无需引导加载程序即可从运行的 Linux 直接引导至另一个内核

无需引导加载程序即可从运行的 Linux 直接引导至另一个内核

有没有一种方法可以从正在运行的 Linux 直接引导到磁盘上的另一个内核,而无需重置机器并通过引导加载程序?

理论上,Linux 应该能够将另一个内核加载到 RAM 中,也加载 initrd,正常关闭所有内容shutdown,然后将控制权传递给新内核。

有没有一种实用的方法可以做到这一点?

答案1

听起来您正在寻找执行程序

文档中的示例:

例如,如果您要重启的内核映像是/boot/vmlinux,/proc/cmdline的内容是root=/dev/hda1,initrd的路径是/boot/initrd,那么您可以使用以下命令加载内核:

kexec -l /boot/vmlinux --append=root=/dev/hda1 --initrd=/boot/initrd

加载该内核后,可以使用以下命令随时启动它:

kexec -e

答案2

关于“如关闭”:

这几乎与关闭时一样:pid 1当然,包括在内的所有进程都被擦除,因为甚至内核也被擦除并重新加载。但是一些固件内容(EFI 变量)可能会挂起,因为 kexec 不是完全重新启动。

如果您不(编译和)测试一个又一个内核,kexec 的用途有限。这是“实验性的”。

但尝试一下很酷:它处于重新启动和运行级别更改之间(无论这在 systemd 时代意味着什么,或者事实上,在 Linux 中一直如此)。经过几次成功的尝试后,它崩溃了,所以我就这样吧。 (但什么也没发生。)

我刚刚读到最新评论:

这个想法是至少卸载现有的文件系统等。

但这与 ctrl-alt-del 是同样的问题,尤其是在没有 systemd 的情况下。很抱歉持怀疑态度,但是使用 sysvinit 的关闭过程确实已经有点棘手了(对于 systemd 也是如此)。 “受控关闭”与 kexec(或 ctrl-alt-del)一起对我来说似乎有点矛盾。

我总是做一些“等等”。在我“拔掉系统插头”之前:关闭/保存文件、关闭 Firefox、检查 tmpfs 挂载、卸载分区...然后:rebootpoweroffhaltshutdowninit 6, init 0、 ctrl-alt-del 甚至 ON/OFF 按钮五个秒...我不希望 kexec 作为潜在问题的另一个来源。


几天后添加:

事实上systemd集成了kexec( man systemctl)。我很遗憾称这个想法“有点矛盾”,但坚持我的观点:为什么不在正常重启后几秒钟后在引导加载程序的命令行中选择(或手动输入)该内核命令行?

答案3

您可以efibootmgr检查启动项的编号BootNext(通常包含4位数字),然后运行以下命令:

# efibootmgr --bootnext BootNext

来自 EFIBOOTMGR(8):

• BootNext - 计划在下次启动时运行的启动项。这仅取代一次引导的 BootOrder,并在第一次使用后被引导管理器删除。这允许您更改下一次引导行为,而无需更改引导顺序。

相关内容