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

在上週末發生一件非常不幸的事情 - 我的硬碟掛了... :~

話說就是在拷貝檔案的時後, 沒有注意到容量大小, 所以硬碟就爆掉了, 然後正好有個檔案 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), 但此種狀況一樣適用) 🙂

  1.  ReiserFS救援步驟
  2.  使用 dd 做系統轉移

因為第一篇那網站連線速度很慢, 怕掛掉, 所以先幫他備份一篇於此: reiserfs_recovery,  再來大概就是照此篇步驟做, 但是還是有些些不同, 順便於以下做修正.

先假設是壞 /dev/hdc1, 然後 /dev/hdc1 是 mount 在 /mnt/hdc1 上, 然後準備一顆大硬碟接備份資料的是 /dev/hdd1, mount 在 /mnt/hdd1 上, 然後假設之前還沒 umount, 然後下述都是用 root 執行.

  1. umount /mnt/hdc1
  2. cd /mnt/hdd1 
  3. dd if=/dev/hdc1 conv=noerror > ./hdc1.img # Partition copy, 會有很多錯誤(硬碟壞軌), 不要管他, 總之慢慢倒出來即可.
  4.  losetup /dev/loop0 hdc1.img  # 設定 /dev/loop0 來控制 hdc1.img(partition), 此時 /dev/loop0 就可當做是原本的 /dev/hdc1 來用
  5.  reiserfsck --rebuild-tree -S -l recovery.log /dev/loop0 # 重新建立filesystem 結構, 如果有檔案已刪除, 不在 tree 的節點上, 就會跑到 lost+found(可由此做 undelete)

但是我的狀況是, 到第 5 點修復一樣失敗(可能是我之前已經將 super block 清掉過了), 於是還是照 system 重新 build 的方法, 讓它重頭開始 build 出 tree 來.

  1. reiserfsck --rebuild-sb  /dev/loop0 # 會問底下幾個問題
    • Do you want to run this program?[N/Yes] Yes
    • Did you use resizer(y/n)[n]:y
    • 中間這些 Block, Blocksize 等照預設即可(除非之前有特別設定)... 
    • Set flags in SB: Is this ok ? (y/n)[n]: y
  2. reiserfsck /dev/loop0  # check
  3. reiserfsck --rebuild-tree -S -l recovery.log /dev/loop0 # rebuild tree
    • 看到 0%....20%....40%....60%....80%....100% 就對了(看到這個好感動)..
  4. 此步驟做完就已經算是搞定了, 要安全點可以再做一次 --fix-fixable, 不過剛建好的應該不會有問題才是.

到此 /dev/loop0 應該就是 /dev/hdc1(扣掉壞軌弄不出來的部份), 再來就可以 mount 起來囉, 如下述步驟:

  1. mount /dev/loop0 /mnt/hdc1  # mount 回舊目錄
  2. ls /mnt/hdc1  # 整個已經回來了, 再來就是看要把資料看要放(或備份)到哪邊去.
  3. ls /mnt/hdc1/lost+found # 裡面有遺失的檔案(含 以前 delete 後 filesystem 還沒清掉的檔案), 但除了文字檔外, 其它都很難辨認.
  4. 備份完後, umount /mnt/hdc1, 記得 losetup -d /dev/loop0 (-d delete), 這樣子空間才會 release 出來

總結: 此次經驗讓我感受到備份的重要, 所以現在努力的燒, 努力的備份中, 在這次體驗下, lost+found 下 lost 掉 1.6G 的檔案, 不過都不是很重要的東西, 已經是萬幸了, 上述的做法應該也可以在 ext2, ext3 做類似的實作(不過我沒做過, 恕不負責), 最後還是該感謝 reiserfs 的強力修復工具, 這麼好的 filesystem 最大的遺憾就是作者現在因某案件在打官司, 相當不妙, 看起來未來很難再繼續維護了.... :~~.

對於上述不懂何謂 super block, tree 等等的, 建議可以參考 鳥哥的 Linux 私房菜 - Linux 磁碟與檔案系統管理 🙂

相關網頁

作者: Tsung

對新奇的事物都很有興趣, 喜歡簡單的東西, 過簡單的生活.

在〈ReiserFS 救援步驟(使用 dd 救援回復)〉中有 4 則留言

路人鉀 發表迴響取消回覆

這個網站採用 Akismet 服務減少垃圾留言。進一步了解 Akismet 如何處理網站訪客的留言資料