如何重新排序 grub 菜单——将光标​​自动定位到第一个菜单?

如何重新排序 grub 菜单——将光标​​自动定位到第一个菜单?

我的电脑中有两个磁盘,在 sda 上安装了双操作系统(debian--buster + win10),在 sdb 上安装了单个操作系统(debian buster)。
每次重启电脑,grub菜单显示如下:

Debian GNU/Linux 
Advanced option for Debian GNU/Linux
Windows Boot Manager(on /dev/sda2)
Debian GNU/Linux 10(buster) on /dev/sda6
Advanced options for Debian GNU/Linux 10(buster) (on /dev/sda6)
System setup

如果我选择第一项Debian GNU/Linux输入

df /boot/grub/grub.cfg
/dev/sdb1

我上传/boot/grub/grub.cfghttps://www.dropbox.com/s/9qjmk178jlj2gha/grub.cfg-sdb1?dl=0

如果我选择第一项Debian GNU/Linux 10(buster) on /dev/sda6输入

df /boot/grub/grub.cfg
/dev/sda1

我上传的/boot/grub/grub.cfg是 as https://www.dropbox.com/s/kf94rbc9g1xpx8e/grub.cfg-sda1?dl=0.

我的期望:每次重新启动电脑时,将 grub 菜单重新排序如下:

Debian GNU/Linux 10(buster) on /dev/sda6
Advanced options for Debian GNU/Linux 10(buster) (on /dev/sda6)
Debian GNU/Linux 
Advanced option for Debian GNU/Linux
Windows Boot Manager(on /dev/sda2)
System setup

我这样调整:

sudo mount /dev/sda2  /mnt
sudo grub-install --efi-directory=/mnt
sudo grub-mkconfig -o /boot/grub/grub.cfg

重新启动,请查看 grub 菜单。

在此输入图像描述

为什么光标位于菜单上

Advanced options for Debian GNU/Linux 10(buster) (on /dev/sdb1)

而不是第一个菜单?

如何创建下面的 grub 菜单,使每次启动电脑时光标都位于第一个菜单?

在此输入图像描述

答案1

您可以简单地使用grub-customizer(https://packages.debian.org/buster/grub-customizer)而无需摆弄 Debian 官方存储库中的 grub 文件,它完美地满足了您的需求:

移动条目

设置默认条目

您可以使用synapticGUI 来安装它,GUI 是标准 Debian 安装附带的。

另外,不要忘记将更改保存在grub-customizer.

答案2

相关问题:如何更改 grub 启动顺序

参考 :

  1. https://olinux.net/change-grub-boot-order-linux/
  2. https://askubuntu.com/questions/100232/how-do-i-change-the-grub-boot-order
  3. https://wiki.debian.org/GrubConfiguration
  4. https://www.linuxquestions.org/questions/debian-26/grub2-debian-squeeze-change-boot-order-906606/

我正在写那个对我来说看起来有用的答案。

sudo gedit /etc/grub.d/10_linux

您可以使用vinano您熟悉的。查看本节中的文件:

linux_entry ()
{
  os="$1"
  version="$2"
  recovery="$3"
  args="$4"
  if ${recovery} ; then
    title="$(gettext_quoted "%s, with Linux %s (recovery mode)")"
  else
    title="$(gettext_quoted "%s, with Linux %s")"
  fi
  printf "menuentry '${title}' ${CLASS} {\n" "${os}" "${version}"
  if ! ${recovery} ; then
      save_default_entry | sed -e "s/^/\t/"
  fi

虽然这句话在我的帖子中看起来像

linux_entry ()
{
  os="$1"
  version="$2"
  type="$3"
  args="$4"

  if [ -z "$boot_device_id" ]; then
      boot_device_id="$(grub_get_device_id "${GRUB_DEVICE}")"
  fi
  if [ x$type != xsimple ] ; then
      case $type in
      recovery)
          title="$(gettext_printf "%s (Kernel: %s - recovery mode)" "${os}" "${version}")" ;;
      fallback)
          title="$(gettext_printf "%s (Kernel: %s - fallback initramfs)" "${os}" "${version}")" ;;
      *)
          title="$(gettext_printf "%s (Kernel: %s)" "${os}" "${version}")" ;;
      esac
      if [ x"$title" = x"$GRUB_ACTUAL_DEFAULT" ] || [ x"Previous Linux versions>$title" = x"$GRUB_ACTUAL_DEFAULT" ]; then
      replacement_title="$(echo "Advanced options for ${OS}" | 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
      echo "menuentry '$(echo "$title" | grub_quote)' ${CLASS} \$menuentry_id_option 'gnulinux-$version-$type-$boot_device_id' {" | sed "s/^/$submenu_indentation/"
  else
      echo "menuentry '$(echo "$os" | grub_quote)' ${CLASS} \$menuentry_id_option 'gnulinux-simple-$boot_device_id' {" | sed "s/^/$submenu_indentation/"
  fi      
  if [ x$type != xrecovery ] && [ x$type != xfallback ] ; then
      save_default_entry | grub_add_tab
  fi

我是壳牌的新手。这就是为什么我不做任何改变。

如果您想更改主分区以外的分区的内核标题,那么您需要编辑

/etc/grub.d/30_os-prober文件

在这个部分:

linux)
      LINUXPROBED="`linux-boot-prober ${DEVICE} 2> /dev/null | tr ' ' '^' | paste -s -d ' '`"
      prepare_boot_cache=

      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

        cat << EOF
menuentry "${LLABEL} (on ${DEVICE})" --class gnu-linux --class gnu --class os {
EOF

这是回答链接

答案3

无论如何,这是一个适用于实时启动的解决方案。 (我只在实时模式下工作)。

我不确定你是否仍然关心这个,但我确信有人会受益。如果你进入 grub 文件夹下的 config 文件夹,就会有一个 bootmenu.cfg 文件。在文件中,最后一段左右就是您要查找的内容。

请注意,此片段以“set_default_entry”开头。多么热衷啊。在这里,我们要更改第一个 if 语句默认的“language_keyboard_timezone”。

set_default_entry

if is_enabled l10n_menu; then   
   if [ -z "$lopts" ]; then
      set default="language_keyboard_timezone"
      set timeout=-1
   else
      set default="linux"
      set timeout=60
   fi
fi

如果您想将其更改为 Linux 操作系统启动项,那么您必须找出该菜单的名称。这可以在 grub 文件夹中的 grub.cfg 文件中找到。请参阅“设置默认值”。

set default=linux

menuentry " MX-21.3 x64 (January 15, 2023)" "$kernel" "$initrd" "$kopts" --id=linux {

kernel="$2"
initrd="$3"

shift 3

linux /antiX/${kernel} quiet splasht nosplash $@
initrd /antiX/${initrd}.gz
}

在本例中,它是“linux”。作为验证,我们可以在其下方看到我的发行版名称:MX-21.3 x64。这个默认条目“linux”也恰好与第一个代码片段中的 else 语句中设置的相同。

相关内容