Ext4檔案系統架構分析 二

2021-06-21 07:27:46 字數 3601 閱讀 6517

超級塊記錄整個檔案系統的大量資訊,如資料塊個數、inode個數、支援的特性、管理資訊,等待。

如果設定sparse_super特性標誌,超級塊和塊組描述符表的冗餘備份僅存放在編號為0或3、5、7的冪次方的塊組中。如果未設定sparse_super特性標誌,冗餘備份存在與所有的塊組中。以下是2.6.32.18核心中對ext4超級塊的描述:

3.0的核心中,ext4的超級塊加入了以下相關元資料:快照、檔案系統錯誤處理相關、掛載選項、配額檔案inode、超級塊校驗和等,見下圖。目前沒有深入研究這些新的元資料。

如果設定了meta_bg特性標誌,幾個塊組結合成乙個meta group。在meta_bg的情況下,在meta group中的第乙個和最後兩個塊組中僅包含meta group中的塊組的塊組描述符。flex_bg和meta_bg互斥因而不能共同出現。

資料塊點陣圖跟蹤塊組中資料塊使用情況。inode點陣圖跟蹤塊組中inode使用情況。每個位圖乙個資料塊,每一位用0或1表示乙個塊組中資料塊或inode表中inode的使用情況。如果乙個資料塊大小是4kb的話,那乙個位圖塊可以表示4*1024*8個資料塊的使用情況,這也是單個塊組具有的最大資料塊個數。這樣可以算出乙個塊組大小是128mb。當然乙個位圖塊也可以表示4*1024*8個inode的使用情況,但是實際上乙個塊組中即使存滿了檔案,也不會用到這麼多的inode,因為實際系統中基本不會出現所有檔案大小都小於等於1個資料塊大小的情況。實際上乙個塊組中有多少個inode,在塊組描述符中是確定的,在檔案系統格式化過程中也會看到這個數值,如果沒記錯的話,大概是每4個還是8個資料塊分配乙個inode空間。

為了找到與乙個檔案相關的資訊,必須遍歷目錄檔案找到與檔案相關的目錄項,然後載入inode找到該檔案的元資料。ext4在目錄項中用一位儲存了檔案型別(通常儲存在inode中)的拷貝,這對效能提公升有益。inode表的大小為ext4_super_block.s_inode_size * ext4_super_block.s_inodes_per_group bytes。 

ext4的inode的資料結構大小為156 bytes,但是ext4的標準inode的大小是256 bytes。

每個塊組包含ext4_super_block.s_inodes_per_group個inodes。因為0號inode不存在,可以通過如下的算式計算inode所在的塊組:

bg=(inode_num -1)/ ext4_super_block.s_inodes_per_group

inode在塊組中inode表中的索引index可以通過如下的算式計算:

index=(inode_num -1) % ext4_super_block.s_inodes_per_group

offset=index * ext4_super_block.s_inode _size

取決於檔案型別,inode.i_blocks使用的方式不同。一般來說,常規檔案和目錄用inode.i_blocks作為檔案資料塊索引資訊,特殊檔案將inode.i_blocks用於特殊用途。常規檔案用inode.i_blocks作為檔案資料塊索引資訊的**索引結構會在後面直接、間接塊位址中詳細介紹。

如果符號鏈結的目標字串長度小於60位元組,那麼就將其儲存在inode.i_blocks中,inode中inode.i_blocks佔據的大小剛好是60kb。這裡要注意到的是,有些檔案其內容是跟檔案的元資料放在一起的,因而就沒有了資料塊。也就是說不是每個檔案資料都必然佔據著乙個資料塊。

ext2/ext3中資料塊對映方式如下表

ext4中用extent樹代替了邏輯塊對映。使用extents,用乙個struct ext4_extent結構就可以對映多個資料塊,減少元資料塊的使用。如果設定了flex_bg,甚至可以用乙個extent分配乙個非常大的檔案。使用extent特性,inode必須設定extents flag。

extents以樹的方式安排。extent樹的每個節點都以乙個ext4_extent_header開頭,如果節點是內部節點(ext4_extent_header.eh_depth>0),ext4_extent_header後面緊跟的是ext4_extent_header .eh_entries個索引項struct ext4_extent_idx,每個索引項指向該extent樹中乙個包含更多的節點的資料塊。如果節點是葉子節點(ext4_extent_header.eh_depth==0),ext4_extent_header後面緊跟的是ext4_extent_header .eh_entries個struct ext4_extent資料結構。這些ext4_extent結構指向檔案資料塊。extent樹的根結點儲存在inode.i_blocks中,可以儲存檔案的前4個extents而不需額外的元資料塊。

struct ext4_extent_idx:extent樹的內部節點,也稱為索引節點。

ext4_extent:extent樹的葉子節點。

由於extent樹的根在inode中,因而extent樹資料塊指extent樹的除根據節點外的所有內部節點和葉子節點。extent的樹根節點和葉子節點的資料塊中儲存完xt4_extent_idx和xt4_extent資料結構後至少會留下4 ((2^x%12)>=4) bytes的空間。因而可以加入乙個結構struct ext4_extent_tail,其中儲存32位的校驗和。位於inode中的4個extents無需校驗和,因為inode已經做了校驗和。

ext4檔案系統中,乙個目錄差不多是乙個平面檔案,對映任意長度的字串到檔案系統中的乙個inode。檔案系統中存在多個目錄項引用同乙個inode——硬鏈結,這也是硬鏈結不能鏈結其他檔案系統中的檔案的原因。

預設地,目錄檔案中包含乙個線性的目錄項陣列。未使用的目錄項標記為inode =0。ext4檔案系統預設地使用struct ext4_dir_entry_2記錄目錄項,除非沒有設定filetype特性標誌。在沒有設定filetype特性標誌的情況下,使用struct ext4_dir_entry記錄目錄項。

ext4檔案系統綜述

從本篇部落格起,我們開始研究現代檔案系統ext4,說其現代是因為其相比傳統檔案系統,有著更現代化的設計。這些先進的特性體現在本文所要敘述的以下方面。ext4是linux檔案系統的一次革命。在很多方面,ext4相對於ext3的進步要遠超過ext3相對於ext2的進步。ext3相對於 ext2的改進主要...

剖析ext4檔案系統

簡介 第 4 個擴充套件檔案系統,即 ext4 是下一代的日誌檔案系統,它與上一代檔案系統 ext3 是向後相容的。儘管 ext4 目前還不是標準檔案系統,但它將成為大部分下一代 linux 發行版的預設檔案系統。了解 ext4,以及它為什麼將成為您最喜歡的新檔案系統。linux 核心的每次發行都伴...

EXT4檔案組織 EXT4檔案系統詳解2

ext4 檔案系統是從 ext2 和 ext3 上發展而來的,這裡我們來分析它們是如何將乙個檔案的內容組織起來,從而在磁碟上 拼湊出乙個檔案 出於對ext4檔案系統相容性的考慮,我們嘗試在先從ext2檔案系統的檔案組織方式說起。ext2檔案節點定義 ext2 檔案節點變數有點多,我們需要關注i bl...