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 註釋
- 附加空間可以使用也可以不用, 一般用於存儲文件系統的附帶信息.
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 !