我正在研究 Linux 中的引导过程。我遇到了这句话“RAM比软盘快几个数量级,所以系统操作从ramdisk快速”
无论如何,内核都会将根文件系统加载到 RAM 中以执行它。所以我的问题是,如果内核将根文件系统加载到 RAM 中,为什么我们需要一个 ramdisk 来加载根文件系统?
SUSE Linux的文档很好地解释了为什么使用 RAMDisk 引导 Linux:
一旦 Linux 内核启动并挂载了根文件系统 (/),就可以运行程序并集成更多内核模块以提供附加功能。要挂载根文件系统,必须满足某些条件。内核需要相应的驱动程序才能访问根文件系统所在的设备(尤其是SCSI驱动程序)。内核还必须包含读取文件系统所需的代码(ext2、reiserfs、romfs 等)。也可以想象,根文件系统已经被加密了。在这种情况下,安装文件系统需要密码。
对于 SCSI 驱动程序的问题,可能有许多不同的解决方案。内核可以包含所有可以想象的驱动程序,但这可能是一个问题,因为不同的驱动程序可能会相互冲突。此外,内核会因此变得非常大。另一种可能性是提供不同的内核,每个内核只包含一个或几个 SCSI 驱动程序。这种方法的问题是需要大量不同的内核,然后通过不同优化的内核(Athlon 优化,SMP)增加了这个问题。 将 SCSI 驱动程序作为模块加载的想法导致了由初始 ramdisk 概念解决的一般问题:甚至在安装根文件系统之前运行用户空间程序。
这可以防止潜在的先有鸡还是先有蛋的情况,即在可以访问根文件系统所在的设备之前无法加载根文件系统,但在加载根文件系统之前无法访问该设备:
初始 ramdisk(也称为 initdisk 或 initrd)正好解决了上述问题。Linux 内核提供了一个选项,即在安装实际的根文件系统之前将一个小文件系统加载到 RAM 磁盘并在其中运行程序。initrd 的加载由引导加载程序(GRUB、LILO 等)处理。引导加载程序只需要 BIOS 例程即可从引导介质加载数据。如果引导加载程序能够加载内核,它也可以加载初始 ramdisk。不需要特殊的驱动程序。
当然,RAMDisk 并不是启动过程所必需的。例如,您可以编译一个内核,其中包含所有必要的硬件驱动程序和要在启动时加载的模块。但显然这对大多数人来说工作量太大,而 RAMDisk 被证明是一种更简单、更具可扩展性的解决方案。
大多数 Linux 发行版在启动时使用 ramfs (initramfs) 的原因是因为它的内容可以包含在内核文件中,或者由引导加载程序提供。因此,它们在启动时立即可用,而内核不必从某个地方加载它们。
这允许内核运行用户空间程序,例如配置设备、加载模块、设置包含所有文件系统的漂亮 RAID 阵列,甚至询问用户加密根文件系统的密码。
完成此配置后,从(现在已配置且可用)根文件系统中调用的第一个脚本只是 exec()s /sbin/init。
我见过不少系统,其中磁盘控制器和 rootfs 的驱动程序本身是通过 initramfs 中的模块加载的,而不是包含在内核映像中。
您并不严格需要initramfs 来引导 - 如果您的内核映像包含访问 rootfs 所需的所有驱动程序,并且您不需要任何特殊配置或用户输入(如 RAID 阵列或加密文件系统)来挂载它,通常可以直接从 rootfs 启动 /sbin/init。
也可以看看:
http://www.kernel.org/doc/Documentation/filesystems/ramfs-rootfs-initramfs.txt
http://www.kernel.org/doc/Documentation/initrd.txt
附带说明一下,当实际的根文件系统位于可能被删除或不可写的介质(CD、Flash MTD 等)中时,某些系统(救援磁盘、嵌入式等)可能会使用 ramfs 作为根文件系统。