文件系统简介
嵌入式系统中常用文件系统包括有 SquashFS、 JFFS2、 NFS 以及 YAFFS2。它们的特点如下:
· SquashFS 和 JFFS2 具有好的空间特性,很适合嵌入式产品应用。
· SquashFS 为只读文件系统。
· JFFS2 为可读写文件系统。
· NFS 文件系统适用于开发初期的调试阶段。
· YAFFS2 文件系统只用于 NAND Flash。
1.
JFFS2
JFFS2 是 RedHat 的 David
Woodhouse 在 JFFS 基础上改进的文件系统,是用于微型嵌入式设备的原始闪存芯片的实际文件系统。 JFFS2 文件系统是日志结构化的可读写的文件系统。
JFFS2 的优缺点如下:
· 优点
使用了压缩的文件格式。最重要的特性是可读写操作。
· 缺点
JFFS2 文件系统挂载时需要扫描整个 JFFS2 文件系统,因此当 JFFS2 文件系统分区增大时,挂载时间也会相应的变长。使用JFFS2 格式可能带来少量的 Flash 空间的浪费。这主要是由于日志文件的过度开销和用于回收系统的无用存储单元,浪费的空间大小大致是若干个数据段。 JFFS2 的另一缺点是当文件系统已满或接近满时, JFFS2 运行速度会迅速降低。这是因为垃圾收集的问题。
加载 JFFS2 文件系统时的步骤如下:
1. 扫描整个芯片,对日志节点进行校验,并且将日志节点全部装入内存缓存。
2. 对所有日志节点进行整理,抽取有效的节点并整理出文件目录信息。
3. 找出文件系统中无效节点并且将它们删除。
4. 最后整理内存中的信息,将加载到缓存中的无效节点释放。
----结束
由此可以看出虽然这样能有效地提高系统的可靠性,但是在一定程度上降低了系统的速度。尤其对于较大的闪存芯片,加载过程会更慢。
为了使内核支持 JFFS2 文件系统,必须在编译内核时把 JFFS2 的选项加入(我们发布的内核默认已经加入了支持)。在 make
ARCH=arm CROSS_COMPILE=armhisiv100nptl-linux- menuconfig 后,进入“ File systems”,选择“miscellaneous filesystems”,最后选中其中的“ Journalling
Flash File System v2 (JFFS2) support”选项(SDK 里面提供的内核默认已经选择了该文件系统的支持)。
JFFS2 的制作方法为:
hisilicon$ mkfs.jffs2 -d ./rootfs -l -e 0x20000 -o jffs2-root.img
参数 说明
d:指定根文件系统
l:little-endian 小端模式
e:Flash 的块大小
o:输出映像文件
2. NFS
使用 SquashFS 和 JFFS2 时,需要先将根文件系统映像烧入 Flash,系统启动时会从Flash 中加载。但是在系统开发或移植的初期,需要经常修改或者添加应用程序。每修改一次就需要重新烧入一次,这样做不仅耗费时间,而且对 Flash 的寿命会有影响。
NFS 是一种分布式的文件系统,用于共享文件和打印机。它允许用户调用挂载远端的文件系统或设备来实现共享,使用方式与挂载本机的文件系统一样。 NFS 使用“客户-服务器”模型。在这种模型中,服务器输出需要共享的目录,客户可通过网络挂载这些目录并访问其中的文件。
使用 NFS 作为挂载的文件系统,内核会根据预先设置好的内核命令参数挂载一个 NFS sever 中输出的目录作为其根目录。这个过程不需要任何对 Flash 的操作,修改应用程序完全在 Linux 服务器中进行,非常适于开发初期的调试阶段。
在 Linux 服务器配置 NFS 文件系统的方法为:编辑/etc/exports 配置文件,添加路径及参数,然后执行/etc/init.d/
nfs start启动 NFS 服务。
以上操作必须超级用户完成,且导出的目录必须是绝对路径。如果 NFS 服务已经开启,在配置文件后只需重新启动 NFS 服务,即/etc/init.d/
nfs restart。
在 Linux 服务器上配置好 NFS 根文件系统后,在单板侧挂载 NFS 文件系统,具体操作
如下:
ifconfig eth0 hw ether 00:10:85:18:01:84 /*配置MAC地址*/
ifconfig eth0 10.85.180.184 netmask 255.255.254.0 /*配置IP地址和子网掩码*/
route add default gw 10.85.180.1 /*配置默认网关*/
mount -t nfs -o nolock 10.85.180.133:/home/c54122/glibc-nfs /mnt /*挂载NFS目录至JFFS2文件系统的mnt目录下*/
3. YAFFS2
YAFFS2 是专门为 NAND Flash 设计的嵌入式文件系统。它是日志结构的文件系统,提供了损耗平衡和掉电保护,可以有效地避免意外掉电对文件系统一致性和完整性的影响。
YAFFS2 的优缺点如下:
· 优点
− 专门针对 NAND Flash,软件结构得到优化,速度快。
− 使用硬件的 spare area 区域存储文件组织信息,启动时只需扫描组织信息,启动比较快。
− 采用多策略垃圾回收算法,能够提高垃圾回收的效率和公平性,达到损耗平衡的目的。
· 缺点
没有采用压缩的文件格式。当包含的内容相同时, YAFFS2 镜像文件要比 jffs2 镜像文件大。
YAFFS2 文件系统在 SDK 中作为一个模块提供。只需在 YAFFS2 代码中的 Makefile 中加入所依赖的内核代码路径,进行编译,即可生成 YAFFS2 文件系统模块。
YAFFS2 镜像文件的制作和 SquashFS 相同,即通过工具制作,只需简单的几个参数,具体如下:
hisilicon$ mkyaffs2image ./rootfs ./yaffs2-root.img pagesize ecctype
其中, rootfs 是之前已经制作好的根文件系统, yaffs2-root.img 是生成的 YAFFS2 文件系统镜像文件, pagesize 是单板上焊接 NAND
Flash 器件的页大小, ecctype 是单板上焊接 NAND
Flash 器件的 ecc 类型。
4. SquashFS
SquashFS 是另一种可用于 flash 设备的 Linux 只读文件系统。 SquashFS 具有极高的压缩率,数据(data),节点(inode)和目录(directories)都被压缩。常用于存储介质很有限的场景。
SquashFS 保存了全部的 32 位 UID/GIDS 和文件的创建时间,支持多达 4G 的文件系统, SquashFS 使用简单,响应速度快。
SquashFS 是一种新的文件系统,它对 CramFS 的特点作了进一步的改进,并突破了CramFS 的一些限制。其优点如下:
· SquashFS 具有更高的压缩率
· SquashFS 的响应速度更快
· CramFS 文件系统支持的最大文件为 16M,而 SquashFS 多达 4G
· CramFS 文件系统大小限制略大于 256M,而 SquashFS 多达 4G
如果要使用 SquashFS,需要在内核中增加相应的配置选项: make
ARCH=arm CROSS_COMPILE=arm-hisiv100nptl-linux- menuconfig;然后选择下面选项
File systems --->
[*] Miscellaneous filesystems --->
<*> SquashFS 4.0 - Squashed file system support
mksquashfs 是用来制作 SquashFS 文件系统映象的工具。通过这个工具处理已经制作好的根文件系统,就可以生成
SquashFS 文件系统的映象,制作 SquashFS 的方法: ./mksquashfs ./rootfs ./rootfs.squashfs.img -b 256K,其中:
· rootfs 是已经制作好的根文件系统。
· rootfs.squashfs.img 是生成的 SquashFS 文件系统映像文件。
· -b 256K 指定 SquashFS 文件系统的块大小为 256K。