2

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

  • 看完romfs文档:romfs,据我所知,romfs是一个类似于 的文件系统ext2, ext3, ext4....,用于创建内核启动时需要的init ramdisk。不过据说romfs从2.1.21版开始就被纳入内核了:romfs homepage。在主页上,我们只能下载genromfs用于创建romfs图像文件的实用程序。所以,我想在这里明确一点:romfs内核中包含的模块是用来读取romfs文件系统的,genromfs是用来创建的,不是吗(我试过了genromfs,但我想确认一下)?

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

  • 如果是这样,则必须将romfs模块内置到内核中,以便在内核启动的早期阶段进行读取,对吗?在我的系统中,我们有一台无盘机器,目前,initrd它被用作引导阶段文件系统以及最终的根文件系统。但是,由于romfs是只读的,使用romfs被拒绝的用户写入文件系统的能力(所以,我们不能做类似的事情echo "something" > /tmp/something.txt)?

4

2 回答 2

2

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

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

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

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

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

我不建议将 romfs 文件系统用作根文件系统 - POSIX 属性(所有权、权限)不足以使其作为适合日常使用的文件系统运行(我不知道肯定的;我只是觉得使用这样的文件系统很奇怪

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

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

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

于 2012-05-15T08:10:40.983 回答
2

romfs文件系统今天基本上已经不再使用,因为它非常有限。如果你有一个大的只读介质并且对压缩不感兴趣,你只会使用它。

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

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

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

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

于 2012-05-15T08:12:17.283 回答