我想在无需重启的情况下在系统上安装的不同版本的内核之间切换。
也就是说,如果我有一个3.0.0-16-generic
当前正在运行的内核,并且那里也有旧内核3.0.0-14-generic
,那么我可能能够切换到3.0.0-14-generic
(另一个内核)而无需重新启动。
(我需要进行实时内核调试并做出更改,因此无法重新启动)
答案1
没有办法交换两个完整的内核。我相信你能理解 Linux 这样的单片内核的意义,以及为什么它无法简单地替换。
最接近的方法是使用实时修补过程拼接。它将内核更新转换为神奇的垫片,可以填补正在运行的内核中的漏洞,让您可以无限期地保持计算机运行而无需重新启动。为了达到您的目的,它还允许您回滚更改。
Ubuntu 桌面版是免费的,所以您可以随意试用,但您必须为服务器付费(服务器最需要这种功能)。
刚刚看到您的编辑。如果您手动破解并构建自己的内核进行调试,Ksplice 可能不会有所帮助,因为“服务”是他们提供特殊更新,而这些更新不是您可以自行生成的。
如果你只是在建造东西反对作为官方内核,它可能仍然有效。
还有一个想法:虚拟化。您可以构建新内核并在虚拟机中交换内容并重新启动。它仍然需要重新启动所需的时间,但您可以使虚拟机比开发机器轻得多(基于 Ubuntu Server,如果不需要,则删除 X 服务器,等等)。
答案2
作为奥利如上所述,最好的选择可能是虚拟化。
也就是说,如果你正在摆弄硬件,虚拟化可能不适合你,在这种情况下,你可以使用kexec
无需完全重启即可交换正在运行的内核。
kexec -l /boot/new-kernel --initrd=/boot/new-initrd --reuse-cmdline systemctl kexec
注意以上仍会重新启动所有服务,包括您的初始化系统、显示服务器、网络等。但是,如果您使用足够快的初始化系统(例如),systemd
您可以在 2-3 秒内启动到您的新内核,因为您绕过了 BIOS/UEFI 和引导加载程序。
类似的描述可以在RapidReboot Ubuntu Wiki 页面。
答案3
我认为这些答案需要更新。
有补丁现在,比拼接等
但由于显而易见的原因,它无法改变内核数据结构,因此它主要用于安全热补丁。
一般的问题总是:正在运行的进程仍然保留着内核数据结构,期望内核函数能够获取它们并返回它们。如果没有为它创建这些进程,就不可能知道是否确实如此。因此,您无法更改它们,直到重新启动所有使用它们的进程。它还需要对所有这些程序进行实时修补。
我甚至没有提到当硬件处于特殊状态时驱动程序的更改。(与执行。