Linux基础 -- NAND Flash UBIFS基础特性及注意点
一、NAND Flash 基础特性及注意点
1.1 NAND Flash 的结构
名称 | 描述 |
---|---|
页(Page) | 最小可写单元,常见大小 2K / 4K / 8K |
块(Block) | 最小擦除单元,通常包含 64~128 页 |
Plane / Die | 多平面架构,提高并发访问效率 |
1.2 重要特性
- 不可覆盖写(Out-of-place write):不能原地更新,只能写入空页;更新数据需要重写新页,并标记旧页为“无效”。
- 坏块管理(Bad Block Management):NAND 出厂时和使用过程中可能存在坏块。驱动需跳过这些块,避免使用。
- 擦除次数有限(Wear Leveling):NAND Flash 每块寿命通常在 10k~100k 次擦除,需均衡使用块。
- 位翻转(Bitflip):需要 ECC(纠错码)机制检测和修复位错误。
二、UBI(Unsorted Block Images)概述
UBI 是为 大容量 NAND Flash 提供的一种擦除块管理机制,它工作在 MTD 原始设备与文件系统之间。
2.1 UBI 的作用
- 块映射(PEB ↔ LEB)
- 坏块管理
- 擦除均衡(wear leveling)
- 空间回收(garbage collection)
2.2 关键术语
名称 | 含义 |
---|---|
MTD | Memory Technology Device,裸设备接口,如 /dev/mtdX |
PEB | Physical Erase Block,物理擦除块 |
LEB | Logical Erase Block,逻辑擦除块 |
VID Header | UBI 块的元信息,包含版本、校验、EC 等 |
EC Header | 擦除计数信息 |
2.3 使用注意事项
- UBI 必须格式化原始 NAND Flash,通过
ubiformat
。 - ubiattach 不会破坏数据,但必须配合
ubi.mtd=x
参数。 - 最大 UBI 设备块数有限(默认 2048),可通过
CONFIG_MTD_UBI_BEB_LIMIT
与CONFIG_MTD_UBI_MAX_VOLUMES
调整。
三、UBIFS(UBI File System)概述
3.1 UBIFS 是什么?
UBIFS 是专门为大容量 NAND Flash 设计的日志型文件系统,它 依赖于 UBI 层 提供的抽象。
3.2 特性优势
- 支持压缩(LZO、ZLIB)
- 日志结构(支持断电恢复)
- 支持写缓存与回写机制
- 动态 GC 与擦除均衡
- CRC 校验保证数据完整性
3.3 UBIFS 的组件结构
+---------------------+
| 应用程序 |
+---------------------+
| VFS |
+---------------------+
| UBIFS |
+---------------------+
| UBI |
+---------------------+
| MTD/NAND |
+---------------------+
四、UBI & UBIFS 使用流程与工具
4.1 MTD 分区设置(如 in DTS)
partition@0 {label = "ubi";reg = <0x00000000 0x08000000>; // 128MB
};
4.2 工具链使用
ubiformat
- 擦除并格式化 NAND 的某个 MTD 分区供 UBI 使用:
ubiformat /dev/mtdX -y -f rootfs.ubifs
ubiattach
- 将某个 MTD 分区附加为
/dev/ubiX
ubiattach /dev/ubi_ctrl -m X
ubimkvol
- 创建逻辑卷(volume):
ubimkvol /dev/ubi0 -N rootfs -s 60MiB
ubiupdatevol
- 直接更新 volume 内容(适用于数据升级):
ubiupdatevol /dev/ubi0_0 rootfs.ubifs
mkfs.ubifs
- 制作 UBIFS 镜像:
mkfs.ubifs -r rootfs_dir -m 4096 -e 258048 -c 2048 -o rootfs.ubifs
参数说明:
-m
:最小 I/O 单元(来自/sys/class/mtd/mtdX/writesize
)-e
:逻辑擦除块大小(来自/sys/class/mtd/mtdX/erasesize
减去头部)-c
:最多 LEB 数量(不能超过分区块数)
五、启动参数与挂载方式
5.1 kernel cmdline 参数(例如)
ubi.mtd=ubi root=ubi0:rootfs rootfstype=ubifs
5.2 fstab 中设置挂载
/dev/ubi0_0 / ubifs defaults 0 1
六、NAND + UBI + UBIFS 使用的常见陷阱与建议
问题或陷阱 | 建议解决方案 |
---|---|
未使用 ubiformat 而直接 ubiattach 导致挂载失败或旧数据干扰 | 一定要先使用 ubiformat 格式化 |
mkfs.ubifs 的 -m 与 -e 参数不匹配 | 从 /sys/class/mtd/mtdX/ 获取真实值 |
sync 非常慢 | 这是 NAND+UBIFS 的特性,建议异步写加回写控制(如 mount -o sync 慎用) |
volume 太多或太大 | 合理设计 volume 数量,避免超过 UBI 的最大 LEB 限制 |
嵌入式系统需要容错和容灾 | 建议使用双系统分区(A/B)、或 rootfs + overlayfs 实现热升级 |
七、对比其他 Flash 文件系统
文件系统 | 适用介质 | 压缩 | 坏块管理 | 挂载速度 | 特点 |
---|---|---|---|---|---|
JFFS2 | NOR / 小容量 NAND | 支持 | 支持 | 慢(全扫描) | 结构简单 |
UBIFS | 大容量 NAND | 支持 | 依赖 UBI | 快 | 可写缓存 |
YAFFS2 | NAND | 否 | 支持 | 中等 | 实时性好 |
F2FS | eMMC/UFS/SD | 支持 | 控制器管理 | 快 | 高性能日志型 |
八、结语与推荐
在嵌入式系统中,UBIFS + UBI + NAND 是当前主流的稳定解决方案,尤其适用于:
- 128MB+ NAND Flash
- 写入频繁、需要断电保护
- 系统分区和数据分区需要擦除均衡管理