内核升级 – Grub默认

我打算编译我自己的内核,我之前做了很多次,但是一如既往,仍然有可能出错,机器可能无法重启。

这台机器是在一个远程数据中心,我没有物理访问,因此,如果机器无法正确启动,需要有人去物理服务器来修复它,这将花费我很多。

有没有一种方法可以将grub设置为仅使用一个新的内核进行单次引导,但是在额外的重新启动时会回退到旧的内核。 所以我可以使用我的远程电源pipe理控制台重新启动机器,如果它无法正确启动新的内核,它会回落到旧的内核。

我知道这是可能的lilo使用lilo -r kernel命令,是否有一个GRUB等效?

引用一下GRUB手册 ,它为katriel的答案增加了一些额外的检查。

您可以教GRUB只在下次启动时启动一个条目。 假设你有一个旧的内核old_kernel和一个新的内核new_kernel。 你知道old_kernel可以正确启动你的系统,并且你想testingnew_kernel。

为了确保即使新内核出现故障(例如,它会出现混乱),系统也将返回到旧内核,您可以指定GRUB只应尝试一次新内核,然后再启动旧内核。

首先,修改你的configuration文件。 这里是一个例子:

  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!!! 

请注意,此configuration文件在新内核的条目中使用default saved' (see default) at the head and savedefault为0(请参见savedefault)。 这意味着GRUB默认启动一个保存的条目,引导新内核的条目将保存“0”作为保存的条目。

有了这个configuration文件,毕竟GRUB总是试图在引导新内核之后启动旧内核,因为'0'是旧内核的入口。

下一步是告诉GRUB在下次启动时启动新的内核。 为此,请执行grub-set-default(请参阅调用grub-set-default):

  # grub-set-default 1 

该命令将保存的条目设置为“1”,也就是新的内核。

这个方法是有用的,但仍然不是很健壮,因为如果引导入口中有任何错误,GRUB停止引导,这样新的内核具有无效的可执行格式。 因此,使用GRUB的后备机制更好。 请看下一小节的这个function。

你可以尝试在/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内核启动,如果发生任何故障(内核未find或内核崩溃),将使用第一个和第二个回退(如fallback指令中指定的)

请注意,手册指出缺less的内核或内核恐慌,它没有说任何关于网卡不工作。 在你的情况下,可能会像核心恐慌一样糟糕