内核升级 - Grub 默认

内核升级 - Grub 默认

我打算编译自己的内核,以前我已经做过很多次了,但是仍然有可能会出错,机器可能无法重启。

这台机器位于远程数据中心内,我无法对其进行物理访问,因此,如果机器无法正确启动,那么让某人亲自到服务器上进行修复将花费我大量的钱。

有没有办法可以设置 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 指令中所指定)

请注意,手册中提到了缺少内核或内核崩溃,但并未提及网卡不工作。对于你的情况来说,这可能和内核崩溃一样糟糕

相关内容