一、 UBI/UBIFS產(chǎn)生背景
FLASH具有的“先擦除再寫(xiě)入”、壞塊、“有限的讀寫(xiě)次數(shù)”等特性,目前管理FLASH的方法主要有:
1、 采用MTD+FTL/NFTL(flash 轉(zhuǎn)換層/nand flash轉(zhuǎn)換層)+ 傳統(tǒng)文件系統(tǒng),如:FAT、ext2等。FTL/NFTL的使用就是針對(duì)FLASH的特有屬性,通過(guò)軟件的方式來(lái)實(shí)現(xiàn)日志管理、壞塊管理、損益均衡等技 術(shù)。但實(shí)踐證明,由于知識(shí)產(chǎn)權(quán)、效率等各方面因素導(dǎo)致本方案有一定的局限性。
2、采用硬件翻譯層+傳統(tǒng)文件系統(tǒng)的方案。這種方法被很多存儲(chǔ)卡產(chǎn)品采用,如:SD卡、U盤(pán)等。這種方案對(duì)于一些產(chǎn)品來(lái)說(shuō),成本較高。
3、采用MTD+ FLASH專用文件系統(tǒng),如JFFS1/2,YAFFS1/2等。它們大大提高了FLASH的管理能力,并被廣泛應(yīng)用。
JFFS2、YAFFS2等專用文件系統(tǒng)也存在著一些技術(shù)瓶頸,如:內(nèi)存消耗大,對(duì)FLASH容量、文件系統(tǒng)大小、內(nèi)容、訪問(wèn)模式等的線性依賴,損益均衡能力差或過(guò)渡損益等。在此背景下內(nèi)核加入了UBI文件系統(tǒng)的支持。
二、UBI/UBIFS簡(jiǎn)單介紹
由于超大容量Nand?Flash的普及,YAFFS等皆無(wú)法再去控制Nand?Flash的空間,于是在2006年由IBM與Nokia的工程師Thomas?Gleixner,Artem?Bityutskiy設(shè)計(jì)開(kāi)發(fā)了UBI及其UBIFS文件系統(tǒng),專門(mén)為了解決MTD(Memory?Technology?Device)設(shè)備所遇到的瓶頸。UBIFS通過(guò)子系統(tǒng)UBI處理與MTD?device之間的動(dòng)作。與JFFS2一樣,UBIFS?建構(gòu)于MTD?device?之上,因而與一般的block?device不兼容。
其中,UBI是一種類似于LVM的邏輯卷管理層。主要實(shí)現(xiàn)損益均衡,邏輯擦除塊、卷管理,壞塊管理等。而UBIFS是一種基于UBI的FLASH日志文件系統(tǒng)。
一句話解讀就是,UBIFS及其使用的UBI子系統(tǒng),是一種用在大容量flash上的文件系統(tǒng)。
三、UBI/UBIFS的特點(diǎn)
1. 可擴(kuò)展性
UBIFS對(duì)flash?尺寸有著很好的擴(kuò)展性;也就是說(shuō)mount時(shí)間、內(nèi)存消耗以及I/O速度都不依賴于flash?尺寸(對(duì)于內(nèi)存消耗并不是完全準(zhǔn)確的,但是依賴性非常的低);?UBIFS可以很好的適應(yīng)GB以上大小的大容量flash; 當(dāng)然UBI本身還有擴(kuò)展性的問(wèn)題,無(wú)論如何, UBI/UBIFS都比JFFS2的可擴(kuò)展性好,此外如果UBI成為瓶頸,還可以通過(guò)升級(jí)UBI而不需改變UBIFS。
2. 快速mount
不像JFFS2,UBIFS在mount階段不需要掃描整個(gè)文件系統(tǒng),UBIFS?mount介質(zhì)的時(shí)間只是毫秒級(jí),時(shí)間不依賴與flash的尺寸;然而UBI的初始化時(shí)間是依賴flash的尺寸的,因此必須把這個(gè)時(shí)間考慮在內(nèi)。
3. write-back?支持
UBIFS的回寫(xiě)(延遲寫(xiě))同JFFS2的write-through(立即寫(xiě)入內(nèi)存)相比可以顯著地提高文件系統(tǒng)的吞吐量。
4. 異常unmount適應(yīng)度
UBIFS是一個(gè)日志文件系統(tǒng),可以容忍突然掉電以及unclean重啟;?UBIFS?通過(guò)replay?日志來(lái)恢復(fù)unclean?unmount,在這種情況下replay會(huì)消耗一些時(shí)間,因此mount時(shí)間會(huì)稍微增加,但是replay過(guò)程并不會(huì)掃描整個(gè)flash介質(zhì),所以UBIFS的mount時(shí)間大概在幾分之一秒。
5. 快速I/O
即使我們disable?write-back(可以在unmount時(shí)使用-o?sync?mount選項(xiàng)),?UBIFS的性能仍然接近JFFS2。記住,JFFS2的同步I/O是非常驚人的,因?yàn)镴FFS2不需要在flash上維護(hù)indexing?data結(jié)構(gòu),?所以就沒(méi)有因此而帶來(lái)的負(fù)擔(dān);?而UBIFS恰恰是有index數(shù)據(jù)的。?UBIFS之所以夠快是因?yàn)閁BIFS提交日志的方式:不是把數(shù)據(jù)從一個(gè)地方移動(dòng)到另外一個(gè)位置,而只是把數(shù)據(jù)的地址加到文件系統(tǒng)的index,然后選擇不同的eraseblock作為新的日志塊,此外還有multi-headed日志方式等技巧。
6. on-the_flight?compression
存儲(chǔ)在flash介質(zhì)上的數(shù)據(jù)是壓縮的;同時(shí)也可以靈活的針對(duì)單個(gè)文件來(lái)打開(kāi)關(guān)閉壓縮;?例如,可能需要針對(duì)某個(gè)特定的文件打開(kāi)壓縮,或者可能缺省方式下支持壓縮,但是對(duì)多媒體文件則關(guān)閉壓縮。
7. 可恢復(fù)性
UBIFS可以從index破壞后恢復(fù);?UBIFS中的每一片信息都有一個(gè)header來(lái)描述,因此可以通過(guò)掃描這個(gè)flash介質(zhì)來(lái)重構(gòu)文件系統(tǒng),這點(diǎn)和JFFS2非常類似;想像一下,如果你擦出了FAT文件系統(tǒng)的FAT表,那么對(duì)于FAT?FS是致命的錯(cuò)誤,但是如果擦除UBIFS的index,你人然可以重構(gòu)文件系統(tǒng),當(dāng)然這需要一個(gè)特定的用戶空間程序來(lái)做這個(gè)恢復(fù)。
8. 完整性
UBIFS通過(guò)寫(xiě)checksum到flash?介質(zhì)上來(lái)保證數(shù)據(jù)的完整性,UBIFS不會(huì)無(wú)視損壞文件數(shù)據(jù)或meta-data;?缺省的情況,UBIFS僅僅檢查meta-data的CRC,但是你可以通過(guò)mount選項(xiàng),強(qiáng)制進(jìn)行data?CRC的檢查。
三、UBI/UBIFS的層次結(jié)構(gòu)
UBI和UBIFS在linux上的層次結(jié)構(gòu)如下圖所示。
?從上圖可以清楚看到:
UBIFS是工作在UBI子系統(tǒng)之上的。
UBI沒(méi)有FLASH轉(zhuǎn)換成(FTL,F(xiàn)lash Translation Layer)。
因?yàn)闆](méi)有FTL,所以UBI只能工作在裸的flash,因此,它不能用于消費(fèi)類FLASH,如MMC, RS-MMC, eMMC, SD, mini-SD, micro-SD, CompactFlash, MemoryStick等,UBI在嵌入式設(shè)備如智能手機(jī)中被廣泛使用。
?
評(píng)論