Linux 支撑多种文件体系,包含 ext2 、 ext3 、 vfat 、 ntfs 、 iso9660 、 jffs 、 romfs 和 nfs 等,为了对各类文件体系进行一致办理, Linux 引入了虚拟文件体系 VFS(Virtual File System) ,为各类文件体系供给一个一致的操作界面和运用编程接口。
Linux 下的文件体系结构如下:
Linux 发动时,第一个有必要挂载的是根文件体系;若体系不能从指定设备上挂载根文件体系,则体系会犯错而退出发动。之后能够主动或手动挂载其他的文件体系。因此,一个体系中能够一起存在不同的文件体系。
不同的文件体系类型有不同的特色,因此依据 存储 设备的硬件特性、体系需求等有不同的运用场合。在嵌入式 Linux 运用中,首要的 存储 设备为 RAM(DRAM, SDRAM) 和 ROM( 常选用 FLASH 存储器 ) ,常用的根据存储设备的文件体系类型包含: jffs2, yaffs, cramfs, romfs, ramdisk, ramfs/tmpfs 等。
根据 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 空间。 uC linux 体系一般选用 Romfs 文件体系。
其他文件体系: fat/fat32 也可用于实践嵌入式体系的扩展存储器 ( 例如 PDA, Smartphone, 数码相机等的 SD 卡 ) ,这首要是为了更好的与最盛行的 Windows 桌面操作体系相兼容。 ext2 也能够作为嵌入式 Linux 的文件体系,不过将它用于 FLASH 闪存会有许多坏处。