2010-11-16 47 views
4

我正在研究Linux中的启动过程。我碰到这句话:“内存比软盘快几个数量级,所以系统操作从内存盘快速运行”为什么根文件系统加载到虚拟硬盘?

内核无论如何都会在RAM中加载根文件系统来执行它。所以我的问题为什么我们需要一个ramdisk加载根文件系统,如果内核加载根文件系统到RAM中?

+0

顺便说一下,init ramdisks(如在基于RAM的_block_ devices中),也称为initrds,现代内核版本并未真正使用。它们已被基于RAM的文件系统(ramfs)所取代。 – thkala 2010-11-16 10:07:54

回答

8

documentation为SUSE Linux提供的,为什么Linux是一个RAMDisk中启动了很好的解释:

只要Linux内核已经 引导和根文件系统(/) 安装程序可以运行并且进一步的内核模块可以被集成以提供 功能。 要装入根文件 系统,某些条件必须为 。内核需要相应的驱动程序访问 设备,其中根文件系统 位于(特别是SCSI 驱动程序)。 内核还必须包含 读取文件 系统(ext2,reiserfs,romfs等)所需的代码。 也可以想象,根文件系统 已经被加密。在 这种情况下,需要密码 安装文件系统。

对于SCSI驱动程序的问题,一个 数不同的解决方案是 可能的。内核可能包含所有可以想象的驱动程序,但这可能是 的一个问题,因为不同的驱动程序可能会相互冲突。而且, 内核因此会变得非常大 。 的另一种可能性是提供不同的内核,每个内核只包含一个或几个SCSI驱动程序。此方法存在问题 需要大量不同的内核,然后由不同优化的内核(Athlon优化,SMP)增加 内核。 加载SCSI驱动程序 的想法模块导致由初始 RAMDISK的概念解决了一般问题 :即使是根文件系统之前运行的用户空间程序 是 安装。

这防止在根文件系统不能被加载,直到它在其上位于可访问的设备的电势鸡还是先有蛋的情况,但该装置不能直到根文件系统被访问已经被加载:

初始化内存(也称为initdisk或initrd的)解决精确上述问题。 Linux内核提供了一个选项,在安装实际的根文件系统之前,将一个小文件系统加载到RAM磁盘并在那里运行程序。 initrd的加载由引导加载程序(GRUB,LILO等)处理。引导加载程序只需要BIOS例程从引导介质加载数据。 如果引导加载程序能够加载内核,它也可以加载初始ramdisk。不需要特殊的驱动程序。

当然,RAMDisk中不的引导过程中发生绝对必要。例如,您可以编译内核,其中包含所有必要的硬件驱动程序和模块以在启动时加载。但显然这对大多数人来说工作太多了,RAMDisk被证明是一个更简单,更具扩展性的解决方案。

5

大多数Linux发行版在启动时使用ramfs(initramfs)是因为它的内容可以包含在内核文件中,或由bootloader提供。因此,它们在引导时立即可用,而内核不必从任何地方加载它们。

这允许内核运行用户空间程序,例如,配置设备,加载模块,设置包含所有文件系统的漂亮RAID阵列,甚至要求用户输入其加密根文件系统的密码。

完成此配置后,将从(现在已配置且可用的)根文件系统中仅调用exec()s/sbin/init的第一个脚本。

我已经看到了很多系统,其中驱动程序为磁盘控制器和rootfs通过initramfs中的模块加载,而不是包含在内核映像中。

你不严格需要的initramfs为了启动 - 如果你的内核映像包含所有需要访问根文件系统驱动程序,你不需要任何特殊配置或用户输入(如RAID阵列或加密文件系统)安装它通常可以直接从rootfs启动/ sbin/init。

参见:

http://www.kernel.org/doc/Documentation/filesystems/ramfs-rootfs-initramfs.txt

http://www.kernel.org/doc/Documentation/initrd.txt

作为边注,一些系统(救援盘,嵌入式和例如)可以使用RAMFS作为根文件系统时的实际的根文件系统是在可能被删除或不可写的介质中(CD,Flash MTD等)。