Linux 内核如何自我更新?

Atu*_*tul 31 upgrade linux-kernel

内核如何在运行时自我更新而不破坏进程中的任何内容?

Chr*_*own 73

当您更新内核时,您实际上更新了内核。在大多数 Linux 发行版上,这实际上只是在您的包管理器中注册包,在 下/lib/modules添加新模块,在 下添加 initramfs 和内核/boot,并可能更新引导加载程序条目和其他一些杂项活动。它通常不会真正替换内存中加载的内核。

在启动时,内核本身被加载到内存中。也就是说,即使从(例如/boot/vmlinuz)加载它的文件消失了,在内核初始加载后也不需要它。

即使需要的东西(比如,调试信息),并已被替换,以开放的文件句柄到它的人已经将仍然能够使用该文件,因为备份数据之前,不会有问题的i节点被删除引用计数为 0(不过内核本身不需要这样的引用,因为它已经加载到内存中,与从用户空间可执行文件运行进程不同)。这些块通常可以从磁盘中完全释放,除非您正在该文件上运行一些用户空间程序。Linux 内核不会对自己的内存进行分页,甚至会在启动时自行解压。没有/proc/.../exe/proc/.../fd 访问引导的 /boot/vmlinuz 的方式——内核甚至可能不会挂载它在网络引导或 USB 引导情况下引导的设备。

所以一般来说,内核不会自我更新。这通常在重新启动或kexec时间完成。您所描述的那种东西确实存在于kpatchkgraftksplice 等有限用例中,但通常这些只能用于小型和有针对性的补丁,而不是新的上游内核版本。

  • 还值得注意的是,这与 Windows 或 macOS 并没有什么不同。没有现代操作系统会在线升级核心内核代码以进行完整版本更新,因为实际上几乎不可能可靠地对正在运行的可执行文件进行热补丁,除非它是一个超级目标补丁,并且您在可执行代码中有现有的检测来允许它。 (4认同)
  • [Andrew Tanenbaum 会告诉你这是微内核优于整体内核的原因之一](https://en.wikipedia.org/wiki/Tanenbaum–Torvalds_debate)。 (2认同)