淺談Linux下的EXT3文件系統

【EXT3的基本介紹】

1、EXT3文件系統存儲單位是“塊”,就好比NTFS的“簇”。格式化硬盤或分區時將所有磁盤空間分成若干個大小相同“塊”。“塊”大小是可以在格式化指定,也可以採用默認的。

2、塊是EXT3文件系統中的數據存儲單元,每個塊都有一個唯一編號,從0開始。0號塊起始於文件系統起始扇區。

3、EXT3文件系統將若干個塊組成“塊組”,每個塊組大小相同。但是由於塊的總數不一定是塊組的整倍數,所以最後一個塊組相對於其他塊組要小。

4、每個塊組都對應一個塊組描述符,這些塊組描述符統一放在文件系統的前面,對塊組進行管理。

5、EXT3文件系統使用“i節點”來記錄文件的時間,大小,塊指針等信息;用目錄項描述文件名和節點號,通過節點號就能訪問其節點信息了。

6、在整個文件系統的頭部,是超級快,用以描述文件系統的綜合信息。


如下是EXT3文件系統的結構圖

wKiom1LUu3OBEyX1AADsV8ccK3w710.jpg


【分析超級快】

   EXT3的超級塊起始於文件系統的第2號扇區,佔用兩個扇區,0-1號扇區被引導程序佔用。EXT3的超級快是一個非常重要的扇區,它記錄了文件系統的很多參數。如果超級快損壞文件系統將不可用

如下是超級塊的一些常見參數:

0x00~0x03:文件系統中包含的i節點總數。

0x04~0x07:文件系統中包含的總塊數。

0x08~0x0B:保留塊數,文件系統給自身保留的塊數量。

0x0C~0x0F:空閒塊數,既當前文件系統的可用塊數量。

0x10~0x13:空閒i節點數,當前文件系統的可用i節點數量。

0x14~0x17:第一個數據塊,既0號塊組的起始起始塊號。

0x18~0x1B:塊大小描述值,塊大小=2的N次方*1024字節,N爲改參數。

0x1C~0x1F:段大小描述值,與塊大小描述值相同。

0x20~0x23:塊組大小描述值,既每塊組中的塊數量。

0x24~0x27:每塊組中包含的段數,與塊組大小描述符相同。

0x28~0x2B:每塊中包含i節點數。

…………

此處省略部分參數解釋


【分析塊組描述符表】

   EXT3文件系統的塊組描述符表起始於超級塊下面的一個塊,每個塊組描述符佔32個字節,多個塊組描述符組成了塊組描述符表。如下圖:是使用“Winhex”打開的塊組描述符表。

wKioL1LUxHqyqyhHAAJvQF94HRQ635.jpg

塊組描述的參數解釋如下:

0x00~0x03:該塊組的塊位圖起始塊號。

0x04~0x07:該塊組的i節點位圖起始塊號。

0x08~0x0B:該塊組的i節點表起始塊號。

0x0C~0x0D:該塊組的空閒塊數,既可用塊數量。

0x0E~0x0F:該塊組的空閒i節點數,既可用i節點數量。

0x10~0x11:該塊組的目錄總數。

0x12~0x13:填充。

0x14~0x1F:未用。

超級塊和塊組描述符表的是非常重要的,如果超級塊或者塊組描述符損壞,會導致文件系統不可以,因此文件系統對他們都有備份。如果文件系統不具有“稀疏超級塊特性”,那麼每個塊組中都有超級塊以及塊組描述符;如果文件系統具有“稀疏超級塊特性”,那麼只會在3、5、7的冪中纔會有備份(如:1、3、5、7、9、25、49等)。


【塊位圖分析】

   EXT3文件系統中以塊爲存儲單位,若干個塊又組成了一個塊組,在塊組中塊的使用情況用塊位圖來記錄。塊位圖的主要特點如下:

1、每個塊組中都塊位圖,塊位圖的地址在該塊組描述符中有指定。

2、對於含有超級塊、塊組描述表以及它們的備份的塊組,塊位圖位於塊組描述表的下一個塊;否則,則位於塊組的第一個塊。

3、在創建文件系統的時候,系統會將每個塊組中的塊數和塊位圖中的位數設置爲相同。因此保證了塊位圖的每一位對應一個塊。

4、塊位圖中的每個字節對應8個塊(1字節=8位),第一個塊對應該字節的最低位(例如:某字節的值爲0xFE,轉換成二進制爲11111110,則第一個塊對應最低位0)。如果某個塊的對應爲沒有設置,那麼則表示此塊目前未使用;否則,則表示此塊以使用或者是不可用。

5、計算塊在文件系統中的絕對位置的公式如下:

文件系統的絕對塊號=(當前偏移量-塊位圖的起始位置)* 8 + 塊組在文件系統中的起始位置


【i節點位圖分析】

   EXT3文件系統中使用i節點來描述文件的元數據,i節點的使用情況由塊組中的i節點位圖來記錄。i節點位圖的基本特點如下:

1、每個塊組中都有i節點位圖,i節點位圖的地址在該塊組描述符中指定。

2、i節點位圖的位置在塊位圖的下一個塊,和塊位圖一樣,i節點中的每個字節對應8個i節點,第一個i節點對應該字節的最低位。

3、由於i節點位圖的大小小於一個塊,所以i節點的大小需要使用塊組描述符中i節點數除以8得出i節點位圖的大小。

