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

nit*_*ian 4 boot rootfs ramdisk

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

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

Cod*_*ray 8

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被证明是一种更简单,更具可扩展性的解决方案.


thk*_*ala 5

大多数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作为根文件系统.