这正是Linux内核中的romfs吗?

时间:2012-05-15 06:56:33

标签: linux linux-kernel kernel

我必须使用romfs创建一个带有自定义可加载模块的文件系统。但是,我有一些困惑(我还不熟悉内核的东西):

  • 阅读romfs文档:romfs后,据我所知,romfs是一个类似于ext2, ext3, ext4....的文件系统,用于创建init ramdisk内核在启动时需要。但是,据说自版本2.1.21 romfs homepage以来romfs已合并到内核中。在主页上,我们只能下载genromfs实用程序,该实用程序用于创建romfs图像文件。所以,我想在这里说清楚:内核中包含的模块romfs用于读取romfs文件系统,而genromfs用于创建一个,不是吗(我试过{ {1}},但我希望得到确认)?

  • genromfsinitrd在源目录(要加载的文件系统)创建,并由mkinitrd -allow-missing -f initrd.img kernel-version解包,在使用romfs时,我必须创建其图像使用gzip -dc initrd.img | cpio -idv并使用以下内容对其进行解包:mkinitrd。这与内核启动时的initrd相同吗? genromfs -fdv romfs.img涉及压缩,而initrd不是,这可以吗?

  • 如果是这样,必须在内核中构建romfs模块,以便在早期内核启动阶段进行读取,是吗?在我的系统中,我们有一个无盘机器,目前,romfs用作启动阶段文件系统以及最终的根文件系统。但是,由于initrd仅用于读取,因此使用romfs拒绝用户写入文件系统的能力(因此,我们不能执行romfs之类的操作)?

2 个答案:

答案 0 :(得分:2)

对于(1),是的,模块romfs是支持简单只读文件系统的文件系统,该系统实现起来非常简单。程序genroms允许您创建一个romfs文件系统的实例,该系统可以在加载了romfs模块的内核下安装和访问。

genromfs工具生成一个文件系统映像,可以放在块设备上,也可以放在预先存在的文件系统上的文件上。

对于(2),只要有用于访问romfs文件系统的编译内核支持,就可以使用romfs文件系统作为初始ram磁盘。不同之处在于initrd加载时间。对于标准initrd映像,它会被解压缩到用于启动引导的ramdisk中,使用romfs映像,它不是未压缩的,只是按原样使用。

使用romfs映像作为文件系统的主要原因是它可以放在一个只读内存块上,并以这种方式直接访问,而无需为扩展的ramdisk使用物理内存图像。

对于(3),是的,您必须将文件系统作为内置组件而不是可加载模块编译到系统中 - 即您为Y选项选择“rom file system”在内核文件系统配置中。

我不建议使用romfs文件系统作为根文件系统 - 没有足够的POSIX属性(所有权,权限)允许它作为正常的日常使用的正确文件系统运行(我不是我肯定知道;我会发现使用这样的文件系统非常奇怪

initrd在运行时被解压缩到内存中,因此在重新启动系统后不会保留对文件系统的任何写入。如果该扩展的ramdisk上的文件系统具有适当的权限,则内核应阻止普通用户对磁盘上的特定内容进行更改。您不允许用户以root身份登录系统,并依赖文件系统的权限来阻止对文件的修改。

它是只读且不可修改的这一事实意味着如果你想要一个/ tmp文件,那么你需要创建该目录作为genromfs调用的一部分,然后你会有将tmpfs挂载到该挂载点以执行对该目录的写入。

如果您正在寻找一种只读根文件系统的方法,那么您应该考虑从远程文件系统安装只读共享;这样,用户就没有实际的方法来修改文件系统 - 所有写入工作都会被服务器拒绝。通过使用像FS-Cache/CacheFS这样的功能,性能会非常好。

答案 1 :(得分:2)

romfs文件系统今天已基本停止使用,因为它非常有限。如果你有一个大的只读媒体而且对压缩没兴趣,你只会使用它。

以前是initrd是从加载它的RAM块安装的romfs图像,卸载后,RAM块被释放;这已被tmpfs实例(基于读/写RAM的文件系统)取代,该实例使用来自cpio格式存档(类似于ZIP文件)的数据进行初始化。

在启动过程中有一点是内核卸载所有永远不需要的代码(“释放初始化内存”),这发生在进程1启动之前。使用romfs方法,此时initrd从initrd映像挂载,因此访问romfs映像以及initrd代码所需的代码必须保持在此处加载,这意味着您最终会死掉一些系统启动后的内核代码。

当前的initrd方法使用相同的ramdisk代码,该代码稍后也用于/tmp文件系统(如果您的系统以这种方式配置),并且该文件系统的整个初始化在内存点之前运行被释放,因此在启动initrd后仍然没有加载死代码。

无法写入romfs和cpio格式的initrds;新的代码路径首先将数据复制到可写文件系统,这允许您的initrd脚本写入数据;但是这永远不会写回图像。