Configuração do GRUB para reconhecer diferentes ambientes de desktop (instalações) da mesma distribuição Linux

1

O título não significa realmente que eu espero que o GRUB reconheça meus ambientes de Desktop. Eu só quero ter instalações separadas do Debian 9 com diferentes ambientes e poder reconhecê-las no menu do GRUB.

Eu tentei mudar o / etc / default / grub mas isso é usado apenas no sistema atual (digamos Debian 9.2 xfce) e então o outro sistema (digamos Debian 9.2 lxde) vê apenas "Debian GNU / Linux 9 (esticar) ".

Eu não consigo entender qual arquivo eu tenho que mudar para que o GRUB de cada OS dará o nome de entrada apropriado (com DesktopEnvironment).

Procurei em tópicos semelhantes que estavam discutindo a mudança de 40_custom ou 30_os_prober, mas não consegui encontrar uma resposta.

    
por koleygr 23.11.2017 / 02:12

2 respostas

0

Finalmente, as configurações anteriores (antes desta edição) não podem funcionar após algumas atualizações do meu sistema debian. Então resolvi o problema assim:

No arquivo /etc/grub.d/10_linux de cada distro, adicionei uma palavra que mostra o DE usado na distro como este (veja "MATE"):

if [ "x${GRUB_DISTRIBUTOR}" = "x" ] ; then
  OS=GNU/Linux
else
  case ${GRUB_DISTRIBUTOR} in
    Ubuntu|Kubuntu)
      OS="${GRUB_DISTRIBUTOR}"
      ;;
    *)
      OS="${GRUB_DISTRIBUTOR} MATE"
      ;;
  esac
  CLASS="--class $(echo ${GRUB_DISTRIBUTOR} | tr 'A-Z' 'a-z' | cut -d' ' -f1|LC$
fi

eu editei o arquivo /etc/grub.d/30_os-prober e mudei algumas coisas.

Meu arquivo final é:

#! /bin/sh
set -e

# grub-mkconfig helper script.
# Copyright (C) 2006,2007,2008,2009  Free Software Foundation, Inc.
#
# GRUB is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# GRUB is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with GRUB.  If not, see <http://www.gnu.org/licenses/>.

prefix="/usr"
exec_prefix="/usr"
datarootdir="/usr/share"
quick_boot="0"

export TEXTDOMAIN=grub
export TEXTDOMAINDIR="${datarootdir}/locale"

. "$pkgdatadir/grub-mkconfig_lib"

found_other_os=

adjust_timeout () {
  if [ "$quick_boot" = 1 ] && [ "x${found_other_os}" != "x" ]; then
    cat << EOF
set timeout_style=menu
if [ "\${timeout}" = 0 ]; then
  set timeout=10
fi
EOF
  fi
}

if [ "x${GRUB_DISABLE_OS_PROBER}" = "xtrue" ]; then
  exit 0
fi

if [ -z "'which os-prober 2> /dev/null'" ] || [ -z "'which linux-boot-prober 2> /dev/null'" ] ; then
  # missing os-prober and/or linux-boot-prober
  exit 0
fi

OSPROBED="'os-prober | tr ' ' '^' | paste -s -d ' ''"
if [ -z "${OSPROBED}" ] ; then
  # empty os-prober output, nothing doing
  exit 0
fi

