UBI文件系統-----UBI文件系統概念、UBI文件系統開銷、UBI文件系統使用方法

參考資料:html

衷心感謝網友的分享:less

UBI系統原理分析
http://blog.chinaunix.net/uid-28236237-id-4164656.html
dom

Ubifs文件系統和mkfs.ubifs以及ubinize工具的用法
https://blog.csdn.net/wjjontheway/article/details/8977871
ide

Linux ubi子系統原理分析
https://www.cnblogs.com/gmpy/p/10874475.html
函數

 

1、UBI文件系統的概念:

一、UBI文件系統:無排序區塊鏡像文件系統(Unsorted Block Image File System, UBIFS)是用於固態存儲設備上,並與LogFS相互競爭,做爲JFFS2的後繼文件系統之一。工具

二、UBIFS涉及三個子系統ui

1)MTD子系統:flash驅動直接操做設備,而MTD在flash驅動之上,向上呈現統一的操做接口。因此MTD子系統的使命是:屏蔽不一樣flash的操做差別,向上提供統一的操做接口;對應drivers/mtd;this

2)UBI子系統:UBI子系統是基於MTD子系統的,在MTD上實現nand特性的管理邏輯,向上屏蔽nand的特性;對應drivers/mtd/ubi;spa

3)UBIFS文件系統:是基於UBI子系統的文件系統,實現文件系統的全部基本功能。例如文件的實現,日誌的實現;對應fs/ubifs;.net

4)ubi文件系統的結構:


 

三、nand flash的特性:

1)操做最小單元爲頁(Page)/塊(Block):nand flash不一樣於nor flash,nor能夠以字節爲單位操做flash,可是nand的最小讀寫單元是頁,擦除最小單元是塊。

2)擦除壽命限制:nand flash的物理性質決定了其每一個塊都有擦除壽命的限制,所以驅動必須作到磨損平衡。

3)位翻轉(bit-filps):nand物理性質使其可能會在使用、保存過程當中出現位翻轉現象。因此要不在nand flash的內部,要不在nand flash控制器都會存在ecc校訂模塊,在位翻轉後校訂。然而ecc並非萬能的,其校訂能力有限,因此驅動必須在位翻轉數量進一步變多以前把數據搬移到其它快。ecc都已經校訂了,爲何還要搬移?由於ecc校訂是從flash讀到內存中的數據,而不是flash自己存儲的數據,此時flash中的數據依然是錯的,若是不搬移,隨着翻轉的位數量積累,ecc就校驗不了,此時就至關於永久丟失正確數據。

4)存在壞塊(Bad Block)
製做工藝和nand自己的物理性質致使在出廠和正常使用過程當中都會產生壞塊。


四、UBI與Block Layer
Block Layer是適用於常見塊設備的通用塊層,其本質上來說並非塊設備。UBIFS的IO操做並不經過通用塊設備。

五、UBI與FTL
FTL(Flash Translation Layer)是一個"黑盒子",其跟UBI很是像,都是對nand特性進行封裝。
UBI子系統屏蔽nand特性是爲了對接UBIFS,而FTL則是爲了對接Block Layer。

六、UBI Volume 與 UBI Device
在UBI中有兩個概念:UBI卷與UBI設備
UBI設備至關於磁盤設備(sda、mmcblk0);
UBI卷至關於磁盤上對應分區(sda1,mmcblk0p1);
UBI設備是在MTD設備上建立出來的設備,而UBI卷則是從UBI設備上劃分出來的分區;



七、LEB與PEB
LEB:Logical Erase Block,即邏輯擦除塊,簡稱邏輯塊,表示邏輯卷中的一個塊;
PEB:Physical Erase Block,即物理擦除塊,簡稱物理塊,表示nand中的一個塊;

八、UBI子系統的做用:
UBI子系統就是UBIFS與MTD子系統的中間層,其向下鏈接MTD設備,實現nand特性管理,向上呈現無壞塊的卷;
因此UBI子系統的做用主要包括兩點:
1)屏蔽nand特性(壞塊管理、磨損平衡、位翻轉);
2)UBI卷實現;



