为什么根文件系统被加载到ramdisk?

时间:2010-11-16 09:36:45

标签: boot ramdisk rootfs

我正在研究Linux中的启动过程。我遇到这句话“RAM比软盘快几个数量级,所以系统操作从ramdisk很快”

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

2 个答案:

答案 0 :(得分:8)

SUSE Linux的documentation很好地解释了为什么用RAMDisk启动Linux的原因:

  

Linux内核一直存在   启动和根文件系统(/)   安装,程序可以运行和   进一步的内核模块可以   集成提供额外的   功能。 安装根文件   系统,必须具备一定的条件   满足。内核需要   相应的驱动程序访问   设备所在的根文件系统   位于(特别是SCSI   驱动程序)。 内核也必须包含   读取文件所需的代码   系统(ext2,reiserfs,romfs等)。   也可以想到根   文件系统已加密。在   在这种情况下,需要密码   挂载文件系统。

     

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

这可以防止在可以访问根文件系统直到可以访问它的设备之前无法加载的鸡或蛋情况,但是在加载根文件系统之前无法访问该设备:

  

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

当然,RAMDisk不是严格必要的,用于启动进程。例如,您可以编译包含要在启动时加载的所有必需硬件驱动程序和模块的内核。但显然这对大多数人来说太过分了,RAMDisk被证明是一种更简单,更具可扩展性的解决方案。

答案 1 :(得分:5)

大多数Linux发行版在引导时使用ramfs(initramfs)的原因是因为其内容可以包含在内核文件中,或者由引导加载程序提供。因此,它们在引导时立即可用,而内核不必从某处加载它们。

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

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

我见过很多系统,其中驱动程序是用于磁盘控制器的,而rootfs是通过initramfs中的模块加载的,而不是包含在内核映像中。

如果您的内核映像包含访问rootfs所需的所有驱动程序而您不需要任何特殊配置或用户输入(如RAID阵列或已加密),那么您不需要严格需要启动initramfs文件系统)安装它,通常可以直接从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作为根文件系统