浅谈Linux下的EXT3文件系统
【EXT3的基本介紹】
1、EXT3文件系統(tǒng)存儲單位是“塊”,就好比NTFS的“簇”。格式化硬盤或分區(qū)時將所有磁盤空間分成若干個大小相同“塊”。“塊”大小是可以在格式化指定,也可以采用默認的。
2、塊是EXT3文件系統(tǒng)中的數(shù)據(jù)存儲單元,每個塊都有一個唯一編號,從0開始。0號塊起始于文件系統(tǒng)起始扇區(qū)。
3、EXT3文件系統(tǒng)將若干個塊組成“塊組”,每個塊組大小相同。但是由于塊的總數(shù)不一定是塊組的整倍數(shù),所以最后一個塊組相對于其他塊組要小。
4、每個塊組都對應一個塊組描述符,這些塊組描述符統(tǒng)一放在文件系統(tǒng)的前面,對塊組進行管理。
5、EXT3文件系統(tǒng)使用“i節(jié)點”來記錄文件的時間,大小,塊指針等信息;用目錄項描述文件名和節(jié)點號,通過節(jié)點號就能訪問其節(jié)點信息了。
6、在整個文件系統(tǒng)的頭部,是超級快,用以描述文件系統(tǒng)的綜合信息。
如下是EXT3文件系統(tǒng)的結(jié)構(gòu)圖
【分析超級快】
? ?EXT3的超級塊起始于文件系統(tǒng)的第2號扇區(qū),占用兩個扇區(qū),0-1號扇區(qū)被引導程序占用。EXT3的超級快是一個非常重要的扇區(qū),它記錄了文件系統(tǒng)的很多參數(shù)。如果超級快損壞文件系統(tǒng)將不可用
如下是超級塊的一些常見參數(shù):
0x00~0x03:文件系統(tǒng)中包含的i節(jié)點總數(shù)。
0x04~0x07:文件系統(tǒng)中包含的總塊數(shù)。
0x08~0x0B:保留塊數(shù),文件系統(tǒng)給自身保留的塊數(shù)量。
0x0C~0x0F:空閑塊數(shù),既當前文件系統(tǒng)的可用塊數(shù)量。
0x10~0x13:空閑i節(jié)點數(shù),當前文件系統(tǒng)的可用i節(jié)點數(shù)量。
0x14~0x17:第一個數(shù)據(jù)塊,既0號塊組的起始起始塊號。
0x18~0x1B:塊大小描述值,塊大小=2的N次方*1024字節(jié),N為改參數(shù)。
0x1C~0x1F:段大小描述值,與塊大小描述值相同。
0x20~0x23:塊組大小描述值,既每塊組中的塊數(shù)量。
0x24~0x27:每塊組中包含的段數(shù),與塊組大小描述符相同。
0x28~0x2B:每塊中包含i節(jié)點數(shù)。
…………
此處省略部分參數(shù)解釋
【分析塊組描述符表】
? ?EXT3文件系統(tǒng)的塊組描述符表起始于超級塊下面的一個塊,每個塊組描述符占32個字節(jié),多個塊組描述符組成了塊組描述符表。如下圖:是使用“Winhex”打開的塊組描述符表。
塊組描述的參數(shù)解釋如下:
0x00~0x03:該塊組的塊位圖起始塊號。
0x04~0x07:該塊組的i節(jié)點位圖起始塊號。
0x08~0x0B:該塊組的i節(jié)點表起始塊號。
0x0C~0x0D:該塊組的空閑塊數(shù),既可用塊數(shù)量。
0x0E~0x0F:該塊組的空閑i節(jié)點數(shù),既可用i節(jié)點數(shù)量。
0x10~0x11:該塊組的目錄總數(shù)。
0x12~0x13:填充。
0x14~0x1F:未用。
超級塊和塊組描述符表的是非常重要的,如果超級塊或者塊組描述符損壞,會導致文件系統(tǒng)不可以,因此文件系統(tǒng)對他們都有備份。如果文件系統(tǒng)不具有“稀疏超級塊特性”,那么每個塊組中都有超級塊以及塊組描述符;如果文件系統(tǒng)具有“稀疏超級塊特性”,那么只會在3、5、7的冪中才會有備份(如:1、3、5、7、9、25、49等)。
【塊位圖分析】
? ?EXT3文件系統(tǒng)中以塊為存儲單位,若干個塊又組成了一個塊組,在塊組中塊的使用情況用塊位圖來記錄。塊位圖的主要特點如下:
1、每個塊組中都塊位圖,塊位圖的地址在該塊組描述符中有指定。
2、對于含有超級塊、塊組描述表以及它們的備份的塊組,塊位圖位于塊組描述表的下一個塊;否則,則位于塊組的第一個塊。
3、在創(chuàng)建文件系統(tǒng)的時候,系統(tǒng)會將每個塊組中的塊數(shù)和塊位圖中的位數(shù)設(shè)置為相同。因此保證了塊位圖的每一位對應一個塊。
4、塊位圖中的每個字節(jié)對應8個塊(1字節(jié)=8位),第一個塊對應該字節(jié)的最低位(例如:某字節(jié)的值為0xFE,轉(zhuǎn)換成二進制為11111110,則第一個塊對應最低位0)。如果某個塊的對應為沒有設(shè)置,那么則表示此塊目前未使用;否則,則表示此塊以使用或者是不可用。
5、計算塊在文件系統(tǒng)中的絕對位置的公式如下:
文件系統(tǒng)的絕對塊號=(當前偏移量-塊位圖的起始位置)* 8 + 塊組在文件系統(tǒng)中的起始位置
【i節(jié)點位圖分析】
? ?EXT3文件系統(tǒng)中使用i節(jié)點來描述文件的元數(shù)據(jù),i節(jié)點的使用情況由塊組中的i節(jié)點位圖來記錄。i節(jié)點位圖的基本特點如下:
1、每個塊組中都有i節(jié)點位圖,i節(jié)點位圖的地址在該塊組描述符中指定。
2、i節(jié)點位圖的位置在塊位圖的下一個塊,和塊位圖一樣,i節(jié)點中的每個字節(jié)對應8個i節(jié)點,第一個i節(jié)點對應該字節(jié)的最低位。
3、由于i節(jié)點位圖的大小小于一個塊,所以i節(jié)點的大小需要使用塊組描述符中i節(jié)點數(shù)除以8得出i節(jié)點位圖的大小。
4、i節(jié)點從1開始編號,既第一個i節(jié)點是1號i節(jié)點而不是0號i節(jié)點。
5、計算文件系統(tǒng)中絕對i節(jié)點公式如下:
文件系統(tǒng)中絕對i節(jié)點=(當前偏移量-i節(jié)點位圖的起始位置)* 8 + 改塊組的第一個i節(jié)點號
【i節(jié)點分析】
? ?EXT3文件系統(tǒng)的i節(jié)點用來存儲除文件名以外的所有信息,i節(jié)點的主要特點如下:
1、文件系統(tǒng)中每個塊組都有自己的i節(jié)點,每個文件或目錄占用一個i節(jié)點,若干個i節(jié)點組成i節(jié)點表。
2、i節(jié)點位于i節(jié)點位圖的下一個塊,在超級塊中記錄了文件傳統(tǒng)中i節(jié)點的總數(shù),在塊組描述符中記錄了本塊組i節(jié)點的總數(shù)。
3、每個i節(jié)點的大小為128字節(jié),也可以定義大于128字節(jié)的“大i節(jié)點”。
4、每個i節(jié)點都有編號,第一個i節(jié)點編號為1,1~10號i節(jié)點為系統(tǒng)保留,2號i節(jié)點被分配給根目錄使用。
5、如果已知一個i節(jié)點號,計算該i節(jié)點所在的塊組公式如下:
(i節(jié)點號-1)DIV 每塊組i節(jié)點數(shù)?
如下:是使用Winhex打開的一個完整的i節(jié)點
如下:是各參數(shù)的解釋
這里重點解釋一下“直接塊指針”和“間接塊指針”。
? ?在EXT3文件系統(tǒng)中一個有15個塊指針,分別是12直接塊指針、1個間接塊指針、1個二級間接塊指針、1個三級間接塊指針。12個直接塊指針直接指向文件的內(nèi)容,如果文件的內(nèi)容大于12個塊,那么第13個間接塊指針所指向的塊記錄直接塊指針而不是文件內(nèi)容,直接塊指針再指向文件內(nèi)容。如果間接塊指針也不夠用時,就需要二級間接塊指針了,二級間接指針指向的塊記錄間接塊指針。以此類推,不做多解釋,如果二級間接塊指針還不夠用時就需要三級間接塊指針了。
【分析目錄項】
? ?目錄項用來存放文件或目錄的i節(jié)點號、目錄項的長度、文件名等信息,他們存儲在分配給目錄項的塊中。目錄項的主要特點如下:
1、目錄項存儲在目錄區(qū)中,i節(jié)點內(nèi)有描述目錄區(qū)地址的塊指針。
2、目錄項的長度是不固定,隨文件名的長度不同而不同,文件名最長為255個字符。
3、雖然目錄項的長度不固定,但是其長度一定是4字節(jié)的倍數(shù),如果文件名不夠4字節(jié)的倍數(shù),則在尾部填0補齊。
4、目錄區(qū)中的前兩個項一個是“.”和“..”,分別表示當前目錄和上一級目錄。
5、每個目錄項中有一個長度值指向下一個目錄項,最后一個目錄項的長度則指向本塊的結(jié)尾處。
如下:是使用Winhex打開的文件系統(tǒng)根目錄
其中各目錄項的解釋如下:
【分析EXT3文件系統(tǒng)的底層存儲結(jié)構(gòu)】
? ?EXT3文件系統(tǒng)首相被分成若干個塊組,并通過塊組描述符描述這些塊組,所有塊組描述符組成塊組描述表,塊組描述表位于超級塊的下一個塊。文件以塊為單位進行存儲,每個文件都有自己的i節(jié)點以及目錄項,i節(jié)點中記錄了文件的大小、時間信息、塊指針等信息,而目錄項則記錄了文件的i節(jié)點號、文件名等信息。將i節(jié)點和目錄項結(jié)合起來分析,就可以得出文件的所有信息,并通過塊指針定位到數(shù)據(jù)存放的地址,塊指針所指向的塊就是文件的內(nèi)容。
綜合上述,EXT3文件系統(tǒng)可以用一副圖來描述其內(nèi)部結(jié)構(gòu)。如下圖:
分析EXT3內(nèi)部存儲結(jié)構(gòu)的步驟如下:
1、讀取超級塊和塊組描述符的參數(shù)
超級塊位于2號扇區(qū),從超級塊中可以獲取一下參數(shù)。
塊大小、每塊組包含的塊數(shù)、每塊組包含的i節(jié)點數(shù)、i節(jié)點大小等等。
塊組描述符位于超級塊的下一個塊,從塊組描述符中可以獲取一下參數(shù)。
該塊組i節(jié)點表的起始位置等等。
2、讀取i節(jié)點表
我們知道1~10號i節(jié)點為系統(tǒng) 保留,2號i節(jié)點被分配給根目錄使用,所以我們找到2號i節(jié)點,根據(jù)i節(jié)點中的直接塊指針可以找到根目錄。
3、讀取根目錄區(qū)
根據(jù)i節(jié)點的直接塊指針,我們找到了根目錄,我們可以在根目錄項中分析我們需要的目錄i節(jié)點,并計算出該目錄所在的塊組。計算公式如下:(目錄i節(jié)點號 - 1)DIV 每塊組中的i節(jié)點數(shù)?
計算出該目錄所在的塊組之后,還需要計算出該i節(jié)點號對應該塊組的幾號i節(jié)點。計算公式如下:
[(目錄i節(jié)點號 - 1)MOD 每塊組中的i節(jié)點數(shù) ] + 1
4、讀取子目錄區(qū)
根據(jù)上述的方法我已經(jīng)可以定位到子目錄區(qū)了,在子目錄中我們可以分析我們需要的子目錄或文件i節(jié)點了。如果是文件,則查看i節(jié)點內(nèi)的直接塊指針所指向塊的內(nèi)容,如果有間接指針,則分析間接指針。如果還有子目錄,則按照上述的方法進行計算塊組,計算塊組中的i節(jié)點號即可。
呼...終于寫完了,下班后本來沒打算寫的,后來還是堅持寫下來了。雖然以是凌晨了,不過感覺還是挺值得的。只要堅持,沒有什么事做不到的,相信自己。
本文轉(zhuǎn)自yun5277 51CTO博客,原文鏈接:http://blog.51cto.com/dengqi/1351708,如需轉(zhuǎn)載請自行聯(lián)系原作者
總結(jié)
以上是生活随笔為你收集整理的浅谈Linux下的EXT3文件系统的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 第四届国际软件自由日在西安邮电学院的发言
- 下一篇: 图解sqlserver 2000 还原数