九、UBI頭部:
UBI子系統須要往每一個物理塊開頭寫入兩個關鍵數據,這兩個關鍵數據組成了UBI頭部;
這兩個關鍵數據分別是此物理塊擦除次數和次物理塊的邏輯卷標記頭,也分別稱爲EC頭(Erase Count)和VID頭(Volume IDentifier)。
EC頭和VID頭,都是64Bytes,分別記錄於物理塊的第一頁和第二頁;


1)爲何要有兩個頭:
nand每一個block都有擦除壽命限制,所以須要記錄擦除次數,以實現磨損平衡,所以須要EC頭;爲了實現卷,必須記錄物理塊與邏輯塊之間的映射關係,所以須要VID頭;

2)爲何不合併成一個頭?
二者寫入時機不一樣,致使兩個頭必須分開寫入。EC頭在每次擦除後,必須立刻寫入以免丟失,而VID頭只有在卷映射後纔會寫入。

3)不論是EC頭仍是VID頭都是64Bytes,爲何要用倆個Page?
使用兩個Page是對nand來講的,由於nand的最小讀寫單元是Page;對於NOR FLASH,最小讀寫單元使Byte,所以對於Nor能夠只使用64Bytes.

4)在記錄擦除次數時掉電等,致使丟失實際擦除次數怎麼辦?
取全部物理塊擦除次數的平均數;

十、UBI卷表(UBI Volume Table):
UBI子系統有個對用戶隱藏的特殊卷,叫層卷(layout volume),用來記錄卷表。咱們能夠把卷表等價於分區表,記錄各個卷的信息。
卷表大小爲兩個邏輯擦除塊,每一個邏輯擦除塊記錄一份卷表。即UBI子系統爲了保證卷表的可靠性,用了兩個邏輯卷記錄兩份卷表信息;
因爲層卷的大小是固定的,致使能保存的卷信息受限,因此最大支持的卷數量是隨着邏輯塊的大小改變的。但最多不超過128個;
保存卷表的結構體:
struct ubi_vtbl_record {                                                         
        __be32  reserved_pebs; //物理塊數量
        __be32  alignment; //卷對齊
        __be32  data_pad;                                                        
        __u8    vol_type; //靜態卷or動態卷標識
        __u8    upd_marker; //更新標識
        __be16  name_len; //卷名長度
        __u8    name[UBI_VOL_NAME_MAX+1]; //卷名
        __u8    flags; //經常使用語自動重分配大小標記
        __u8    padding[23]; //保留區域
        __be32  crc; //卷信息的CRC32校驗值
} __packed;















卷信息是被CRC232保護的。

十一、動態卷和靜態卷

1)vol_type記錄了卷的類型,在建立卷時指定,可選動態卷和靜態卷。

2)動態卷:是可讀可寫的,數據的完整性由文件系統保證;

3)靜態卷:靜態卷是隻讀的,是UBI子系統試用CRC232來校驗保護整個卷的數據;

十二、flags是否自動分配大小標識
在首次運行時自動resize卷,讓卷大小覆蓋全部未使用的邏輯塊。
例如Flash大小是128M,在燒錄的鏡像中分配的全部卷加起來只用了100M,若是有卷被表示爲autoresize,那麼在首次運行時,那個卷會自動擴大,把剩餘的28M囊括在內。
注意:只容許一個卷設置autoresize標誌;


1三、壞塊標記:

1)有兩個場景可能會識別壞塊,分別是在寫失敗和擦除失敗,擦除失敗且返回EIO,則直接標記壞塊。

2)寫失敗壞塊判斷邏輯:

a. 擦除嫌疑壞塊

b. 讀取擦除後的值,判斷是否都是0xFF(擦除後理應全爲0xFF)

c. 寫入特定數據

d. 讀取並校驗寫入的數據