osx_entry() {
    found_other_os=1
    if [ x$2 = x32 ]; then
        # TRANSLATORS: it refers to kernel architecture (32-bit)
    bitstr="$(gettext "(32-bit)")"
    else
        # TRANSLATORS: it refers to kernel architecture (64-bit)
    bitstr="$(gettext "(64-bit)")"
    fi
    # TRANSLATORS: it refers on the OS residing on device %s
    onstr="$(gettext_printf "(on %s)" "${DEVICE}")"
        cat << EOF
menuentry '$(echo "${LONGNAME} $bitstr $onstr" | grub_quote)' --class osx --class darwin --class os \$menuentry_id_option 'osprober-xnu-$2-$(grub_get_device_id "${DEVICE}")'  {
EOF
    save_default_entry | grub_add_tab
    prepare_grub_to_access_device ${DEVICE} | grub_add_tab
    cat << EOF
        load_video
        set do_resume=0
        if [ /var/vm/sleepimage -nt10 / ]; then
           if xnu_resume /var/vm/sleepimage; then
             set do_resume=1
           fi
        fi
        if [ \$do_resume = 0 ]; then
           xnu_uuid ${OSXUUID} uuid
           if [ -f /Extra/DSDT.aml ]; then
              acpi -e /Extra/DSDT.aml
           fi
           if [ /kernelcache -nt /System/Library/Extensions ]; then
              $1 /kernelcache boot-uuid=\${uuid} rd=*uuid
           elif [ -f /System/Library/Kernels/kernel ]; then
              $1 /System/Library/Kernels/kernel boot-uuid=\${uuid} rd=*uuid
              xnu_kextdir /System/Library/Extensions
           else
              $1 /mach_kernel boot-uuid=\${uuid} rd=*uuid
              if [ /System/Library/Extensions.mkext -nt /System/Library/Extensions ]; then
                xnu_mkext /System/Library/Extensions.mkext
              else
                xnu_kextdir /System/Library/Extensions
              fi
           fi
           if [ -f /Extra/Extensions.mkext ]; then
              xnu_mkext /Extra/Extensions.mkext
           fi
           if [ -d /Extra/Extensions ]; then
              xnu_kextdir /Extra/Extensions
           fi
           if [ -f /Extra/devprop.bin ]; then
              xnu_devprop_load /Extra/devprop.bin
           fi
           if [ -f /Extra/splash.jpg ]; then
              insmod jpeg
              xnu_splash /Extra/splash.jpg
           fi
           if [ -f /Extra/splash.png ]; then
              insmod png
              xnu_splash /Extra/splash.png
           fi
           if [ -f /Extra/splash.tga ]; then
              insmod tga
              xnu_splash /Extra/splash.tga
           fi
        fi
}
EOF
}

used_osprober_linux_ids=

wubi=

for OS in ${OSPROBED} ; do
  DEVICE="'echo ${OS} | cut -d ':' -f 1'"
  LONGNAME="'echo ${OS} | cut -d ':' -f 2 | tr '^' ' ''"
  LABEL="'echo ${OS} | cut -d ':' -f 3 | tr '^' ' ''"
  BOOT="'echo ${OS} | cut -d ':' -f 4'"
  PTLABEL="'echo $(blkid -po udev  ${DEVICE} |grep LABEL_ENC| sed 's/^.*=//')'"
  if UUID="'${grub_probe} --target=fs_uuid --device ${DEVICE%@*}'"; then
    EXPUUID="$UUID"

    if [ x"${DEVICE#*@}" != x ] ; then
      EXPUUID="${EXPUUID}@${DEVICE#*@}"
    fi

    if [ "x${GRUB_OS_PROBER_SKIP_LIST}" != "x" ] && [ "x'echo ${GRUB_OS_PROBER_SKIP_LIST} | grep -i -e '\b'${EXPUUID}'\b''" != "x" ] ; then
      echo "Skipped ${LONGNAME} on ${DEVICE} by user request." >&2
      continue
    fi
  fi

  BTRFS="'echo ${OS} | cut -d ':' -f 5'"
  if [ "x$BTRFS" = "xbtrfs" ]; then
    BTRFSuuid="'echo ${OS} | cut -d ':' -f 6'"
    BTRFSsubvol="'echo ${OS} | cut -d ':' -f 7'"
  fi

  if [ -z "${LONGNAME}" ] ; then
    LONGNAME="${LABEL}"
  fi

  # os-prober returns text string followed by optional counter
  CLASS="--class $(echo "${LABEL}" | LC_ALL=C sed 's,[[:digit:]]*$,,' | cut -d' ' -f1 | tr 'A-Z' 'a-z' | LC_ALL=C sed 's,[^[:alnum:]_],_,g')"

  gettext_printf "Found %s on %s labeled %s\n" "${LONGNAME}" "${DEVICE}" "${PTLABEL}" >&2

  case ${BOOT} in
    chain)

      case ${LONGNAME} in
    Windows*)
      if [ -z "$wubi" ]; then
        if [ -x /usr/share/lupin-support/grub-mkimage ] && \
           /usr/share/lupin-support/grub-mkimage --test; then
          wubi=yes
        else
          wubi=no
        fi
      fi
      if [ "$wubi" = yes ]; then
        echo "Skipping ${LONGNAME} on Wubi system" >&2
        continue
      fi
      ;;
      esac

      found_other_os=1
      onstr="$(gettext_printf "(on %s)" "${DEVICE}")"
      cat << EOF
