嵌入式常用的文件系统特点

ps:此文为本人在学习了“Hi3518EV20X/Hi3516CV200 Linux开发环境用户指南.pdf”文档后,总结记录下各常用文件系统的特点,以加深印象。

常用的文件系统

嵌入式系统中比较常用的文件系统有:cramfs、JFFS2、NFS、initrd、yaffs2、Ext4、squashfs以及others…

他们的特点如下:

  • cramfs和JFFS2具有良好的空间特性(将文件数据以压缩形式存储),很适合嵌入式产品应用。
  • cramfs与squashfs为只读文件系统。
  • squashfs为压缩率最高。
  • JFFS2为可读写文件系统。
  • NFS文件系统适用于开发初期的调试阶段。
  • yaffs2文件系统只用于NAND flash.
  • initrd采用cramfs文件系统,为只读。
  • Ext4文件系统用于EMMC卡。

1、cramfs

  • 优点
    将文件数据以压缩形式存储,在需要运行时进行解压缩,能节省Flash存储空间。
  • 缺点
    由于它存储的文件是压缩的格式,所以文件系统不能直接在Flash上运行。同时,文件系统运行时需要解压数据并拷贝至内存中,在一定程度上降低读取效率,另外cramfs文件系统是只读的。

如果想在单板运行的Linux中提供cramfs的能力,必须要在编译内核是把cramfs的选项加入。在make menuconfig后,进入“File->systems”,选择“miscellaneous filesystems”,最后选中其中的“Compressed ROM file system support”。

mkfs.cramfs是用来制作cramfs文件系统映像的工具。可使用如下指令制作:
@ mkfs.cramfs ./rootbox ./cramfs-root.img
其中,rootbox是之前已经制作好的根文件系统,cramfs-root.img是生成的cramfs文件系统映像文件。

2、JFFS2

  • 优点
    使用了压缩的文件格式。最重要的特性是可读写操作。
  • 缺点
    JFFS2文件系统挂载时需要扫描整个JFFS2文件系统,因此当JFFS2文件系统分区增大时,挂载时间也会相对的变长。使用JFFS2格式可能带来少量的Flash空间的浪费。这主要是由于日志文件的过度开销和用于回收系统的无用存储单元,浪费的空间大小大致是若干个数据段。JFFS2的另一缺点是当文件系统已满或接近满时,JFFS2运行速度会迅速降低。这是因为垃圾收集的问题。

加载JFFS2文件系统的步骤如下:

  1. 扫描整个芯片,对日志节点进行校验,并且将日志节点全部装入内存缓存。
  2. 对所有日志节点进行整理,抽取有效的节点整理出文件目录信息。
  3. 找出文件系统中无效节点并将它们删除。
  4. 最后整理内存中的信息,将加载到缓存中的无效节点释放。

由此可以看出虽然这样能有效的提高系统的可靠性,但是在一定程度上降低了系统的速度。尤其是对于较大的闪存芯片,加载过程会更慢。

为了使内核支持JFFS2文件系统,必须在编译内核时把JFFS2的选项加入。在make menuconfig后,进入“File->systems”,选择“miscellaneous filesystems”,最后选中其中的“Journalling Flash File System v2(JFFS2)support”选项。

JFFS2制作方法为:
@ mkfs.jffs2 -d ./rootbox -l -e 0x20000 -o jffs2-root.img

  • rootbox:制作好的根文件系统。
  • d:指定根文件系统。
  • l:little-endian 小端模式。
  • e:Flash的块大小。
  • o:输出的映像文件。

3、yaffs2

yaffs2是专门为NAND Flash设计的嵌入式文件系统。它是日志结构的文件系统,提供了损耗平衡和掉电保护,可以有效地避免掉电对文件系统一致性和完整性的影响。

  • 优点
    专门针对NAND Flash,软件结构得到优化,速度快。
    使用硬件的spare area区域存储文件组织信息,启动时只需扫描组织信息,启动比较快。
    采用多策略垃圾回收算法,能够提高垃圾回收的效率和公平性,达到损耗平衡的目的。
  • 缺点
    没有采用压缩的文件格式。当包含相同的内容时,yaffs2镜像文件要比jffs2镜像大。