e. 以不一樣的數據模式重複步驟1-4

以上步驟若是出問題則標記壞塊,詳細實現參考torture_peb()。

 

2、UBI管理開銷

什麼是管理開銷?爲了管理nand的空間,實現磨損平衡、壞塊管理等功能,必須佔用一部分空間來存儲關鍵數據,就好像文件系統的元數據。管理佔用的空間是不會呈現給用戶使用的,這個空間即爲管理開銷;

對nand來講,UBI管理開銷主要包括5部分:

1)層卷(卷表),佔用兩個物理塊;

2)磨損平衡,佔用一個物理塊;

3)邏輯塊修改原子操做,佔用一個物理塊;

4)壞塊管理,默認每1024個塊預留20個塊做爲壞塊處理(內核參數:CONFIG_MTD_UBI_BEB_LIMIT)。

5)UBI頭:物理塊總數*2頁;

UBI管理開銷計算:
UBI管理開銷 = UBI特性開銷 + UBI頭開銷
其中:
壞塊預留 = MAX(出廠壞塊數量,壞塊管理預留數量)
特性開銷 = (壞塊預留 + 1磨損平衡開銷 + 2卷表開銷 + 1原子操做開銷)* 物理塊大小(物理塊字節數,假設一個物理塊是128KB)
UBI頭開銷 = 2 * 頁大小 * (含壞塊的總塊數 - 壞塊預留 - 1個磨損平衡開銷 - 1個原子操做開銷 - 2個層捲開銷)
UBI管理總開銷 = (壞塊預留 + 4)* 物理塊大小 + 2 * 頁大小 * (含壞塊的總塊數 - 壞塊預留 - 4)





例子:
總大小:128M(1Gbit)
頁大小:2K bytes
塊大小:128K
塊數量:1024
假設是徹底無壞塊的片子,其管理開銷爲:




UBI管理開銷 = (20 + 4) * 128K + 2 * 2K * (1024 - 20 - 4) = 7072K ≈ 7M


3、UBI文件系統的使用

一、UBI用戶空間工具:
工具    做用
ubinfo            提供ubi設備和卷的信息
ubiattach        連接MTD設備到UBI而且建立相應的UBI設備
ubidetach        ubiattach相反的操做,將MTD設備從UBI設備上去連接
ubimkvol        從UBI設備上建立UBI卷
ubirmvol        從UBI設備上刪除UBI卷
ubiblock        管理UBI捲上的block
ubiupdatevol    更新卷,例如OTA直接更新某個分區鏡像
ubicrc32        使用與ubi相同的基數計算文件的crc32
ubinize            製做UBI鏡像
ubiformat        格式化空的Flash設備,擦除Flash,保存擦除計數,寫入UBI鏡像到Flash
mtdinfo            報告從系統中找到的UBI設備的信息











二、製做ubi鏡像文件範例
1)mkfs.ubifs的用法 
Usage: mkfs.ubifs [OPTIONS] target 
Make a UBIFS file system image from an existing directory tree 
Examples: 
Build file system from directory /opt/img, writting the result in the ubifs.img file 
        mkfs.ubifs -m 512 -e 128KiB -c 100 -r /opt/img ubifs.img 
The same, but writting directly to an UBI volume 
        mkfs.ubifs -r /opt/img /dev/ubi0_0 
Creating an empty UBIFS filesystem on an UBI volume 
        mkfs.ubifs /dev/ubi0_0 
Options: 
-r, -d, --root=DIR               build file system from directory DIR 
-m, --min-io-size=SIZE       minimum I/O unit size,最小輸入輸出大小 
-e, --leb-size=SIZE        logical erase block size邏輯可擦出塊大小 
-c, --max-leb-cnt=COUNT    maximum logical erase block count最大邏輯可擦出塊數目 
-o, --output=FILE        output to FILE輸出文件名 
-j, --jrn-size=SIZE      journal size 
-R, --reserved=SIZE      how much space should be reserved for the super-user 
-x, --compr=TYPE        compression type - "lzo", "favor_lzo", "zlib" or 
                                  "none" (default: "lzo") 
