在 GRUB 中设置默认内核

Tom*_*Tom 89 linux grub boot kernel

如何选择默认情况下应加载哪个内核 GRUB2?我最近安装了一个 linux 实时内核,现在它默认加载。我想默认加载常规的。

到目前为止,我只设法选择了默认操作系统..并且出于某种原因/boot/grub.cfg已经假设我想加载 rt-kernel 并将其放入通用 linux 菜单条目(在我的情况下为 Arch Linux)。

小智 97

经过 2 个小时的努力,我找到了一种更简单的方法来实现这一目标。我只是 RTFM。;)

将两行添加到 /etc/default/grub

GRUB_SAVEDEFAULT=true
GRUB_DEFAULT=saved
Run Code Online (Sandbox Code Playgroud)

执行sudo update-grub,重新启动,进入您的 grub 菜单并选择您需要的任何菜单或子菜单项。每次都会保存选择,然后您的计算机将自动启动。当您手动选择不同的条目时,它将成为新的默认值。

  • 截至 2020 年,`sudo update-grub` 在 Arch 中返回一个 `command not found`。相反,应该使用命令 `sudo grub-mkconfig -o /boot/grub/grub.cfg`。 (3认同)

小智 70

我认为此时大多数发行版已将附加内核移至高级选项子菜单中,正如 TomTom 发现的 Arch 的情况。

我不想为了选择以前的内核作为默认值而改变我的顶级菜单结构。我在这里找到了答案:

http://www.humans-enabled.com/2014/08/how-to-set-default-grub-kernel-boot.html

总结一下:

1) 找到$menuentry_id_option子菜单:

$ grep submenu /boot/grub/grub.cfg
submenu 'Advanced options for Debian GNU/Linux' $menuentry_id_option 'gnulinux-advanced-38ea4a12-6cfe-4ed9-a8b5-036295e62ffc' {
Run Code Online (Sandbox Code Playgroud)

2) 找到$menuentry_id_option您要使用的内核的菜单项:

$ grep gnulinux /boot/grub/grub.cfg
menuentry 'Debian GNU/Linux' --class debian --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-simple-38ea4a12-6cfe-4ed9-a8b5-036295e62ffc' {
submenu 'Advanced options for Debian GNU/Linux' $menuentry_id_option 'gnulinux-advanced-38ea4a12-6cfe-4ed9-a8b5-036295e62ffc' {
    menuentry 'Debian GNU/Linux, with Linux 4.18.0-0.bpo.1-rt-amd64' --class debian --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-4.18.0-0.bpo.1-rt-amd64-advanced-38ea4a12-6cfe-4ed9-a8b5-036295e62ffc' {
    menuentry 'Debian GNU/Linux, with Linux 4.18.0-0.bpo.1-rt-amd64 (recovery mode)' --class debian --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-4.18.0-0.bpo.1-rt-amd64-recovery-38ea4a12-6cfe-4ed9-a8b5-036295e62ffc' {
    menuentry 'Debian GNU/Linux, with Linux 4.18.0-0.bpo.1-amd64' --class debian --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-4.18.0-0.bpo.1-amd64-advanced-38ea4a12-6cfe-4ed9-a8b5-036295e62ffc' {
    menuentry 'Debian GNU/Linux, with Linux 4.18.0-0.bpo.1-amd64 (recovery mode)' --class debian --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-4.18.0-0.bpo.1-amd64-recovery-38ea4a12-6cfe-4ed9-a8b5-036295e62ffc' {
    menuentry 'Debian GNU/Linux, with Linux 4.17.0-0.bpo.1-amd64' --class debian --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-4.17.0-0.bpo.1-amd64-advanced-38ea4a12-6cfe-4ed9-a8b5-036295e62ffc' {
    menuentry 'Debian GNU/Linux, with Linux 4.17.0-0.bpo.1-amd64 (recovery mode)' --class debian --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-4.17.0-0.bpo.1-amd64-recovery-38ea4a12-6cfe-4ed9-a8b5-036295e62ffc' {
    menuentry 'Debian GNU/Linux, with Linux 4.9.0-8-amd64' --class debian --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-4.9.0-8-amd64-advanced-38ea4a12-6cfe-4ed9-a8b5-036295e62ffc' {
    menuentry 'Debian GNU/Linux, with Linux 4.9.0-8-amd64 (recovery mode)' --class debian --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-4.9.0-8-amd64-recovery-38ea4a12-6cfe-4ed9-a8b5-036295e62ffc' {
Run Code Online (Sandbox Code Playgroud)

3) 注释掉您当前的默认 grub/etc/default/grub并将其替换$menuentry_id_option为第一步中的子菜单,以及第二步中选定的内核$menuentry_id_option,以>.

