【EXT3的基本介紹】
1、EXT3文件系統存儲單位是“塊”,就好比NTFS的“簇”。格式化硬盤或分區時將所有磁盤空間分成若干個大小相同“塊”。“塊”大小是可以在格式化指定,也可以採用默認的。
2、塊是EXT3文件系統中的數據存儲單元,每個塊都有一個唯一編號,從0開始。0號塊起始於文件系統起始扇區。
3、EXT3文件系統將若干個塊組成“塊組”,每個塊組大小相同。但是由於塊的總數不一定是塊組的整倍數,所以最後一個塊組相對於其他塊組要小。
4、每個塊組都對應一個塊組描述符,這些塊組描述符統一放在文件系統的前面,對塊組進行管理。
5、EXT3文件系統使用“i節點”來記錄文件的時間,大小,塊指針等信息;用目錄項描述文件名和節點號,通過節點號就能訪問其節點信息了。
6、在整個文件系統的頭部,是超級快,用以描述文件系統的綜合信息。
如下是EXT3文件系統的結構圖
【分析超級快】
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”打開的塊組描述符表。
塊組描述的參數解釋如下:
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節點
如下:是各參數的解釋
這裏重點解釋一下“直接塊指針”和“間接塊指針”。
在EXT3文件系統中一個有15個塊指針,分別是12直接塊指針、1個間接塊指針、1個二級間接塊指針、1個三級間接塊指針。12個直接塊指針直接指向文件的內容,如果文件的內容大於12個塊,那麼第13個間接塊指針所指向的塊記錄直接塊指針而不是文件內容,直接塊指針再指向文件內容。如果間接塊指針也不夠用時,就需要二級間接塊指針了,二級間接指針指向的塊記錄間接塊指針。以此類推,不做多解釋,如果二級間接塊指針還不夠用時就需要三級間接塊指針了。
【分析目錄項】
目錄項用來存放文件或目錄的i節點號、目錄項的長度、文件名等信息,他們存儲在分配給目錄項的塊中。目錄項的主要特點如下:
1、目錄項存儲在目錄區中,i節點內有描述目錄區地址的塊指針。
2、目錄項的長度是不固定,隨文件名的長度不同而不同,文件名最長爲255個字符。
3、雖然目錄項的長度不固定,但是其長度一定是4字節的倍數,如果文件名不夠4字節的倍數,則在尾部填0補齊。
4、目錄區中的前兩個項一個是“.”和“..”,分別表示當前目錄和上一級目錄。
5、每個目錄項中有一個長度值指向下一個目錄項,最後一個目錄項的長度則指向本塊的結尾處。
如下:是使用Winhex打開的文件系統根目錄
其中各目錄項的解釋如下:
【分析EXT3文件系統的底層存儲結構】
EXT3文件系統首相被分成若干個塊組,並通過塊組描述符描述這些塊組,所有塊組描述符組成塊組描述表,塊組描述表位於超級塊的下一個塊。文件以塊爲單位進行存儲,每個文件都有自己的i節點以及目錄項,i節點中記錄了文件的大小、時間信息、塊指針等信息,而目錄項則記錄了文件的i節點號、文件名等信息。將i節點和目錄項結合起來分析,就可以得出文件的所有信息,並通過塊指針定位到數據存放的地址,塊指針所指向的塊就是文件的內容。
綜合上述,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節點號即可。
呼...終於寫完了,下班後本來沒打算寫的,後來還是堅持寫下來了。雖然以是凌晨了,不過感覺還是挺值得的。只要堅持,沒有什麼事做不到的,相信自己。
作者:鄧奇