我想在不重新启动的情况下在系统上安装的不同内核版本之间切换。
也就是说,如果我有3.0.0-16-generic
当前正在运行的内核并且我也有旧内核3.0.0-14-generic
,那么我也许可以3.0.0-14-generic
在不重新启动的情况下切换到(另一个内核)。
(我需要进行实时内核调试并进行更改,因此我无法重新启动)
正如奥利提到的,最好的选择可能是虚拟化。
也就是说,如果您正在修改硬件,虚拟化可能无法满足您的需要,在这种情况下,您可以使用kexec
交换正在运行的内核而无需完全重新启动。
Run Code Online (Sandbox Code Playgroud)kexec -l /boot/new-kernel --initrd=/boot/new-initrd --reuse-cmdline systemctl kexec
请注意,上述操作仍然会重新启动所有服务,包括您的 init 系统、显示服务器、网络等。但是,如果您使用足够快的 init 系统,例如systemd
,您可以在 2-3 秒内启动到新内核,因为您正在绕过 BIOS/UEFI 和引导加载程序。
在RapidReboot Ubuntu Wiki 页面上可以找到类似的描述。
没有办法换出两个完整的内核。我相信您可以理解像 Linux 这样的单片内核的重要性以及为什么它不可能简单地替换。
最接近的是使用Ksplice的实时修补过程。它将内核更新转换为神奇的垫片,可以在正在运行的内核中插入漏洞,让您无需重新启动即可无限期地保持计算机运行。出于您的目的,它还允许您回滚更改。
它对于 Ubuntu 桌面版本是免费的,因此您可以使用它,但您必须为服务器付费(最需要这种东西)。
刚看到你的编辑。如果您手动破解并构建自己的内核以进行调试,Ksplice 可能无济于事,因为“服务”是它们提供特殊更新,而它们不是您可以自己生成的。
如果您只是针对官方内核构建东西,它可能仍然有效。
另一个想法:虚拟化。您可以构建新内核并在 VM 中交换内容并重新启动。它仍然需要重新启动所需的时间,但您可以使 VM 比您的开发机器轻得多(基于 Ubuntu Server,如果您不需要它,则删除 X 服务器,等等)。