[資料恢複故障描述]
一台IBM X3850伺服器,由4塊146G SAS硬碟組成RAID5作為儲存介質,作業系統為SUSE LINUX,檔案系統全部是reiserfs。
分析後得知:之前的硬碟資料群組織結構為: 一個不到100M的boot分區,後接一個271G的LVM卷,之後是2G的swap分區。LVM卷中直接劃分了一個reiserfs檔案系統,作為根分區。
使用者在使用過程中,系統未知原因癱瘓。
重裝系統後,整個RAID邏輯卷變成了前面2G的boot與swap分區,後接271G的LVM卷,LVM卷中檔案系統位置有個空的reiserfs超級塊。
要求恢複原來271G中檔案系統裡的所有使用者資料,資料分別是MYSQL資料庫、PGSQL資料庫、網站程式與網頁、單位OA系統裡的所有辦公文檔。
[資料恢複分析]
1、通過對全盤reiserfs樹節點之間的關聯,確定了原來的reiserfs分區位置,以此斷定,原來儲存資料的檔案系統前2G被覆蓋。
2、應該是使用者在安裝系統時錯誤地初始化了分區結構,之後裝好系統後,發現無法匯入LVM卷,曾做過reiserfsck試圖修複。
3、因reiserfs檔案系統對檔案系統裡所有的檔案(含目錄)線性化後,再以檔案key產生B+樹,樹不斷增加節點,會導致樹的結構整體拉展後向整個磁碟的資料區做平滑遷移,這樣,頂級節點通常不會放在檔案系統的最前面。因根目錄的檔案KEY號通常是最小的,所以,從空間上看,前2G中儲存最多的應該是從根起始路徑最近的key節點,這樣,使用者資料因目錄層次較深,節點存在的可能性很高。
4、前2G覆蓋的資料無法恢複,只能希望不要恰好覆蓋使用者資料。
5、因檔案系統前面對整個樹的索引全丟失,加上reiserfs的樹概念設計得很抽象,重搭建樹會很困難。
[資料恢複過程]
1、通過自主程式在整個原檔案系統地區進行key節點掃描,將所有節點匯出。
2、通過自主程式對所有分葉節點重新排序、過濾(去掉之前刪除檔案丟棄的節點),重建二級、三級、四級等分葉節點。選擇分區前面2G空間做為新樹的結構區(反正這部分資料是沒用的了,重裝系統已經裝得滿滿的),並產生對應地址資訊。應對目錄命名問題,如遇到原樹路徑某節點丟失的情況,對其用自訂的key節點編號命名,如無法確定其父目錄,暫加入/otherfiles下。
3、根據上面對,產生樹索引資訊,寫入特定位置,再根據這些資訊,產生超級塊,設定clear標誌。
4、在suse虛擬機器下,建立快照,掛載修複好的卷,已經可以看到檔案了。(註:虛擬機器與快照的目的為了操作可加溯,同時因bitmap等中繼資料不影響資料,未做修正,故掛載前不可做reiserfsck)。
5、在修複用的suse虛擬機器下,掛載用於copy資料的目標硬碟,mkfs後將所有資料cp到目標盤。
6、使用者通過find命令整理所需資料,修正部分目錄檔案位置與名稱。
7、部分丟失的散檔案,按大小與檔案頭標誌尋找,找到後移動及重新命名。
[資料恢複結果]
1、所幸重要資料100%恢複成功。
2、樹的不直觀性加上程式的調試,使得整個恢複工作曆時3天之久,在繁亂的資訊樹中跟來跟去,真是煩人得很,幸好撐下來了。
[隨筆]
繁鎖的資料恢複分析工作真不是人乾的。