ext3 檔案偏移 到 磁碟block

2021-06-16 04:34:08 字數 2853 閱讀 9002

首先說明ext3檔案系統和ext2檔案系統的區別。ext3檔案系統是帶有日誌的ext2檔案系統,在設計時就秉承盡可能與ext2檔案系統相容的理念,因此他的檔案系統資料結構與ext2檔案系統的本質上是相同的。事實上可以把乙個ext3檔案系統解除安裝後做為ext2檔案系統重新安裝。反之也可以把建立日誌的ext2檔案系統做為ext3檔案系統掛載。

ext2檔案系統的磁碟資料結構如下圖所示:

除了硬碟分割槽中的第一塊作為引導塊所保留,不受ext3檔案系統管理以外,其餘部分分成塊組(blockgroup),每個快組的分布下圖所示,由於核心盡可能把屬於乙個檔案的資料塊存放在同一塊中,所以組塊減少了檔案碎片。塊組中的每塊包含下列資訊:

ÿ          超級塊:檔案系統超級塊的乙個拷貝

ÿ          組描述符:一組塊組描述符的拷貝

ÿ          資料塊點陣圖:乙個資料塊點陣圖

ÿ          索引節點位圖:一組索引節點

ÿ          索引節點表:乙個索引節點位圖

ÿ          資料塊:存放檔案資料

其中超級塊描述整個檔案系統的資訊,包括此檔案系統共有多少個塊組,每個塊組包含多少個塊,包含的結點的個數,每個結點的大小。

組描述符表描述的是每個組的情況,每個組有乙個組描述符,大小為32位元組。檔案系統中所有的組描述符放在一起構成了組描述符表。

組描述符表之後是資料塊點陣圖索引結點位圖各佔乙個塊。隨後就是這個組的索引結點表,每個索引結點占用128個位元組。

塊組的大小是由資料塊點陣圖決定的。假設檔案系統的資料塊大小為b位元組(可以配置為1k,2k,4k),則每個資料塊點陣圖可以描述的磁碟塊大小為b * 8 ,即8 * b * b 個位元組大小。通常情況下塊大小為4k,則乙個塊組包含32k個物理塊(乙個快組 :128m)。需要說明是這32k個塊並不全是資料塊,而是包含元資料塊和資料塊的總和。這樣看似備份的元資料浪費了資料塊,但這種浪費換來的是查詢效能上的提公升。

塊組大小確定之後,整個系統中的塊組數就可以確定了,即磁碟總容量/每個塊組的容量。

確定塊組的重要的意義在於確定inode號。在整個檔案系統中inode號是統一編址的,因此可以根據inode號確定這個inode所在的組號以及組內的偏移,進而找到這個inode。

inode位址= ((inode_no / inode_per_group) * block_per_group + (1 + n + 1 +1)) * block_size + ( inode_no %inode_per_group ) * inode_size + 1024

其中inode_no為結點號,inode_per_group為每個塊組含有多少個結點,block_per_group為每個塊組的塊的個數,(1 + n + 1 +1) 表示乙個超級塊,乙個資料塊點陣圖,乙個索引結點位圖,n表示塊組的個數,最後加上引導塊占用的1k個位元組。

但是實際的情況是這個公式是錯誤的,按照這個公式不可能讀到索引結點。

產生錯誤的原因在於課本上所講的資料結構是錯誤的,或者說只是乙個邏輯上的模型,與實際在物理磁碟上存放的資料結構有很大的差別。首先看一張真正的磁碟資料結構圖:

對比和上一張圖的不同,真實的磁碟布局中有三種塊組,一種是塊組0,一種備份塊組,一種是普通塊組。

塊組0即包含引導塊的塊組,通常系統使用元資料資訊都是從這個塊組中讀取,只有當這個塊組中的元資料發生錯誤時才會從備份的塊組中恢復。

由此產生了和課本的衝突,並不是所有的塊組都會備份乙份元資料資訊,只有部分塊組會備份。但是哪些塊組會備份呢?只有當塊組號是3,5,7的冪的塊組才會備份元資料,其他塊組則是做為普通塊組只存放資料,不備份元資料。

課本的另乙個衝突,引導塊佔據1k的空間,他雖然不被檔案系統管理,但他確實佔據了磁碟0塊組的第乙個塊。所以教科書上的畫法是不妥當的,或者說教科書只是畫出了一種邏輯的磁碟結構,並不反應現實。在0塊組的第乙個塊中,引導塊超級塊各佔了1k的空間,留下了2k的空閒。而在其他的備份塊組中則沒有引導塊的備份,只是在第乙個塊中備份了乙個超級塊。

和課本的下乙個衝突,在實際中出現了乙個課本上沒有提到過的區域,reserve gdt,而且還是乙個占用了不少塊的區域。這個區域是為了以後擴容用的。當以後為檔案系統擴容時,可能人增加新的塊組,塊組描述符表也會相應增加,這個reserve gdt就是為那時使用的。這個區域占用多少個塊我還沒有找到計算方法,但是在super block結構中有乙個域指示了這個區域占用的塊數,可以直接讀出。

至此,我們得到計算inode結點位元組偏移的真正方法:

inode_address = ((inode_no /inode_per_group) * block_per_group + (1+n+n) * is_backup_group ) * block_size +(1+1)* block_size + (inode_no % inode_per_group) * inode_size

這就是真實的ext3檔案系統的磁碟布局。到此我們可以拿到inode,可以進行查詢操作了。

問題遠遠沒有結束,事實上問題才剛剛開始。

每個檔案有乙個inode結點,這個結點對應乙個inode結點號。這個結點號可以由ls –i命令得到,也可以用debugfs工具得到。但是這個inode結點號真的就是在磁碟物理空間上的結點順序號嗎?看了核心中相應的一段**才知道,這個inode結點號是不能直接拿來用的,必須減1才能用。減1是因為沒有0號結點,我們拿到的結點號是從1開始計數的。

第二個問題是當把裝置做為檔案開啟時,可能會因為裝置過大導致檔案無法支援,但是這時做的lseek,read操作會全部正確返回,但這時操作的結果是錯誤的,因為大的資料被截斷了。解決方法是使用lseek64,或者_llseek。

擴充套件ext3檔案的容量

1.使用dd建立1024m的塊檔案 原來的檔案為533m 命令 dd if dev zero of tmp test.ext3 bs 1024 count 1024000 說明 dd是linux unix下的乙個非常有用的命令,作用是用指定大小的塊拷貝乙個檔案.引數if 輸入檔案,of 輸出檔案,b...

ext3檔案系統反刪除利器 ext3grep

linux作為企業級伺服器,資料的安全性至關重要,任何資料德爾丟失和誤刪都是不可容忍的!最近我接觸到一款軟體 ext3grep,它可以恢復誤刪的資料,下面簡單講解一下這個軟體。ext3grep的恢復原理 利用ext3grep恢復檔案時並不依賴特定文字格式。首先ext3grep通過檔案系統的root ...

ext3檔案系統反刪除利器 ext3grep

linux作為企業級伺服器,資料的安全性至關重要,任何資料德爾丟失和誤刪都是不可容忍的!最近我接觸到一款軟體 ext3grep,它可以恢復誤刪的資料,下面簡單講解一下這個軟體。ext3grep的恢復原理 利用ext3grep恢復檔案時並不依賴特定文字格式。首先ext3grep通過檔案系統的root ...