![内核升级 - Grub 默认](https://linux22.com/image/484621/%E5%86%85%E6%A0%B8%E5%8D%87%E7%BA%A7%20-%20Grub%20%E9%BB%98%E8%AE%A4.png)
我打算编译自己的内核,以前我已经做过很多次了,但是仍然有可能会出错,机器可能无法重启。
这台机器位于远程数据中心内,我无法对其进行物理访问,因此,如果机器无法正确启动,那么让某人亲自到服务器上进行修复将花费我大量的钱。
有没有办法可以设置 grub 只在一次启动时使用新内核,但在额外重启时回退到旧内核。这样,如果机器无法使用新内核正确启动,我就可以使用远程电源管理控制台重启机器,然后它会回退到旧内核。
我知道使用 lilolilo -r kernel
命令可以实现这一点,有 grub 等效命令吗?
答案1
引用一段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!!!
请注意,此配置文件
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
此命令将保存的条目设置为“1”,也就是新内核。
这种方法很有用,但仍然不够稳定,因为如果启动项中出现任何错误,例如新内核的可执行格式无效,GRUB 就会停止启动。因此,最好使用 GRUB 的回退机制。请参阅下一小节以了解此功能。
答案2
您可以尝试使用 /boot/grub/menu.lst 中的“fallback”指令。您需要指定一个或多个后备内核,并在内核节中使用 savedefault 指令作为备份,例如(取自grub 使用手册):
default saved # This is important!!!
timeout 10
fallback 1 2 # This is important!!!
title A
root (hd0,0)
kernel /kernel
savedefault fallback # This is important!!!
title B
root (hd1,0)
kernel /kernel
savedefault fallback # This is important!!!
title C
root (hd2,0)
kernel /kernel
savedefault
这将导致 A 内核启动,并且如果发生任何故障(内核未找到或内核崩溃),将使用第一个回退,然后使用第二个回退(如 fallback 指令中所指定)
请注意,手册中提到了缺少内核或内核崩溃,但并未提及网卡不工作。对于你的情况来说,这可能和内核崩溃一样糟糕