1. 程式人生 > >imx6 uboot的mtd分割槽總結(rootfs為ubi檔案系統)

imx6 uboot的mtd分割槽總結(rootfs為ubi檔案系統)

轉載地址:https://blog.csdn.net/qq_29729577/article/details/51130209

此文章基於U-Boot 2014.04版本,燒寫工具為mfgtool,開發環境為yocto

前言:

JFFS2、YAFFS2等專用檔案系統存在著一些技術瓶頸,如:記憶體消耗大,對FLASH容量、檔案系統大小、內容、訪問模式等的線性依賴,損益均衡能力差或過渡損益   等。在此背景下核心加入了UBI檔案系統的支援

與JFFS2一樣,UBIFS 建構於MTD裝置之上,僅適用於裸flash裝置,並不適用於eMMC,SD等裝置

UBI是一種類似於LVM的邏輯卷管理層。主要實現損益均衡,邏輯擦除塊、卷管理,壞塊管理等。而UBIFS是一種基於UBI的FLASH日誌檔案系統

1.核心配置
在make menuconfig中選中:

Device Drivers  ---> Memory Technology Device (MTD) support  ---> Command line partition table parsing

Device Drivers → Memory Technology Device (MTD) support →Enable UBI - Unsorted block images

File systems → Miscellaneous filesystems→UBIFS file system support

我是通過uboot的核心命令列給MTD層傳遞MTD分割槽資訊,在核心中無需進行mtd分割槽配置,只需修改uboot原始碼及環境變數引數即可,但要確保原始碼中分割槽資訊和環境變數的分割槽資訊一致

2.uboot原始碼修改
在uboot原始碼目錄中,include/conifgs/mx6<custom>.h檔案(mx6<custom>.h為自定義板級檔案的標頭檔案)中找到:

#define CONFIG_MFG_NAND_PARTITION 

修改為"mtdparts=gpmi-nand:8m(boot),2m(env),8m(kernel),1m(dtb),-(rootfs)

"

也可以通過在裝置樹檔案中指定

其中gpmi-nand為mtd-id,要與平臺flash的mtd-id一致才行,後面為我的分割槽,僅供參考

我的mx6<custom>.h檔案還包含了include/configs/mx6sabre_common.h檔案,在其中找到:

#define CONFIG_EXTRA_ENV_SETTINGS

將其修改為如下內容:

#define CONFIG_EXTRA_ENV_SETTINGS \
    CONFIG_MFG_ENV_SETTINGS \
    "fdt_addr=0x18000000\0" \
    "fdt_high=0xffffffff\0"      \
    "bootargs=console=" CONFIG_CONSOLE_DEV ",115200 ubi.mtd=4 "  \
        "root=ubi0:rootfs rootfstype=ubifs "             \
        "mtdparts=gpmi-nand:8m(boot),2m(env),8m(kernel),1m(dtb),-(rootfs) "\
        CONFIG_SYS_VIDEO "\0" \
    "bootcmd=nand read ${loadaddr} 0xA00000 0x800000;"\
        "nand read ${fdt_addr} 0x1200000 0x100000;"\
        "bootz ${loadaddr} - ${fdt_addr}\0"

主要是對bootargs進行配置:

由於mtd0~4依次為boot,env,kernel,dtb和rootfs,因此ubi.mtd=4(這是rootfs的mtd分割槽號);

root=ubi0:rootfs中,rootfs為ubi0分割槽的分割槽名,後面ubi分割槽時會進行命名,兩者保持一致即可;

rootfstype檔案系統型別為ubifs;

mtdparts這個應該和CONFIG_MFG_NAND_PARTITION一致

3.mfgtool燒寫工具修改
mfgtool主要修改cfg.ini配置檔案和uxl2.xml檔案,具體語法可以參考官方文件

cfg.ini檔案如下:

[profiles]
chip = Linux

[platform]
board = SabreSD

[LIST]
name = Custom-NAND

[variable]
board = Custom
part_uboot = 0
part_kernel = 1
part_dtb = 2
part_rootfs = 3

