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 一起使用 |