在linux-2。6。27以前,談到Flash文件系統(tǒng),大家很多時候多會想到cramfs、jffs2、yaffs2等文件系統(tǒng)。它們也都是基于文件系統(tǒng)+mtd+flash設(shè)備的架構(gòu)。linux-2。6。27后,內(nèi)核加入了一種新型的FLASH文件系統(tǒng)UBI(UnsortedBlockImages)。這里簡單介紹下UBI文件系統(tǒng)加入的原因,及使用方法。我也是剛接觸到這個文件系統(tǒng),可能有理解不對的地方,也請指正。
一、產(chǎn)生的背景
FLASH具有的“先擦除再寫入”、壞塊、“有限的讀寫次數(shù)”等特性,目前管理FLASH的方法主要有:
1、采用MTD+FTL/NFTL(flash轉(zhuǎn)換層/nandflash轉(zhuǎn)換層)+傳統(tǒng)文件系統(tǒng),如:FAT、ext2等。FTL/NFTL的使用就是針對FLASH的特有屬性,通過軟件的方式來實現(xiàn)日志管理、壞塊管理、損益均衡等技術(shù)。但實踐證明,由于知識產(chǎn)權(quán)、效率等各方面因素導致本方案有一定的局限性。
2、采用硬件翻譯層+傳統(tǒng)文件系統(tǒng)的方案。這種方法被很多存儲卡產(chǎn)品采用,如:SD卡、U盤等。這種方案對于一些產(chǎn)品來說,成本較高。
3、采用MTD+FLASH專用文件系統(tǒng),如JFFS1/2,YAFFS1/2等。它們大大提高了FLASH的管理能力,并被廣泛應用。
JFFS2、YAFFS2等專用文件系統(tǒng)也存在著一些技術(shù)瓶頸,如:內(nèi)存消耗大,對FLASH容量、文件系統(tǒng)大小、內(nèi)容、訪問模式等的線性依賴,損益均衡能力差或過渡損益等。在此背景下內(nèi)核加入了UBI文件系統(tǒng)的支持。
二、用法
環(huán)境:omap3530處理器、(128MByte16位NANDFlash)、linnux-2。6。28內(nèi)核
1、配置內(nèi)核支持UBIFS
DeviceDrivers--->MemoryTechnologydevice(MTD)support--->UBI-Unsortedblockimages--->EnableUBI
配置mtd支持UBI接口
Filesystems--->MiscellaneousfileSystems--->UBIFSfilesystemsupport
配置內(nèi)核支持UBIFS文件系統(tǒng)
2、將一個MTD分區(qū)4掛載為UBIFS格式
●flash_eraseall/dev/mtd4//擦除mtd4
●ubiattach/dev/ubi_ctrl-m4//和mtd4關(guān)聯(lián)
●ubimkvol/dev/ubi0-Nrootfs-s100MiB//設(shè)定volume大?。ú皇枪潭ㄖ?,可以用工具改變)及名稱
●mount-tubifsubi0_0/mnt/ubi或mount-tubifsubi0:rootfs/mnt/ubi
3、制作UBIFS文件系統(tǒng)
在制作UBI鏡像時,需要首先確定以下幾個參數(shù):
MTDpartitionsize;//對應的FLASH分區(qū)大小
flashphysicaleraseblocksize;//FLASH物理擦除塊大小
minimumflashinput/outputunitsize;//最小的FLASH輸入輸出單元大小
forNANDflashes-sub-pagesize;//對于nandflash來說,子頁大小
logicaleraseblocksize。//邏輯擦除塊大小
參數(shù)可以由幾種方式得到
1)如果使用的是2。6。30以后的內(nèi)核,這些信息可以通過工具從內(nèi)核獲得,如:mtdinfo–u。
2)之前的內(nèi)核可以通過以下方法:
●MTDpartitionsize:從內(nèi)核的分區(qū)表或cat/proc/mtd獲得
●flashphysicaleraseblocksize:從flash芯片手冊中可以得到FLASH物理擦除塊大小,或cat/proc/mtd
●minimumflashinput/outputunitsize:
1)norflash:通常是1個字節(jié)
2)nandfalsh:一個頁面
●sub-pagesize:通過flash手冊獲得
●logicaleraseblocksize:對于有子頁的NANDFLASH來說,等于“物理擦除塊大小-1頁的大小”
3)也可以通過ubi和mtd連接時的產(chǎn)生的信息獲取,如:
#modprobeubimtd=4//ubi作為模塊加載
或
#ubiattach/dev/ubi_ctrl-m4//通過ubiattach關(guān)聯(lián)MTD
UBI:attachingmtd4toubi0
UBI:physicaleraseblocksize:131072bytes(128KiB)
UBI:logicaleraseblocksize:129024bytes
UBI:smallestflashI/Ounit:2048
UBI:sub-pagesize:512
UBI:VIDheaderoffset:512(aligned512)
UBI:dataoffset:2048
UBI:attachedmtd4toubi0
更詳細的解釋參見http://www。linux-mtd。infradead。org/doc/ubi。html#L_overhead
#mkfs。ubifs-rrootfs-m2048-e129024-c812-oubifs。img
#ubinize-oubi。img-m2048-p128KiB-s512/home/lht/omap3530/tools/ubinize。cfg
-r:制定文件內(nèi)容的位置
-m:頁面大小
-e:邏輯擦除塊大小
-p:物理擦除塊大小
-c:最大的邏輯擦除塊數(shù)量
對我們這種情況,文件系統(tǒng)最多可以訪問卷上的129024812=100M空間
-s:最小的硬件輸入輸出頁面大小,如:k9f1208為256(上下半頁訪問)
其中,ubinize。cfg的內(nèi)容為:
[ubifs]
mode=ubi
image=ubifs。img
vol_id=0
vol_size=100MiB
vol_type=dynamic
vol_name=rootfs
vol_flags=autoresize
4、利用uboot燒寫、啟動UBIFS鏡像
1)燒寫UBIFS鏡像
OMAP3DevKit8000#mmcinit
OMAP3DevKit8000#fatloadmmc0:181000000ubi。img
readingubi。img
12845056bytesread
OMAP3DevKit8000#nandunlock
device0wholechip
nand_unlock:start:00000000,length:235456!
NANDflashsuccessfullyunlocked
OMAP3DevKit8000#nandeccsw
OMAP3DevKit8000#nanderase6800007980000
NANDerase:device0offset0x680000,size0x7980000
Erasingat0x7fe0000--100%complete。
OK
OMAP3DevKit8000#nandwrite。i81000000680000$(filesize)
NANDwrite:device0offset0x680000,size0xc40000
Writingdataat0x12bf800--100%complete。
12845056byteswritten:OK
燒寫過程和燒寫內(nèi)核鏡像的過程一致,所以UBI文件系統(tǒng)應該不像yaffs文件系統(tǒng)那樣用到了nand的OOB區(qū)域。
2)設(shè)置UBIFS文件系統(tǒng)作為根文件系統(tǒng)啟動的參數(shù)
OMAP3DevKit8000#setenvbootargsconsole=ttyS2,115200n8ubi。mtd=4root=ubi0:rootfs
rootfstype=ubifsvideo=omapfb:mode:4。3inch_LCD
OMAP3DevKit8000#setenvbootcmdnandread。i80300000280000200000;bootm80300000
根文件系統(tǒng)的位置在MTD4上
系統(tǒng)啟動時會打印出如下和UBI相關(guān)的信息:
Creating5MTDpartitionsnumbergoodPEBs:970
UBI:numberofbadPEBs:2
UBI:max。allowedvolumes:128
UBI:wear-levelingthreshold:4096
UBI:numberofinternalvolumes:1
UBI:numberofuservolumes:1
UBI:availablePEBs:0
UBI:totalnumberofreservedPEBs:970
UBI:numberofPEBsreservedforbadPEBhandling:9
UBI:max/meanerasecounter:2/0