4、i節點從1開始編號,既第一個i節點是1號i節點而不是0號i節點。

5、計算文件系統中絕對i節點公式如下:

文件系統中絕對i節點=(當前偏移量-i節點位圖的起始位置)* 8 + 改塊組的第一個i節點號


【i節點分析】

   EXT3文件系統的i節點用來存儲除文件名以外的所有信息,i節點的主要特點如下:

1、文件系統中每個塊組都有自己的i節點,每個文件或目錄佔用一個i節點,若干個i節點組成i節點表。

2、i節點位於i節點位圖的下一個塊,在超級塊中記錄了文件傳統中i節點的總數,在塊組描述符中記錄了本塊組i節點的總數。

3、每個i節點的大小爲128字節,也可以定義大於128字節的“大i節點”。

4、每個i節點都有編號,第一個i節點編號爲1,1~10號i節點爲系統保留,2號i節點被分配給根目錄使用。

5、如果已知一個i節點號,計算該i節點所在的塊組公式如下:

(i節點號-1)DIV 每塊組i節點數

如下:是使用Winhex打開的一個完整的i節點

wKiom1LVUlDQS7iUAAIgpzwolDs135.jpg

如下:是各參數的解釋

wKioL1LVUmnATQHaAAVSv3nyiSM859.jpg

這裏重點解釋一下“直接塊指針”和“間接塊指針”。

   在EXT3文件系統中一個有15個塊指針,分別是12直接塊指針、1個間接塊指針、1個二級間接塊指針、1個三級間接塊指針。12個直接塊指針直接指向文件的內容,如果文件的內容大於12個塊,那麼第13個間接塊指針所指向的塊記錄直接塊指針而不是文件內容,直接塊指針再指向文件內容。如果間接塊指針也不夠用時,就需要二級間接塊指針了,二級間接指針指向的塊記錄間接塊指針。以此類推,不做多解釋,如果二級間接塊指針還不夠用時就需要三級間接塊指針了。


【分析目錄項】

   目錄項用來存放文件或目錄的i節點號、目錄項的長度、文件名等信息,他們存儲在分配給目錄項的塊中。目錄項的主要特點如下:

1、目錄項存儲在目錄區中,i節點內有描述目錄區地址的塊指針。

2、目錄項的長度是不固定,隨文件名的長度不同而不同,文件名最長爲255個字符。

3、雖然目錄項的長度不固定,但是其長度一定是4字節的倍數,如果文件名不夠4字節的倍數,則在尾部填0補齊。

4、目錄區中的前兩個項一個是“.”和“..”,分別表示當前目錄和上一級目錄。

5、每個目錄項中有一個長度值指向下一個目錄項,最後一個目錄項的長度則指向本塊的結尾處。

如下:是使用Winhex打開的文件系統根目錄

wKiom1LVWV-AYFleAANnXX_fxNc270.jpg

其中各目錄項的解釋如下:

wKioL1LVWZrRTPGoAAGWdGxEDZ8175.jpg


【分析EXT3文件系統的底層存儲結構】

   EXT3文件系統首相被分成若干個塊組,並通過塊組描述符描述這些塊組,所有塊組描述符組成塊組描述表,塊組描述表位於超級塊的下一個塊。文件以塊爲單位進行存儲,每個文件都有自己的i節點以及目錄項,i節點中記錄了文件的大小、時間信息、塊指針等信息,而目錄項則記錄了文件的i節點號、文件名等信息。將i節點和目錄項結合起來分析,就可以得出文件的所有信息,並通過塊指針定位到數據存放的地址,塊指針所指向的塊就是文件的內容。

綜合上述,EXT3文件系統可以用一副圖來描述其內部結構。如下圖:

wKiom1LVXEaTa486AAC5Ko6BIs8941.jpg分析EXT3內部存儲結構的步驟如下:

1、讀取超級塊和塊組描述符的參數

超級塊位於2號扇區,從超級塊中可以獲取一下參數。

塊大小、每塊組包含的塊數、每塊組包含的i節點數、i節點大小等等。

塊組描述符位於超級塊的下一個塊,從塊組描述符中可以獲取一下參數。

該塊組i節點表的起始位置等等。

2、讀取i節點表

我們知道1~10號i節點爲系統 保留,2號i節點被分配給根目錄使用,所以我們找到2號i節點,根據i節點中的直接塊指針可以找到根目錄。

3、讀取根目錄區

根據i節點的直接塊指針,我們找到了根目錄,我們可以在根目錄項中分析我們需要的目錄i節點,並計算出該目錄所在的塊組。計算公式如下:(目錄i節點號 - 1)DIV 每塊組中的i節點數

計算出該目錄所在的塊組之後,還需要計算出該i節點號對應該塊組的幾號i節點。計算公式如下:

[(目錄i節點號 - 1)MOD 每塊組中的i節點數 ] + 1

4、讀取子目錄區

根據上述的方法我已經可以定位到子目錄區了,在子目錄中我們可以分析我們需要的子目錄或文件i節點了。如果是文件,則查看i節點內的直接塊指針所指向塊的內容,如果有間接指針,則分析間接指針。如果還有子目錄,則按照上述的方法進行計算塊組,計算塊組中的i節點號即可。


呼...終於寫完了,下班後本來沒打算寫的,後來還是堅持寫下來了。雖然以是凌晨了,不過感覺還是挺值得的。只要堅持,沒有什麼事做不到的,相信自己。



作者:鄧奇


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章