UBI (Unsorted Block Images) 是 Linux MTD (Memory Technology Device) 子系統上構建的擦除塊管理層,為 NAND/NOR Flash 提供磨損均衡、壞塊管理、邏輯擦除塊抽象。UBIFS 是運行在 UBI 之上的日誌文件系統。本文詳細記錄**從裸 MTD 分區到 UBIFS 掛載**的完整命令流程與原理解析。
| 層級 | 組件 | 作用 | 設備節點 |
|---|---|---|---|
| 物理層 | MTD 分區 | Flash 物理分區 (如 mtd0, mtd1) | /dev/mtdX, /dev/mtdblockX |
| 管理層 | UBI | 磨損均衡、壞塊管理、LEB 抽象 | /dev/ubiX (控制節點), /dev/ubiX_Y (卷節點) |
| 文件系統層 | UBIFS | 日誌文件系統、壓縮、同步 | 掛載點 (如 /mnt/ubifs) |
# 1. 查看 MTD 分區 cat /proc/mtd # 輸出示例: # dev: size erasesize name # mtd0: 00100000 00020000 "uboot" # mtd1: 00f00000 00020000 "rootfs" # 2. 查看分區表 cat /proc/partitions # 3. 查看現有 UBI 設備 ls /sys/class/ubi/ # ubi0/ ubi1/ ... # 4. 查看設備節點 ls /dev/ubi* /dev/mtd*
ubiformat /dev/mtd1 # 可選參數:-s 最小擦除單元, -O 擦除塊大小, -y 確認覆蓋
此步驟將裸 MTD 分區初始化為 UBI 可識別的物理擦除塊 (PEB) 結構,寫入 UBI 標頭 (EC、VID header)。
ubiattach /dev/ubi_ctrl -m 1 # -m 1 表示關聯 mtd1 # 輸出關鍵信息: # UBI device number 2, total 2000 LEBs (253952000 bytes, 242.2 MiB), available 1976 LEBs ... # 系統自動分配下一個可用 UBI 設備號 (此處為 ubi2)
ls /sys/class/ubi/ # 應出現 ubi2/ cat /sys/class/ubi/ubi2/dev # 獲取主次設備號,如 249:0 cat /sys/class/ubi/ubi2/volumes_count # 應為 0,表示無卷
# 假設主設備號 249,次設備號 0 mknod /dev/ubi2 c 249 0
ubimkvol /dev/ubi2 -s 100MiB -N my_ubi_vol # -s 大小,-N 卷名 # 系統自動分配卷 ID 0,對應 ubi2_0
ls /sys/class/ubi/ # 出現 ubi2_0/ cat /sys/class/ubi/ubi2_0/name # 輸出 my_ubi_vol cat /sys/class/ubi/ubi2_0/dev # 獲取主次設備號,如 249:1
mknod /dev/ubi2_0 c 249 1
mount -t ubifs ubi2_0 /mnt # 或使用卷名:mount -t ubifs ubi2:my_ubi_vol /mnt
mount | grep ubifs # 輸出:ubi2_0 on /mnt type ubifs (rw,relatime) df -h /mnt
| 現象 | 原因 | 解決 |
|---|---|---|
| ubiattach 失敗 | MTD 分區已被佔用、非 UBI 格式、壞塊過多 | 確保未掛載、先 ubiformat、檢查 dmesg 壞塊報告 |
| ubimkvol 空間不足 | 可用 LEB 不夠、預留磨損均衡空間 | 減小 -s 大小、檢查 available LEBs |
| mount 失敗:不支持的文件系統 | 內核未編譯 UBIFS 支持 (CONFIG_UBIFS_FS) | 重編內核或加載模組 modprobe ubifs |
| 掛載後讀寫報 I/O 錯誤 | Flash 物理壞塊超出 UBI 管理能力、供電不穩 | 檢查 dmesg ECC 錯誤、更換 Flash、啟用 UBI 強制掃描 |
# /etc/fstab 示例 (掛載現有 UBI 卷) ubi2:my_ubi_vol /mnt ubifs defaults 0 0 # 系統啟動腳本 (如 /etc/init.d/mount_ubifs) #!/bin/sh ubiformat /dev/mtd1 ubiattach /dev/ubi_ctrl -m 1 # 等待 ubi2_0 出現 mount -t ubifs ubi2:my_ubi_vol /mnt
UBI/UBIFS 掛載是**分層抽象**的典型實踐:**MTD 物理分區 → UBI 邏輯管理層 (磨損均衡/壞塊) → UBIFS 文件系統層**。掌握 ubiformat → ubiattach → ubimkvol → mount 四步核心鏈路,理解 PEB/LEB/VID/EC 關鍵數據結構,能應對嵌入式 Linux 存儲 90% 的 Flash 文件系統場景。生產環境建議:啟用內核 UBIFS、配置 fstab 自動掛載、監控擦除計數均衡度、定期備份關鍵分區。