【EXT3的基本介紹】
ide
一、EXT3文件系統存儲單位是「塊」,就比如NTFS的「簇」。格式化硬盤或分區時將全部磁盤空間分紅若干個大小相同「塊」。「塊」大小是能夠在格式化指定,也能夠採用默認的。spa
二、塊是EXT3文件系統中的數據存儲單元,每一個塊都有一個惟一編號,從0開始。0號塊起始於文件系統起始扇區。3d
三、EXT3文件系統將若干個塊組成「塊組」,每一個塊組大小相同。可是因爲塊的總數不必定是塊組的整倍數,因此最後一個塊組相對於其餘塊組要小。指針
四、每一個塊組都對應一個塊組描述符,這些塊組描述符統一放在文件系統的前面,對塊組進行管理。blog
五、EXT3文件系統使用「i節點」來記錄文件的時間,大小,塊指針等信息;用目錄項描述文件名和節點號,經過節點號就能訪問其節點信息了。
get
六、在整個文件系統的頭部,是超級快,用以描述文件系統的綜合信息。it
以下是EXT3文件系統的結構圖io
【分析超級快】class
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:未用。
超級塊和塊組描述符表的是很是重要的,若是超級塊或者塊組描述符損壞,會致使文件系統不能夠,所以文件系統對他們都有備份。若是文件系統不具備「稀疏超級塊特性」,那麼每一個塊組中都有超級塊以及塊組描述符;若是文件系統具備「稀疏超級塊特性」,那麼只會在三、五、7的冪中才會有備份(如:一、三、五、七、九、2五、49等)。
【塊位圖分析】
EXT3文件系統中以塊爲存儲單位,若干個塊又組成了一個塊組,在塊組中塊的使用狀況用塊位圖來記錄。塊位圖的主要特色以下:
一、每一個塊組中都塊位圖,塊位圖的地址在該塊組描述符中有指定。
二、對於含有超級塊、塊組描述表以及它們的備份的塊組,塊位圖位於塊組描述表的下一個塊;不然,則位於塊組的第一個塊。
三、在建立文件系統的時候,系統會將每一個塊組中的塊數和塊位圖中的位數設置爲相同。所以保證了塊位圖的每一位對應一個塊。
四、塊位圖中的每一個字節對應8個塊(1字節=8位),第一個塊對應該字節的最低位(例如:某字節的值爲0xFE,轉換成二進制爲11111110,則第一個塊對應最低位0)。若是某個塊的對應爲沒有設置,那麼則表示此塊目前未使用;不然,則表示此塊以使用或者是不可用。
五、計算塊在文件系統中的絕對位置的公式以下:
文件系統的絕對塊號=(當前偏移量-塊位圖的起始位置)* 8 + 塊組在文件系統中的起始位置
【i節點位圖分析】
EXT3文件系統中使用i節點來描述文件的元數據,i節點的使用狀況由塊組中的i節點位圖來記錄。i節點位圖的基本特色以下:
一、每一個塊組中都有i節點位圖,i節點位圖的地址在該塊組描述符中指定。
二、i節點位圖的位置在塊位圖的下一個塊,和塊位圖同樣,i節點中的每一個字節對應8個i節點,第一個i節點對應該字節的最低位。
三、因爲i節點位圖的大小小於一個塊,因此i節點的大小須要使用塊組描述符中i節點數除以8得出i節點位圖的大小。
四、i節點從1開始編號,既第一個i節點是1號i節點而不是0號i節點。
五、計算文件系統中絕對i節點公式以下:
文件系統中絕對i節點=(當前偏移量-i節點位圖的起始位置)* 8 + 改塊組的第一個i節點號
【i節點分析】
EXT3文件系統的i節點用來存儲除文件名之外的全部信息,i節點的主要特色以下:
一、文件系統中每一個塊組都有本身的i節點,每一個文件或目錄佔用一個i節點,若干個i節點組成i節點表。
二、i節點位於i節點位圖的下一個塊,在超級塊中記錄了文件傳統中i節點的總數,在塊組描述符中記錄了本塊組i節點的總數。
三、每一個i節點的大小爲128字節,也能夠定義大於128字節的「大i節點」。
四、每一個i節點都有編號,第一個i節點編號爲1,1~10號i節點爲系統保留,2號i節點被分配給根目錄使用。
五、若是已知一個i節點號,計算該i節點所在的塊組公式以下:
(i節點號-1)DIV 每塊組i節點數
以下:是使用Winhex打開的一個完整的i節點
以下:是各參數的解釋
這裏重點解釋一下「直接塊指針」和「間接塊指針」。
在EXT3文件系統中一個有15個塊指針,分別是12直接塊指針、1個間接塊指針、1個二級間接塊指針、1個三級間接塊指針。12個直接塊指針直接指向文件的內容,若是文件的內容大於12個塊,那麼第13個間接塊指針所指向的塊記錄直接塊指針而不是文件內容,直接塊指針再指向文件內容。若是間接塊指針也不夠用時,就須要二級間接塊指針了,二級間接指針指向的塊記錄間接塊指針。以此類推,不作多解釋,若是二級間接塊指針還不夠用時就須要三級間接塊指針了。
【分析目錄項】
目錄項用來存放文件或目錄的i節點號、目錄項的長度、文件名等信息,他們存儲在分配給目錄項的塊中。目錄項的主要特色以下:
一、目錄項存儲在目錄區中,i節點內有描述目錄區地址的塊指針。
二、目錄項的長度是不固定,隨文件名的長度不一樣而不一樣,文件名最長爲255個字符。
三、雖然目錄項的長度不固定,可是其長度必定是4字節的倍數,若是文件名不夠4字節的倍數,則在尾部填0補齊。
四、目錄區中的前兩個項一個是「.」和「..」,分別表示當前目錄和上一級目錄。
五、每一個目錄項中有一個長度值指向下一個目錄項,最後一個目錄項的長度則指向本塊的結尾處。
以下:是使用Winhex打開的文件系統根目錄
其中各目錄項的解釋以下:
【分析EXT3文件系統的底層存儲結構】
EXT3文件系統首相被分紅若干個塊組,並經過塊組描述符描述這些塊組,全部塊組描述符組成塊組描述表,塊組描述表位於超級塊的下一個塊。文件以塊爲單位進行存儲,每一個文件都有本身的i節點以及目錄項,i節點中記錄了文件的大小、時間信息、塊指針等信息,而目錄項則記錄了文件的i節點號、文件名等信息。將i節點和目錄項結合起來分析,就能夠得出文件的全部信息,並經過塊指針定位到數據存放的地址,塊指針所指向的塊就是文件的內容。
綜合上述,EXT3文件系統能夠用一副圖來描述其內部結構。以下圖:
一、讀取超級塊和塊組描述符的參數
超級塊位於2號扇區,從超級塊中能夠獲取一下參數。
塊大小、每塊組包含的塊數、每塊組包含的i節點數、i節點大小等等。
塊組描述符位於超級塊的下一個塊,從塊組描述符中能夠獲取一下參數。
該塊組i節點表的起始位置等等。
二、讀取i節點表
咱們知道1~10號i節點爲系統 保留,2號i節點被分配給根目錄使用,因此咱們找到2號i節點,根據i節點中的直接塊指針能夠找到根目錄。
三、讀取根目錄區
根據i節點的直接塊指針,咱們找到了根目錄,咱們能夠在根目錄項中分析咱們須要的目錄i節點,並計算出該目錄所在的塊組。計算公式以下:(目錄i節點號 - 1)DIV 每塊組中的i節點數
計算出該目錄所在的塊組以後,還須要計算出該i節點號對應該塊組的幾號i節點。計算公式以下:
[(目錄i節點號 - 1)MOD 每塊組中的i節點數 ] + 1
四、讀取子目錄區
根據上述的方法我已經能夠定位到子目錄區了,在子目錄中咱們能夠分析咱們須要的子目錄或文件i節點了。若是是文件,則查看i節點內的直接塊指針所指向塊的內容,若是有間接指針,則分析間接指針。若是還有子目錄,則按照上述的方法進行計算塊組,計算塊組中的i節點號便可。
呼...終於寫完了,下班後原本沒打算寫的,後來仍是堅持寫下來了。雖然以是凌晨了,不過感受仍是挺值得的。只要堅持,沒有什麼事作不到的,相信本身。
做者:鄧奇