Linux支撑多种文件体系,包含ext2、ext3、vfat、ntfs、iso9660、jffs、romfs和nfs等,为了对各类文件体系进行一致办理,Linux引入了虚拟文件体系VFS(Virtual File System),为各类文件体系供给一个一致的操作界面和运用编程接口。
Linux下的文件体系结构如下:
Linux下的文件体系结构
Linux发动时,第一个有必要挂载的是根文件体系;若体系不能从指定设备上挂载根文件体系,则体系会犯错而退出发动。之后能够主动或手动挂载其他的文件体系。因此,一个体系中能够一同存在不同的文件体系。
不同的文件体系类型有不同的特色,因此依据存储设备的硬件特性、体系需求等有不同的运用场合。在嵌入式Linux运用中,首要的存储设备为 RAM(DRAM, SDRAM)和ROM(常选用FLASH存储器),常用的根据存储设备的文件体系类型包含:jffs2, yaffs, cramfs, romfs, ramdisk, ramfs/tmpfs等。
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) 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闪存会消耗很多时刻。
(2) yaffs:Yet Another Flash File System
yaffs/yaffs2是专为嵌入式体系运用NAND型闪存而规划的一种日志型文件体系。与jffs2比较,它减少了一些功用(例如不支撑数据紧缩),所以速度更快,挂载时刻很短,对内存的占用较小。其他,它仍是跨渠道的文件体系,除了Linux和eCos,还支撑WinCE, pSOS和ThreadX等。
yaffs/yaffs2自带NAND芯片的驱动,而且为嵌入式体系供给了直接拜访文件体系的API,用户能够不运用Linux中的MTD与VFS,直接对文件体系操作。当然,yaffs也可与MTD驱动程序合作运用。
yaffs与yaffs2的首要差异在于,前者仅支撑小页(512 Bytes) NAND闪存,后者则可支撑大页(2KB) NAND闪存。一同,yaffs2在内存空间占用、废物收回速度、读/写速度等方面均有大幅进步。
(3) Cramfs:Compressed ROM File System
Cramfs是Linux的创始人 Linus Torvalds参加开发的一种只读的紧缩文件体系。它也根据MTD驱动程序。
在cramfs文件体系中,每一页(4KB)被独自紧缩,能够随机页拜访,其紧缩比高达2:1,为嵌入式体系节约很多的Flash存储空间,使体系可经过更低容量的FLASH存储相同的文件,然后下降体系本钱。
Cramfs文件体系以紧缩方法存储,在运转时解紧缩,所以不支撑运用程序以XIP方法运转,一切的运用程序要求被拷到RAM里去运转,但这并不代表比Ramfs需求的RAM空间要大一点,因为Cramfs是选用分页紧缩的方法寄存档案,在读取档案时,不会一会儿就耗用过多的内存空间,只针对现在实践读取的部分分配内存,尚没有读取的部分不分配内存空间,当咱们读取的档案不在内存时,Cramfs文件体系主动核算紧缩后的材料所存的方位,再即时解紧缩到RAM中。
其他,它的速度快,效率高,其只读的特色有利于保护文件体系免受损坏,进步了体系的可靠性。
因为以上特性,Cramfs在嵌入式体系中运用广泛。
可是它的只读特点一同又是它的一大缺陷,使得用户无法对其内容对进扩大。
Cramfs映像一般是放在Flash中,可是也能放在其他文件体系里,运用loopback 设备能够把它装置其他文件体系里。
(4) Romfs
传统型的Romfs文件体系是一种简略的、紧凑的、只读的文件体系,不支撑动态擦写保存,按次序寄存数据,因此支撑运用程序以XIP(eXecute In Place,片内运转)方法运转,在体系运转时,节约RAM空间。uClinux体系一般选用Romfs文件体系。
其他文件体系:fat/fat32也可用于实践嵌入式体系的扩展存储器(例如PDA, Smartphone, 数码相机等的SD卡),这首要是为了更好的与最盛行的Windows桌面操作体系相兼容。ext2也能够作为嵌入式Linux的文件体系,不过将它用于 FLASH闪存会有许多坏处。
2. 根据RAM的文件体系
(1) Ramdisk
Ramdisk是将一部分固定巨细的内存当作分区来运用。它并非一个实践的文件体系,而是一种将实践的文件体系装入内存的机制,而且能够作为根文件体系。将一些常常被拜访而又不会更改的文件(如只读的根文件体系)经过Ramdisk放在内存中,能够明显地进步体系的功能。
在Linux的发动阶段,initrd供给了一套机制,能够将内核映像和根文件体系一同载入内存。
(2)ramfs/tmpfs
Ramfs是Linus Torvalds开发的一种根据内存的文件体系,作业于虚拟文件体系(VFS)层,不能格式化,能够创立多个,在创立时能够指定其最大能运用的内存巨细。 (实践上,VFS本质上可当作一种内存文件体系,它一致了文件在内核中的表明方法,并对磁盘文件体系进行缓冲。)
Ramfs/tmpfs文件体系把一切的文件都放在RAM中,所以读/写操作发生在RAM中,能够用ramfs/tmpfs来存储一些临时性或常常要修正的数据,例如/tmp和/var目录,这样既避免了对Flash存储器的读写损耗,也进步了数据读写速度。
Ramfs/tmpfs相关于传统的Ramdisk的不同之处首要在于:不能格式化,文件体系巨细可随所含文件内容巨细改变。
Tmpfs的一个缺陷是当体系从头引导时会丢掉一切数据。
3. 网络文件体系NFS (Network File System)
NFS是由Sun开发并发展起来的一项在不同机器、不同操作体系之间经过网络共享文件的技能。在嵌入式Linux体系的开发调试阶段,能够使用该技能在主机上树立根据NFS的根文件体系,挂载到嵌入式设备,能够很方便地修正根文件体系的内容。
以上评论的都是根据存储设备的文件体系(memory-based file system),它们都可用作Linux的根文件体系。实践上,Linux还支撑逻辑的或伪文件体系(logical or pseudo file system),例如procfs(proc文件体系),用于获取体系信息,以及devfs(设备文件体系)和sysfs,用于保护设备文件。
附录:NOR闪存与NAND闪存比较