适用人群:知道"直接读写 Flash 地址很麻烦",但不清楚该上什么文件系统、FATFS 和 LittleFS 差在哪、为什么 Linux 上又是 UBIFS 的同学。这是
17_存储专栏第六篇,存储产品/设备必备。
读完你能得到:
① 为什么裸 Flash 要套文件系统;
② 四个常见嵌入式文件系统的定位与取舍;
③ 关键区分:带 FTL 的块设备(eMMC)vs 裸 Flash(SPI NOR)用哪个;
④ 选型决策树;
⑤ 和你13_嵌入式Linux基础根文件系统的关系。
一、为什么裸 Flash 不好直接用
你完全可以自己定个格式:“地址 0x1000 存配置、0x2000 存日志”。但很快会遇到:
- 怎么找"下一个空位置"?怎么删文件回收空间?
- 断电写到一半怎么办(见
存储_05)? - SPI NOR 没有磨损均衡,老写同一区就坏了。
文件系统就是解决这些的:提供"文件/目录"抽象、管空间分配、配合底层做磨损和掉电安全。
二、常见嵌入式文件系统
| 文件系统 | 适用介质 | 磨损均衡 | 掉电安全 | 特点 |
|---|---|---|---|---|
| FATFS | SD/eMMC/U 盘(FAT 格式) | ❌(靠底层) | 一般 | 通用、PC 可读、MCU 生态最成熟 |
| LittleFS | SPI NOR / 小 Flash | ✅ 自带 | ✅ 强 | 专为 MCU 设计,掉电安全+磨损均衡 |
| SPIFFS | SPI Flash | ✅ | 一般 | 老方案,基本被 LittleFS 取代 |
| UBIFS / JFFS2 | NAND(Linux MTD) | ✅ | ✅ | Linux 嵌入式 NAND 专用 |
| ext4 | eMMC/SD(Linux) | ❌(eMMC 自带 FTL) | 一般 | Linux 通用 |
三、关键区分:块设备 vs 裸 Flash
这是选型的核心:
带 FTL 的"块设备"(eMMC / SD / U 盘): 内部控制器已做磨损均衡+坏块管理 → 上层直接上 FATFS / ext4 即可,不用操心底层 → 就像用硬盘 裸 Flash(SPI NOR / 外接 NAND 无控制器): 没有 FTL → 要用自带磨损均衡的文件系统(LittleFS)或自己写 FTL → 不能直接 FATFS(会写坏)⚠️常见误区:把 FATFS 直接往 SPI NOR 上套。FATFS 本身不管磨损均衡,SPI NOR 没 FTL,结果某些扇区被频繁改写很快坏。正确做法:SPI NOR 用LittleFS(自带磨损+掉电安全),或自己加一层 FTL 再上 FATFS。
四、两个最该懂的
4.1 FATFS(MCU 生态最成熟)
- 跑在 SD 卡 / eMMC 上,格式 PC 直接认(插电脑能读);
- 提供
f_open / f_write / f_read标准 API,和 PC 的 C 文件操作几乎一样; - 不管磨损均衡——但它通常跑在 eMMC/SD 上,那些器件自带 FTL 兜底,所以没问题。
4.2 LittleFS(MCU 小 Flash 首选)
- 专为SPI NOR / 小容量 Flash设计;
- 自带磨损均衡 + 掉电安全(写采用 COW 写时复制,崩溃可恢复);
- 资源占用小,适合没有 OS 的 MCU;
- 你
01里外扩的 W25Q64 想存日志/配置,LittleFS 是首选。
五、选型决策树
你的介质是? ├─ eMMC / SD / U 盘(带 FTL 块设备) │ └─ 上 FATFS(要 PC 互认)或 ext4(Linux) └─ SPI NOR / 裸 NAND(无 FTL) ├─ MCU 无 OS、小容量 │ └─ LittleFS(磨损+掉电安全都管) └─ Linux 嵌入式 NAND └─ UBIFS / JFFS2(走 MTD 层)一句话:带控制器的存储(eMMC/SD)用 FATFS/ext4,裸 SPI NOR 用 LittleFS,Linux NAND 用 UBIFS。
六、和你 Linux 根文件系统的关系
13_嵌入式Linux基础里讲的根文件系统(rootfs)、BusyBox,最终要落到一块存储上:
Linux 启动: bootloader 把内核 + dtb 从 eMMC/SD 读到 RAM → 挂载根文件系统(rootfs,也在 eMMC/SD 的 ext4,或 NAND 的 UBIFS) → init 起 BusyBox,进入 shell所以13那篇的 rootfs 就是跑在存储_06讲的 ext4/UBIFS 之上的——文件系统是"根文件系统"的物理底座。
七、踩坑
| # | 坑 | 后果 | 正确做法 |
|---|---|---|---|
| 1 | FATFS 直接套 SPI NOR | 频繁写区写坏 | 用 LittleFS 或先加 FTL |
| 2 | 忘了挂载/卸载直接断电 | 文件系统损坏 | 掉电前同步(见存储_05) |
| 3 | 选错块大小 | 空间浪费/性能差 | 按介质特性配 |
| 4 | NAND 用 ext4 不用 UBIFS | 坏块/磨损失控 | NAND 走 MTD+UBIFS |
八、面试速答
考官:SPI NOR 上想存日志,用什么文件系统?
你:用 LittleFS。它专为小容量 Flash 设计,自带磨损均衡和掉电安全,适合没 OS 的 MCU。如果直接用 FATFS 套 SPI NOR,FATFS 不管磨损均衡,某些扇区会被频繁写坏。
考官:eMMC 上为什么能直接 FATFS?
你:eMMC 内部有控制器跑 FTL,已经做了磨损均衡和坏块管理,对外是标准块设备,所以上层直接用 FATFS/ext4 就行,不用自己管底层。
九、总结
| 要点 | 内容 |
|---|---|
| 为什么用 FS | 空间管理/抽象/磨损/掉电 |
| FATFS | eMMC/SD,通用,不管磨损(靠底层 FTL) |
| LittleFS | SPI NOR,自带磨损+掉电安全 |
| UBIFS | Linux NAND,走 MTD |
| 选型核心 | 带 FTL 块设备→FATFS/ext4;裸 Flash→LittleFS/UBIFS |
一句话总结:选文件系统先看介质——带控制器的 eMMC/SD 用 FATFS/ext4,裸 SPI NOR 用 LittleFS,Linux NAND 用 UBIFS;千万别把 FATFS 直接套裸 Flash,会写坏。
各文件系统的移植接口、配置参数以官方文档为准(FATFS 的 ff.c/ff.h、LittleFS 的 lfs.c)。Linux MTD/UBIFS 用法见
13_嵌入式Linux基础配套。
本站相关:存储_01(介质定位)、存储_03(FTL)、存储_05(掉电安全)、13_嵌入式Linux基础(根文件系统)。
下一篇:存储_07_江波龙面试专项——常问题与项目包装