Ext4檔案系統一之架構分析
Balloc.c (kernel\fs\ext4)
本文描述Ext4檔案系統磁碟佈局和元資料的一些分析,同樣適用於Ext3和Ext2檔案系統,除了它們不支援的Ext4的特性外。整個分析分兩篇博文,分別概述佈局和詳細介紹各個佈局的資料結構及組織定址方式等。感興趣的看官敬請留意和指導!
1. Ext4檔案系統佈局綜述
一個Ext4檔案系統被分成一系列塊組。為減少磁碟碎片產生的效能瓶頸,塊分配器儘量保持每個檔案的資料塊都在同一個塊組中,從而減少尋道時間。以4KB的資料塊為例,一個塊組可以包含32768個數據塊,也就是128MB。
1.1 磁碟佈局
Ext4檔案系統的標準磁碟佈局如下:
Ext4檔案系統主要使用塊組0中的超級塊和塊組描述符表,在其他一些特定塊組中有超級塊和塊組描述符表的冗餘備份。如果塊組中不含冗餘備份,那麼塊組就以資料塊點陣圖開始。當格式化磁碟成為Ext4檔案系統的時候,mkfs將在塊組描述符表後面分配預留GDT表資料塊(“Reserve GDT blocks”)以用於將來擴充套件檔案系統。緊接在預留GDT表資料塊後的是資料塊點陣圖與inode表點陣圖,這兩個點陣圖分別表示本塊組內的資料塊與inode表的使用,inode表資料塊之後就是儲存檔案的資料塊了。在這些各種各樣的塊中,超級塊、GDT、塊點陣圖、Inode點陣圖都是整個檔案系統的元資料,當然inode表也是檔案系統的元資料,但是inode表是與檔案一一對應的,我更傾向於將inode當做檔案的元資料,因為在實際格式化檔案系統的時候,除了已經使用的十來個外,其他inode表中實際上是沒有任何資料的,直到建立了相應的檔案才會分配inode表,檔案系統才會在inode表中寫入與檔案相關的inode資訊。
1.2 Flexible 塊組(flex_bg)
Flexible 塊組(flex_bg)是從Ext4開始引入的新特性。在一個flex_bg中,幾個塊組在一起組成一個邏輯塊組flex_bg。Flex_bg的第一個塊組中的點陣圖空間和inode表空間擴大為包含了flex_bg中其他塊組上點陣圖和inode表。
比如flex_bg包含4個塊組,塊組0將按序包含超級塊、塊組描述符表、塊組0-3的資料塊點陣圖、塊組0-3的inode點陣圖、塊組0-3的inode表,塊組0中的其他空間用於儲存檔案資料。同時,其他塊組上的資料塊點陣圖、inode點陣圖、inode表元資料就不存在了,但是SB和GDT還是存在的。
Flexible塊組的作用是:
(1) 聚集元資料,加速元資料載入;
(2) 使得大檔案在磁碟上儘量連續;
即使開啟flex_bg特性,超級塊和塊組描述符的冗餘備份仍然位於塊組的開頭。 Flex_bg中塊組的個數由2^ext4_super_block.s_log_groups_per_flex 給出。
1.3 元塊組(Meta Block Groups)
通常,在每個冗餘備份的超級塊的後面是一個完整的(包含所有塊組描述符的)塊組描述符表的備份。這樣會產生一個限制,以Ext4的塊組描述符大小64 Bytes計算,檔案系統中最多隻能有2^21個塊組,也就是檔案系統最大為256TB。
使用元塊組Meta Block Groups特性,每個塊組都包含該塊組自己的描述符的冗餘備份。因此可以建立2^33個塊組,也就是檔案系統最大1EB。48位資料塊,每個塊組128MB,因而可以建立2^33個塊組。
元塊組實際上是可以用一個塊組描述符塊來進行描述的塊組集,簡單的說,它由一系列塊組組成,同時這些塊組對應的塊組描述符儲存在一個塊中。它的出現使得Ext3和Ext4的磁碟佈局有了一定的變化,以往超級塊後緊跟的是變長的GDT塊,現在是超級塊依然決定於是否是3,5,7的冪,而一個塊組描述符塊則儲存在元塊組的第一個,第二個和最後一個塊組的開始處(見下圖)
在兩種情況下我們可能會用到這種新佈局:
(1) 檔案系統建立時。使用者可以指定使用這種佈局。
(2) 當檔案系統增長而且預留的組描述符塊耗盡時。目前超級塊中有一個域s_first_meta_bg用於描述第一個使用元塊組的塊組。
當增加新塊組時,我們不需要給組描述符表預留空間,而是在當前檔案系統後面直接新增新的元塊組就可以了。
1.4 Lazy 塊組初始化
如果塊組中的相應標誌已設定,那麼塊組中的inode點陣圖和inode表將不被初始化。這樣可以減少mkfs時間,如果開啟了塊組描述符校驗和功能,甚至連塊組都可以不初始化。
1.5 特殊inodes
Ext4預留了一些inode做特殊特性使用,見下表:
表 1 Ext4的特殊inode
Inode號 用途
0 不存在0號inode
1 損壞資料塊連結串列
2 根目錄
3 ACL索引
4 ACL資料
5 Boot loader
6 未刪除的目錄
7 預留的塊組描述符inode
8 日誌inode
11 第一個非預留的inode,通常是lost+found目錄
1.6 資料塊和Inode分配策略
在機械磁碟上,保持相關的資料塊相互接近可以總的磁頭移動時間,因而可以加速磁碟IO。在SSD上雖然沒有磁頭轉動,資料區域性性可以增加每次IO請求的傳輸的資料大小,因而減少響應IO請求的傳輸次數。資料的區域性性對單個擦除塊的寫入產生影響,可以加速檔案重寫的速度。因而儘可能減少碎片是必要的。inode和資料塊的分配策略可以保證資料的區域性集中。以下為inode和資料塊的分配策略:
(1) 多塊分配可以減少磁碟碎片。當檔案初次建立的時候,塊分配器預測性地分配8KB的磁碟空間給檔案。當檔案關閉的時候,未使用的空間當然也就釋放了。但是如果推測是正確的,那麼檔案資料將寫到一個多個塊的extent中。
(2) 延遲分配。當一個檔案需要更多的資料塊引起寫操作時,檔案系統推遲決定新資料在磁碟上的存放位置,直到髒的buffer寫到磁碟為止。
(3) 儘量保持檔案的資料塊與其inode在同一個塊組中。可以減少磁碟尋道時間.
(4) 儘量保持同一個目錄中的所有inodes與目錄位於同一個塊組中。這樣的假設前提是一個目錄中的檔案是相關的。
(5) 磁碟卷被分成128MB的塊組。當在根目錄中建立目錄時,inode分配器掃描塊組並將新目錄放到它找到的使用負荷最小的塊組中。這可以保證目錄在磁碟上的分散性。
(6) 即使上述機制無效,仍然可以使用e4defrag整理碎片檔案。