menuentry '$(echo "${LONGNAME} $onstr" | grub_quote)' $CLASS --class os \$menuentry_id_option 'osprober-chain-$(grub_get_device_id "${DEVICE}")' {
EOF
      save_default_entry | grub_add_tab
      prepare_grub_to_access_device ${DEVICE} | grub_add_tab

      if [ x"'${grub_probe} --device ${DEVICE} --target=partmap'" = xmsdos ]; then
      cat << EOF
    parttool \${root} hidden-
EOF
      fi

      case ${LONGNAME} in
    Windows\ Vista*|Windows\ 7*|Windows\ Server\ 2008*)
    ;;
    *)
      cat << EOF
    drivemap -s (hd0) \${root}
EOF
    ;;
      esac

      cat <<EOF
    chainloader +1
}
EOF
    ;;
    efi)

    found_other_os=1
    EFIPATH=${DEVICE#*@}
    DEVICE=${DEVICE%@*}
    onstr="$(gettext_printf "(on %s)" "${DEVICE}")"
      cat << EOF
menuentry '$(echo "${LONGNAME}  $onstr" | grub_quote)' $CLASS --class os \$menuentry_id_option 'osprober-efi-$(grub_get_device_id "${DEVICE}")' {
EOF
      save_default_entry | sed -e "s/^/\t/"
      prepare_grub_to_access_device ${DEVICE} | sed -e "s/^/\t/"

      cat <<EOF
    chainloader ${EFIPATH}
}
EOF
    ;;
    linux)
      if [ "x$BTRFS" = "xbtrfs" ]; then
         LINUXPROBED="'linux-boot-prober btrfs ${BTRFSuuid} ${BTRFSsubvol}  2> /dev/null | tr ' ' '^' | paste -s -d ' ''"
      else
         LINUXPROBED="'linux-boot-prober ${DEVICE} 2> /dev/null | tr ' ' '^' | paste -s -d ' ''"
      fi
      prepare_boot_cache=
      boot_device_id=
      is_top_level=true
      title_correction_code=
      OS="${LONGNAME}"

      for LINUX in ${LINUXPROBED} ; do
        LROOT="'echo ${LINUX} | cut -d ':' -f 1'"
        LBOOT="'echo ${LINUX} | cut -d ':' -f 2'"
        LLABEL="'echo ${LINUX} | cut -d ':' -f 3 | tr '^' ' ''"
        LKERNEL="'echo ${LINUX} | cut -d ':' -f 4'"
        LINITRD="'echo ${LINUX} | cut -d ':' -f 5'"
        LPARAMS="'echo ${LINUX} | cut -d ':' -f 6- | tr '^' ' ''"

        if [ -z "${LLABEL}" ] ; then
          LLABEL="${LONGNAME}"
        fi

    if [ "${LROOT}" != "${LBOOT}" ]; then
      LKERNEL="${LKERNEL#/boot}"
      LINITRD="${LINITRD#/boot}"
    fi

    if [ -z "${prepare_boot_cache}" ]; then
      prepare_boot_cache="$(prepare_grub_to_access_device ${LBOOT} | grub_add_tab)"
      [ "${prepare_boot_cache}" ] || continue
    fi

    found_other_os=1
    onstr="$(gettext_printf "(on %s)" "${DEVICE}")"
    recovery_params="$(echo "${LPARAMS}" | grep 'single\|recovery')" || true
    counter=1
    while echo "$used_osprober_linux_ids" | grep 'osprober-gnulinux-$LKERNEL-${recovery_params}-$counter-$boot_device_id' > /dev/null; do
        counter=$((counter+1));
    done
    if [ -z "$boot_device_id" ]; then
        boot_device_id="$(grub_get_device_id "${DEVICE}")"
    fi
    used_osprober_linux_ids="$used_osprober_linux_ids 'osprober-gnulinux-$LKERNEL-${recovery_params}-$counter-$boot_device_id'"

    if [ "x$is_top_level" = xtrue ] && [ "x${GRUB_DISABLE_SUBMENU}" != xy ]; then
            cat << EOF
