AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / unix / 问题 / 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

GRUB 配置以识别同一 Linux 发行版的不同桌面环境(安装)

  • 772

标题并不意味着我希望 GRUB 能够识别我的桌面环境。我只想在不同的环境中单独安装 Debian 9,并能够在 GRUB 菜单中识别它们。

我试图更改 /etc/default/grub 但这仅用于当前系统(比如 Debian 9.2 xfce),因此其他系统(比如 Debian 9.2 lxde)只看到“Debian GNU/Linux 9 (stretch) ”。

我不明白我必须更改哪个文件,以便每个操作系统的 GRUB 都会给出适当的条目名称(使用 DesktopEnvironment)。

我查看了讨论更改 40_custom 或 30_os_prober 的类似主题,但没有找到答案。

debian grub2
  • 2 2 个回答
  • 472 Views

2 个回答

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

    我同意 Time4Tea 关于在单个系统上拥有多个 DE 的评论,但是,如果您真的想要两个单独的安装,那么我建议您选择一个作为主要用于配置 grub。例如,对于debian xfce,我会 edit /etc/grub.d/10_linux,然后/etc/grub.d/40_custom对于debian lxde。请务必先备份这些文件,然后再进行编辑。然后运行update-grub以将更改应用到/boot/grub/grub.cfg.

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

    最后,在对我的 debian 系统进行一些更新后,以前的设置(在此编辑之前)无法正常工作。所以我解决了这样的问题:

    在每个发行版的 /etc/grub.d/10_linux 文件中,我添加了一个词,显示发行版中使用的 DE,如下所示(参见“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
    

    然后我编辑了文件 /etc/grub.d/30_os-prober 并更改了一些内容。

    我的最终文件是:

    #! /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
    

    这些变化是:

    1)创建变量:

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

    2)这个变量是分区标签,我正在标记我的分区(至少每个操作系统的根分区)。此标签保存在此变量中,然后添加到我的系统的 menuentries 和 sudmenuenties 中,与系统无关。在上面的代码中搜索 PTLABEL 以查看我在哪里使用它。您也可以在任何其他类型的操作系统中使用它(我想),但我只将它用于 linux 发行版。

    3) 在我们更新 grub 时出现的 "found DISTRONAME" 语句中添加了这个变量,以便我可以检查我的系统是否找到或找到了等等。

    这样,我使用磁盘的标签来命名我的 grub 条目。

    • 0

相关问题

  • astyle 不会更改源文件格式

  • 接收有关全新 Debian 的电子邮件

  • Debian Stretch:libgs_plugin_systemd-updates.so 中的 gnome-software 段错误

  • 如何在拼音输入法中输入ü?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    JSON数组使用jq来bash变量

    • 4 个回答
  • Marko Smith

    日期可以为 GMT 时区格式化当前时间吗?[复制]

    • 2 个回答
  • Marko Smith

    bash + 通过 bash 脚本从文件中读取变量和值

    • 4 个回答
  • Marko Smith

    如何复制目录并在同一命令中重命名它?

    • 4 个回答
  • Marko Smith

    ssh 连接。X11 连接因身份验证错误而被拒绝

    • 3 个回答
  • Marko Smith

    如何下载软件包而不是使用 apt-get 命令安装它?

    • 7 个回答
  • Marko Smith

    systemctl 命令在 RHEL 6 中不起作用

    • 3 个回答
  • Marko Smith

    rsync 端口 22 和 873 使用

    • 2 个回答
  • Marko Smith

    以 100% 的利用率捕捉 /dev/loop -- 没有可用空间

    • 1 个回答
  • Marko Smith

    jq 打印子对象中所有的键和值

    • 2 个回答
  • Martin Hope
    EHerman JSON数组使用jq来bash变量 2017-12-31 14:50:58 +0800 CST
  • Martin Hope
    Christos Baziotis 在一个巨大的(70GB)、一行、文本文件中替换字符串 2017-12-30 06:58:33 +0800 CST
  • Martin Hope
    Drux 日期可以为 GMT 时区格式化当前时间吗?[复制] 2017-12-26 11:35:07 +0800 CST
  • Martin Hope
    AllisonC 如何复制目录并在同一命令中重命名它? 2017-12-22 05:28:06 +0800 CST
  • Martin Hope
    Steve “root”用户的文件权限如何工作? 2017-12-22 02:46:01 +0800 CST
  • Martin Hope
    Bagas Sanjaya 为什么 Linux 使用 LF 作为换行符? 2017-12-20 05:48:21 +0800 CST
  • Martin Hope
    Cbhihe 将默认编辑器更改为 vim for _ sudo systemctl edit [unit-file] _ 2017-12-03 10:11:38 +0800 CST
  • Martin Hope
    showkey 如何下载软件包而不是使用 apt-get 命令安装它? 2017-12-03 02:15:02 +0800 CST
  • Martin Hope
    youxiao 为什么目录 /home、/usr、/var 等都具有相同的 inode 编号 (2)? 2017-12-02 05:33:41 +0800 CST
  • Martin Hope
    user223600 gpg —list-keys 命令在将私钥导入全新安装后输出 uid [未知] 2017-11-26 18:26:02 +0800 CST

热门标签

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

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve