admin 发表于 2014-10-27 13:24:39

ReiserFS 救援步驟(使用 dd 救援回復)

資料來源:http://blog.longwin.com.tw/2007/01/linux_reiserfs_recovery_2007/

--------------

話說就是在拷貝檔案的時後, 沒有注意到容量大小, 所以硬碟就爆掉了, 然後正好有個檔案 xxx.lock 就在那邊砍不掉, 而且, 程式也無法再次啟動, 然後仔細查看應該是硬碟在那個磁區正好壞掉, 造成的情況, 於是就將那 device umount 掉(準備修復), 悲劇就此發生.. :~~

磁區要修復, 一般就是使用 fsck(或 fsck.ext3, fsck.reiserfs.... 等), 但是對於壞掉的硬碟, 用 fsck.reiserfs 去修, 只要執行到壞掉的磁區, 程式就會中止, 無法修復..
後來我就放棄修復, 打算 mount 起來, 先把資料 cp 出來, 打算把硬碟重新 mkfs.reiserfs(如果還能用的話), 但是更慘的是... 硬碟已經 mount 不起來了... ~>_<~
reiserfs 救援能用的工具有下列參數可以用:(reiserfsck 同 fsck.reiserfs)

[*]--check (default)
[*]--fix-fixable
[*]--rebuild-sb (super block checking and rebuilding)
[*]--rebuild-tree (rebuild filesystem from scratch)
[*]另外其它參數, -B file, -l logfilename, -a -p, -f -r(ignored)
稍微做點解釋:(上述參數全部都無法完成修復, 程式都會中止)

[*]reiserfsck: default 是 check, 會去檢查磁區是否有問題
[*]fix-fixable: 想辦法修復
[*]rebuild-sb: 在 filesystem 的最開頭, 會有 super block 去劃分此磁區的格式. 用此就可以重建(想成是快速 format, 差不多意思)
[*] rebuild-tree: 重建完 sb 後, 實際資料還是存在的, 用此參數, 會再把檔案串連起來(想成就是 link list), 串起來後, 自然就可以讀取整個 file system 的檔案
[*]其它參數就不再詳述了, 反正上面沒有作用, 這些參數也沒用了.. :~~
當做完這些事情後, mount 不起來, mount -f(強制 mount) 起來都是空的, 於是只好放棄, 該是看看 NAMESYS Reiser4 官方網站有沒有解法了, 找到了 FAQ 區, 但是對我的狀況還是無解, 看到首頁左邊有個 $25 Gets You an Answer, 確實是動心了一下, 但是想想作者現在應該在忙著打官司吧, 還是放棄這個想法了.
後來問到 Kevinwatt 長輩, 提到了用 dd 來救援, 真是一語點醒夢中人, 只要把每 bit data 弄到另外一顆硬碟, 然後再修復, 修復後再 mount 起來就可以將資料救回來了, 於是就準備開始做, 在做之前先找了兩篇文章參考, 主要是參考下述第一篇來做(那一篇是寫如何救回已經砍掉的檔案(undelete), 但此種狀況一樣適用) http://blog.longwin.com.tw/wp-includes/images/smilies/icon_smile.gif

[*] ReiserFS救援步驟
[*] 使用 dd 做系統轉移
因為第一篇那網站連線速度很慢, 怕掛掉, 所以先幫他備份一篇於此: reiserfs_recovery,再來大概就是照此篇步驟做, 但是還是有些些不同, 順便於以下做修正.
先假設是壞 /dev/hdc1, 然後 /dev/hdc1 是 mount 在 /mnt/hdc1 上, 然後準備一顆大硬碟接備份資料的是 /dev/hdd1, mount 在 /mnt/hdd1 上, 然後假設之前還沒 umount, 然後下述都是用 root 執行.

[*]umount /mnt/hdc1
[*]cd /mnt/hdd1
[*]dd if=/dev/hdc1 conv=noerror > ./hdc1.img # Partition copy, 會有很多錯誤(硬碟壞軌), 不要管他, 總之慢慢倒出來即可.
[*] losetup /dev/loop0 hdc1.img# 設定 /dev/loop0 來控制 hdc1.img(partition), 此時 /dev/loop0 就可當做是原本的 /dev/hdc1 來用
[*] reiserfsck --rebuild-tree -S -l recovery.log /dev/loop0 # 重新建立filesystem 結構, 如果有檔案已刪除, 不在 tree 的節點上, 就會跑到 lost+found(可由此做 undelete)
但是我的狀況是, 到第 5 點修復一樣失敗(可能是我之前已經將 super block 清掉過了), 於是還是照 system 重新 build 的方法, 讓它重頭開始 build 出 tree 來.

[*]reiserfsck --rebuild-sb/dev/loop0 # 會問底下幾個問題

[*]Do you want to run this program? Yes
[*]Did you use resizer(y/n):y
[*]中間這些 Block, Blocksize 等照預設即可(除非之前有特別設定)...
[*]Set flags in SB: Is this ok ? (y/n): y
[*]reiserfsck /dev/loop0# check
[*]reiserfsck --rebuild-tree -S -l recovery.log /dev/loop0 # rebuild tree

[*]看到 0%....20%....40%....60%....80%....100% 就對了(看到這個好感動)..
[*]此步驟做完就已經算是搞定了, 要安全點可以再做一次 --fix-fixable, 不過剛建好的應該不會有問題才是.
到此 /dev/loop0 應該就是 /dev/hdc1(扣掉壞軌弄不出來的部份), 再來就可以 mount 起來囉, 如下述步驟:

[*]mount /dev/loop0 /mnt/hdc1# mount 回舊目錄
[*]ls /mnt/hdc1# 整個已經回來了, 再來就是看要把資料看要放(或備份)到哪邊去.
[*]ls /mnt/hdc1/lost+found # 裡面有遺失的檔案(含 以前 delete 後 filesystem 還沒清掉的檔案), 但除了文字檔外, 其它都很難辨認.
[*]備份完後, umount /mnt/hdc1, 記得 losetup -d /dev/loop0 (-d delete), 這樣子空間才會 release 出來
總結: 此次經驗讓我感受到備份的重要, 所以現在努力的燒, 努力的備份中, 在這次體驗下, lost+found 下 lost 掉 1.6G 的檔案, 不過都不是很重要的東西, 已經是萬幸了, 上述的做法應該也可以在 ext2, ext3 做類似的實作(不過我沒做過, 恕不負責), 最後還是該感謝 reiserfs 的強力修復工具, 這麼好的 filesystem 最大的遺憾就是作者現在因某案件在打官司, 相當不妙, 看起來未來很難再繼續維護了.... :~~.
對於上述不懂何謂 super block, tree 等等的, 建議可以參考 鳥哥的 Linux 私房菜 - Linux 磁碟與檔案系統管理
页: [1]
查看完整版本: ReiserFS 救援步驟(使用 dd 救援回復)