-X, --favor-percent       may only be used with favor LZO compression and defines 
                                how many percent better zlib should compress to make 
                                mkfs.ubifs use zlib instead of LZO (default 20%) 
-f, --fanout=NUM         fanout NUM (default: 8) 
-F, --space-fixup         file-system free space has to be fixed up on first moun
                          (requires kernel version 3.0 or greater) 
-k, --keyhash=TYPE       key hash type - "r5" or "test" (default: "r5") 
-p, --orph-lebs=COUNT     count of erase blocks for orphans (default: 1) 
-D, --devtable=FILE       use device table FILE 
-U, --squash-uids         squash owners making all files owned by root 
-l, --log-lebs=COUNT     count of erase blocks for the log (used only for debugging) 
-v, --verbose             verbose operation 
-V, --version             display version information 
-g, --debug=LEVEL         display debug information (0 - none, 1 - statistics, 2 - files, 3 - more details) 
-h, --help               display this help text 
例: 
mkfs.ubifs -x lzo -m 2KiB -e 124KiB -c 720 -o system_ubifs.img -d $path_to_system 
-x壓縮格式爲lzo 
-m最小輸入輸出大小爲2KiB(2048bytes),通常爲頁大小 
-e邏輯可擦除塊大小爲124KiB=(每塊的頁數-2)*頁大小=(64-2)*2KiB=124KiB 
-c最多邏輯可擦除塊數目爲720(720*128KiB=90MiB),這個可根據ubi volume來設置,其實是設置此卷的最大容量。 
經過此命令製做的出的UBIFS文件系統鏡像可在u-boot下使用ubi write命令燒寫到NAND FLASH上。
========================================================================================










































2)ubinize的用法
Usage: ubinize [-o filename] [-p <bytes>] [-m <bytes>] [-s <bytes>] [-O <num>] [-e 
<num>][-x  <num>]  [-Q  <num>]  [-v]  [-h]  [-V]  [--output=<filename>] 
[--peb-size=<bytes>]  [--min-io-size=<bytes>]  [--sub-page-size=<bytes>] 
[--vid-hdr-offset=<num>]  [--erase-counter=<num>]  [--ubi-ver=<num>] 
[--image-seq=<num>] [--verbose] [--help] [--version] ini-file 
Example: ubinize -o ubi.img -p 16KiB -m 512 -s 256 cfg.ini - create UBI image 
         'ubi.img' as described by configuration file 'cfg.ini' 
-o, --output=<file name>     output file name 
-p, --peb-size=<bytes>       size of the physical eraseblock of the flash 
                             this UBI image is created for in bytes, 
                              kilobytes (KiB), or megabytes (MiB) 
                              (mandatory parameter)物理可擦出塊大小 
-m, --min-io-size=<bytes>    minimum input/output unit size of the flash 
                             in bytes 
-s, --sub-page-size=<bytes>  minimum input/output unit used for UBI 
                             headers, e.g. sub-page size in case of NAND 
                             flash (equivalent to the minimum input/output 
                             unit size by default)子頁大小 
-O, --vid-hdr-offset=<num>   offset if the VID header from start of the 
                              physical eraseblock (default is the next 
                             minimum I/O unit or sub-page after the EC 
                             header)VID頭部偏移量,默認是512 
-e, --erase-counter=<num>    the erase counter value to put to EC headers (default is 0) 
-x, --ubi-ver=<num>           UBI version number to put to EC headers  (default is 1) 
-Q, --image-seq=<num>        32-bit UBI image sequence number to use 
                             (by default a random number is picked) 
