AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / unix / Perguntas / 406438
Accepted
koleygr
koleygr
Asked: 2017-11-23 17:12:20 +0800 CST2017-11-23 17:12:20 +0800 CST 2017-11-23 17:12:20 +0800 CST

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

  • 772

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

Tentei alterar o /etc/default/grub, mas isso é usado apenas no sistema atual (digamos, Debian 9.2 xfce) e, portanto, o outro sistema (digamos, Debian 9.2 lxde) vê apenas "Debian GNU/Linux 9 (stretch) ".

Não consigo entender qual arquivo devo alterar para que o GRUB de cada sistema operacional forneça o nome de entrada apropriado (com DesktopEnvironment).

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

debian grub2
  • 2 2 respostas
  • 472 Views

2 respostas

  • Voted
  1. oxr463
    2017-12-03T16:56:21+08:002017-12-03T16:56:21+08:00

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

    • 2
  2. Best Answer
    koleygr
    2017-12-04T05:15:40+08:002017-12-04T05:15:40+08:00

    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 assim (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
    

    depois 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\(.*\))/\1s\2/'`"
          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
    

    The changes are:

    1) Created the variable:

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

    2) This variable is the partition label and I am labeling my partitions (at least the root partitions of every operating system). This label is saved in this variable and then is added in the menuentries and sudmenuenties of my system independent of the system. Search for PTLABEL in the code above to see where I used it. You can also use it in any other kind of OS (I suppose) but I used it just for linux distros.

    3) Added this variable in the sentence "found DISTRONAME" that appears when we updating grub, So that I can check if my systems found or which found etc.

    This way I use the labels of my disks to name my grub entries.

    • 0

relate perguntas

  • astyle não altera a formatação do arquivo de origem

  • Recebendo e-mail em um novo Debian fresco

  • Debian Stretch: gnome-software segfault em libgs_plugin_systemd-updates.so

  • Como digitar ü no Pinyin IME?

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Matriz JSON para bash variáveis ​​usando jq

    • 4 respostas
  • Marko Smith

    A data pode formatar a hora atual para o fuso horário GMT? [duplicado]

    • 2 respostas
  • Marko Smith

    bash + lê variáveis ​​e valores do arquivo pelo script bash

    • 4 respostas
  • Marko Smith

    Como posso copiar um diretório e renomeá-lo no mesmo comando?

    • 4 respostas
  • Marko Smith

    conexão ssh. Conexão X11 rejeitada devido a autenticação incorreta

    • 3 respostas
  • Marko Smith

    Como baixar o pacote não instalá-lo com o comando apt-get?

    • 7 respostas
  • Marko Smith

    comando systemctl não funciona no RHEL 6

    • 3 respostas
  • Marko Smith

    rsync porta 22 e 873 uso

    • 2 respostas
  • Marko Smith

    snap /dev/loop em 100% de utilização -- sem espaço livre

    • 1 respostas
  • Marko Smith

    chave de impressão jq e valor para todos no subobjeto

    • 2 respostas
  • Martin Hope
    EHerman Matriz JSON para bash variáveis ​​usando jq 2017-12-31 14:50:58 +0800 CST
  • Martin Hope
    Christos Baziotis Substitua a string em um arquivo de texto enorme (70 GB), uma linha 2017-12-30 06:58:33 +0800 CST
  • Martin Hope
    Drux A data pode formatar a hora atual para o fuso horário GMT? [duplicado] 2017-12-26 11:35:07 +0800 CST
  • Martin Hope
    AllisonC Como posso copiar um diretório e renomeá-lo no mesmo comando? 2017-12-22 05:28:06 +0800 CST
  • Martin Hope
    Steve Como as permissões de arquivo funcionam para o usuário "root"? 2017-12-22 02:46:01 +0800 CST
  • Martin Hope
    Bagas Sanjaya Por que o Linux usa LF como caractere de nova linha? 2017-12-20 05:48:21 +0800 CST
  • Martin Hope
    Cbhihe Altere o editor padrão para vim para _ sudo systemctl edit [unit-file] _ 2017-12-03 10:11:38 +0800 CST
  • Martin Hope
    showkey Como baixar o pacote não instalá-lo com o comando apt-get? 2017-12-03 02:15:02 +0800 CST
  • Martin Hope
    youxiao Por que os diretórios /home, /usr, /var, etc. têm o mesmo número de inode (2)? 2017-12-02 05:33:41 +0800 CST
  • Martin Hope
    user223600 gpg — o comando list-keys gera uid [ desconhecido ] depois de importar a chave privada para uma instalação limpa 2017-11-26 18:26:02 +0800 CST

Hot tag

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve