關于RAID(磁盤陣列),大家可能有些陌生。在個人電腦上,RAID用的不多,但工作站,或服務器常用到RAID(磁盤陣列),例如RAID-0 RAID-1 RAID-5 RAID-10 等。
對于RAID0的分析主要在于重組磁盤,重組磁盤就需要確定盤序,塊大小,判斷磁盤加入陣列的起始位置等。確定了上述參數后就可以重組陣列達到恢復數據的目的了。
分析一下RAID0。希望能給大家帶來一些啟示。
這個是我在windows 2003下虛擬出的三塊磁盤,每塊磁盤的大小都是200M三塊磁盤做了一個RAID0 ,采用NTFS格式化。上圖顯示的三塊磁盤的0號扇區,這個扇區的主要作用是一個DOS分區結構。和基本磁盤的MBR有點類似。這個扇區也有一個分區表,但是只占用了一個分區表項。。大家看下圖
分區類型是 0x42 起始于63號扇區,大小是0x9A 20 06 00 也就是401562個扇區。而磁盤的總扇區數是 409600個扇區。因為在windows系統中采用邏輯磁盤管理也就是LDM。
LDM支持JBOD, RAID0, RAID1和RAID5。要組成這些陣列類型,我們需要把我們的磁盤轉換成動態磁盤,而LDM就是管理動態磁盤的。動態磁盤有兩個重要的部分,一個是LDM分區區域,它占用磁盤的絕大部分,另一個就是動態磁盤的最后1MB,分配給LDM數據庫。LDM數據庫包含分區區域的分配情況。所以在把基本磁盤轉換成動態磁盤時需要在磁盤最后有一定的剩余空間。我們上圖顯示的類似基本磁盤的分區表部分我們管它叫軟分區,分區類型就是0x42 而基本磁盤的分區我們就叫硬分區吧。好了,現在我們對組成RAID的磁盤有了一個基本的了解了,我們來總結一下
1.成員盤都是動態磁盤,windows操作系統有個叫LDM的管理它們。
2.LDM會在每個成員盤的最后1MB建立一個數據庫,記錄一些動態盤的信息,而且這個數據庫還有一個作用,當我們的成員盤被卸載了加載到其他機器上去之后,如果那臺機器采用的和原來的機器一樣的RAID那么我們的成員盤又可以組建成原來的RAID了,而數據不會丟失,這就方便了移植。
3.LDM會在動態磁盤的0號扇區建立一個如上圖所示的軟分區表。
4.LDM數據庫中包含四個區域,一個叫做LDM私有頭,一個內容表區域,一個數據庫記錄區和一個事物處理日志區。
5.軟分區描述的扇區總數并沒有包括最后那1MB的LDM數據庫。
好的,我們先看看是不是磁盤的最后1MB是數據庫,看看數據庫都寫了些什么。1MB就是2048個扇區,我們的磁盤有409600個扇區減去2048。 那么我們的數據庫的起始扇區就是407553號扇區了。
看到了嗎,真的是有東西簽名標志 54 4F 43 4C 4F 43 4B 具體的數據庫分析我們就不做了,太費時了,如果大家有興趣可以加我共同討論。這里我只是想讓大家知道在RAID0中的各成員盤的具體結構是怎樣的,寫入的各部分數據有什么作用。我們回到0號扇區,找到那個軟分區表,分區表顯示分區的起始扇區是63號扇區,那么也就是說磁盤加入陣列的起始扇區是63號扇區。通過搜索發現前面的63個扇區除了0號扇區有一個軟分區表6號扇區有一些東西其他扇區都是零。好的,我們轉到63號扇區看看。
1 確定盤序:
看到了嗎 ,硬盤1的63號扇區是DBR 而其他兩塊盤的63號扇區不是DBR而是數據,這樣我們就能知道硬盤1就是這個RAID0的第一塊盤了。至于剩下的兩塊盤的盤序就通過其他方法確認了,而且我們在這里知道了硬盤1是RAID0的第一塊盤,那么硬盤2和硬盤3肯定就是相鄰的了。我們可以通過尋找硬盤2和硬盤3的MFT來確認他們的盤序和塊大小。這個方法不錯。但是很遺憾,我做的這個RAID居然找不到合適的MFT。也就是說通過比較MFT來判斷盤序和塊大小的方法就沒戲了。那我們怎么辦,馬老師貌似沒有給出方法了。看來我們的自己尋找解決的方法了。因為此RAID采用的是NTFS文件系統,那么我們能不能根據對NTFS文件系統的特點,找找看能不能通過其他的一些特征來確定盤序和塊大小呢?我們通過分析DBR得出:
1,每簇扇區數 1 個;
2,$MFT起始簇號 401408這里就是401408號扇區了;
3,$MFTMIRR起始簇號602111這里也就是602111號扇區了;
4,分區總扇區數1204223個扇區;
我們就想了,硬盤1已經確定是RAID0的第一塊盤了,$MFTMIRR的起始扇區在$MFT的后面。那么系統就是先向磁盤寫入$MFT然后再寫入$MFTMIRR了。
好的,我們就根據以MFT為線索,我們把每塊成員盤的MFT搜索出來,當然就搜索前面幾個MFT項就行了。這里我就直接給出我搜索出的結果了
硬盤1 在20768號扇區搜到了第一個MFT項,這塊硬盤一共有3個MFT項分別是1號 2號 3號MFT項。
硬盤2 133823號扇區搜到了第一個MFT項,這塊硬盤一個找到了從0號MFT項到36號MFT項,我們知道$MFT記錄的0號MFT項到15號MFT項是NTFS文件系前面16個重要的元文件16到23號用作保留。而我們這里出現了36號MFT項,顯然這個就是文件的MFT項了。
硬盤3 200766號扇區找到了第一個MFT項,這塊硬盤就一個MFT項,是0號MFT。
現在我們應該就能判斷了吧,硬盤2號記錄的是$MFT這個元文件,而硬盤1和硬盤3記錄的是$MFTMIRR這個元文件,也就是$MFT這個元文件前4個MFT項的備份,這個和NTFS系統的描述的一樣。呵呵,看來分析對了。。。
我們說了系統先寫入$MFT在寫入$MFTMIRR而硬盤2就是$MFT 硬盤1和硬盤3是$MFTMIRR 而我們前面已經確定硬盤1是RAID的第一塊盤,這里我想我們就能判斷出硬盤2就是RAID0的第二塊盤了吧。硬盤3是第三塊盤。而且根據各磁盤上的MFT參考號,我們也能判斷出,系統先向硬盤1寫入數據,到該寫入$MFT元文件的時候,就轉到了硬盤2向硬盤2寫入,寫入完成之后又轉到了硬盤3開始寫入$MFTMIRR,因為硬盤3記錄的MFI參考號是0 接著又跳轉到了硬盤1繼續寫入沒有寫完的$MFTMIRR所以硬盤1的MFT參考號是從1號開始的,這樣就形成了一個完整的寫入過程了。。盤序分析就出來了。。。
盤序就是 硬盤1 硬盤2 硬盤3
2 確定塊大小
我們已經確定了盤序,磁盤加入陣列的起始扇區是63號扇區,而塊大小是2的整數次冥,也就是只可能是 2 4 8 16 32 64 128等等,那么就挨個試,如果塊大小吻合,那么數據就能恢復成功。這里我在選擇塊大小是128時,數據完美重現了,恢復完成。