我正计划编译我自己的内核,我以前已经做过很多次了,但一如既往,这仍然有可能出错,机器可能无法重新启动。
这台机器位于我无法物理访问的远程数据中心内,因此如果机器无法正确启动,有人亲自前往服务器修复它会花费我很多钱。
有没有一种方法可以将 grub 设置为仅在单次启动时使用新内核,但在再次启动时回退到旧内核。因此,如果计算机无法使用新内核正确启动,我可以使用远程电源管理控制台重新启动计算机,然后它会回退到旧内核。
我知道使用 lilo 可以使用该lilo -r kernel命令,是否有等效的 grub?
引用GRUB 手册中的一些内容,它为 katriel 的答案添加了一些额外的检查。
您可以教 GRUB 仅在下次引导时引导条目。假设您有一个旧内核 old_kernel 和一个新内核 new_kernel。您知道 old_kernel 可以正确引导您的系统,并且您想测试 new_kernel。
为确保即使新内核出现故障(例如,它崩溃),您的系统也能返回到旧内核,您可以指定 GRUB 应仅尝试新内核一次,然后再启动旧内核。
首先,修改您的配置文件。下面是一个例子:
default saved # This is important!!!
timeout 10
title the old kernel
root (hd0,0)
kernel /old_kernel
savedefault
title the new kernel
root (hd0,0)
kernel /new_kernel
savedefault 0 # This is important!!!
Run Code Online (Sandbox Code Playgroud)
请注意,此配置文件
default saved' (see default) at the head and在新内核的条目中使用savedefault 0'(请参阅 savedefault)。这意味着默认情况下 GRUB 会引导一个已保存的条目,并且为新内核引导该条目会将“0”保存为已保存的条目。毕竟,有了这个配置文件,GRUB 总是在引导新内核后尝试引导旧内核,因为“0”是旧内核的入口。
下一步是告诉 GRUB 在下次引导时引导新内核。为此,执行 grub-set-default(请参阅调用 grub-set-default):
# grub-set-default 1
Run Code Online (Sandbox Code Playgroud)
此命令将保存的条目设置为“1”,即新内核。
这种方法很有用,但仍然不是很健壮,因为如果引导项有任何错误,GRUB 会停止引导,从而导致新内核具有无效的可执行格式。因此,最好使用 GRUB 的回退机制。请查看此功能的下一小节。