如何在 Debian 中设置默认内核?

Hei*_*eit 8 linux grub boot debian grub2

我有一个5.10.0-11-cloud-amd64内核并且已经5.10.0-12-amd64在 Debian 上安装了内核11.2。我想 5.10.0-12-amd64暂时设置为默认内核。我是 Grub 新手,如何将默认内核设置为5.10.0-12-amd64?我的/lib/modules

5.10.0-10-cloud-amd64  5.10.0-11-cloud-amd64  5.10.0-12-cloud-amd64
5.10.0-11-amd64        5.10.0-12-amd64
Run Code Online (Sandbox Code Playgroud)

我的/boot/只有grub文件夹,没有grub2文件夹。命令grep -e "menuentry " -e submenu -e linux /boot/grub/grub.cfg产量:

### BEGIN /etc/grub.d/10_linux ###
set linux_gfx_mode=
export linux_gfx_mode
menuentry 'Debian GNU/Linux' --class debian --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-simple-ccb4ba21-fd62-42c9-b8eb-75a437b1747d' {
    linux   /boot/vmlinuz-5.10.0-12-cloud-amd64 root=UUID=ccb4ba21-fd62-42c9-b8eb-75a437b1747d ro console=tty0 console=ttyS0,115200 earlyprintk=ttyS0,115200 consoleblank=0 
