繁体   English   中英

这正是Linux内核中的romfs做什么?

[英]is this exactly what romfs in Linux kernel does?

我必须使用romfs创建带有自定义可加载模块的文件系统。 但是,我有一些困惑(我仍然对内核一无所知):

  • 在阅读romfs文档: romfs之后 ,据我所知, romfs是类似于ext2, ext3, ext4....的文件系统,该文件系统用于创建内核在启动时所需的初始化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 gzip -dc initrd.img | cpio -idv ,使用romfs时,我必须使用mkinitrd创建其映像,并使用genromfs -fdv romfs.img对其进行解包。 这与内核启动时的initrd相同吗? initrd涉及压缩,而romfs不压缩,这样可以吗?

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

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

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

对于(2),您可以将romfs文件系统用作初始ram磁盘-只要存在用于访问romfs文件系统的内置内核支持即可。 区别在于initrd加载时间。 对于标准的initrd映像,它会被解压缩到用于启动启动的ramdisk中,而使用romfs映像,它并不是未压缩的,它只是按原样使用。

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

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

我不建议将romfs文件系统用作根文件系统-POSIX属性(所有权,权限)不足,无法将其作为适当的文件系统运行以用于日常日常使用(我不知道当然;我只是会发现使用这样的文件系统非常奇怪

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

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

如果您正在寻找一种具有只读根文件系统的方法,则应考虑从远程文件系统挂载只读共享。 这样,用户就没有修改文件系统的实际方法-服务器将拒绝所有写入工作。 通过使用FS-Cache/CacheFS类的功能,性能将非常不错。

由于romfs文件系统非常有限,因此基本上已经不再使用。 仅当您拥有大型只读介质并且对压缩不感兴趣时​​,才可以使用它。

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

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

当前的initrd方法使用相同的ramdisk代码,稍后也将其用于/tmp文件系统(如果以这种方式配置系统),并且该文件系统的整个初始化都在释放内存之前运行,因此不会死机启动initrd之后,代码仍保持加载状态。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM