聊一聊嵌入式文件系统¶
引言¶
在存储设备中,我们常见的文件系统通常分为两大类:
- 通用文件系统(如 FAT32、exFAT、NTFS、EXT4 等):主要用于机械硬盘、SD 卡、eMMC 等设备,这些设备通常内部集成了闪存转换层(FTL),对上层操作系统表现为标准块设备。
- 专用闪存文件系统(如 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如何挂载这些专用闪存文件系统,步骤是怎样的。