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 关键术语

名称含义
MTDMemory Technology Device,裸设备接口,如 /dev/mtdX
PEBPhysical Erase Block,物理擦除块
LEBLogical Erase Block,逻辑擦除块
VID HeaderUBI 块的元信息,包含版本、校验、EC 等
EC Header擦除计数信息

2.3 使用注意事项

  • UBI 必须格式化原始 NAND Flash,通过 ubiformat
  • ubiattach 不会破坏数据,但必须配合 ubi.mtd=x 参数。
  • 最大 UBI 设备块数有限(默认 2048),可通过 CONFIG_MTD_UBI_BEB_LIMITCONFIG_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 文件系统

文件系统适用介质压缩坏块管理挂载速度特点
JFFS2NOR / 小容量 NAND支持支持慢(全扫描)结构简单
UBIFS大容量 NAND支持依赖 UBI可写缓存
YAFFS2NAND支持中等实时性好
F2FSeMMC/UFS/SD支持控制器管理高性能日志型

八、结语与推荐

在嵌入式系统中,UBIFS + UBI + NAND 是当前主流的稳定解决方案,尤其适用于:

  • 128MB+ NAND Flash
  • 写入频繁、需要断电保护
  • 系统分区和数据分区需要擦除均衡管理
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值