Answers:
没有办法换出两个完整的内核。我相信您可以理解像Linux这样的单片内核的重要性,以及为什么不能简单地替换它。
最接近的是使用Ksplice进行实时修补的过程。它将内核更新转换为神奇的垫片,可以填充正在运行的内核中的漏洞,使您可以无限期地保持计算机开机而无需重新启动。出于您的目的,它还使您可以回滚更改。
它对于Ubuntu桌面版本是免费的,因此您可以试用它,但是您必须为服务器付费(最需要这种服务)。
刚刚看到了您的修改。如果您手动破解并构建自己的内核进行调试,则Ksplice可能不会提供帮助,因为“服务”是它们提供了特殊的更新,而不是您可以自己生成的。
如果您只是根据官方内核构建内容,它可能仍然有效。
另一个想法:虚拟化。您可以构建新内核,然后在VM中交换内容并重新启动。它仍然需要花费一些时间来重新启动,但是您可以使VM的强度比开发计算机的轻得多(基于Ubuntu Server,如果不需要,则删除X服务器,等等)。
如Oli所言,您最好的选择可能是虚拟化。
就是说,如果您要修补硬件,那么虚拟化可能不会帮您解决,在这种情况下,您可以kexec
在不完全重启的情况下交换正在运行的内核。
kexec -l /boot/new-kernel --initrd=/boot/new-initrd --reuse-cmdline kexec -e
请注意,上述操作仍将重新启动所有服务,包括您的init系统,显示服务器,网络等。但是,如果您使用速度足够快的init系统(例如)systemd
,则可以在2-3秒内引导到新内核中,因为您将绕过BIOS / UEFI和引导程序。
在RapidReboot Ubuntu Wiki页面上可以找到类似的描述。
我认为这些答案需要更新。
现在有kpatch,它比ksplice等人原生。
但是,由于显而易见的原因,它不能更改内核数据结构,因此对于安全修补程序最有用。
通常的问题始终是:运行中的进程仍会保留内核数据结构,期望内核函数期望它们并将其返回。如果没有进行这些处理,那么实际上是不可能的。因此,您必须先重新启动所有使用它们的进程,然后才能更改它们。这也需要实时修补所有这些程序。
当硬件处于特殊状态时,我什至没有提到驱动程序更改。(与kexec相同的问题。)