壊れたHDDからデータを取出す方法

停電とか,寿命で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は絶対に実行しないというのが最大のポイントである.

用意するもの

  • 壊れたHDD(もしくは壊れたパーティション)よりも数倍大きいHDD
  • 十分な作業時間,精神的余裕

そもそもlinuxが起動しなくなった場合は,正常に起動できる作業用Linuxが必要.

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 を書ける前のディスクイメージの中身を見ていろいろ試行錯誤すると何とかなる場合が結構ある


緊急出動!動かないWindows・破損したファイル救出の極意―プロならこうするファイル復旧&再インストール
C&R研究所
ナツメ社
売り上げランキング: 350528
おすすめ度の平均: 5.0
5 助かりました。
5 やってしまった!その時に・・・

コンピュータシステム災害復旧の対策―ディザスターリカバリ対策の構築
谷井 成吉
ダイヤモンド社
売り上げランキング: 231799
おすすめ度の平均: 4.0
3 実務向けBCM、BCP本としてはちょっと物足りない
4 DRについて概要を知りたい方に
5 企業の事業継続の進め方について本質を突いた良書
5 DRのガイドライン