如何正确设置正确的 GRUB 2 默认菜单项?

如何正确设置正确的 GRUB 2 默认菜单项?

我在 Gentoo Linux 系统上运行 GRUB 2.00。

我手动编译自己的内核,然后将它们安装/bootmake install.我/boot现在有以下内核:

# ls -1 /boot/vmlinuz*
/boot/vmlinuz-3.7.4-gentoo-5
/boot/vmlinuz-3.7.4-gentoo-first
/boot/vmlinuz-3.7.4-gentoo-fourth
/boot/vmlinuz-3.7.4-gentoo-third

运行grub2-mkconfig结果如下:

# grub2-mkconfig -o /boot/grub2/grub.cfg
Generating grub.cfg ...
Found linux image: /boot/vmlinuz-3.7.4-gentoo-third
Found linux image: /boot/vmlinuz-3.7.4-gentoo-fourth
Found linux image: /boot/vmlinuz-3.7.4-gentoo-first
Found linux image: /boot/vmlinuz-3.7.4-gentoo-5
done

如果我现在阅读生成的/boot/grub2/grub.cfg文件,我会注意到已创建以下条目:

  • 启动的主要默认条目vmlinuz-3.7.4-gentoo-third
  • 包含所有其他条目(包括恢复条目)的子菜单,顺序与命令grub2-mkconfig相同

问题是在启动时我想默认加载内核的第五个版本 ( vmlinuz-3.7.4-gentoo-5),而不是第三个版本 ( vmlinuz-3.7.4-gentoo-third)。我也不想访问子菜单来选择要加载的正确内核。

我怎样才能改变这种行为?我如何告诉 GRUB 我想默认运行内核的第五个版本而不是旧的第三个版本?一般来说,如何更改默认输入行以匹配我想要的内核,而不是 GRUB 选择的看似随机的内核?

我还尝试将以下几行放入/etc/default/grub

GRUB_DEFAULT=saved
GRUB_SAVEDEFAULT=true

这并不能按照我想要的方式解决问题。但至少 GRUB 似乎会记住我启动的最新内核并自动从子菜单中选择它。只是我不喜欢访问子菜单。

答案1

要选择子菜单“高级选项”下的菜单项,请设置 GRUB_DEFAULT="1>3"。您现在可以运行 grub2-mkconfig 来生成 grub 配置文件。下次重新启动时,vmlinuz-3.7.4-gentoo-5 应该会启动。

笔记:这不会更改 grub 菜单中的默认条目,即默认条目仍将指示与您现在相同的条目。但默认启动的映像将是“高级选项”下的第四个映像。要使 vmlinuz-3.7.4-gentoo-5 作为 grub 菜单中的默认条目,镜像的顺序应该是这样的:运行 grub2-mkconfig 时 vmlinuz-3.7.4-gentoo-5 应该是第一个镜像。

答案2

如果你有一个子菜单在 grub.cfg 中,您应该使用如下两位数字:

grub-reboot '1>3'

第一的是菜单索引,并且第二是子菜单索引。

例如,要从配置中启动最后一个条目,如下所示:

grep menu /boot/grub/grub.cfg

menuentry 'Debian GNU/Linux' --class debian --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-simple-1ffa16a9-fda2-43b5-91b9-c91a08ff190f' {
submenu 'Advanced options for Debian GNU/Linux' $menuentry_id_option 'gnulinux-advanced-1ffa16a9-fda2-43b5-91b9-c91a08ff190f' {
    menuentry 'Debian GNU/Linux, with Linux 4.6.0-0.bpo.1-amd64' --class debian --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-4.6.0-0.bpo.1-amd64-advanced-1ffa16a9-fda2-43b5-91b9-c91a08ff190f' {
    menuentry 'Debian GNU/Linux, with Linux 4.6.0-0.bpo.1-amd64 (sysvinit)' --class debian --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-4.6.0-0.bpo.1-amd64-init-sysvinit-1ffa16a9-fda2-43b5-91b9-c91a08ff190f' {
    menuentry 'Debian GNU/Linux, with Linux 4.6.0-0.bpo.1-amd64 (recovery mode)' --class debian --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-4.6.0-0.bpo.1-amd64-recovery-1ffa16a9-fda2-43b5-91b9-c91a08ff190f' {
    menuentry 'Debian GNU/Linux, with Linux 3.16.0-4-amd64' --class debian --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-3.16.0-4-amd64-advanced-1ffa16a9-fda2-43b5-91b9-c91a08ff190f' {
    menuentry 'Debian GNU/Linux, with Linux 3.16.0-4-amd64 (sysvinit)' --class debian --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-3.16.0-4-amd64-init-sysvinit-1ffa16a9-fda2-43b5-91b9-c91a08ff190f' {
    menuentry 'Debian GNU/Linux, with Linux 3.16.0-4-amd64 (recovery mode)' --class debian --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-3.16.0-4-amd64-recovery-1ffa16a9-fda2-43b5-91b9-c91a08ff190f' {

你应该使用:

grub-reboot '1>5'

并重新启动。

答案3

使用centos7(或RHEL7)和grub2:

grub 使用 grubenv 中的“saved_entry”条目作为默认引导,来自 /boot/grub2/grub.cfg 的片段:

if [ "${next_entry}" ] ; then
   set default="${next_entry}"
   set next_entry=
   save_env next_entry
   set boot_once=true
else
   set default="${saved_entry}"
fi

检查“saved_entry”现在是什么我的构建:

grub2-editenv list

saved_entry=CentOS Linux (3.10.0-693.2.2.el7.ari.x86_64) 7 (Core)

将其更改为我的调试版本:

grub2-editenv - set saved_entry='CentOS Linux 3.10.0-693.2.2.el7.ari.x86_64.debug) 7 (Core)'

答案4

尝试

mkdir -p /boot/grub/backup
mv -v /boot/grub/vmlinuz-3.7.4-gentoo-{first,third,fourth} /boot/grub/backup

这会将所有未使用的内核移动到备份目录,现在:

grub2-mkconfig -o /boot/grub/grub.cfg

这只会r5为您的菜单增加选择。执行此操作后,请阅读此内容 链接,然后重命名备份目录中的所有内核,如果您坚持保留它们,则可以使用除 vmlinuz 之外的其他内容

相关内容