介紹
Ext2文件系統全稱為Second Extended FileSystem(第二擴展文件系統),既然是第二個那麼就存在第一個,第一個就是擴展文件系統 Extended FileSystem。當然還有Ext3和Ext4,Ext4還是很不錯的的文件系統,但是brtfs是目前的主流Linux文件系統。
磁盤佈局
名詞
- 引導區
磁盤中的第一塊是引導塊,這一塊不受文件系統的管理,因為第一塊是為引導扇區保留的。 - 塊組
除了第一塊以外,磁盤中的其他內容被劃分為n個塊組,每個塊組由超級塊、組描述符、數據塊位圖、索引節點位圖、索引節點表和數據塊組成。
塊組通過儘可能把一個文件的數據塊放到同一個塊組來減少文件碎片。
佈局圖
超級塊 super block
超級塊是所有塊組的管理塊,超級塊包含文件系統版本、魔數、塊組的統計、數據壓縮等等數據。超級塊佔用一個塊的空間。
超級塊就相當於文件系統的老闆,每個塊組相當於一條業務線,老闆需要知道每條業務線報表信息,老闆在一開始就為存儲信息這件事情做好了周密的計劃和安排。
組描述符
Ext2文件系統只有一個組描述符,組描述符描述了Ext2文件系統中所有塊組的信息。
組描述符主要包括:
- 每個塊組的塊位圖塊號;
- 每個塊組中的索引節點位圖塊號;
- 統計信息:塊組中空閒塊的個數、塊組中空閒索引節點個數、塊組中目錄個數
數據塊位圖
一個塊組的數據塊位圖佔用一個塊,數據塊位圖用來描述塊組中數據庫是否被使用,塊組中一個數據塊使用1bit信息就可以來確定。
索引節點位圖
一個塊組的索引節點位圖佔用一個塊,索引節點位圖用來描述塊組中索引節點表中的索引節點是否使用,塊組中一個索引節點使用1bit信息就可以來確定。
索引節點表
索引節點表包含了塊組中的索引節點也就是i-node,所有的索引節點是等長的,也就是128字節,我個人認為索引節點最重要的一個設計內容是數據塊指針。
目錄
在Ext2中目錄也是一種特殊的文件,目錄存儲時把文件名和索引節點號存放到一起。目錄的層級結構是通過目錄項中的字段:目錄項長度字段來關聯的。
索引節點 i-node
索引節點描述了一個文件信息,這些信息通常包括文件大小、創建時間、訪問時間、修改時間及權限信息。Ext2文件系統索引節點總共128個字節,其中字節數整個索引節點最大的是數據塊指針(數據塊指針和塊大小決定了Ext2文件系統單文件的大小同時訪問文件數據是通過數據塊尋址來完成的。)數據塊指針的代碼定義如下:
__le32 i_block[EXT2_N_BLOCKS];
其中__le32表示一個小端的32位數字,也就是4個字節。如果EXT2_N_BLOCKS默認值為15的話,那麼數據指針會佔用15 * 4 = 60個字節,差不多是索引節點整個存儲空間的一半了。
數據塊指針與尋址
Ext2文件系統通過對數據塊指針進行劃分來組織文件數據及尋址,劃分方式如下圖(假設默認有15個數據塊指針):
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-IYLjAS32-1648392406760)(en-resource://database/1891:0)]
數據尋址方式如下:
- 前12個數字(也就是數組下標0-11)與文件最初的12個塊對應,這12個數字指向12個磁盤塊,這12個磁盤塊存放文件的前12塊數據;
- 第13個數字指向一個磁盤塊,但是這個磁盤塊又由B/4(B表示磁盤塊大小)個數字組成,這些數字分表又指向一個磁盤塊,所以第13個數字又稱為間接塊號或者一級間接索引;
- 第14個數字基於第13個模式又增加了一級,所以第14個數字又稱為二級間接索引;
- 第15個數字基於第14個數字模式又增加一級,所以第15個數字又稱為三級間接索引。
圖形化表示如下(圖片來源於維基百科):
基於數據塊指針的數據尋址方式,Ext2文件系統的文件數據尋址理論大小限制為:
|
塊大小
|
直接尋址
|
一級間接索引
|
二級間接索引
|
三級間接索引
|
實際大小
|
|
1KB
|
12KB
|
268KB
|
64.26MB
|
16.06GB
|
16.06GB
|
|
2KB
|
24KB
|
1.02MB
|
513.02MB
|
256GB
|
16.256GB
|
|
4KB
|
48KB
|
4.04
|
4GB
|
4TB
|
2TB
|
|
8KB
|
96KB
|
8.08
|
8GB
|
8TB
|
2TB
|
Ext2文件系統問題
Ext2的問題主要是還是一致性問題,當計算機發生故障時比如:斷電、CPU故障等等發生時造成文件系統內容不一致。
總結
- Ext2多級數據尋址方式可以支持小、中和大類型的文件,其中尋址次數最壞情況下最多四次,但是最好情況下是0次,前提是所有數據都緩存在了高速緩存;
- Ext2文件系統設計要點主要是磁盤佈局、塊組和i-node中的數據尋址方式;