Atul Asked: 2020-01-22 05:37:28 +0800 CST2020-01-22 05:37:28 +0800 CST 2020-01-22 05:37:28 +0800 CST Linux 内核如何自我更新? 772 内核如何在运行时自我更新而不破坏过程中的任何内容? upgrade linux-kernel 1 个回答 Voted Best Answer Chris Down 2020-01-22T05:48:01+08:002020-01-22T05:48:01+08:00 更新内核时,实际上是更新了内核包。在大多数 Linux 发行版上,这实际上只是在包管理器中注册包,在 下添加新模块,在下/lib/modules添加 initramfs 和内核/boot,并可能更新引导加载程序条目和其他一些其他活动。它通常不会真正替换内存中加载的内核。 在启动时,内核本身被加载到内存中。也就是说,即使加载它的文件(例如/boot/vmlinuz)消失了,在内核初始加载后也不需要它。 即使某些东西需要它(比如调试信息)并且已经被替换,任何已经拥有打开文件句柄的人仍然可以使用该文件,因为在有问题的 inode 之前不会删除支持数据引用计数为 0(内核本身不需要这样的引用,因为它已经加载到内存中,这与从用户空间可执行文件中运行的进程不同)。除非您正在对该文件运行某些用户空间程序,否则这些块通常可以从磁盘中完全释放。Linux 内核不会对自己的内存进行分页,甚至会在启动时即时解压缩。没有/proc/.../exe或/proc/.../fd访问已启动的 /boot/vmlinuz 的方法——内核甚至可能不会挂载它在网络启动或 USB 启动情况下启动的设备。 所以一般来说,内核不会自我更新。这通常在重新启动或kexec时间完成。您所描述的这种事情确实存在于kpatch、kgraft和ksplice等有限用例中,但通常这些只能用于小型和有针对性的补丁,而不是新的上游内核版本。
更新内核时,实际上是更新了内核包。在大多数 Linux 发行版上,这实际上只是在包管理器中注册包,在 下添加新模块,在下
/lib/modules
添加 initramfs 和内核/boot
,并可能更新引导加载程序条目和其他一些其他活动。它通常不会真正替换内存中加载的内核。在启动时,内核本身被加载到内存中。也就是说,即使加载它的文件(例如
/boot/vmlinuz
)消失了,在内核初始加载后也不需要它。即使某些东西需要它(比如调试信息)并且已经被替换,任何已经拥有打开文件句柄的人仍然可以使用该文件,因为在有问题的 inode 之前不会删除支持数据引用计数为 0(内核本身不需要这样的引用,因为它已经加载到内存中,这与从用户空间可执行文件中运行的进程不同)。除非您正在对该文件运行某些用户空间程序,否则这些块通常可以从磁盘中完全释放。Linux 内核不会对自己的内存进行分页,甚至会在启动时即时解压缩。没有
/proc/.../exe
或/proc/.../fd
访问已启动的 /boot/vmlinuz 的方法——内核甚至可能不会挂载它在网络启动或 USB 启动情况下启动的设备。所以一般来说,内核不会自我更新。这通常在重新启动或
kexec
时间完成。您所描述的这种事情确实存在于kpatch、kgraft和ksplice等有限用例中,但通常这些只能用于小型和有针对性的补丁,而不是新的上游内核版本。