嵌入式linux文件系统


  • 空间

我的理解:JFFS 是比较早的FALSH文件系统,最初为NOR FALSH设计的,将FLASH作为一种循环的块日志,把块分为废弃的,有效的,未利用的。当可用空间变小时,收集废弃块擦除成为可利用的,把有效的块整理到一个连续的空间里。

JFFS 2,JFFS 的改进版本,专门针对NAND FLASH。JFFS2 通过维护块列表来充分地对设备执行平均读写。维护了三个列表:CLEAN LIST DIRTY LIST FREE LIST ,通过管理列表来实现块管理与垃圾收集。

YAFFS :把“实现块管理与垃圾收集的类似列表”的东西放在系统RAM里来实现。挂载时从FLASH中读出来,退出时把RAM里的块管理信息再写到FLASH中。

下面是详细的介绍:

Linux 内核使用内存技术设备(Memory Technology Device,MTD)接口,这是针对 flash 系统的通用接口。MTD 可以自动检测 flash 设备总线的宽度以及实现总线宽度所需设备的数量。

JFFS 将 flash 设备视为一种循环的块日志。写入 flash 的数据被写到了空间的末尾,开始部分的块则被收回,而两者之间的空间是空闲的;当空间变少时,将执行垃圾收集。垃圾收集器将有效块移动到日志的尾部,跳过无效或废弃块,并擦除它们(参见图 2)。因此这种文件系统可以自动实现静态和动态平均读写。这种架构的主要缺点是过于频繁地执行擦除操作(而没有使用最佳擦除策略),从而使设备迅速磨损。


图 2. 在垃圾收集之前和之后循环日志
嵌入式linux文件系统

挂载 JFFS 时结构细节将读取到内存中,这将延缓挂载时间并消耗更多的内存。

Journaling Flash File System 2

尽管 JFFS 在早期非常有用,但是它的平均读写算法容易缩短 NOR flash 设备的寿命。因此重新设计了底层算法,去掉了循环日志。JFFS2 算法专门为 NAND flash 设备设计,并且改善压缩性能。

在 JFFS2 中,flash 中的每个块都是单独处理的。JFFS2 通过维护块列表来充分地对设备执行平均读写。clean 列表表示设备中的块全部为有效节点。dirty 列表中的块至少包含有一个废弃节点。最后,free 列表包含曾经执行过擦除操作并且可以使用的块。

垃圾收集算法通过合理的方法智能地判断应该回收的块。目前,这个算法根据概率从 clean 或 dirty 列表中选择。dirty 列表的选择概率为 99%(将有效内容移到另一个块),而 clean 列表的选择概率为 1%(将内容移到新的块)。在这两种情况中,对选择的块执行擦除操作,然后将其置于 free 列表(参见图 3)。这允许垃圾收集器重用废弃的块,但是仍然围绕 flash 移动数据,以支持静态平均读写。


图 3. JFFS2 中的块管理和垃圾收集
嵌入式linux文件系统

YAFFS 是针对 NAND flash 开发的另一种 flash 文件系统。最早的版本(YAFFS)支持 512 字节页面的 flash 设备,但是较新的版本(YAFFS2)支持页面更大的新设备以及更大的 Write 限制。

大多数 flash 文件系统会对废弃块进行标记,但是 YAFFS2 使用单调递增数字***额外地标记块。在挂载期间扫描文件系统时,可以快速标识有效的 inode。YAFFS 保留在 RAM 中的树以表示 flash 设备的块结构,包括通过检查点(checkpointing)实现快速挂载 — 这个过程将在正常卸载时将 RAM 树结构保存到 flash 设备,以在挂载时快速读取和恢复到 RAM(参见图 4)。与其他 flash 文件系统相比,YAFFS2 的挂载时性能是它的最大优势。


图 4. YAFFS2 中的块管理和垃圾收集 
嵌入式linux文件系统

只读式压缩文件系统

在某些嵌入式系统中,没有必要提供可更改的文件系统:一个不可更改(immutable)的文件系统已经足够。Linux 支持多种只读文件系统,最有用的两种是 cramfs 和 SquashFS。

Cramfs

cramfs 文件系统是一种可用于 flash 设备的压缩式 Linux 只读文件系统。cramfs 的主要特点是简单和较高的空间利用率。这种文件系统用于内存占用较小的嵌入式设计。

虽然 cramfs 元数据没有经过压缩,但是 cramfs 针对每个页面使用 zlib 压缩,从而允许随机的页面访问(访问时对页面进行解压缩)。

您可以通过 mkcramfs 实用工具和 loopback 设备尝试使用 cramfs。

SquashFS

SquashFS 是另一种可用于 flash 设备的压缩式 Linux 只读文件系统。您可以在很多 Live CD Linux 发行版中找到 SquashFS。除了支持 zlib 压缩外,SquashFS 还使用 Lembel-Ziv-Markov chain Algorithm (LZMA) 改善压缩并提高速度。

和 cramfs 一样,您可以通过 mksquashfs 和 loopback 设备在标准 Linux 系统上使用 SquashFS。