menuentry '$(echo "$OS $PTLABEL $onstr" | grub_quote)' $CLASS --class gnu-linux --class gnu --class os \$menuentry_id_option 'osprober-gnulinux-simple-$boot_device_id' {
EOF
        save_default_entry | grub_add_tab
        printf '%s\n' "${prepare_boot_cache}"
        cat <<  EOF
    linux ${LKERNEL} ${LPARAMS}
EOF
            if [ -n "${LINITRD}" ] ; then
          cat << EOF
    initrd ${LINITRD}
EOF
            fi
        cat << EOF
}
EOF
        echo "submenu '$(gettext_printf "Advanced options for %s" "${OS} ${PTLABEL} $onstr" | grub_quote)' \$menuentry_id_option 'osprober-gnulinux-advanced-$boot_device_id' {"
        is_top_level=false
    fi
    title="${LLABEL} ${PTLABEL} $onstr"
        cat << EOF
    menuentry '$(echo "$title" | grub_quote)' --class gnu-linux --class gnu --class os \$menuentry_id_option 'osprober-gnulinux-$LKERNEL-${recovery_params}-$boot_device_id' {
EOF
    save_default_entry | sed -e "s/^/$grub_tab$grub_tab/"
    printf '%s\n' "${prepare_boot_cache}" | grub_add_tab
    cat <<  EOF
        linux ${LKERNEL} ${LPARAMS}
EOF
        if [ -n "${LINITRD}" ] ; then
            cat << EOF
        initrd ${LINITRD}
EOF
        fi
        cat << EOF
    }
EOF
    if [ x"$title" = x"$GRUB_ACTUAL_DEFAULT" ] || [ x"Previous Linux versions>$title" = x"$GRUB_ACTUAL_DEFAULT" ]; then
        replacement_title="$(echo "Advanced options for ${OS} $onstr" | sed 's,>,>>,g')>$(echo "$title" | sed 's,>,>>,g')"
        quoted="$(echo "$GRUB_ACTUAL_DEFAULT" | grub_quote)"
        title_correction_code="${title_correction_code}if [ \"x\$default\" = '$quoted' ]; then default='$(echo "$replacement_title" | grub_quote)'; fi;"
        grub_warn "$(gettext_printf "Please don't use old title \'%s' for GRUB_DEFAULT, use \'%s' (for versions before 2.00) or \'%s' (for 2.00 or later)" "$GRUB_ACTUAL_DEFAULT" "$replacement_title" "gnulinux-advanced-$boot_device_id>gnulinux-$version-$type-$boot_device_id")"
    fi
      done
      if [ x"$is_top_level" != xtrue ]; then
      echo '}'
      fi
      echo "$title_correction_code"
    ;;
    macosx)
      if [ "${UUID}" ]; then
    OSXUUID="${UUID}"
    osx_entry xnu_kernel 32
    osx_entry xnu_kernel64 64
      fi
    ;;
    hurd)
      found_other_os=1
      onstr="$(gettext_printf "(on %s)" "${DEVICE}")"
      cat << EOF
