停電で死んだHDDの復旧作業

先日の嵐の際に、停電があり、サーバのHDDが死にました。
RAID等も組んでいないので、このまま「はいはいワロスワロス」というわけにもいきません。
そこで、サルベージを試み、なんとか治りました。


当時の状況

  • フォーマットはLVM
  • サーバを起動すると、論理ボリュームが見つからず、kernel panic
  • HDDからは明らかな異音が聞こえる
データの吸出し

ひとまずHDDをはずし、別のPCにつないで dd でデータ吸出し。
Windows だとうまく認識してくれなかったので、仮想マシン上の backtrack で作業しました。
やはり不良セクタがあり、その部分で dd が終わってしまうので、
conv=sync,noerror をつけて吸出し。
約10時間ほどかかったが、 hdparmでDMAを有効にすると早くなるという情報もあるので、やっておけばよかった。。
bsはデフォルト値で吸い出しました。
(参考サイト: dd conv=sync,noerror)

マウントしようとしてみる

いろいろ検索しながら、マウントを試みました。
しかし、"Incorrect metadata area header checksum" というエラーが出たり、
"input/output error" が出まくる。そして、ボリュームなんてありゃしない。
(参考サイト: lvmのディスクイメージをmount - 間違いだらけの備忘録

とにかく頑張る

ダメ。うまくいかない。
かといって、直接バイナリからデータをとるにしても、それはそれで相当面倒なので、なんとか復旧させたい。

直接バイナリを見る

hexedit などを使って、直接吸い出したデータを見てみることにしました。
FAT16とかみたいに、詳しいデータ構造の資料はないのかなと検索した結果、
どうやら、論理ボリュームに関する情報は、テキストでそのまま保存されている模様。
(参考サイト: Slide 1)


しかし、吸い出したデータを見てみると、あるはずのボリューム情報(metadata)がない。
データ領域については、ひどく壊れているような様子も見られないので、
ひとまずボリューム情報を復旧することで、マウントし、データを取れそう。

metadataの復旧

metadataについては、どこかにファイルとしてバックアップが残っているらしい。
metadataの内容の一部 "extent_count" などで検索してみると、2つほど発見。
dd を使って、2つとも抽出。
仮想HDDを1台作り、抽出データをそこへ書き込み、その仮想HDD上でmetadataを復旧させることにした。
(参考サイト: Recovering lvm over RAID5 Linux using R-Studio - Data Recovery and Disk Utilities Forum @R-TT)


metadataの復旧は、pvcreate と vgcfgrestore を用いればいいらしい。これを使うことで、
データ領域を壊すことなく、metadataのみ復旧してくれる、とのこと。
無事に metadata は復旧された。

マウント、別HDDへ書き込んでテスト

pvdisplay や lvdisplay で、ボリュームが正常に表示されるようになった。
試しにマウントしてみたところ、データも普通に見れた!ここまでくるのに3日もかかりました。
試しに、別HDDへ dd で書き込んでサーバで起動してみたところ、正常にサーバが起動。
fsck しろと怒られたので、ディスクチェックして、なんとか復活しました。


CTFのネタとして使えそうな気もする。