在上週末發生一件非常不幸的事情 - 我的硬碟掛了... :~
話說就是在拷貝檔案的時後, 沒有注意到容量大小, 所以硬碟就爆掉了, 然後正好有個檔案 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), 但此種狀況一樣適用) 🙂
因為第一篇那網站連線速度很慢, 怕掛掉, 所以先幫他備份一篇於此: 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?[N/Yes] Yes
- Did you use resizer(y/n)[n]:y
- 中間這些 Block, Blocksize 等照預設即可(除非之前有特別設定)...
- Set flags in SB: Is this ok ? (y/n)[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 磁碟與檔案系統管理 🙂
有一個dd_rescue可以用的樣子
除了備份之外,還可以用不重要的檔案來稀釋重要的檔案....@@
感謝您的建議, 我找到下列文章和軟體
http://freshmeat.net/projects/ddrescue/
http://www.stevenshiau.org/sts/dd_rescue.txt
http://blog.zhaoke.com/25.html
看起來很棒~~ 感恩 Orz..
你好,我照你的方法做了,还原出来的文件无论文件名还是文件夹的名字,文件大小感觉都是对的,但就是打不开,图片基本上都打不开呀。
和这个人遇到的基本上一样
http://forum.ubuntu.org.cn/viewtopic.php?f=86&t=262547
這方法能救得回來多少算多少, 救不回來的就是沒救了.. orz