yaffs2制作方式如下:
@ mkyaffs2image ./rootbox yaffs2-root.img pagesize ecctype
其中,rootbox是之前已经制作好的根文件系统,yaffs2-root.img是生成的yaffs2文件系统镜像文件,pagesize是单板上焊接的NAND Flash器件的页大小,ecctype是单板上焊接NAND Flash器件的ecc类型。

ps:yaffs2在SDK中作为模块来提供,mkyaffs2image需要通过编译yaffs2模块生成。

4、initrd

initrd相当于存储介质,它支持的文件系统格式有ext2、cramfs等,因此内核除了要支持initrd外,还要支持cramfs文件系统。内核需要做如下配置,initrd才可以正常工作:

  1. 进入“Device Drivers->Block devices”,选择支持“RAM disk support”和“Initial RAM disk(initrd)support”。
  2. 进入“File->systems”,选择“miscellaneous filesystems”,最后选择其中的“Compressed ROM file system support”。

制作initrd的步骤如下:

  1. 制作cramfs镜像文件。
  2. 以1步骤制作的镜像文件作为输入,制作initrd文件,制作命令是“mkimage -A arm -T ramdisk -C none -a 0 -e 0 -n cramfs-initrd -d ./cramfs-image cramfs-initrd”。

5、squashfs

squashfs文件系统是一套基于Linux内核使用的压缩只读文件系统,压缩率高。

squashfs具有如下特点:

  • 数据(data),节点(inode)和目录(directories)都被压缩。
  • 保存了全部的32位UID/GIDS和文件的创建时间。
  • 最大支持 4G文件系统。
  • 检测并删除重复文件。

使用squashfs文件系统步骤:

  1. 制作支持 squashfs 的内核镜像。进入 linux-3.4.y 目录下,执行以下命令:
cp arch/arm/configs/hi3518ev200_mini_defconfig .config 
make ARCH=arm CROSS_COMPILE=arm-hisiXXX-linux- menuconfig (保存退出即可)
make ARCH=arm CROSS_COMPILE=arm-hisiXXX-linux- uImage
  1. 制作 squashfs 文件系统镜像。在发布包 SDK/package/osdrv/tools/pc_tools 目录下的
    mksquashfs 为制作 squashfs 文件系统工具。使用方法如下:
./mksquashfs rootfs ./ rootfs.squashfs.img -b 64K –comp xz

其中,rootfs 是之前已经制作好的根文件系统,rootfs.squashfs.img 是生成的 squashfs 文
件系统映像文件。-b 64K 指定 squashfs 文件系统的块大小为 64K(决定于实际 spi flash
块大小)。-comp 指定文件系统压缩方式为 xz。请根据实际情况修改参数。

6、Ext4

Ext4 文件系统是一个高效的、优秀的、可靠的和极具特点的文件系统,相对于 Ext3 的的改进是更深层次的,是文件系统数据结构方面的优化。

  1. 制作支持 Ext4 的内核镜像。进入 linux-3.4.y 目录下,执行以下命令:
cp arch/arm/configs/hi3518ev200_full_defconfig .config 
make ARCH=arm CROSS_COMPILE=arm-hisiXXX-linux- menuconfig(保存退出即可)
make ARCH=arm CROSS_COMPILE=arm-hisiXXX-linux- uImage
  1. 制作 Ext4 文件系统镜像。在发布包 SDK/package/osdrv/tools/pc_tools 目录下的
    make_ext4fs 为制作 Ext4 文件系统工具。使用方法如下:
./make_ext4f –l 32M –s rootfs.ext4.img rootfs

其中,-l 32M 是指定 uboot 中配置 emmc 的文件系统分区大小为 32M,-s 为使用 gzip
压缩,rootfs.ext4.img 是生成的 Ext4 文件系统映像文件,rootfs 是之前已经制作好的根
文件系统。请根据实际情况修改参数。

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