Grub:重新启动到特定内核

Grub:重新启动到特定内核

我想要寻求grub-reboot上班方面的帮助。

理论:根据这篇博文(和其他来源)我应该能够使用 来选择下次重启的内核grub-reboot。但是,这对我来说不起作用;grub 总是启动到默认内核。

以下是我尝试过的:

$ grep GRUB_DEFAULT /etc/default/grub
GRUB_DEFAULT=saved
$ grep "menuentry " /boot/grub/grub.cfg 
menuentry 'Ubuntu' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-simple-f3a807d1-3fd6-4970-b741-5382e9801060' {
    menuentry 'Ubuntu, with Linux 4.4.0-43-generic' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-4.4.0-43-generic-advanced-f3a807d1-3fd6-4970-b741-5382e9801060' {
    menuentry 'Ubuntu, with Linux 4.4.0-43-generic (recovery mode)' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-4.4.0-43-generic-recovery-f3a807d1-3fd6-4970-b741-5382e9801060' {
    menuentry 'Ubuntu, with Linux 4.4.0-36-generic' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-4.4.0-36-generic-advanced-f3a807d1-3fd6-4970-b741-5382e9801060' {
    menuentry 'Ubuntu, with Linux 4.4.0-36-generic (recovery mode)' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-4.4.0-36-generic-recovery-f3a807d1-3fd6-4970-b741-5382e9801060' {

# Version 1, using the name
$ sudo grub-reboot "Ubuntu, with Linux 4.4.0-36-generic"

# Version 2, using the id
$ sudo grub-reboot gnulinux-4.4.0-36-generic-advanced-f3a807d1-3fd6-4970-b741-5382e9801060

# Version 3, counting
$ sudo grub-reboot 3

这两个命令似乎都不起作用;重启后,我总是得到 4.4.0-43 内核。

注意:这是在 Ubuntu 16.04 Xenial 上。这是一台服务器机器,我在启动期间无法访问控制台,所以我无法查看 grub 菜单 :(

答案1

从命令行显示 Grub 菜单项

我创建了一个脚本grub-menu.sh,以便轻松找到菜单条目编号:

grub 菜单.png


使用 Grub 菜单项号进行引导

如果您想重新启动进入内核,4.4.0-131您可以使用:

sudo grub-reboot "1>6"

获取 bash 脚本grub-menu.sh

您可以在此问答中找到 bash 脚本:无需重新启动即可显示 grub 菜单和选项?

答案2

看起来您要启动的内核位于 grub 的子菜单中(只需查看完整的grub.cfg)。man grub-reboot说:

请注意,子菜单或子子菜单中的菜单项需要指定子菜单组件,然后指定菜单项组件。标题应使用大于号 ( >) 分隔,中间不能有多余的空格。根据您的 shell,某些字符(包括 )>可能需要转义。有关此内容的更多信息,请参阅 GRUB 手册中有关“default”命令的部分。

也许类似的东西grub-reboot '2>2'会对你有用。

答案3

我曾经遇到过类似的情况,想要一种简单的方法来重新启动到不同的内核或设置默认值。Ubuntu 中生成的菜单确实让这一切变得不那么简单。

我编写了一个脚本,名为啟動核心这让事情变得更容易。它并不完美,但至少对于官方的 ubuntu 内核来说,它运行良好。

$ sudo ./boot-kernel --setup-only
changing GRUB_DEFAULT from 0 to "saved" in /etc/default/grub
apply change to /etc/default/grub
   --- /etc/default/grub    2018-01-12 19:40:38.681080878 +0000
   +++ /tmp/boot-kernel.GXbsRC  2018-01-12 19:40:50.525044373 +0000
   @@ -3,7 +3,7 @@
    # For full documentation of the options in this file, see:
    #   info -f grub -n 'Simple configuration'

   -GRUB_DEFAULT=0
   +GRUB_DEFAULT=saved
    GRUB_HIDDEN_TIMEOUT=0
    GRUB_HIDDEN_TIMEOUT_QUIET=true
    GRUB_TIMEOUT=0
execute: update-grub
Generating grub configuration file ...
Found linux image: /boot/vmlinuz-4.4.0-109-generic
Found initrd image: /boot/initrd.img-4.4.0-109-generic
Found linux image: /boot/vmlinuz-4.4.0-108-generic
Found initrd image: /boot/initrd.img-4.4.0-108-generic
done

$ sudo ./boot-kernel /boot/vmlinuz-4.4.0-108-generic
GRUB_DEFAULT already set to 'saved'. no change necessary.
selected /boot/vmlinuz-4.4.0-108-generic. entry: Advanced options for Ubuntu>Ubuntu, with Linux 4.4.0-108-generic
execute: grub-reboot "Advanced options for Ubuntu>Ubuntu, with Linux 4.4.0-108-generic"

答案4

如果您有标准 grub 菜单,以下提示将很有用。如果您有两个子菜单,则需要将子菜单编号从 更改1为子菜单具有的另一个编号,然后更改-2为另一个值。例如,如果您Submenu 2在第 3 位,则需要将该数字更改为 ,2并且可能-3menunum变量设置中。

获取内核列表并输出:

    kernlist=$(grep -i "menuentry '" /boot/grub/grub.cfg|sed -r "s|--class .*$||g")
    printf "%s$kernlist\n"

指定我们想要启动的内核版本:

    kernel=5.3.0-40-generic

如果我们的内核位于Advanced options for Ubuntu具有 MENU_ENTRY 编号的菜单后面,则获取 MENU_ENTRY 编号1

    menuline=$($kernlist | grep -ne $kernel | grep -v recovery | cut -f1 -d":")
    menunum=$(($menuline-2))

重新启动进入所需内核:

    sudo grub-reboot "1>$menunum" && reboot

需要内核版本修正但无需命令的一行解决方案reboot kernel=5.3.0-40-generic; menuline=$(grep -i "menuentry '" /boot/grub/grub.cfg|sed -r "s|--class .*$||g" | grep -ne $kernel | grep -v recovery | cut -f1 -d":") && menunum=$(($menuline-2)) && sudo grub-reboot "1>$menunum"

相关内容