其中Custom為自己定義的目標板名稱,part_*為各個mtd分割槽號

uxl2.xml檔案應該給出了Nand燒寫的demo,只需在它的基礎上進行修改即可:

將LIST name 改成Custom-NAND

BootStrap部分不贅述了;

uboot和kernel燒寫部分沿用demo,只需修改燒寫檔名及mtd分割槽名即可,也省略了。。

重點分析一下rootfs的ubi分割槽及燒寫:

   <CMD state="Updater" type="push" body="$ flash_erase /dev/mtd%part_rootfs% 0 0">Erasing rootfs partition</CMD>
    <CMD state="Updater" type="push" body="$ ubiformat /dev/mtd%part_rootfs%"/>
    <CMD state="Updater" type="push" body="$ ubiattach /dev/ubi_ctrl -m %part_rootfs%">Attaching UBI partition</CMD>
    <CMD state="Updater" type="push" body="$ ubimkvol /dev/ubi0 -Nrootfs -m"/>
    <CMD state="Updater" type="push" body="$ mkdir -p /mnt/mtd%part_rootfs%"/>
    <CMD state="Updater" type="push" body="$ mount -t ubifs ubi0:rootfs /mnt/mtd%part_rootfs%"/>
    <CMD state="Updater" type="push" body="pipe tar -jxv -C /mnt/mtd%part_rootfs%" file="files/Custom-imx6q.rootfs.tar.bz2">Sending and writting rootfs</CMD>
    <CMD state="Updater" type="push" body="frf">Finishing rootfs write</CMD>
    <CMD state="Updater" type="push" body="$ umount /mnt/mtd%part_rootfs%">Unmounting rootfs partition</CMD>

    <CMD state="Updater" type="push" body="$ echo Update Complete!">Done</CMD>

以上為rootfs的分割槽及燒寫,下面說明一下ubi工具的使用:

ubiformat /dev/mtdN是對mtd分割槽格式化

ubiattach是對指定mtd分割槽進行attach,-m 後加上分割槽號即可,這會生成/dev/ubi0的裝置檔案,若再進行attach,則按順序生成/dev/ubi1, /dev/ubi2等等。。。

ubimkvol是在指定的/dev/ubiN上進行ubi分割槽,即make volume,-N後為分割槽名,此處指定為rootfs,與上文中bootargs中指定的ubi0:rootfs要保持一致,-m 為指定大小為max(ubiN全部分割槽大小),也可以使用 -s  500MiB來指定你所需要的大小(單位是MiB或KiB),如果空間足夠,可以再ubiN上進行多個volume的分割槽,訪問時只需按照分割槽名掛載即可

mount -t ubifs ubi0:rootfs /mnt/... 就是按照ubi的分割槽名進行掛載ubi分割槽

ubi分割槽總結:

ubiN分割槽中,N對應某一個mtd分割槽,需要attach來動態的再/dev下生成,在這個mtd分割槽基礎上,還能使用ubimkvol按照分割槽名再次進行多個ubi的volume分割槽,訪問時按照ubiN:name的格式進行掛載即可

注意:

在mtd分割槽上進行ubi分割槽後,用ubinfo /dev/ubiN命令會發現實際的ubi分割槽大小會比mtd分割槽小一些,這是因為ubi的儲存管理是將其邏輯擦除塊(LEB)對映到物理擦除塊(PEB),在這個過程中需要使用一部分儲存空間來進行管理,所以實際我們使用的儲存空間會比mtd的大小要小一些。

此外,若mtd分割槽太小,將可能沒有足夠空間來進行ubi分割槽,本人經過嘗試,40M的mtd空間可以提供約17M的ubi分割槽,然而20M的mtd空間則無法進行ubi分割槽(ubinfo檢視會提示無可提供的邏輯擦除塊)
--------------------- 
作者:9527zyj 
來源:CSDN 
原文:https://blog.csdn.net/qq_29729577/article/details/51130209 
版權宣告:本文為博主原創文章,轉載請附上博文連結!