編者按:隨著數據恢復技術的不斷發展,基于磁盤數據邏輯層恢復技術日益完善,但目前在邏輯層恢復技術中存在一項巨大的挑戰,那就是當刪除文件存在多段碎片的狀態時,數據重組恢復將變得十分困難。本期,數據恢復四川省重點實驗室科研人員將以一種XFS文件三系統中文件在存儲時被散列多個片段的情況下,被刪除后的恢復為例,講解基于XFS文件系統的碎片重組恢復方法。
一、XFS文件系統簡介
XFS 最初是由 Silicon Graphics,Inc.于 90 年代初開發的一種高性能日志文件系統。XFS極具伸縮性,非常健壯,之后SGI將其移植到了Linux系統中。它是一個64位的文件系統。
XFS文件系統具有良好數據完全性,能夠在斷電以及操作系統崩潰的情況下保證文件系統數據的一致性,如果文件系統開啟日志功能,磁盤上的文件不再會因意外情況而遭到破壞,文件系統可以根據所記錄的日志在一定時間內恢復磁盤文件內容,這與文件系統上存儲的文件多少與數據量大小無關。另外,XFS 是一個全64-bit的文件系統,它可以支持上百萬T字節的存儲空間。對特大文件及小尺寸文件的支持都表現出眾,支持特大數量的目錄。最大可支持的文件大小為263 = 9 exabytes。
二、XFS文件存儲原理
通過解析XFS文件系統存儲原理發現,分配組是XFS抽象程度最高的概念,XFS文件系統內部被分為多個“分配組”(AG),它們是文件系統中的等長線性存儲區。每個分配組各自管理自己的inode和剩余空間。文件和文件夾可以跨越分配組。這一機制為XFS提供了可伸縮性和并行特性——多個線程和進程可以同時在同一個文件系統上并行執行I/O操作。這種由分配組帶來的內部分區機制在一個文件系統跨越多個物理設備時特別有用,使得優化對下級存儲部件的吞吐量利用率成為可能。
在一個磁盤上創建XFS文件系統之后,磁盤會被格式化成如下格式,如圖1。
圖1
在CentOS7上默認的是創建4個AG。每個AG都相當于是1個獨立的文件系統,維護著自己的free space以及inode,其主要包括以下信息:
•superblock:描述整個文件系統的信息。
•空閑空間管理。
•inode的分配和記錄管理
在超級塊superblock中記錄著AG中的所有元數據信息,其中幾個核心的元數據為:
•blocksize,文件系統中使用的block的大小,以及整個文件系統用于存放data和metadata的block個數。
•sectorsize,指定底層磁盤一個扇區的大小,數據的最小對齊粒度。
• AG_blocks/AG_count,文件系統中一個AG包含的block個數,以及整個文件系統AG的個數。
• inodesize/inopblock,記錄inode的大小以及每個block中包含inode的個數。
•logstart/logblocks,如果使用同一塊盤存放XFS的journal,這兩個值用于表示存放journal的第一個block以及用于存放log的總block個數。
•icount/ifree,文件系統中已經分配的inode個數以及剩余可用的inode個數,這個只在AG Primary的Superblock中維護。
需要說明的是XFS文件系統中采用的字節序為大端,在Superblock中記錄著AG中的所有元數據信息結構,如圖2所示。
圖2
在XFS存儲數據文件時,會產生一個extend鏈表來存儲文件占用的塊結構的編號,并且按照順序來進行記錄,在每一記錄項中包含了塊地址的編號與使用塊的個數。為了更為方便闡述,我們將使用IRIX 5.3版本發布的XFS文件系統為例,文件鏈表的基本結構如圖3所示。
圖3
XFS文件系統中每一個文件鏈表的長度為一個塊的長度,其結構如圖4所示。
圖4
文件特征頭為0x424D4150,長度為4字節,其后2字節表示當前文件鏈表的級別,緊接著2字節記錄的值表示當前文件鏈表中的記錄項的個數,后面左右兄弟節點的地址均占有8字節來存儲,在其后的數據為若干個記錄項數據,每一記錄項的長度為16字節,若某一記錄項未被使用時,其16字節長度的內容全用00表示。
在每一個記錄項中記錄著存儲文件的塊地址信息,具體的每一個記錄項的結構,如圖5所示。
圖5
在記錄項中存儲結構的劃分單位為bit(位),由于每一個記錄項的長度為16字節,也即是16*8=128bit,在相對每一記錄項起始偏移1bit的值為記錄項的標記位;在相對每一記錄項起始偏移2bit~55bit的值為記錄項所記錄的塊數據在文件中的相對偏移的塊數;在相對每一記錄項起始偏移56bit~107bit的值為文件所使用的塊地址,在該處記錄地址的信息包含的文件所使用塊所在的AG編號及塊在AG中的相對偏移編號,其中塊在AG中的相對偏移編號在該結構中占有的位數處于低位,長度的值為在XFS文件系統中相對超級塊起始偏移0x7C字節的處記錄的值,由此可計算出塊所在的AG編號的值位于相對記錄項起始偏移56bit~107bit的高位處,其長度為52減塊在AG中的相對偏移編號的長度值;在相對每一記錄項起始偏移108bit~128bit的值為文件所使用的塊個數。
三、XFS文件系統的碎片重組恢復思路
通過對XFS文件系統的深入分析,發現當文件在存儲時分配的塊不連續,會使用extend文件鏈來記錄文件存儲信息。通過對比文件刪除前后的變化情況發現,文件刪除后會清除記錄文件inode節點信息,而文件鏈表信息不會丟失,如圖6,這就為數據恢復提供了理論支持。
圖6
由于XFS在存儲數據文件時,會產生一個鏈表來存儲文件占用的塊結構的編號,并且按照順序來進行記錄,在每一記錄項中包含了塊地址的編號與使用的塊的個數。根據以上特征,只需通過快速定位存儲文件占用塊編號的鏈表來進行查找數據,并按照鏈表中記錄的信息讀取相應塊地址的數據內容,然后按照鏈表的記錄的順序將提取到的數據進行拼接重組,即可實現XFS文件系統的碎片重組。這種方法不僅能夠快速高效提取刪除的視頻數據,還能將刪除的視頻數據進行拼接重組。
四、XFS文件系統的碎片重組恢復流程
基于XFS文件系統的碎片重組恢復方法,主要通過以下流程來完成:
1.加載并解析磁盤扇區信息
加載磁盤,讀取磁盤中AG內的超級塊所在扇區信息并解析。需要解析的內容包括塊大小,塊總數,AG所包含的塊數,每一個塊在AG中的相對偏移值。具體地,superblock位于AG數據中的第一個扇區,在相對于超級起始地址偏移0x04~0x07記錄的值表示塊大小,在相對于超級起始地址偏移0x08~0x0F記錄的值表示塊總數,在相對于超級起始地址偏移0x54~0x57記錄的值表示單個AG所包含的塊的總個數,在相對于超級起始地址偏移0x7C記錄的值表示在文件鏈表記錄項中塊在AG的相對偏移編號。
2.匹配文件鏈表結構
獲取單個文件鏈表的大小,即塊大小的值。將整個硬盤的數據按照塊大小分成若干個塊,匹配每一個塊是否符合文件鏈表的結構,文件鏈表的結構特征包含如下特征:
特征一:文件鏈表特征頭為0x424D4150;
特征二:文件鏈表特征頭后兩個字節表示文件鏈表的級別,該處記錄值的范圍是0~255;
特征三:文件鏈表級別后兩個字節表示文件鏈表的記錄項的個數,該處記錄的值應小于超級塊中記錄的總塊數;
特征四:在特征三之后的8個字節表示該文件鏈表所記錄的文件之前有數據內容的狀態,該處記錄的值應小于超級塊中記錄的總塊數;
特征五:在特征四之后的8個字節表示該文件鏈表所記錄的文件之后有數據內容的狀態,該處記錄的值應小于超級塊中記錄的總塊數;
3.解析文件鏈接結構
首先通過2中特征四來判斷該文件鏈表所記錄的文件在此文件鏈表記錄的地址之前是否包含數據。若2中特征四描述的地址的值為-1,則表示在此之前無文件數據,也表明該文件鏈為文件存儲的root節點;若2中特征四描述的地址的值不為-1時,該值表示該文件鏈表所記錄的文件在此文件鏈表記錄的地址之前的文件鏈表所在的塊號,跳轉至相應塊號讀取塊中的文件鏈表結構,按照3所描述的方法進行解析文件鏈表結構;同理判斷2中特征五所描述的該文件鏈表所記錄的文件在此文件鏈表記錄的地址之后是否包含數據;依次文件鏈表中每一記錄項數據,按照記錄項的結構特征讀取記錄文件數據的塊號和所占用的塊個數。
4.讀取對應塊地址數據
根據3中解析的內容,依據文件鏈表中記錄的順序,依次讀取每一記錄項對應塊地址的數據內容;
5.重組新文件
將4中讀取的數據,按照文件鏈表中記錄的文件鏈表間的關系和記錄項的順序,依次拼接項中記錄的塊地址的數據,重新組合為一個新的文件;
6.遍歷硬盤扇區
將一個文件鏈表中記錄的值解析完成后,繼續向下搜索文件鏈表結構并判斷該文件鏈表是否被使用,若被使用繼續向下,未使用則進行解析,重復2到5的步驟,直至遍歷整個硬盤扇區。
通過以上步驟,即可實現XFS文件系統的碎片重組恢復。
四、結語
本期,數據恢復四川省重點室科研人員介紹了一種基于XFS文件系統的視頻刪除數據的快速提取與恢復方法,這種方法不僅能夠快速高效提取刪除視頻數據,還能將刪除視頻數據進行拼接重組。目前,此方法已經在效率源DRS數據恢復系統、VIP視頻偵查單兵系統、VIE視頻全能提取系統等產品中應用,取得了很好的效果。