submenu 'Advanced options for Debian GNU/Linux' $menuentry_id_option 'gnulinux-advanced-ccb4ba21-fd62-42c9-b8eb-75a437b1747d' {
    menuentry 'Debian GNU/Linux, with Linux 5.10.0-12-cloud-amd64' --class debian --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-5.10.0-12-cloud-amd64-advanced-ccb4ba21-fd62-42c9-b8eb-75a437b1747d' {
        linux   /boot/vmlinuz-5.10.0-12-cloud-amd64 root=UUID=ccb4ba21-fd62-42c9-b8eb-75a437b1747d ro console=tty0 console=ttyS0,115200 earlyprintk=ttyS0,115200 consoleblank=0 
    menuentry 'Debian GNU/Linux, with Linux 5.10.0-12-cloud-amd64 (recovery mode)' --class debian --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-5.10.0-12-cloud-amd64-recovery-ccb4ba21-fd62-42c9-b8eb-75a437b1747d' {
        linux   /boot/vmlinuz-5.10.0-12-cloud-amd64 root=UUID=ccb4ba21-fd62-42c9-b8eb-75a437b1747d ro single console=tty0 console=ttyS0,115200 earlyprintk=ttyS0,115200 consoleblank=0
    menuentry 'Debian GNU/Linux, with Linux 5.10.0-12-amd64' --class debian --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-5.10.0-12-amd64-advanced-ccb4ba21-fd62-42c9-b8eb-75a437b1747d' {
        linux   /boot/vmlinuz-5.10.0-12-amd64 root=UUID=ccb4ba21-fd62-42c9-b8eb-75a437b1747d ro console=tty0 console=ttyS0,115200 earlyprintk=ttyS0,115200 consoleblank=0 
    menuentry 'Debian GNU/Linux, with Linux 5.10.0-12-amd64 (recovery mode)' --class debian --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-5.10.0-12-amd64-recovery-ccb4ba21-fd62-42c9-b8eb-75a437b1747d' {
        linux   /boot/vmlinuz-5.10.0-12-amd64 root=UUID=ccb4ba21-fd62-42c9-b8eb-75a437b1747d ro single console=tty0 console=ttyS0,115200 earlyprintk=ttyS0,115200 consoleblank=0
    menuentry 'Debian GNU/Linux, with Linux 5.10.0-11-cloud-amd64' --class debian --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-5.10.0-11-cloud-amd64-advanced-ccb4ba21-fd62-42c9-b8eb-75a437b1747d' {
        linux   /boot/vmlinuz-5.10.0-11-cloud-amd64 root=UUID=ccb4ba21-fd62-42c9-b8eb-75a437b1747d ro console=tty0 console=ttyS0,115200 earlyprintk=ttyS0,115200 consoleblank=0 
    menuentry 'Debian GNU/Linux, with Linux 5.10.0-11-cloud-amd64 (recovery mode)' --class debian --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-5.10.0-11-cloud-amd64-recovery-ccb4ba21-fd62-42c9-b8eb-75a437b1747d' {
        linux   /boot/vmlinuz-5.10.0-11-cloud-amd64 root=UUID=ccb4ba21-fd62-42c9-b8eb-75a437b1747d ro single console=tty0 console=ttyS0,115200 earlyprintk=ttyS0,115200 consoleblank=0
    menuentry 'Debian GNU/Linux, with Linux 5.10.0-11-amd64' --class debian --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-5.10.0-11-amd64-advanced-ccb4ba21-fd62-42c9-b8eb-75a437b1747d' {
        linux   /boot/vmlinuz-5.10.0-11-amd64 root=UUID=ccb4ba21-fd62-42c9-b8eb-75a437b1747d ro console=tty0 console=ttyS0,115200 earlyprintk=ttyS0,115200 consoleblank=0 
    menuentry 'Debian GNU/Linux, with Linux 5.10.0-11-amd64 (recovery mode)' --class debian --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-5.10.0-11-amd64-recovery-ccb4ba21-fd62-42c9-b8eb-75a437b1747d' {
        linux   /boot/vmlinuz-5.10.0-11-amd64 root=UUID=ccb4ba21-fd62-42c9-b8eb-75a437b1747d ro single console=tty0 console=ttyS0,115200 earlyprintk=ttyS0,115200 consoleblank=0
### END /etc/grub.d/10_linux ###
### BEGIN /etc/grub.d/20_linux_xen ###
### END /etc/grub.d/20_linux_xen ###

Run Code Online (Sandbox Code Playgroud)

感谢 telcoM 提供上述命令

tel*_*coM 13

首先,检查/etc/default/grub. GRUB_DEFAULT=里面应该有一个变量。如果设置为GRUB_DEFAULT=0或未设置,默认情况下将启动启动菜单中的第一个条目(条目#0)。如果它设置为除 以外的任何值 GRUB_DEFAULT=saved,则可靠地更改默认值的唯一方法是进行编辑GRUB_DEFAULT=/etc/default/grub然后以 root 身份运行update-grub(或grub-mkconfig > /boot/grub/grub.cfg)。

如果设置 GRUB_DEFAULT=saved,则两个命令 、grub-rebootgrub-set-default将可用。前者会将内核设置为仅引导一次,然后返回到之前的默认值。后者将切换 GRUB 默认条目,直到您通过使用grub-set-default或在 GRUB 引导菜单中选择其他内容再次更改它。

最简单的默认设置形式仅指定菜单条目编号(从顶部的条目 #0 开始)。但现代 GRUB 菜单通常构造为在第一个位置包含最新的内核,然后在第二个位置包含所有其他内核的子菜单,以及该子菜单之后的任何其他操作系统和其他自定义条目。

要以有用的方式查看 GRUB 菜单,请运行grep -e "menuentry " -e submenu -e linux /boot/grub/grub.cfg。(需要后面的空格menuentry来过滤掉一些错误的点击。)您将看到许多相当长的menuentrysubmenu行,其顺序与真实菜单的顺序完全相同。此外,子菜单的条目将缩进,而主菜单条目则不会。这将允许您查看当前活动 GRUB 菜单的结构,而无需重新启动系统。

最上面的菜单项的标题通常只是“Debian GNU/Linux”,没有内核版本号,但我上面给出的命令也会列出linux /boot/vmlinuz-<kernel version number> ...作为第一个菜单项块一部分的命令,这将显示确切的命令将由最顶层条目引导的内核版本。

如果您需要选择子菜单内的菜单项(即其menuentry行缩进),则默认项规范应该是该行的标识符submenu、一个>字符,然后是您想要的实际菜单项的标识符。菜单项标识符可以是菜单项编号(每个菜单中从 0 开始)、标识符字符串($menuentry_id_option每个menuentrysubmenu行后面的引号字符串)或每个菜单项和子菜单的可见标题。

Linux 内核的标识符字符串似乎采用gnulinux-simple-<Linux root filesystem UUID>第一个条目以及gnulinux-<kernel version>-advanced-<Linux root filesystem UUID>“高级选项...”子菜单中的条目的形式。

美式英语配置的 Debian 11 中可见的菜单项标题为第一项为“Debian GNU/Linux”,子菜单为“Advanced options for Debian GNU/Linux”,非子菜单为“Debian GNU/Linux, with Linux”。 - 子菜单中的恢复模式条目。

因此,假设您的 GRUB 菜单没有其他操作系统使问题变得复杂,您可以将内核设置5.10.0-12-amd64为默认值,直到您通过编辑以下GRUB_DEFAULT=行将其更改回来/etc/default/grub

GRUB_DEFAULT="1>Debian GNU/Linux, with Linux 5.10.0-12-amd64"
Run Code Online (Sandbox Code Playgroud)

update-grub以 root 身份运行。

如果您想要更大的灵活性,您可以设置GRUB_DEFAULT=saved、运行update-grub,然后运行grub-set-default "1>Debian GNU/Linux, with Linux 5.10.0-12-amd64"以更改默认值,直到将其更改回来,或者运行grub-reboot "1>Debian GNU/Linux, with Linux 5.10.0-12-amd64"以仅更改一次启动的默认值。

1>前缀来自于首先选择子菜单条目的要求,并且它始终是主 GRUB 菜单中的第二个条目(即菜单项#1)。

如果您使用grub-set-default,您可以通过使用 ,根据简单的字母数字排序返回当前“最新”的任何内核grub-set-default 0

请记住,每个菜单级别中的第一个条目编号为#0。对于菜单项,您可以将menuentry 'Debian GNU/Linux, with Linux 5.10.0-12-amd64'带有菜单项编号的行指定为:

GRUB_DEFAULT="1>2"
Run Code Online (Sandbox Code Playgroud)

即第二个条目(条目#1)打开子菜单,然后选择子菜单的第三个条目(条目#2)。

或者菜单标题为:

GRUB_DEFAULT="Advanced options for Debian GNU/Linux>Debian GNU/Linux, with Linux 5.10.0-12-amd64"
Run Code Online (Sandbox Code Playgroud)

或者使用菜单 ID 字符串:

GRUB_DEFAULT="gnulinux-advanced-ccb4ba21-fd62-42c9-b8eb-75a437b1747d>gnulinux-5.10.0-12-amd64-advanced-ccb4ba21-fd62-42c9-b8eb-75a437b1747d"
Run Code Online (Sandbox Code Playgroud)

或者使用上述方法的任意组合。

使用菜单标题或 ID 字符串的优点是,即使您安装和删除内核软件包,只要所选内核仍然可用,它们也会继续引用相同的内核。使用菜单项编号需要您在每次内核更新后检查(并在必要时调整)设置,因此如果与任何类型的自动更新一起使用,可能会导致令人讨厌的意外。