嵌入式领域中各种文件系统的介绍嵌入式领域中各种文件系统的介绍
Linux支持多种文件系统,包括ext2、ext3、vfat、ntfs、iso9660、jffs、romfs和nfs等,为了对各类文件系统 进
行统一管理,Linux引入了虚拟文件系统VFS(Virtual File System),为各类文件系统提供一个统一的操作界面和
应用编程接口。 Linux启动时,个必须挂载的是根文件系统;若系统不能从指定设备上挂载根文件系统,则系
统会出错而退出启动。之后可以自动或手动挂载其他的文件系统。因此,一个系统中可以同时存在不同的文件
系统。 不同的文件系统类型有不同的特点,因而根据存储设备的硬件特性、系统需求等有不同的应用场
合。在嵌入式Linux应用中,主要的
Linux支持多种
文件系统
,包括ext2、ext3、vfat、ntfs、iso9660、jffs、romfs和nfs等,为了对各类
文件系统
进行统一管
理,Linux引入了虚拟
文件系统
VFS(Virtual File System),为各类文件系统提供一个统一的操作界面和应用编程接口。
Linux启动时,个必须挂载的是根文件系统;若系统不能从指定设备上挂载根文件系统,则系统会出错而退出启动。之后可
以自动或手动挂载其他的文件系统。因此,一个系统中可以同时存在不同的文件系统。
不同的文件系统类型有不同的特点,因而根据存储设备的硬件特性、系统需求等有不同的应用场合。在
嵌入式
Linux应用
中,主要的存储设备为 RAM(DRAM, SDRAM)和ROM(常采用FLASH存储器),常用的基于存储设备的文件系统类型包括:
jffs2, yaffs, cramfs, romfs, ramdisk, ramfs/tmpfs等。
1.1. 基于基于FLASH的文件系统的文件系统
Flash(闪存)作为
嵌入式
系统的主要存储媒介,有其自身的特性。Flash的写入操作只能把对应位置的1修改为0,而不能把
0修改为1(擦 除Flash就是把对应存储块的内容恢复为1),因此,一般情况下,向Flash写入内容时,需要先擦除对应的存储区
间,这种擦除是以块(block)为 单位进行的。
闪存主要有NOR和NAND两种技术(简单比较见附录)。Flash存储器的擦写次数是有限的,NAND闪存还有特殊的硬件接口
和读写时序。因 此,必须针对Flash的硬件特性设计符合应用要求的文件系统;传统的文件系统如ext2等,用作Flash的文件系
统会有诸多弊端。
在
嵌入式
Linux下,MTD(Memory Technology Device,存储技术设备)为底层硬件(闪存)和上层(文件系统)之间提供一个统
一的抽象接口,即Flash的文件系统都是基于MTD驱动层的(参见上 面的Linux下的文件系统结构图)。使用MTD驱动程序的主
要优点在于,它是专门针对各种非易失性存储器(以闪存为主)而设计的,因而它对Flash有 更好的支持、管理和基于扇区的擦
除、读/写操作接口。
顺便一提,一块Flash芯片可以被划分为多个分区,各分区可以采用不同的文件系统;两块Flash芯片也可以合并为一个分
区使用,采用一个文件系统。即文件系统是针对于存储器分区而言的,而非存储芯片。
1.1.1. jffs2
JFFS文件系统早是由瑞典Axis Communications公司基于Linux2.0的内核为嵌入式系统开发的文件系统。JFFS2是
RedHat公司基于JFFS开发的闪存文件系 统,初是针对RedHat公司的嵌入式产品eCos开发的嵌入式文件系统,所以JFFS2也
可以用在Linux, uCLinux中。
Jffs2: 日志闪存文件系统版本2 (Journalling Flash FileSystem v2)
主要用于NOR型闪存,基于MTD驱动层,特点是:可读写的、支持数据压缩的、基于哈希表的日志型文件系统,并提供
了崩溃/掉电安全保护,提供“写平衡”支持等。缺点主要是当文件系统已满或接近满时,因为垃圾收集的关系而使jffs2的运行速
度大大放慢。
目前jffs3正在开发中。关于jffs系列文件系统的使用详细文档,可参考MTD补丁包中mtd-jffs-HOWTO.txt。
jffsx不适合用于NAND闪存主要是因为NAND闪存的容量一般较大,这样导致jffs为维护日志节点所占用的内存空间迅速增
大,另 外,jffsx文件系统在挂载时需要扫描整个FLASH的内容,以找出所有的日志节点,建立文件结构,对于大容量的
NAND闪存会耗费大量时间。
1.1.2. yaffs
yaffs/yaffs2(Yet Another Flash File System)是专为嵌入式系统使用NAND型闪存而设计的一种日志型文件系统。与jffs2相
比,它减少了一些功能(例如不支持数 据压缩),所以速度更快,挂载时间很短,对内存的占用较小。另外,它还是跨平台的文
件系统,除了Linux和eCos,还支持WinCE, pSOS和ThreadX等。
yaffs/yaffs2自带NAND芯片的驱动,并且为嵌入式系统提供了直接访问文件系统的API,用户可以不使用Linux中的MTD
与VFS,直接对文件系统操作。当然,yaffs也可与MTD驱动程序配合使用。
yaffs与yaffs2的主要区别在于,前者仅支持小页(512 Bytes) NAND闪存,后者则可支持大页(2KB) NAND闪存。同
时,yaffs2在内存空间占用、垃圾回收速度、读/写速度等方面均有大幅提升。
1.1.3. ubifs