我想要寻求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 菜单项号进行引导
如果您想重新启动进入内核,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
并且可能-3
在menunum
变量设置中。
获取内核列表并输出:
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"