认识romfs文件系统

1.1 什么是romfs

romfs是一个只读文件系统,主要用在 mainly for initial RAM disks of installation disks.使用romfs文件系统可以构造出一个最小的内核,并且很节省内存。

相比而言,早期的minix和xiafs(现在已经过时)文件系统如果编译为模块的形式则大小超过20000字节(在x86机器上大小为38502字节),

而romfs却小于一页(在linux系统中,一页大小为PAGE_OFFSET,一般为4K),大约4000字节(在x86机器上大小为10479字节)。

在相同的条件下,msdos文件系统模块大约30K(并且不支持设备节点和符号链接,在x86机器上大小为12K)。

ntfs和nfsroot文件系统模块大约57K(在x86机器上大小为102K)。

注:上面叙述中的数值都是针对i586机器,括号中叙述的数值是在现在的x86机器上的大小,针对2.6.28内核。

1.2 romfs的用途

romfs本设计的主要目标是构造一个最小内核,在内核中只链接romfs文件系统,这样就可以使用romfs在稍后加载其他模块。

romfs也可以用来运行一些程序,从而决定你是否需要SCSI设备,或者IDE设备,或者如果你使用的是"initrd"结构的内核,romfs也可以用来在之后加载软驱驱动。

romfs的另一个用途是在你使用romfs文件系统的时候,你可以关闭ext2或者minix甚至affs文件系统直到你确信需要的时候再开启。

1.3 romfs的性能

romfs的操作是基于块设备的,它的底层结构非常简单。为了快速访问,每个单元被设计为起始于16字节边界。一个最小的文件为32字节(文件内容为空,并且文件名长度小于16字节)。

对于一个非空文件的最大的开销是位于文件内容前面的文件头和其后的16字节的文件名(因为大多数的文件名长度大于3字节并且小于15字节,所以预置文件名长度为16字节)。

1.4 如何使用romfs映像

要使用一个制作好的romfs格式的映像,是将其挂载在其他文件系统的某个节点上。并且还有一个很重要的前提,就是内核要支持romfs文件系统。

这一点可以通过配置内核实现,有两个方法:

1.将romfs配置成直接编译进内核,方法为使用make menuconfig命令进入内核配置界面,选择"File systems"并进入,选择“Miscellaneous filesystems”并进入,选择“ROM file system support(ROMFS)”,将其配置成"*"(直接编译进内核)。

这样生成的内核就直接包含对romfs文件系统的支持。

2.将romfs配置成模块的形式,步骤和前面一样,只是在最后选择"ROM file system support(ROMFS)“的时候将其配置成"M”(编译为内核模块)。

这样编译好的内核并不包含对romfs文件系统的支持,只是生成了romfs.ko模块(fs/romfs/romfs.ko),需要在启动系统后将其加载进内核才能使内核支持romfs文件系统。

有了内核对romfs文件系统的支持,就可以直接挂载romfs格式的映像了,挂载方法为:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18

niutao@niutao:~/kernel/romfs$ ls

hello.img

niutao@niutao:~/kernel/romfs$ file hello.img

hello.img: romfs filesystem, version 1 208 bytes, named rom 49e05ac0.

niutao@niutao:~/kernel/romfs$ sudo mount -o loop hello.img /mnt

niutao@niutao:~/kernel/romfs$ cd /mnt/

niutao@niutao:/mnt$ ls

hello.c

niutao@niutao:/mnt$

可以看到使用mount命令将hello.img挂载到了/mnt目录下,其内只有一个文件。

卸载一个已经被挂载的romfs格式映像使用umount命令。

1.5如何制作romfs映像

如果要创建一个romfs文件系统,需要使用genromfs工具。具体用法为:

-f IMAGE 指定输出romfs映像的名字

-d DIRECTORY 指定源目录(将该目录制作成romfs文件系统)

-v 显示详细的创建过程

-V VOLUME 指定卷标

-a ALIGN 指定普通文件的对齐边界(默认为16字节)

-A ALIGN,PATTERN 匹配参数PATTERN的对象对齐在ALIGN边界上

-x PATTERN 不包括匹配PATTERN的对象。

-h 显示帮助文档。

手工生成ROMFS文件系统

建立ROMFS文件系统之前应该手工建立文件系统树,例如通常ROMFS包含如下目录:

1
2

/bin /dev /etc /lib /proc /sbin /tmp /usr /var

然后我们可以将交叉编译好的应用程序放入/bin目录中,之后使用genromfs工具来建立文件系统的映象,如:

genromfs -v -V “ROM Disk” -f romfs.img -d romfs > romfs.map

最后,可以与内核文件连接在一起,然后烧入Flash中。

cat linux.bin romfs.img > image.bin

在Windows上生成ROMFS

在Windows上生成ROMFS(只读文件系统)镜像的工具有很多,其中一种常用的方法是使用Cygwin,它提供了一组UNIX工具和环境,包括用于创建ROMFS的工具。以下是使用Cygwin的简要步骤:

安装Cygwin:

下载并运行Cygwin的安装程序。

在安装向导中,选择需要的软件包,确保包括romfs或类似的工具。这些工具通常在"Utils"或"Archivers"类别下。

创建ROMFS目录结构:

在你的Windows文件系统中创建一个包含你要添加到ROMFS的文件和目录的文件夹。

打开Cygwin终端:

打开Cygwin终端(通常是通过Cygwin的图标或快捷方式)。

使用genromfs工具创建ROMFS镜像:

在Cygwin终端中,使用genromfs命令创建ROMFS镜像。例如,以下是一个示例命令:

1
2

genromfs -f my_romfs.img -d /path/to/your/files

这将在当前工作目录中创建一个名为my_romfs.img的ROMFS镜像,其中包含/path/to/your/files目录中的所有文件和子目录。

在你的应用程序中使用ROMFS:

将生成的ROMFS镜像(my_romfs.img)嵌入到你的嵌入式应用程序中,以便在运行时访问其中的文件和目录。

请注意,上述步骤是使用Cygwin在Windows上生成ROMFS镜像的一种方法。如果你更喜欢使用Python脚本,你可以编写一个Python脚本来自定义生成ROMFS的过程,但需要了解ROMFS文件系统的结构和格式,以便正确创建镜像。通常,ROMFS包含文件的元数据(例如文件名、权限等)以及实际的文件数据。

另外,也有其他一些第三方工具和库可以在Windows上生成ROMFS镜像,具体取决于你的需求和项目。