Linux支持多种文件系统,包括ext2、ext3、vfat、ntfs、iso9660、jffs、romfs和nfs等,为了对各种文件系统进行统一管理,Linux引入了虚拟文件系统VFS(VirtualFileSystem),为各种文件系统提供一个统一的操作界面和应用编程插口。
Linux下的文件系统结构如下:
Linux启动时,第一个必须挂载的是根文件系统;若系统不能从指定设备上挂载根文件系统,则系统会出错而退出启动。以后可以手动或自动挂载其他的文件系统。因而,一个系统中可以同时存在不同的文件系统。
不同的文件系统类型有不同的特性,因此依据储存设备的硬件特点、系统需求等有不同的应用场合。在嵌入式Linux应用中,主要的储存设备为RAM(DRAM,SDRAM)和ROM(常采用FLASH储存器),常用的基于储存设备的文件系统类型包括:jffs2,yaffs,cramfs,romfs,ramdiskLINUX虚机,ramfs/tmpfs等。
1.基于FLASH的文件系统
Flash(闪存)作为嵌入式系统的主要储存媒介,有其自身的特点。Flash的写入操作只能把对应位置的1更改为0,而不能把0更改为1(擦除Flash就是把对应储存块的内容恢复为1),因而,通常情况下,向Flash写入内容时,须要先擦除对应的储存区间,这些擦除是以块(block)为单位进行的。
闪存主要有NOR和NAND两种技术(简单比较见附表)。Flash储存器的擦写次数是有限的,NAND闪存还有特殊的硬件插口和读写时序。为此,必须针对Flash的硬件特点设计符合应用要求的文件系统;传统的文件系统如ext2等,用作Flash的文件系统会有众多隐忧。
在嵌入式Linux下,MTD(MemoryTechnologyDevice,储存技术设备)为底层硬件(闪存)和下层(文件系统)之间提供一个统一的具象插口,即Flash的文件系统都是基于MTD驱动层的(参见前面的Linux下的文件系统结布光)。使用MTD驱动程序的主要优点在于,它是专门针对各类非易失性储存器(以闪存为主)而设计的,因此它对Flash有更好的支持、管理和基于磁道的擦除、读/写操作插口。
顺便一提,一块Flash芯片可以被界定为多个分区,各分区可以采用不同的文件系统;两块Flash芯片也可以合并为一个分区使用,采用一个文件系统。即文件系统是针对于储存器分区而言的,而非储存芯片。
(1)jffs2
JFFS文件系统最早是由法国AxisCommunicaTIons公司基于Linux2.0的内核为嵌入式系统开发的文件系统。JFFS2是RedHat公司基于JFFS开发的闪存文件系统,最初是针对RedHat公司的嵌入式产品eCos开发的嵌入式文件系统,所以JFFS2也可以用在Linux,uCLinux中。
Jffs2:日志闪存文件系统版本2(JournallingFlashFileSystemv2)
主要用于NOR型闪存,基于MTD驱动层,特征是:可读写的、支持数据压缩的、基于哈希表的日志型文件系统,并提供了崩溃/掉电安全保护,提供“写平衡”支持等。缺点主要是当文件系统已满或接近满时,由于垃圾搜集的关系而使jffs2的运行速率大大放慢。
目前jffs3正在开发中。关于jffs系列文件系统的使用详尽文档,可参考MTD补丁包中mtd-jffs-HOWTO.txt。
jffsx不适宜用于NAND闪存主要是由于NAND闪存的容量通常较大,这样造成jffs为维护日志节点所占用的显存空间迅速减小,另外,jffsx文件系统在挂载时须要扫描整个FLASH的内容,以找出所有的日志节点,构建文件结构,对于大容量的NAND闪存会花费大量时间。
(2)yaffs:YetAnotherFlashFileSystem
yaffs/yaffs2是专为嵌入式系统使用NAND型闪存而设计的一种日志型文件系统。与jffs2相比,它减轻了一些功能(比如不支持数据压缩),所以速率更快,挂载时间很短,对显存的占用较小。另外,它还是跨平台的文件系统,不仅Linux和eCos,还支持WinCE,pSOS和ThreadX等。
yaffs/yaffs2自带NAND芯片的驱动linux为只读文件系统,但是为嵌入式系统提供了直接访问文件系统的API,用户可以不使用Linux中的MTD与VFSlinux为只读文件系统,直接对文件系统操作。其实redhat linux 9.0,yaffs也可与MTD驱动程序配合使用。
yaffs与yaffs2的主要区别在于,后者仅支持小页(512Bytes)NAND闪存,前者则可支持大页(2KB)NAND闪存。同时,yaffs2在显存空间占用、垃圾回收速率、读/写速率等方面均有急剧提高。
(3)Cramfs:CompressedROMFileSystem
Cramfs是Linux的创始人LinusTorvalds参与开发的一种只读的压缩文件系统。它也基于MTD驱动程序。
在cramfs文件系统中,每一页(4KB)被单独压缩,可以随机页访问,其压缩比高达2:1,为嵌入式系统节约大量的Flash储存空间,使系统可通过更低容量的FLASH储存相同的文件,因而减少系统成本。
Cramfs文件系统以压缩方法储存,在运行时解压缩,所以不支持应用程序以XIP形式运行,所有的应用程序要求被拷到RAM里去运行,但这并不代表比Ramfs需求的RAM空间要大一点,由于Cramfs是采用分页压缩的形式储存档案,在读取档案时,不会一下子就耗损过多的显存空间,只针对目前实际读取的部份分配显存,尚没有读取的部份不分配显存空间,当我们读取的档案不在显存时,Cramfs文件系统手动估算压缩后的资料所存的位置,再即时解压缩到RAM中。
另外,它的速率快,效率高,其只读的特性有利于保护文件系统免受破坏,增强了系统的可靠性。
因为以上特点,Cramfs在嵌入式系统中应用广泛。
并且它的只读属性同时又是它的一大缺陷,促使用户难以对其内容对进扩展。
Cramfs映像一般是置于Flash中,并且也能置于别的文件系统里,使用loopback设备可以把它安装别的文件系统里。
(4)Romfs
传统型的Romfs文件系统是一种简单的、紧凑的、只读的文件系统,不支持动态擦写保存,按次序储存数据,从而支持应用程序以XIP(eXecuteInPlace,片内运行)形式运行,在系统运行时,节约RAM空间。uClinux系统一般采用Romfs文件系统。
其他文件系统:fat/fat32也可用于实际嵌入式系统的扩充储存器(比如PDA,Smartphone,数码单反等的SD卡),这主要是为了更好的与最流行的Windows桌面操作系统相兼容。ext2也可以作为嵌入式Linux的文件系统,不过将它用于FLASH闪存会有众多恶果。