![无需引导加载程序即可从运行的 Linux 直接引导至另一个内核](https://linux22.com/image/161774/%E6%97%A0%E9%9C%80%E5%BC%95%E5%AF%BC%E5%8A%A0%E8%BD%BD%E7%A8%8B%E5%BA%8F%E5%8D%B3%E5%8F%AF%E4%BB%8E%E8%BF%90%E8%A1%8C%E7%9A%84%20Linux%20%E7%9B%B4%E6%8E%A5%E5%BC%95%E5%AF%BC%E8%87%B3%E5%8F%A6%E4%B8%80%E4%B8%AA%E5%86%85%E6%A0%B8.png)
有没有一种方法可以从正在运行的 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 挂载、卸载分区...然后:reboot
、poweroff
、halt
、shutdown
、init 6,
init 0
、 ctrl-alt-del 甚至 ON/OFF 按钮五个秒...我不希望 kexec 作为潜在问题的另一个来源。
几天后添加:
事实上systemd集成了kexec( man systemctl
)。我很遗憾称这个想法“有点矛盾”,但坚持我的观点:为什么不在正常重启后几秒钟后在引导加载程序的命令行中选择(或手动输入)该内核命令行?
答案3
您可以efibootmgr
检查启动项的编号BootNext(通常包含4位数字),然后运行以下命令:
# efibootmgr --bootnext BootNext
来自 EFIBOOTMGR(8):
• BootNext - 计划在下次启动时运行的启动项。这仅取代一次引导的 BootOrder,并在第一次使用后被引导管理器删除。这允许您更改下一次引导行为,而无需更改引导顺序。