我通读了这个流行的 IBM 文档(我在网上经常看到它)解释了初始 RAM 磁盘的功能。
不过,我在概念化其工作原理时遇到了困难。
在文档中它说
引导加载程序(例如 GRUB)识别要加载的内核并复制该内核内核映像和任何关联的 initrd 到内存中
我已经很困惑了:它将整个内核复制到内存中还是只是其中的一部分?如果整个内核都在内存中,那么为什么我们还需要初始 RAM 磁盘呢?
我认为 initrd 的目的是能够拥有一个小的通用内核映像,并且 initrd 将在加载内核映像之前在其中安装正确的模块。但是如果整个内核已经在内存中,为什么我们还需要 initrd 呢?
这也带来了另一件让我困惑的事情——加载到内核中的模块位于哪里?所有的内核模块都存储在 initrd 中吗?
答案1
整个内核在启动时加载到内存中,通常与initramfs
现在一起加载。 (仍然可以将系统设置为无需启动,initramfs
但这在台式机和服务器上并不常见。)
的initramfs
作用是提供挂载“真实”文件系统并继续引导系统所需的功能。这涉及内核模块,以及各种二进制文件:您至少需要udev
,也许一些网络,以及kmod
加载模块。
模块可以在启动之后加载到内核中,因此initramfs
.它们可以存储在任何地方:initramfs
在/lib/modules
真实的文件系统上,在开发树中(如果您正在开发模块)...只需initramfs
包含挂载根文件系统(包含其余部分)所需的模块。
答案2
整个内核(但不是其模块)将被加载到内存中。如果在任何文件系统可用之前内核需要某些模块(这通常意味着文件系统及其设备的驱动程序),那么这些模块将位于 initramfs (内存中)中,内核将从那里加载它们。其他模块可以稍后从文件系统加载。
答案3
大多数现代 Linux 设置中的内核很大程度上是基于模块的,即内核本身(在启动时加载到 RAM 中)仅包含最基本的功能,其余所有功能都编译为模块(可在运行时加载)。为了使其工作,即使启动所需的设备或文件系统是模块,也会initramfs
加载内核(顾名思义,这是一个带有简单文件系统的 RAM 区域,在启动时安装)。该临时文件系统安装在 上/
,包含启动程序和所需的模块。一旦启动initramfs
完成,Linux 就会执行 a pivot_root(8)
,安装真实的文件/
并删除initramfs
内容。
这种复杂性的关键在于,例如,发行版可以编译一内核(最小内核和全套模块),并在安装内核时创建initramfs
适合目标机器的硬件和设置的内核。由于“个人计算机”的设备和配置多种多样,因此需要所有这些。