在不同版本的内核之间切换而无需重新启动


11

我想在系统上安装的不同版本的内核之间切换,而无需重新启动。

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

(我需要进行实时内核调试和更改,以便无法重新启动)

Answers:


8

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

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

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


刚刚看到了您的修改。如果您手动破解并构建自己的内核进行调试,则Ksplice可能不会提供帮助,因为“服务”是它们提供了特殊的更新,而不是您可以自己生成的。

如果您只是根据官方内核构建内容,它可能仍然有效。


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


1
但是我想在我的/ boot目录中的两个不同的内核之间切换
编码器

1
是的,您将无法在两个内核之间任意切换。我添加了另一个编辑,但另一个想法可能对您有用。
奥利(Oli)

2

Oli所言,您最好的选择可能是虚拟化。

就是说,如果您要修补硬件,那么虚拟化可能不会帮您解决,在这种情况下,您可以kexec在不完全重启的情况下交换正在运行的内核。

取自ArchWiki kexec页面

kexec -l /boot/new-kernel --initrd=/boot/new-initrd --reuse-cmdline
kexec -e

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


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


0

我认为这些答案需要更新。

现在有kpatch,它比ksplice等人原生。

但是,由于显而易见的原因,它不能更改内核数据结构,因此对于安全修补程序最有用。

通常的问题始终是:运行中的进程仍会保留内核数据结构,期望内核函数期望它们并将其返回。如果没有进行这些处理,那么实际上是不可能的。因此,您必须先重新启动所有使用它们的进程,然后才能更改它们。这也需要实时修补所有这些程序。
当硬件处于特殊状态时,我什至没有提到驱动程序更改。(与kexec相同的问题。)

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.