menuentry '$(echo "${LONGNAME} $onstr" | grub_quote)' --class hurd --class gnu --class os \$menuentry_id_option 'osprober-gnuhurd-/boot/gnumach.gz-false-$(grub_get_device_id "${DEVICE}")' {
EOF
      save_default_entry | grub_add_tab
      prepare_grub_to_access_device ${DEVICE} | grub_add_tab
      grub_device="'${grub_probe} --device ${DEVICE} --target=drive'"
      mach_device="'echo "${grub_device}" | sed -e 's/(\(hd.*\),msdos\(.*\))/s/''"
      grub_fs="'${grub_probe} --device ${DEVICE} --target=fs'"
      case "${grub_fs}" in
    *fs)    hurd_fs="${grub_fs}" ;;
    *)  hurd_fs="${grub_fs}fs" ;;
      esac
      cat << EOF
    multiboot /boot/gnumach.gz root=device:${mach_device}
    module /hurd/${hurd_fs}.static ${hurd_fs} --readonly \
            --multiboot-command-line='\${kernel-command-line}' \
            --host-priv-port='\${host-port}' \
            --device-master-port='\${device-port}' \
            --exec-server-task='\${exec-task}' -T typed '\${root}' \
            '\$(task-create)' '\$(task-resume)'
    module /lib/ld.so.1 exec /hurd/exec '\$(exec-task=task-create)'
}
EOF
    ;;
    minix)
      cat << EOF
menuentry "${LONGNAME} (on ${DEVICE}, Multiboot)" {
EOF
         save_default_entry | sed -e "s/^/\t/"
         prepare_grub_to_access_device ${DEVICE} | sed -e "s/^/\t/"
     cat << EOF
    multiboot /boot/image_latest
}
EOF
    ;;
    *)
      # TRANSLATORS: %s is replaced by OS name.
      gettext_printf "%s is not yet supported by grub-mkconfig.\n" "  ${LONGNAME}" >&2
    ;;
  esac
done

adjust_timeout

As alterações são:

1) Criada a variável:

 PTLABEL="'echo $(blkid -po udev  ${DEVICE} |grep LABEL_ENC| sed 's/^.*=//')'"

2) Esta variável é o rótulo da partição e eu estou rotulando minhas partições (pelo menos as partições raiz de cada sistema operacional). Este rótulo é salvo nesta variável e, em seguida, é adicionado no menuentries e sudmenuenties do meu sistema independente do sistema. Pesquise por PTLABEL no código acima para ver onde o usei. Você também pode usá-lo em qualquer outro tipo de sistema operacional (suponho), mas eu usei apenas para distribuições Linux.

3) Adicionada esta variável na frase "found DISTRONAME" que aparece quando atualizamos o grub, para que eu possa checar se meus sistemas encontraram ou quais encontraram etc.

Dessa forma, eu uso os rótulos de meus discos para nomear minhas entradas no grub.

    
por 03.12.2017 / 14:15
2

Concordo com o comentário da Time4Tea sobre ter vários DEs em um único sistema, no entanto, se você realmente deseja ter duas instalações separadas, recomendo que você escolha uma como principal para usar para configurar o grub. Por exemplo, para debian xfce , eu editaria /etc/grub.d/10_linux e, em seguida, /etc/grub.d/40_custom para debian lxde . Certifique-se de primeiro fazer backup desses arquivos antes de editá-los. Em seguida, execute update-grub para aplicar suas alterações a /boot/grub/grub.cfg .

    
por 03.12.2017 / 01:56