-v, --verbose                be verbose 
-h, --help                   print help message 
-V, --version                print program version 
例: 
ubinize –o ubi.img -m 2KiB -p 128KiB -s 2048 $system_cfg_file –v 
-m最小輸入輸出大小爲2KiB(2048bytes),通常爲頁大小 
-p物理可擦出塊大小爲128KiB=每塊的頁數*頁大小=64*2KiB=128KiB 
-s用於UBI頭部信息的最小輸入輸出單元,通常與最小輸入輸出單元(-m參數)大小同樣。 
此命令生成的ubi.img可直接使用NAND FLASH的燒寫命令燒寫到FLASH上(帶有UBI文件系統鏡像卷標)。


































3)ubinize須要指定一個配置文件$system_cfg_file,內容以下: 
[rootfs-volume]  
mode=ubi  
image=system_ubifs.img  
vol_id=0  
vol_size=90MiB  
vol_type=dynamic 
vol_name=system 
======================================================================
配置文件說明 
INI-file format. 
The input configuration ini-file describes all the volumes which have to 
be included to the output UBI image. Each volume is described in its own 
section which may be named arbitrarily. The section consists on 
"key=value" pairs, for example: 
 
[jffs2-volume] 
mode=ubi 
image=../jffs2.img         mkfs.ubi生成的源鏡像 
vol_id=1                   卷序號 
vol_size=30MiB             卷大小 
vol_type=dynamic           動態卷 
vol_name=jffs2_volume      卷名 
vol_flags=autoresize      
vol_alignment=1 























This example configuration file tells the utility to create an UBI image with one volume with ID 1, volume size 30MiB, the volume is dynamic, has name "jffs2_volume", "autoresize" volume flag, and alignment 1. The "image=../jffs2.img" line tells the utility to take the contents of the volume from the "../jffs2.img" file. The size of the image file has to be less or equivalent to the volume size (30MiB). The "mode=ubi" line is mandatory and just tells that the section describes an UBI volume - other section modes may be added in the future. 
Notes: 
  * size in vol_size might be specified kilobytes (KiB), megabytes (MiB),  gigabytes (GiB) or bytes (no modifier); 
  * if "vol_size" key is absent, the volume size is assumed to be equivalent to the size of the image file (defined by "image" key); 
  * if the "image" is absent, the volume is assumed to be empty; 
  * volume alignment must not be greater than the logical eraseblock size; 
  * one ini file may contain arbitrary number of sections, the utility will put all the volumes which are described by these section to the           output UBI image file. 






三、寫入鏡像
將ubi.img鏡像寫入到nand flash上

1)使用open(),write()等系統調用函數將鏡像寫入到/dev/xxx_ubi捲上;

2)或者使用ubiupdatevol更新卷,更新鏡像中的卷;
例如,把/dev/ubi1_x的內容同步到/dev/ubi0_x
dd if=/dev/ubi1_x of=xxx.ubi
ubiupdatevol /dev/ubi0_x  xxx.ubi


3)手動寫入:按照設備啓動過程當中加載ubi卷這一節中的1)~ 4)步驟操做;

四、設備啓動過程當中加載ubi卷

1)格式化mtd設備而後寫入鏡像(若是是手動寫入ubi卷鬚要加這一步操做):
擦除:flash_eraseall /dev/mtd2或ubiformat /dev/mtd2
寫入:nandwrite  -p /dev/mtd2 xxx.ubi

2)連接MTD設備到UBI而且建立相應的UBI設備:
ubiattach -m mtd2 -d 2   

3)從UBI設備上建立UBI卷:
ubimkvol /dev/ubi0 -N user1 -s 100MiB 
在UBI設備/dev/ubi0上建立UBI卷ubix_x,第一個卷爲ubix_0,user1爲ubi卷名。ubix_0與ubix:user1是等價的。

4)mount將ubi卷掛載到文件系統中某個目錄下,能夠經過操做這個目錄下的文件來實現ubi讀寫: mount -t ubifs ubi0_0 /mnt/ubi或mount -t ubifs ubi0:user1 /mnt/ubi 將ubi0_0卷以ubi文件系統的格式掛載到/mnt/ubi目錄下,-t指定掛載的文件系統格式。

相關文章
相關標籤/搜索