为什么我们不在内核本身中包含文件系统驱动程序,而是使用 Initrd/Initramfs

为什么我们不在内核本身中包含文件系统驱动程序,而是使用 Initrd/Initramfs

Linux 内核包含在大多数设备上启动所需的非常少的代码,但我不明白拥有 Initrd/Initramfs 的意义。
据我了解,Initrd/Initramfs 的工作是临时提供文件系统驱动程序以实际加载根文件系统。
如果是这种情况,那么我们为什么不简单地将必要的文件系统驱动程序添加到内核本身中。
我们最终必须加载内核和 Initrd/Initramfs,所以为什么不将两者集成到一个映像文件中,因为它们占用相同的内存量。


******更新********

1. Linux 内核实际上是由什么构成的?它只是 vmlinuz 映像(大约 5-6MB)还是可加载模块、vmlinuz 映像、initrd 文件和其他组件的集合。
2. 为什么内核映像vmlinuz 的大小(约5-6MB)小于initrd 文件的大小(约18MB)。与仅包含挂载文件系统的代码的 initrd 相比,内核包含许多其他内容的代码。

答案1

首先,这不仅仅是文件系统驱动程序。它也是文件系统所在的任何存储设备的驱动程序。如果您使用 LVM、加密等,可能还会更多。

无论如何,绝对有可能将它们构建到内核中。我知道 slackware 至少有一个名为“huge”的内核选择,它就是这样做的,并且不需要典型 PC 硬件的 initramfs。

缺点是这样的内核必须包含任何人可能需要的所有内容:可能用作 root 的每个可能的文件系统、可能保存该文件系统的设备驱动程序等。因此,您最终会得到一个臃肿的内核,其中包含很多内容未使用的代码并浪费内存。

我认为还有一些驱动程序只能构建为内核模块,但这更多的是一种设计选择,而不是真正的技术限制。

对编辑的答复:

  1. 这可能取决于你问的是谁以及在什么情况下。对我来说,它是在内核空间中运行的所有内容,因此包括所有驱动程序。内核开发人员可能有不同的观点,对不同的部分有更多的名称。

  2. 实际上,绝大多数内核代码都是可加载的模块和驱动程序。其中一些相当大。在我的系统上,仅 btrfs 就压缩了 500 kB。 NFS 几乎同样大。 ext4 为 300 kB。还有大量受支持的存储设备,您可能需要其中任何一个来获取根文件系统。只需/lib/modules/*/kernel/drivers/在 Linux 系统上浏览一下,您就会看到。

答案2

这有点像先有鸡还是先有蛋的问题...您可以(并且通常应该)让许多驱动程序成为模块,它可以使您的内核保持精简并节省内存(直到您需要该模块为止)。然而你需要一些内置于内核中的驱动程序 - 专门用于您从其启动的任何设备(例如 CD-ROM 驱动器、HDD...)、使用的文件系统(例如 iso9660、ext4...)以及支持所需的任何其他驱动程序这个(例如 USB 支持、SCSI 支持……)。如果你,您的内核将无法访问附加驱动程序模块所在的介质和文件系统,因此无法将它们加载到内核中。

如果您为自己的系统制作定制内核 - 您事先知道您拥有什么硬件(HDD 类型、DVD 驱动器类型等) - 这不是问题。您只需要您实际拥有或认为您可能需要的驱动程序。您只需将启动时所需的驱动程序包含到内核中即可。

但是,如果您为发行版制作安装光盘,则必须包含以下驱动程序一切皆有可能硬件用户很可能会遇到!将它们全部包含到内核中,会使内核无可救药地臃肿,并且在低端系统上会占用过多的 RAM。制作所有驱动程序模块是行不通的,因为加载它们可能需要这些模块。解决办法是initrd

initrd 是在启动时加载到内存中的 RAM 磁盘的映像。所有可能需要的驱动程序都将其作为模块。只要内核包含读取 DVD、读取 DVD 上的文件系统以及读取 RAM 磁盘的驱动程序即可;它将能够根据需要从 initrd 访问和加载驱动程序模块。这为那些制作发行版的人解决了问题,使内核既小又包含其可能运行的每个硬件的驱动程序。

大多数用户在硬盘上安装 Linux 后可能会继续使用 initrd-boot...这并不是真正必要的,因为他们可以构建一个自定义内核 - 也许带有额外的内核模块 - 为他们实际获得的硬件定制。首先加载 initrd 的两步过程在引导过程中需要一些额外的时间。

相关内容