死にかけのHDDからのデータ吸い出しには GNU ddrescue が良いらしい

今日は超小ネタ。
(というか、言いたいことは記事タイトルで言い切ってしまってます。)

先日、家でサーバーとして使っているPCのHDDの調子がおかしくなっていたので、データの引き上げを行おうとしたのですが、dd でパラメータをいろいろ設定するのは面倒だし、良いツールなりスクリプトなりがないかと探したところ、ddrescue というプログラムがあることを知りました。

2つの ddrescue

ただ、ちょっとした罠なのですが、ddrescure という名前のプログラムは2種類あります。

どちらも ddrescue で、同じ目的・機能のものですが、まったく別のソフトです。
区別して呼ぶ場合、前者は dd_rescue、後者は GNU ddrescue と呼び分けたりしますが、前者の方が古くからあったからか、単に ddrescue と呼んだ場合、暗黙的に前者を指す事が多いようです。両方とも ubuntuリポジトリに入っているので apt-get でインストールできますが、パッケージ名は、前者が ddrescue で、後者は gddrescue です。

通称 Ubuntu パッケージ名 プログラム名
ddrescue, dd_resque ddrescue dd_rescue
GNU ddrescue gddrescue ddrescue

機能に関しては GNU ddrescue が良いようですので、あまり悩まずそちらを使っておけば良いのではないかと思います。

(2014-06-08:追記) なぜ GNU ddrescue が良いと判断したかというと、単純に後発で、 GNU ddrescue の作者が、類似の他のソフトのマズい点を修正するような設計を行っているようだから、といったところです。"GNU ddrescue dd_rescue" でググったりwikipedia を見たりすると、いろんな意見が見れますので、興味のある方は調べて見てください。

使い方

公式ドキュメントでは、ディスク中の、特に大事な領域を優先して取得する方法が書いてありますが、どこが大事かなんてどうせ分からないので、初めから全体取得で良いかと思います。

(/dev/sdX を hdd.img ファイルに書き出す場合)
$ sudo ddrescue -f -n /dev/sdX hdd.img logfile      # まずはエラーを飛ばして一通りコピー
$ sudo ddrescue -d -f -r3 /dev/sdX hdd.img logfile  # エラーの場所を3回までリトライして読む

logfile は、どこにエラーがあって、どこは吸い出せたかを記録するためのファイルですので、こんな風に条件を変えて何度もとりなおすときには同じファイルを指定します。

また、上記の例では吸い出したデータをファイルに書いていますが、もちろん新しいHDDのデバイスファイルを指定して直接書き出すことも可能です。

最終的に読み出しエラーが 0 になれば、一応完全にコピーができたことになりますので、新しいHDDに吸い出した hdd.img を dd してHDDを置き換えれば復旧完了です。

だめだった場合は、大事なファイルが壊れていないことを祈りながら fsck をかけることになりますが、何が壊れているかわかったものではないので、マウントして、手作業で確認しながら1つ1つコピーするハメになるでしょう。(今回は大丈夫でしたが)