スポンサーリンク

HDDが壊れそうなときにdd使うのは古い。というわけでGNU ddrescue

HDDが壊れかけたときのデータ救出法です。

経緯

  • 録画サーバの一次保存HDD(Seageteの1TB玉)にあるデレマスを見てたら突然readが不安定になった。dmesgとかSMARTとか見たらread errorが多発してた。
  • 老害なのでddで吸い出したら494GBで引っかかる。「conv=sync,noerror」を付けても1時間で3MBしか進まないという素敵な状況。
  • イマドキの時代、read error出たらサクッと諦めて次のセクタに進む吸い出しソフトないの?

そんなわけで

老害だから知らなかった「ddrescue」なるソフト。だって死にかけのHDDを吸い出すのって多分十数年ぶりだぜ。

世の中には「GNU ddrescue」と「dd_rescue」の2種類があるそうですが、ここで扱うのは「GNU ddrescue」です。

GNU ddrescueの使い方

普通にconfigure→make→make  installで入れる。

GNU ddrescueのここがスゴイ

  • read errorが発生したらガン無視スキップしてくれて(吐き出し先はゼロパディングらしい)、不良セクタの位置がロギングされる
  • 一旦全部書き出した後、ログに残った不良セクタだけを決め打ちでリトライできる
  • もはや人類には不可能な「どのファイルが不良セクタの被害を受けたか」を調べられる

どれをとっても非常にありがたい機能です。

実作業

以下の条件で行いました。

  • CentOS6
  • 壊れかけのHDD: /dev/sdb (sdb1がext4)  (NTFSな人は吸い出した後で各自工夫してください)
  • 直接別のHDDにdd的に吐けるけど、今回はファイルサーバにファイル(/mnt/fs/back.img)として吐き出す
  • ddrescueのログは/mnt/fs/ddrescue.logに吐き出す
  • 吐きだしたイメージ(/mnt/fs/back.img)は、うまくいったら/mnt/imageにmountする

基本書式は

ddrescue [オプション] [読込元] [書き出し先] [ログ出力先]

です。書き出し先はファイルでも直デバイスでもOK。

直デバイスに書き出す人はHDDの指定を間違えないよう気をつけてください。

まず初回はread errorを無視するモード(-n)で読みます。-vは進捗詳細表示。

パーティションはmountさせてません。

進捗がこんな感じで表示されて、終わったらこんな感じ。

1TBで1.65日かかりました。エラーは意外と少なく、100MB切ってますね。

次にダメ元でエラー箇所だけ読んでみます。もしかしたら読めるかも…?

-dはダイレクトアクセス、-fはoverwrite、-r3は「3回リトライ」で増やしたい人は増やしてください(でも増やしすぎると死にかけのHDDに負荷がかかる)

結果です。

errorsの数が変わってないので、ダメなモノはダメだった模様。

では保存したファイル(/mnt/fs/back.img)を/mnt/imageにmountしてみましょう。

loopbackじゃないとダメな模様。あれ?

先頭セクタの位置がなんかズレてるようです。

fdiskないしpartedで該当パーティションの開始位置(セクタ)を確認します。

■fdiskの場合

partedの場合

(zfsフラグが立っているのは、ZFSで使ったHDDをそのまま流用したからです…)

というわけでmountするのにセクタの先頭位置のオフセットが必要です。

オフセット量は「Startの値 * 512」(この場合は63 * 512 = 32256)です。

mountできたら/mnt/image内のファイルを新しいHDDにコピーしちゃってください。

これでデータ救出は完了です。

コピーが終わったら、このイメージを使って「どのファイルに不良セクタが当たってたか」を調べます。

やってることは以下な感じです。

  • 不良セクタとしてロギングされた位置に、任意の文字列を書き込む
  • findとgrepを使って、ひたすらファイル内を文字列検索する

力業だなあw

というわけでデータを書き換えるんですが、元に戻せます(後述)

要はgrepなので置き換える文字列は「元データとかぶらない文字列」にする必要があります。

今回は「HOGEPIYO」にしてみます。

この文字列は一旦ファイル(/mnt/fs/tmpfile)に入れます。

あとイメージをmountしたままなので、一旦umountします。

不良セクタを文字列(HOGEPIYO)で置き換えます。

6秒であっという間に終わります。まあ100MBないですしね。

終わったらtmpfileを待避させ(させる理由は分からんが必要なくね?)、もう一回イメージをmountして、ひたすらgrepします。teeで出力をファイルとコンソールの両方に向けるとよいでしょう。

出力はこんな感じです。この子たちが被害を受けました。

書き換えた箇所を元に戻したい人は、umountして以下をどうぞ(ゼロパディングしてるだけなんですが)

ファイルはfoltia anime lockerで録画したTSなんで、何のアニメかはうまく探してあげてください。

しかしGNU ddrescueでなければ、ヘタすると全部のアニメを端から端まで見てデータチェックをするハメになってたわけで。なかなか優秀なツールです。

スポンサーリンク

シェアする

  • このエントリーをはてなブックマークに追加

フォローする