![如何重新排序 grub 菜单——将光标自动定位到第一个菜单?](https://linux22.com/image/190698/%E5%A6%82%E4%BD%95%E9%87%8D%E6%96%B0%E6%8E%92%E5%BA%8F%20grub%20%E8%8F%9C%E5%8D%95%E2%80%94%E2%80%94%E5%B0%86%E5%85%89%E6%A0%87%E2%80%8B%E2%80%8B%E8%87%AA%E5%8A%A8%E5%AE%9A%E4%BD%8D%E5%88%B0%E7%AC%AC%E4%B8%80%E4%B8%AA%E8%8F%9C%E5%8D%95%EF%BC%9F.png)
我的电脑中有两个磁盘,在 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.cfg
为https://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 文件,它完美地满足了您的需求:
您可以使用synaptic
GUI 来安装它,GUI 是标准 Debian 安装附带的。
另外,不要忘记将更改保存在grub-customizer
.
答案2
相关问题:如何更改 grub 启动顺序
参考 :
- https://olinux.net/change-grub-boot-order-linux/
- https://askubuntu.com/questions/100232/how-do-i-change-the-grub-boot-order
- https://wiki.debian.org/GrubConfiguration
- https://www.linuxquestions.org/questions/debian-26/grub2-debian-squeeze-change-boot-order-906606/
我正在写那个对我来说看起来有用的答案。
sudo gedit /etc/grub.d/10_linux
您可以使用vi
或nano
您熟悉的。查看本节中的文件:
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 语句中设置的相同。