UBI(Unsorted Block Images)是 Linux 中为原始 NAND Flash 设计的一种 逻辑卷管理层,其核心作用是:在 NAND 闪存设备上提供 坏块管理、擦写均衡(wear leveling)和逻辑到物理地址映射等机制,为上层文件系统(如 UBIFS)提供可靠、抽象的存储支持。
一、UBI 处于哪一层?
以 NAND Flash 的访问层级来看:
+---------------------------+
| 文件系统(UBIFS) |
+---------------------------+
| UBI 层 |
+---------------------------+
| MTD(Memory Technology Device)层 |
+---------------------------+
| 物理 NAND Flash 芯片 |
+---------------------------+
二、为什么需要 UBI?
NAND Flash 与普通块设备(如硬盘)相比,存在以下挑战:
问题 | 描述 |
---|---|
❌ 坏块 | 出厂就可能存在坏块,使用过程中还会增加 |
❌ 最小擦除单位为 Block(128K、256K等) | 而写入单位是 Page(2K、4K) |
❌ 写入次数有限 | 每个块典型的擦写寿命是 10,000~100,000 次 |
❌ 不支持重写 | 只能擦除再写,不能覆盖写 |
❌ 写入延迟变化 | 擦除、写入时间比读取慢得多 |
因此,需要一个中间层(UBI)来:
- 管理 坏块
- 实现 擦写均衡(wear-leveling)
- 提供 逻辑卷 支持
- 抽象底层 NAND 差异,简化文件系统设计
三、UBI 的核心概念
概念 | 说明 |
---|---|
PEB(Physical Erase Block) | 物理擦除块,对应 NAND Flash 的最小擦除单位 |
LEB(Logical Erase Block) | 逻辑擦除块,由 UBI 映射到某个 PEB |
Volume(卷) | 一个独立的存储逻辑空间,可以挂载文件系统(如 UBIFS)或原始数据 |
UBI Header | 每个 PEB 块都有头部,用于校验与定位 |
VID Header | 存放块的卷号、LEB 编号、版本号等信息 |
EC Header | 擦写计数(Erase Counter),用于 wear-leveling |
四、UBI 与 UBIFS 的关系
- UBI 提供逻辑卷管理
- UBIFS(UBI File System)运行在 UBI 之上
UBIFS 支持特性包括:
- 动态大小卷支持(类似 LVM)
- 写放大(write amplification)优化
- 断电保护(使用日志机制)
- 高压缩比(zlib/lzo)
五、UBI 的常用命令工具
命令 | 说明 |
---|---|
ubiformat /dev/mtdX | 格式化一个 MTD 分区为 UBI 结构(会擦除) |
ubiattach /dev/ubi_ctrl -m X | 把某个 mtdX 附加为 UBI 卷 |
ubimkvol /dev/ubi0 -N volname -s size | 创建逻辑卷 |
ubiupdatevol /dev/ubi0_X file.img | 更新某个卷的内容 |
ubinfo | 查看当前 UBI 卷信息 |
mount -t ubifs ubi0_0 /mnt/ubi | 挂载 UBI 卷(如果是 UBIFS) |
六、举个例子
假设有一个 NAND 分区 /dev/mtd4
,你想把它作为 rootfs:
# 1. 格式化为 UBI
ubiformat /dev/mtd4# 2. 附加到 UBI
ubiattach /dev/ubi_ctrl -m 4# 3. 创建逻辑卷(名字为 rootfs,大小 auto)
ubimkvol /dev/ubi0 -N rootfs -s 120MiB# 4. 写入文件系统镜像
ubiupdatevol /dev/ubi0_0 rootfs.img# 5. 挂载到系统
mount -t ubifs ubi0_0 /mnt/ubi
七、UBI 的使用场景
- 嵌入式设备(OpenWRT、Android、Yocto)中的 rootfs
- 工业级存储管理(高可靠性、高寿命)
- 自定义启动分区 / 数据分区管理
八、总结
特性 | UBI 作用 |
---|---|
坏块管理 | 自动跳过坏块、记录可靠块 |
擦写均衡 | 记录擦除计数、平均分配写入 |
逻辑映射 | 提供 LEB → PEB 映射表 |
卷管理 | 支持多个逻辑卷(rootfs、data 等) |
支持文件系统 | 通常配合 UBIFS 一起使用 |