Ddrescue

GNU ddrescue（グヌー　ディーディーレスキュー）は、主に不良セクタのあるハードディスクドライブ (HDD) からのデータの救出に使われる、UNIX上で動作するフリーソフトである。macOSでも動作する。開発者はAntonio Diaz（アントニオ・ディアス）。

ディスクの最初のセクタから順次コピーしていき、不良セクタに当たるとその箇所を飛ばして、最後に飛ばした箇所をまとめて読み出すため、不良セクタの再三の読み込みでディスクを傷める可能性が低く、また正常セクタを優先的に回収するために早期に多くのデータが回収できるという特徴がある。

回収ログはファイルに残るため、途中で中断しても前の場所から再開できる。ファイル情報を基にせずにセクタ単位でコピーするため、ファイルシステムに損傷が発生している場合などにも対応できる。また、回収元と保存先は（不良セクタ以外）まったく同一になるため、回収元を削除ファイル復元ソフトで検索して取り出せる削除済みファイルは、保存先でも同じ方法で取り出せる。そのため、回収元のハードディスクを動作させることが困難な場合、このコマンドはデータ回収のための選択肢の一つとなる。

保存先HDDは、回収元HDDの1.5倍の容量があると高速に処理できるが、同じサイズのものでも実行は可能である。

 他のコマンドとソフト 
UNIXの標準的なデータのコピーのコマンドは、ddである。しかしddは不良セクタのある媒体からの読み出しが苦手である。さまざまなオプションを付けることにより改善されるが、もともと正常媒体を想定しているため、不良セクタが多いとデータの回収が困難である。

不良セクタの多いディスクを扱うためのGNU ddrescueと同じような目的を持つオープンソースソフトウエアとして、dd_rescue、dd_rhelp、savehd7、FreeBSD 標準コマンドの recoverdisk などがある。ddrescueの開発者であるAntonio Diaz Diazは、これらのプログラムを比較した文章を公開している。その文章によれば「ddはディスクを先頭セクタより直線的に処理するため、処理時間が長いだけでなく途中でエラーに出くわすとそこで処理中断してしまうこともある。dd_rescueはddとほぼ同じような処理を、少しだけ効率的に行うことが出来る。dd_rhelpはスクリプト中でdd_rescueを何度もコールすることで、より複雑なコピーを行うことが出来る。」となっている。

dd_rhelpは読み込み可能なデータを一旦ファイルに書き込み、読み込み不可能な場合ゼロを書き込んでいる。そして再び読み込み不可能なセクタの読み込みを試み、読み込めた場合はファイルを更新する。
これに対し、GNU ddrscueは必要であれば直接ディスクに結果を書き込むことが出来る。これはddと同じ仕様である。

dd_rhelpとGNU ddrescueはどちらもディスク全体のコピーを可能な限り短時間で行うソフトウエアである。GNU ddrescueはC++のみで記述されているため、dd_rescueをコールするシェルスクリプトを用いているdd_rhelpより、外部プログラムコールのオーバーラップが少ないため若干処理時間が短くなるはずである。また、どちらのソフトウエアも、ディスク上にエラーを検出した場合、処理ブロックのサイズを徐々に小さくしてゆくことで、最終的に読み込めないデータのサイズを最小化する手法は同じである。

UNIXやLinuxをインストールしたコンピュータが無い場合でも、KnoppixなどのCDブートのLinuxを用いれば、Linuxをハードディスク上にインストールすることなくddrescueや同目的のソフトウエアを用いることが出来る。

 導入 
公式サイトでダウンロードし、通常通り導入すればよい。ただし、CUIベースの作業になることと、環境やバージョンによって手順が異なることから、初心者には分かりにくいため、本段落で手順を解説する。

2023年2月時点では、バージョンは1.27まで存在する。バージョン表示の小数点以下の部分については、1.8の次が1.9で、その次が1.10と進む形になっているため、1.9より1.10の方が新しい。Ubuntuなどには簡単にインストールできるパッケージがあるが、これに含まれている物はやや古いバージョンである。もしそれが気になるのであれば、下記の方法で手動でインストールすればよい。

本項目の外部リンクの「不良ディスクからデータを回収するGNU ddrescue」の5ページ目に書かれている方法は、バージョン1.9を一般的なUNIXにインストールする場合に手本となるが、バージョン1.10の場合は配布ファイルの拡張子が異なっているために使えず、またUbuntuにおいてはsuの代わりにsudoを用いたり、C++をインストールしたりする必要があるなど、環境が異なるので、下記に手順を解説する。

 実行 
Ubuntuのようにrootでログインできない場合はコマンドの前に sudoをつけてスーパーユーザーとして実行する。"l" の文字は、ブラウザのフォントによっては "1" と紛らわしいが、小文字のエルである。

実行の前に、デバイス名の確認をする必要がある。下記のように入力し、どのドライブがどのデバイス名になっているかをよく確かめる。
 # fdisk -l

また、もしデバイスがマウントされている場合、下記のように入力すれば、ボリュームラベルまで確認できるので、分かりやすい。
 $ df -h
次にddrescueを実行する。最も簡潔な、オプションを付けない場合のコマンドの例を以下に示す。
 # ddrescue /dev/sdb /dev/sdc rescue.log

この例では、パーティションずつではなく、デバイス（ディスク装置）単位でまるごとをコピーする。sdbは回収元、sdcは保存先であり、接続状況を確認して適宜指定する。書く順序ただ一つで、コピー元とコピー先が決まってしまうので、十分に確認を要する。

rescue.logはログファイルであり、一旦中断した後、再開するときはこのログファイルから前回までの処理内容が参照される。名前は任意であるが、以前に今回とは無関係なddrescueをしたことがある場合、ログファイルをそのときと別の名前にしなければ、上書きされたり前回のデータを元に途中から始まったりしてしまう（前回生成されたファイルを別な場所に移しておけば名前は同じでもよい）。

実行中に中断するには、Ctrlキーを押しながらCを押す。このとき不良セクタに掛かっていると、停止まで少し時間がかかる。再開時も、まったく同じコマンドを入力するだけでよい。ただし、デバイスの着脱などによりデバイス名が変わっていないかを確認する必要がある。

なお、本機能の実行にあたってはマウントする必要はない。読み取り専用でマウントするのもよい。

 オプション 
さまざまなオプションを指定できる。大文字と小文字で別の指示になる。以下の例では3回リトライのオプションを付けている。
 # ddrescue -r 3 /dev/sdb /dev/sdc rescue.log
-r
最大リトライ回数を指定（標準は0、-1で無限回）
不良セクタを何回再読み込みするかを指定する。
-v
詳細表示
-f
強制的に上書き出力
-q
すべてのメッセージを表示しない

例のように保存先の後にログファイル名を指定するとログを出力できる。一度中断した後に再開する場合にはこのファイルを指定すると中断箇所から再開できる。

 注意点 
GUIの確認画面などもないため、回収元と保存先のデバイス名を打ち間違えると非常に危険である。"fdisk -l" や "df -h" の実行によって、デバイス名をよく確認することが望ましい。また、リトライは ddrescue の他に OS でもエラー時のリトライを行っているため、ddrescue のリトライ× OSのリトライ 回数となり終了までの時間が大きく伸びるので注意。(エラーの場合でも読み捨てて次に進み、末端まで読んでから読めなかった部分をリトライするためディスクへのダメージは少ない)