无需重启即可在不同版本的内核之间切换

cod*_*der 11 kernel

我想在不重新启动的情况下在系统上安装的不同内核版本之间切换。

也就是说,如果我有3.0.0-16-generic当前正在运行的内核并且我也有旧内核3.0.0-14-generic,那么我也许可以3.0.0-14-generic在不重新启动的情况下切换到(另一个内核)。

(我需要进行实时内核调试并进行更改,因此我无法重新启动)

Att*_* O. 9

正如奥利提到的,最好的选择可能是虚拟化。

也就是说,如果您正在修改硬件,虚拟化可能无法满足您的需要,在这种情况下,您可以使用kexec交换正在运行的内核而无需完全重新启动。

摘自ArchWikikexec页面

kexec -l /boot/new-kernel --initrd=/boot/new-initrd --reuse-cmdline
systemctl kexec
Run Code Online (Sandbox Code Playgroud)

请注意,上述操作仍然会重新启动所有服务,包括您的 init 系统、显示服务器、网络等。但是,如果您使用足够快的 init 系统,例如systemd,您可以在 2-3 秒内启动到新内核,因为您正在绕过 BIOS/UEFI 和引导加载程序。


在RapidReboot Ubuntu Wiki 页面上可以找到类似的描述。


Oli*_*Oli 8

没有办法换出两个完整的内核。我相信您可以理解像 Linux 这样的单片内核的重要性以及为什么它不可能简单地替换。

最接近的是使用Ksplice的实时修补过程。它将内核更新转换为神奇的垫片,可以在正在运行的内核中插入漏洞,让您无需重新启动即可无限期地保持计算机运行。出于您的目的,它还允许您回滚更改。

它对于 Ubuntu 桌面版本是免费的,因此您可以使用它,但您必须为服务器付费(最需要这种东西)。


刚看到你的编辑。如果您手动破解并构建自己的内核以进行调试,Ksplice 可能无济于事,因为“服务”是它们提供特殊更新,而它们不是您可以自己生成的。

如果您只是针对官方内核构建东西,它可能仍然有效。


另一个想法:虚拟化。您可以构建新内核并在 VM 中交换内容并重新启动。它仍然需要重新启动所需的时间,但您可以使 VM 比您的开发机器轻得多(基于 Ubuntu Server,如果您不需要它,则删除 X 服务器,等等)。