在我的情况下,修改的GRUB_DEFAULT是:

$ grep submenu /boot/grub/grub.cfg
submenu 'Advanced options for Debian GNU/Linux' $menuentry_id_option 'gnulinux-advanced-38ea4a12-6cfe-4ed9-a8b5-036295e62ffc' {
Run Code Online (Sandbox Code Playgroud)

4) 更新 grub 以进行更改。对于 Debian,这是这样做的:

$ sudo update-grub
Run Code Online (Sandbox Code Playgroud)

完毕。现在当你启动时,高级菜单应该有一个星号,你应该启动到选定的内核。您可以使用 确认这一点uname

$ uname -a
Linux NAME 4.18.0-0.bpo.1-amd64 #1 SMP Debian 4.18.0-0 (2018-09-13) x86_64 GNU/Linux
Run Code Online (Sandbox Code Playgroud)

将其改回最新的内核就像注释掉新行并取消注释一样简单#GRUB_DEFAULT=0

$ grep gnulinux /boot/grub/grub.cfg
menuentry 'Debian GNU/Linux' --class debian --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-simple-38ea4a12-6cfe-4ed9-a8b5-036295e62ffc' {
submenu 'Advanced options for Debian GNU/Linux' $menuentry_id_option 'gnulinux-advanced-38ea4a12-6cfe-4ed9-a8b5-036295e62ffc' {
    menuentry 'Debian GNU/Linux, with Linux 4.18.0-0.bpo.1-rt-amd64' --class debian --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-4.18.0-0.bpo.1-rt-amd64-advanced-38ea4a12-6cfe-4ed9-a8b5-036295e62ffc' {
    menuentry 'Debian GNU/Linux, with Linux 4.18.0-0.bpo.1-rt-amd64 (recovery mode)' --class debian --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-4.18.0-0.bpo.1-rt-amd64-recovery-38ea4a12-6cfe-4ed9-a8b5-036295e62ffc' {
    menuentry 'Debian GNU/Linux, with Linux 4.18.0-0.bpo.1-amd64' --class debian --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-4.18.0-0.bpo.1-amd64-advanced-38ea4a12-6cfe-4ed9-a8b5-036295e62ffc' {
    menuentry 'Debian GNU/Linux, with Linux 4.18.0-0.bpo.1-amd64 (recovery mode)' --class debian --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-4.18.0-0.bpo.1-amd64-recovery-38ea4a12-6cfe-4ed9-a8b5-036295e62ffc' {
    menuentry 'Debian GNU/Linux, with Linux 4.17.0-0.bpo.1-amd64' --class debian --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-4.17.0-0.bpo.1-amd64-advanced-38ea4a12-6cfe-4ed9-a8b5-036295e62ffc' {
    menuentry 'Debian GNU/Linux, with Linux 4.17.0-0.bpo.1-amd64 (recovery mode)' --class debian --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-4.17.0-0.bpo.1-amd64-recovery-38ea4a12-6cfe-4ed9-a8b5-036295e62ffc' {
    menuentry 'Debian GNU/Linux, with Linux 4.9.0-8-amd64' --class debian --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-4.9.0-8-amd64-advanced-38ea4a12-6cfe-4ed9-a8b5-036295e62ffc' {
    menuentry 'Debian GNU/Linux, with Linux 4.9.0-8-amd64 (recovery mode)' --class debian --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-4.9.0-8-amd64-recovery-38ea4a12-6cfe-4ed9-a8b5-036295e62ffc' {
Run Code Online (Sandbox Code Playgroud)

然后重新运行update-grub

  • 这种方法非常冒险,没有 GUI 控制台或串行控制台......尝试将 aws 内核更改为通用内核并重新启动 AWS EC2 实例(已部署在不支持串行控制台功能的区域) ),它无法访问。看起来,这被困在 grub 菜单本身,但 aws 仪表板系统检查呈绿色。 (3认同)
  • 问题是,当安装所需系列的新内核时,默认内核不会更新。 (2认同)

