「ddrescue」の使い方

不良セクタのあるハードディスクからデータを救出

実行中 - ddrescue

「ddrescue」は、不良セクタのあるハードディスクに最適化されたデータコピーツールです。
不良セクタがある前提で動作します
ちなみに「dd」は、Unix系で用いられるデータコピープログラム。
ファイルシステムによらず、データを直接やりとりできるのが特徴です。
「ddrescue」も、同じ特徴を持ちます。

ただし、「ddrescue」は「dd」とは別物です。
「ddrescue」は、読み出しが遅いブロックを積極的にスキップし、
正常な読み出しができる領域のコピーを優先します。
特に、読み出しに時間がかかるブロックほどデータ転送を後回しにするアルゴリズムになっています。
このことで、不良セクタのあるハードディスクからできるだけ多くのデータを回収しようとします。

ハードディスクに不良セクタが存在すると、その箇所においてデータの読み出しに支障をきたします。
リードエラーが返ってくることもあれば、読みに行ったままフリーズしてしまうこともあります。
これらは物理障害なので、根本的には元通り読めるようにはなりません。

ただ多くの場合、必要なのはモノとしてのハードディスクではなく中のデータなので、
読み出せるデータは正常なハードディスクにコピーしてしまい、
後は正常に読み書きできるクローンディスクを対象に、データの復旧作業を試みるのが筋です。

やっていることはディスクコピーなので、「ddrescue」を使用する際は、
不良セクタのあるハードディスクと同容量以上の正常なハードディスクを用意する必要があります

「ddrescue」の入手

「ddrescue」は、Unix用のプログラムです。
不良セクタのあるハードディスクからデータを取り出すという用途から、
データ復旧用のLinuxライブCDには標準でインストールされていることが多いです。

ここでは例として、
「Ultimate Boot CD」(以下「UBCD」と略記)に同梱されている「Parted Magic」から「ddrescue」を起動します。
つまり、「ddrescue」の入手は、「UBCD」の入手と同義です。

ダウンロードページ Download UBCD
当サイト内解説 「Ultimate Boot CD」の使い方

また、「ddrescue」単体の入手先は以下のとおり。

ソフトウェアページ Ddrescue - GNU Project
ダウンロードページ ddrescue

「ddrescue」使用上の注意

「ddrescue」は、原則的に対象のハードディスクをSATA接続したうえで実行してください。
外付けハードディスクケースや、SATA-USB変換ケーブルのようなものもありますが、
動作不安定なハードディスクに対してそういった機器を使うと、より一層動作があやしくなります。

接続機器が増えると、不具合の原因がわかりにくくなるだけでなく、
データの転送経路が変わってしまうのが非常に大きな問題です。
「ddrescue」は、データの読み出し速度を監視しているからです。

ハードディスクの場合、SATA接続が最もシンプルで、確実かつ高速に動作します。

「ddrescue」の実行

まず、「UBCD」から「Parted Magic」を起動します。

「ddrescue」は、ターミナル上で動作するCUIのソフトウェアです。
従って、まずはターミナルを起動してコマンドを入力可能な状態にします。

「ROXTerm」アイコン

「Parted Magic」起動後、タスクバーの上記アイコンをクリックすると、ターミナルが起動します。

これは、他の環境でも同様です。
ただし、「ddrescue」はroot権限で実行する必要があります
「Parted Magic」のターミナルはデフォルトでrootですが、
他の環境の場合は、root権限に変更してから「ddrescue」を実行してください。
さもないと、パーミッションエラーが出ます。

「ddrescue」の使い方は、単純です。
だからこそ、恐ろしくもあるのですが。

基本的に、以下の書式でディスクコピーが実行されます。

ddrescue -f (コピー元) (コピー先)

ddrescue -f /dev/sda /dev/sdb

あとは、「Enter」キーを押すだけで、確認もなくコピーが開始されます
細心の注意を払ってください。

コピー先ディスクのデータは上書きされるので、指定を誤るとデータを失います。
「Parted Magic」であれば、GSmartControlを使うなどして、
どの型番の、どの状態のハードディスクが、どこにマウントされているのかを、
事前に確認しておいてください。
また、関係ない記憶装置の接続は断っておくべきです。
できるだけ選択肢を少なくしたほうが、事故を防げるので。

