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 文件有誤.
==> 2012年10月11日 星期四 <==
ubifs 應用案例
標籤: development
訂閱:
文章 (Atom)