==> 2012年10月11日 星期四 <==

ubifs 應用案例




1. 環境
CPU : Freescale MX27
NAND FLASH : Samsung K9F2G08U0B, 2Gbits = 256MB
操作系統: linux
內核版本: 2.6.27

2. linux 編譯選項
2.2 支持UBI
Device Drivers  ---> 
<*> Memory Technology Device (MTD) support  --->    
    [*]   MTD partitioning support
    <*>   NAND Device Support  --->
    UBI - Unsorted block images  ---> 
        <*> Enable UBI 

2.3 支持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. 錯誤信息
8.1 UBIFS error (pid 1): validate_sb: LEB size mismatch: 131072 in superblock, 129024 real
參考 4. 參數 "-e".

8.2 UBI error: validate_ec_hdr: bad VID header offset 2048, expected 512.
參考 5. 參數 "-s".

8.3 UBI warning: ubi_io_read_ec_hdr: no EC header found at PEB 845, only 0xFF bytes
可忽略, 剛刷寫完的, 很多這種提示.

8.4 VFS: Cannot open root device "ubi0:rootfs" or unknown-block(0,0 ...
mtd分區不是 ubi 格式 或者 創建 ubi 鏡像時的 cfg 文件有誤.