跳转至

聊一聊嵌入式文件系统

引言

在存储设备中,我们常见的文件系统通常分为两大类:

  1. 通用文件系统(如 FAT32、exFAT、NTFS、EXT4 等):主要用于机械硬盘、SD 卡、eMMC 等设备,这些设备通常内部集成了闪存转换层(FTL),对上层操作系统表现为标准块设备。
  2. 专用闪存文件系统(如 JFFS2、YAFFS2、UBIFS 等):直接针对裸闪存(MTD 设备)的特性进行优化,考虑了闪存的擦除、坏块和磨损均衡等问题。

本文将对这两类文件系统的基本原理、适用场景以及扩展性进行详细解析,帮助开发者在嵌入式系统设计中做出合理选择。

1. 通用文件系统

1.1 基本原理

  • FTL 支持: eMMC、SD 卡等设备内部集成了 Flash Translation Layer(FTL),将裸闪存抽象为一个标准块设备。这样,上层就可以直接使用常见的文件系统,如 FAT32、exFAT、NTFS、EXT4 等,无需考虑闪存的低级特性。

换句话说:FTL需要在RAM中建立一个缓冲区,写数据时首先将数据写到缓冲区中,一段时间后再将数据汇总后再写入Nand Flash中,避面频繁的写Nand Flash,这样可以延长Nand Flash的寿命。FAT表和数据区不能固定,要将它混着使用,从而FAT表达磨损分布到各个块中,不会某个块很快的坏了。

  • 跨平台优势: 文件系统如 FAT32 和 exFAT 被 Windows、Linux 和 macOS 等多个操作系统原生支持,非常适合需要跨平台数据交换的场景。NTFS 在 Windows 上性能优异,但在 Linux 和 macOS 上通常需要额外驱动才能实现读写支持。

1.2 扩展性与局限性

  • 扩展性: 通用文件系统通常设计为适应较大容量的存储设备,并支持大文件(例如 exFAT 可支持单个文件超过 4GB)。但这些文件系统的设计初衷并非针对闪存的物理特性,因此它们依赖于 FTL 层来隐藏闪存的坏块、擦除特性及磨损均衡问题。
  • 局限性: 如果直接在裸闪存上使用这些文件系统,可能无法发挥良好的性能,甚至会损害闪存寿命,因为它们并未针对直接控制闪存的擦除和重写操作进行优化。

2. 专用闪存文件系统

专用闪存文件系统(如 JFFS2、YAFFS2、UBIFS 等)主要是在 Linux 嵌入式系统中使用的。这类文件系统直接面向裸闪存(MTD 设备),能够处理闪存擦除、坏块管理和磨损均衡等特性,适用于嵌入式设备的场景。

对于这常用的三种这里采用表格的形式进行对比看看:

指标 JFFS2 YAFFS2 UBIFS
设计原理 日志型文件系统,修改数据以追加方式写入,并在挂载时全盘扫描以重建索引。 日志型文件系统,专为 NAND flash 优化,利用 OOB 区存储元数据,挂载时扫描范围小。 构建在 UBI 层之上,部分索引存储在闪存中,支持写回缓存和在线压缩。
支持闪存类型 主要适用于 NOR flash,亦可支持小容量 NAND flash。 专为 NAND flash 设计,适合中小容量应用。 主要针对大容量 NAND flash(如现代智能手机、平板等)。
挂载速度 较慢,因需要扫描整个分区。 较快,只需扫描 OOB 区域。 非常快,大部分元数据存储在闪存上,无需全盘扫描。
内存占用 较高,索引全部加载到 RAM 中。 较低,挂载过程占用较少内存。 较低,索引主要存储在闪存中。
数据压缩 支持(如 zlib 压缩),有助于节省空间。 通常不支持数据压缩。 支持,可选择 zlib、LZO、Zstandard 等多种算法。
扩展性 适用于小容量系统,扩展性有限。 适合中小容量 NAND flash 系统。 优秀,适用于大容量 NAND flash 系统。
写入性能 写入性能受限,垃圾回收较频繁。 写入性能较好,适合频繁更新。 性能优异,支持写回缓存,有效提高 I/O 效率。
适用场景 嵌入式 NOR flash 或小容量 NAND flash 系统。 嵌入式 NAND flash 中小容量应用。 现代大容量 NAND flash 嵌入式设备,如智能手机、平板等。

从表格可以看到JFFS2 比较适合小容量的外部存储,比如SPI Flash这种。

3. 两类文件系统的对比

在 Windows 系统中,常见的文件系统格式主要包括 FAT32、exFAT 和 NTFS 等。这些通用文件系统广泛应用于各种存储设备,如硬盘、U 盘和 SD 卡。相比之下,Linux 系统支持更广泛的文件系统类型,除了上述通用格式外,还包括 ext3、ext4 等本地文件系统,以及专为裸闪存设计的 JFFS2、YAFFS2 和 UBIFS 等专用闪存文件系统。

  • 通用文件系统(FAT32、exFAT、NTFS 等):
  • 适用于具备 FTL 的存储设备(如 eMMC、SD 卡),并且需要在多个操作系统间共享数据。
  • 对于跨平台兼容性要求较高的应用,exFAT 是目前的主流选择。
  • 专用闪存文件系统(JFFS2、YAFFS2、UBIFS):
  • 适用于裸闪存直接控制的嵌入式系统。
  • 小容量(< 32MB)或 NOR flash 系统可以选用 JFFS2;中小容量 NAND flash 可以考虑 YAFFS2;而大容量 NAND flash 则推荐采用 UBIFS。

4.文件系统格式查看

Linux 中可以主要用的方式如下:

mount 命令:直接输入 mount 可以列出所有挂载的文件系统及其类型。
/proc/mounts 文件:查看该文件(例如执行 cat /proc/mounts)也能获得挂载信息和文件系统类型。
df -T 命令:使用 df -T 命令可以显示每个挂载点对应的文件系统类型。
blkid 命令:对于块设备,blkid 会显示设备的详细信息,包括文件系统类型。

5. 结语

在嵌入式系统设计中,文件系统的选择直接影响到系统的启动速度、性能、数据安全以及设备的使用寿命。对于带有 FTL 的 eMMC、SD 卡等,选择 FAT32/exFAT 等通用文件系统能够实现跨平台数据共享;而对于裸闪存设备,则应根据容量、使用频率及实时性要求选用专用的闪存文件系统。总体来说:

  • FAT32/exFAT/NTFS 等通用文件系统依赖 FTL,适合跨平台应用;
  • JFFS2、YAFFS2 和 UBIFS 则分别针对小容量 NOR、NAND 以及大容量 NAND 闪存进行了优化,在扩展性上各有侧重。

下一个章节将介绍,Linux如何挂载这些专用闪存文件系统,步骤是怎样的。