物理ディスクにコピーする際は、「-f」オプションは必須です。
「-f」は、強制的に実行するオプションです。
出力先を強制的に上書きする、という意味です。
実体があるものに出力する際は「-f」が必要、という認識でいいと思います。
(たとえば、イメージファイルの新規作成時は不要。)

ddrescue /dev/sda /dev/sdb

オプションを指定せずに実行すると、「--force」を指定しろと忠告が出ます。
なお、「-f」は「--force」の省略形です。
どちらを記述しても構いません。

不良セクタの再読み出し

有効そうなオプションとして、「-r」があります。
これは、データを読み出すことのできなかった不良セクタに対して、再読み出しを行うものです。
デフォルトでは、不良セクタの再読み出しを行いません。※1回は読み出そうとします。

ddrescue -f -r1 /dev/sda /dev/sdb

「-r」オプションは、リトライ回数とあわせて指定します
上の画像は、リトライ回数が1回の場合の例です。

リトライ回数に「-1」を指定すると、不良セクタが読み出せるまで無限に読み出しを繰り返します。
読めないものは読めませんが。

ddrescue -fr1 /dev/sda /dev/sdb

ちなみに、オプションが複数ある場合は、このように連続して記述することも可能です。
ただし、数字は最後に入力しなければなりません。

不良セクタの読み出しに関してですが、
リードエラーの出たセクタに対して再度リードコマンドを送ったところで、読めないのが普通です。
また、セクタ代替処理が行われることもあります。
読めたけど結局ゼロデータという。

また、状態の悪いハードディスクでは、
不良セクタの再読み出し以前に、1回目のスキャンすら完了しない場合があります。
それでも、読めるデータは先にコピーしてしまうのが「ddrescue」のいいところなんですが。

というわけで、基本的にはデフォルトのまま「ddrescue」を実行し、
読み出せるデータのみコピー先へ転送したほうがいい
ような気がします。

ただ、不良セクタの再読み出しは、読み出せるセクタをすべてコピーしてから最後に行われるので、
不良セクタの再読み出しを指定しても、コピー先のデータに対する悪影響はありません。
デメリットは、コピー元ディスクの負荷が高くなり、よりいっそう時間がかかること。
あと、コピー先のデータは結局変わらないかもしれません。

ログファイルについて

「ddrescue」では、実行時にログファイルを指定することで、
コピーを再開したり、異なるオプションで継続して実行することができます。

ただ、不良セクタのあるハードディスクからのディスクコピーは一発勝負になることが多いのと、
不良セクタの再読み出しの効果が限定的なこと、
さらに、ログファイルを含めた操作説明をすると冗長でわかりにくくなることもあって、
ここでは、ログファイルを指定せずにディスクコピーを行っています。

実行中 - ddrescue

いざ「ddrescue」を実行すると、コピーが開始されるとともに、進捗状況が表示されます。
とにかく、作業が完了するまで待ちます。

ハードディスクの状態によっては、コピーが完了するまでに非常に長い時間を要します。
数日単位です。
しかも、後になればなるほど、読み出し速度は遅くなりますし、読み出せるデータ量も少なくなります。
つまり、効率が悪くなります。
「ddrescue」は、不良ブロックの読み出しをどんどん後回しにするからです。
逆に言えば、比較的容易に読み出せるデータを優先しています。
※参考: ddrescueについて教えてください - PCと解 掲示板

コピーを中断したい場合は、「Ctrl」キー+「C」キーを押すと、プログラムが停止します。
中断したところまでのデータはコピーされています。
場合によっては、作業を途中で止めても構いません。
優先順位の問題です。
少しでも多くのデータを取り出したいのか、作業効率を優先したいのか。

完了 - ddrescue

コピー完了です。

不良セクタのあるハードディスクからデータをコピーした場合は、
コピー先のデータに論理障害があるのが普通なので、
以後はそちらの復旧作業に移ることになります。
ファイルを復元したり、「chkdsk」を実行したり。