首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么根文件系统被加载到ramdisk中?

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

Stack Overflow用户
提问于 2010-11-16 17:36:45
回答 2查看 7.7K关注 0票数 4

我正在研究Linux的引导过程。我偶然发现了这样一句话:"RAM比软盘快几个数量级,所以系统操作在内存中是很快的。“

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-11-16 18:29:04

SUSE Linux的documentation很好地解释了为什么使用RAMDisk引导Linux:

一旦引导了Linux内核并挂载了根文件系统(/),就可以运行程序,并且可以集成更多内核模块来提供其他功能。要装载根文件系统,必须满足某些条件。内核需要相应的驱动程序来访问根文件系统所在的设备(尤其是驱动程序)。内核还必须包含读取文件系统 (ext2、reiserfs、romfs等)所需的代码。还可以想象,根文件系统已经加密。在这种情况下,需要密码才能挂载文件系统。

对于SCSI驱动程序的问题,有许多不同的解决方案。内核可以包含所有可以想象到的驱动程序,但这可能是一个问题,因为不同的驱动程序可能会相互冲突。同样,内核也会因此变得非常大。另一种可能是提供不同的内核,每个内核只包含一个或几个SCSI驱动程序。这种方法的问题是需要大量不同的内核,然后通过不同优化的内核(Athlon优化,SMP)来增加问题。将SCSI驱动程序作为一个模块加载的想法导致了通过初始内存磁盘概念解决的一般问题:甚至在挂载根文件系统之前就运行用户空间程序。

这可防止出现鸡或蛋的潜在情况,即在访问根文件系统所在的设备之前,无法加载根文件系统,但在加载根文件系统之前,无法访问该设备:

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

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

票数 9
EN

Stack Overflow用户

发布于 2010-11-16 17:59:03

大多数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 MTDs等)中时,一些系统(抢救盘、嵌入式等)可能使用ramfs作为根文件系统。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4192736

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档