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

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

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

也就是说,如果我有一个3.0.0-16-generic当前正在运行的内核,并且那里也有旧内核3.0.0-14-generic,那么我可能能够切换到3.0.0-14-generic(另一个内核)而无需重新启动。

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

答案1

没有办法交换两个完整的内核。我相信你能理解 Linux 这样的单片内核的意义,以及为什么它无法简单地替换。

最接近的方法是使用实​​时修补过程拼接。它将内核更新转换为神奇的垫片,可以填补正在运行的内核中的漏洞,让您可以无限期地保持计算机运行而无需重新启动。为了达到您的目的,它还允许您回滚更改。

Ubuntu 桌面版是免费的,所以您可以随意试用,但您必须为服务器付费(服务器最需要这种功能)。


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

如果你只是在建造东西反对作为官方内核,它可能仍然有效。


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

答案2

作为奥利如上所述,最好的选择可能是虚拟化。

也就是说,如果你正在摆弄硬件,虚拟化可能不适合你,在这种情况下,你可以使用kexec无需完全重启即可交换正在运行的内核。

摘自ArchWikikexec页面

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

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


类似的描述可以在RapidReboot Ubuntu Wiki 页面

答案3

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

补丁现在,比拼接

但由于显而易见的原因,它无法改变内核数据结构,因此它主要用于安全热补丁。

一般的问题总是:正在运行的进程仍然保留着内核数据结构,期望内核函数能够获取它们并返回它们。如果没有为它创建这些进程,就不可能知道是否确实如此。因此,您无法更改它们,直到重新启动所有使用它们的进程。它还需要对所有这些程序进行实时修补。
我甚至没有提到当硬件处于特殊状态时驱动程序的更改。(与执行

相关内容