jkt*_*123 23

如评论中所述,您可以使用该grub-set-default X命令设置要启动的默认内核,其中 X 是您要启动的内核编号。在某些发行版中,您还可以通过编辑/etc/default/grub文件和设置GRUB_DEFAULT=X,然后运行update-grub.

该数字是引导期间 GRUB 菜单中显示的内核/内核设置数组的索引,0 是第一个(最顶部)条目。您通常可以通过在 中查找menuentry行来找到正确的数字/boot/grub/grub.cfg,如下所示:

grep menuentry /boot/grub/grub.cfg
Run Code Online (Sandbox Code Playgroud)

您将看到列出的每个内核都带有 GRUB 引导菜单中显示的名称。第一个为 0,第二个为 1,依此类推。

  • @Dronacharya 5年后我可以告诉你,你可能需要写下`submenu`编号(0代表顶部,1代表“高级选项”),然后写下`menuentry`编号(9),全部在引号之间,例如`GRUB_DEFAULT =“1> 9”`。 (4认同)
  • 这对我不起作用。我安装的最新内核是 **4.4.0-64-generic**(菜单项 0),但我希望 **4.4.0-59-generic**(菜单项 9)成为默认引导内核。我运行了 `grub-set-default 9` 然后是 `grub-update` 并重新启动。我让 grub 使用默认内核启动,它仍然使用 **4.4.0-64-generic** 启动。我还尝试编辑`/etc/default/grub` 并设置`GRUB_DEFAULT=9` 并运行`grub-update`。在重新启动时没有任何变化,系统仍然以 **4.4.0-64-generic** 启动。也许我错过了什么,有人可以帮助我吗? (3认同)
  • 在 Fedora 21 中,它是“/boot/grub2/grub.cfg”。 (2认同)

Ser*_*nyy 13

简单地grep 'menuentry' /boot/grub/grub.cfg列出与实际内核或操作系统版本无关的附加条目。例如,它列出了

if [ x"${feature_menuentry_id}" = xy ]; then
  menuentry_id_option="--id"
  menuentry_id_option=""
export menuentry_id_option
Run Code Online (Sandbox Code Playgroud)

我想对搜索该文件的方法提出一个小的改进:使用 awk

$ awk '/menuentry/ && /class/ {count++; print count-1"****"$0 }' /boot/grub/grub.cfg                                            
0****menuentry 'Ubuntu' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-simple-86df21bf-d95f-435c-9292-273bdbcba056' {
1****   menuentry 'Ubuntu, with Linux 3.19.0-26-generic' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-3.19.0-26-generic-advanced-86df21bf-d95f-435c-9292-273bdbcba056' {
2****   menuentry 'Ubuntu, with Linux 3.19.0-26-generic (recovery mode)' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-3.19.0-26-generic-recovery-86df21bf-d95f-435c-9292-273bdbcba056' {
3****   menuentry 'Ubuntu, with Linux 3.13.0-62-generic' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-3.13.0-62-generic-advanced-86df21bf-d95f-435c-9292-273bdbcba056' {
4****   menuentry 'Ubuntu, with Linux 3.13.0-62-generic (recovery mode)' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-3.13.0-62-generic-recovery-86df21bf-d95f-435c-9292-273bdbcba056' {
Run Code Online (Sandbox Code Playgroud)

使用下面的命令及其输出,您可以看到awk代码与实际操作系统版本匹配,并为您提供可以在/etc/default/grub文件中使用的编号。

除了/etc/default/grub手动编辑 文件,我建议使用sed. 在下面的命令中,将 X 替换为您从上面的 awk 命令中获得的适当数字:

sudo sed -i 's/GRUB_DEFAULT=0/GRUB_DEFAULT=X/g' /etc/default/grub; sudo update-grub

  • 我认为这个答案确实显着改善了提出 grep 的答案,如果您比较两者的输出,则 awk 输出更容易使用(包括数字,更易于阅读)。但是,引言可能应该重写,以便这个答案是独立的,并且读起来不像对 grep 答案的评论。 (3认同)
  • 这不是答案。它读起来像一条评论。答案应该是“这是在 GRUB 中设置默认条目的方法”,而不是“让我对另一个答案进行补充”。您可以轻松地将其编辑为正确的答案,但对 jkt123 关于使用 awk 而不是 grep 的答案发表评论可能会更明智。 (2认同)