停電とか,寿命でHDDが壊れてしまった場合,せめて残っているデータだけでも取出したい・・・そういう泣きそうな状況に陥った人向けの作業メモ.
概要としては,例えばCDROMをCDRへコピーする際には,
- 一度 CDROMからデータを吸い出してISOイメージをつくって
- ISOイメージをCDRへ書き込む
という作業をする.同じように
- 壊れたHDDからデータを吸い出して
- 新しいHDDへ書き込む
という作業手順で,破損したHDDから残っているデータが救出できる.以下,具体的な作業手順についてまとめる.
状況を把握する
たとえば dmesg で以下のようなエラーが出ている場合は
end_request: I/O error, dev 03:42 (hdb), sector 31719462 hdb: read_intr: status=0x59 { DriveReady SeekComplete DataRequest Error } hdb: read_intr: error=0x40 { UncorrectableError }, LBAsect=31924080, sector=31719456
HDDが物理的に壊れている.このような状態でHDDを使い続けていると(データを書き込んでいくと),どんどんファイルが壊れていく.深刻な事態なので,すぐに復旧作業に取り掛かるべき.
いきなり fsck を実行しない
HDDが物理的に破損している場合, 何も考えずに fsck をしてもファイルがどんどん壊れるだけである.出来るだけ多くのデータを救出するためには実HDDに対してはfsckは絶対に実行しないというのが最大のポイントである.
dd コマンドで HDDからデータを吸い出す
/dev/hdb3 が壊れた場合を想定して, hdb3からデータを吸い出す方法について説明する.
- /dev/hdb3 を umount する
以下の場合は,壊れたHDDを別PCに接続して,作業する.
-
- そもそも linux が起動しない
- /dev/hdb3 を umnout することが出来ない
- dd コマンドを使う
以下のコマンドで /dev/hdb3 のパーティションを丸ごと吸い出して, hdb3.img というファイルに保存する(以下イメージファイルと呼ぶ).hdb3.img は,hdb3 のパーティションと同じ大きさのファイルになるので,十分に空き容量のあるディレクトリでddコマンドは実行すること.
# dd if=/dev/hdb3 of=hdb3.img bs=512 conv=noerror,sync
このddコマンドが成功すると,hdb3に残っている有効なデータがまるまる hdb3.img に保存される.作業用のHDDに余裕があるなら,hdb3.img のバックアップを取っておくと,より多くのデータが復旧できる.
$ cp hdb3.img hdb3.img.orig
吸い出したイメージファイルにたいして fsck を実行する
HDDからイメージファイルが吸い出せたら, イメージファイルに対して fsck を実行する
$ fsck hdb3.img
あまりにも大量のエラーが出る場合,またはイメージファイルのバックアップ(hdb3.img.orig)がある場合は,割りきって"-y"オプションをつけると楽.
$ fsck -y hdb3.img
エラーが修復できたら,hdb3.img をマウントする.たとえば ディレクトリ /tmp/hoge にマウントする場合は
# mkdir /tmp/hoge # mount -o loop ./hdb3.img /tmp/hoge
救出出来たファイル達を確認
救出できたファイルは /tmp/hoge 以下にある
$ cd /tmp/hoge $ ls
これらのファイルは
- 無事救出できた
- 古いデータを使ってファイルが復元された
のどちらかである.
一方,不幸にも壊れたファイルは
- 消えてしまった
- /tmp/hoge/lost+found 以下に断片的に保存される
のどちらかとなる
実際に,おそるおそるlost+found以下を見てみる
$ cd /tmp/hoge/lost+found $ find
ファイルの一覧がずらずら出てくれば,それは壊れたファイルの断片達である.ファイル名が "#数字"のような名前になっているが,ファイルの中身をlessなどで見ると判るように,これらは大事なデータの断片なので,一つづつ中身を確認する作業が必要である.
また,ファイルシステムによっては lost+foundが無い場合もある.lost+foundが無い場合は,
- 古いデータを使ってファイルが復元された
- 消えてしまった
のどちらかである.
ファイルの確認方法としては,grep, find コマンドが便利である.
たとえば abc という文字が含まれたファイルを探したい場合は
$ grep -r "abc" ディレクトリ名
たとえば,過去10時間以内に更新されたファイルの一覧を見たい場合は
$ find ディレクトリ名 -mtime -10
とする.
詳細は man grep とか man find でマニュアルを見る
失われたデータの復旧(最終奥義?)
大事なデータが復元できておらず, lost+found のしたにも無かった場合は,ディスクイメージの中を直接探すという方法がある.具体的な方法についてはここでは触れないが,fsck を書ける前のディスクイメージの中身を見ていろいろ試行錯誤すると何とかなる場合が結構ある
ナツメ社
売り上げランキング: 350528