ubifs 應用案例

1   環境

CPU : Freescale MX27

NAND FLASH : Samsung K9F2G08U0B, 2Gbits = 256MB

操作系統: linux

內核版本: 2.6.27

2   linux 編譯選項

2.1   支持UBI

Device Drivers  --->
<*> Memory Technology Device (MTD) support  --->
    [*]   MTD partitioning support
    <*>   NAND Device Support  --->
    UBI - Unsorted block images  --->
        <*> Enable UBI

2.2   支持UBIFS 文件系統

File systems  --->
Miscellaneous filesystems  --->
    <*> UBIFS file system support

3   linux 啟動命令行參數

noinitrd console=ttymxc0,115200 ubi.mtd=2 root=ubi0:rootfs rootfstype=ubifs rw ip=off init=/linuxrc video=imx-fb:Innolux-WVGA

我們的flash 在內核裡被分為三個 mtd 區: bootloader, kernel, filesystem. 因此 ubi.mtd=2, 即選中第三個 mtd 分區作為 ubifs 根分區. 至於 ubi0:rootfs 則跟創建文件系統鏡像時的 *.cfg 有關.

需要注意的是, 很多 bootloader 會覆蓋 linux 本身的默認命令行參數, 所以, 如果存在這樣的 bootloader 就必須修改 bootloader 調用 linux 時的命令行參數! 否則 ubifs 完全不起作用.

4   創建 ubifs 文件系統鏡像

mkfs.ubifs -m 2048 -e 129024 -c 992 -r filesystem_base filesystem_base.ubifs

ubifs 文件系統鏡像不能直接寫入 flash, 需要再根據這個生成的 ubifs 格式的文件系統鏡像生成 ubi 鏡像才能直接寫入 flash .

參數 "-m"
為 flash 分頁大小, 可從 nand flash 的 datasheet 得知. 有些 flash 的分頁會有附加空間, 如我們所使用的這個 flash 每個分頁就帶有 64 字節的附加空間(1), 附加空間不計入我們的 -m 參數中!
參數 "-e"

把 128KiB 減去一個分頁(2048)大小, 則等於 129024. 如果加載 ubifs 出現類似以下的錯誤:

UBIFS error (pid 1): validate_sb: LEB size mismatch: 131072 in superblock, 129024 real

則以那個 real 值為準!

參數 "-c"
最大邏輯刷寫塊數量, 似乎可以是任意數值, 只要不超過邏輯塊總數即可.

5   創建 ubi 鏡像

ubinize -o ubi.img -m 2048 -p 128KiB -s 512 -O 512 ubiimage.cfg
參數 "-m"
參考 4. 中的 "-m" 參數
參數 "-p"
為一次性擦除塊的大小, 可從 nand flash 的 datasheet 得知. 附加空間不計在內.
參數 "-s"

與 -O 必須一致, 分頁子頁大小, 似乎跟 flash 的分頁組成有關, 似乎我們所用的 flash 每一頁由4 個子分頁組成, 一個子分頁為 512. 當出現以下錯誤時:

UBI error: validate_ec_hdr: bad VID header offset 2048, expected 512.

則以 expected 值為準.

其中 ubiimage.cfg 內容如下:

[ubifs]
mode=ubi
image=filesystem_base.ubifs
vol_id=0
vol_size=100MiB
vol_type=dynamic
vol_name=rootfs
vol_flags=autoresize

6   燒寫並啟動

把 5. 裡生成的 ubi.img 燒寫進板子, 啟動, 當出現類似以下信息時表示, ubifs 已經成功加載:

UBI: attaching mtd2 to ubi0
UBI: physical eraseblock size:   131072 bytes (128 KiB)
UBI: logical eraseblock size:    129024 bytes
UBI: smallest flash I/O unit:    2048
UBI: sub-page size:              512
UBI: VID header offset:          512 (aligned 512)
UBI: data offset:                2048
UBI: attached mtd2 to ubi0
UBI: MTD device name:            "nand.rootfs"
UBI: MTD device size:            123 MiB
UBI: number of good PEBs:        985
UBI: number of bad PEBs:         6
UBI: max. allowed volumes:       128
UBI: wear-leveling threshold:    4096
UBI: number of internal volumes: 1
UBI: number of user volumes:     1
UBI: available PEBs:             0
UBI: total number of reserved PEBs: 985
UBI: number of PEBs reserved for bad PEB handling: 9
UBI: max/mean erase counter: 1/0

7   註釋

  1. 附加空間可以使用也可以不用, 一般用於存儲文件系統的附帶信息.

8   錯誤信息

  • UBIFS error (pid 1): validate_sb: LEB size mismatch: 131072 in superblock, 129024 real

    參考 4. 參數 "-e"

  • UBI error: validate_ec_hdr: bad VID header offset 2048, expected 512.

    參考 5. 參數 "-s".

  • UBI warning: ubi_io_read_ec_hdr: no EC header found at PEB 845, only 0xFF bytes

可忽略, 剛刷寫完的, 很多這種提示.
  • VFS: Cannot open root device "ubi0:rootfs" or unknown-block(0,0 ...
mtd分區不是 ubi 格式 或者 創建 ubi 鏡像時的 cfg 文件有誤.

Comments !