LinuxでGNU ddrescueを使い、バッドセクタのあるHDDからデータを救出する極意

Linux tutorial - IT technology blog
Linux tutorial - IT technology blog

「Input/Output Error」が表示されたら

技術職であれば、遅かれ早かれ「Input/output error」という無機質な文字列に直面することになるでしょう。この状態になると、cpコマンドによる手動コピーやマウスでのドラッグ&ドロップはすべて無意味になります。無理に読み取ろうとすればするほど、磁気ヘッドが損傷箇所を激しくスキャンし、ハードディスクの状態を「少し壊れている」から「完全に修復不能」へと、わずか数分で悪化させてしまいます。

私はかつて、ツールの選択を誤ったために、古いサーバーからわずか20GBのデータを救出するのに6時間も費やしたことがあります。最大の失敗は、通常のddコマンドを使用したことでした。PCはフリーズを繰り返し、データはエラー領域に留まったままでした。その経験から、このような難局を乗り切るために生まれたツールこそが、GNU ddrescueであると確信しました。

なぜ通常のコピーコマンドは失敗するのか?

OSは通常、エラー領域を諦める前に何度も繰り返し読み取りを試みます。これが、非常にストレスの溜まるシステムフリーズの原因となります。

  • cpコマンド: 最初のエラーに遭遇した時点で停止します。断片的なファイルしか取得できず、ほとんど役に立ちません。
  • ddコマンド: conv=noerrorフラグを付けても、順次読み取りを行います。例えば1GBほどの連続したバッドセクタに遭遇すると、ddはそこを通り過ぎるだけで丸一日かかることもあります。その間に、磁気ヘッドはその先にある正常なデータ領域に到達する前に完全に寿命を迎えてしまうかもしれません。

ddとddrescueの比較:アルゴリズムの違い

以下の表は、プロがなぜddrescueを選ぶのかをまとめたものです。

機能 従来のddコマンド GNU ddrescue
読み取り戦略 先頭から最後までの順次読み取り 正常な領域を先に読み、後でエラーを処理
マップファイル (ログ) 非対応 進捗を保存し、いつでも再開可能
エラー処理 ゴミデータで上書き、または停止 ヘッド保護のためスマートにスキップ
速度 バッドセクタ遭遇時に非常に遅い 故障ディスクに最適化されている

安全な3段階のデータ救出プロセス

核心となる原則:故障したハードディスク上で直接操作をしないこと。まずはddrescueを使用して、正常なハードディスクへイメージ(image)を作成します。その後、そのイメージファイルからデータを抽出します。

ステップ1:ツールのインストール

gddrescueパッケージをインストールする必要があります。同名の別のツールと混同しないよう、パッケージ名の先頭に「g」が付いていることに注意してください。

# Ubuntu/Debian系
sudo apt update && sudo apt install gddrescue

# CentOS/RHEL/AlmaLinux系
sudo yum install ddrescue

ステップ2:ハードディスクの識別

lsblkコマンドでデバイス名を確認します。ここでは、故障したディスクが/dev/sdbで、イメージファイルを/mnt/backupに保存すると仮定します。故障ディスクのパーティションはマウントしないでください。これにより、OSが追加のデータを書き込んで状況を悪化させるのを防ぎます。

ステップ3:本格的な救出作業の実行

これは、ほとんどのケースで95%以上のデータを救出するために私が普段適用しているプロセスです。

フェーズ1:高速スキャン(Scraping)

初回は、ddrescueに対して最も正常なデータ領域だけを素早く取得するように指示します。

sudo ddrescue -f -n /dev/sdb /mnt/backup/disk_image.img /mnt/backup/recovery.log
  • -n: エラー領域の再試行を行わず、第1フェーズを早期に完了させます。
  • recovery.log: これはマップファイルです。途中で停電が発生しても、コマンドを再実行するだけで、中断した箇所から再開できます。

フェーズ2:軽微なエラー領域の回収(Retrying)

大部分のデータが安全に確保できたら、次は困難なセクタに立ち向かう番です。

sudo ddrescue -f -d -r1 /dev/sdb /mnt/backup/disk_image.img /mnt/backup/recovery.log
  • -d: ダイレクトディスクアクセス(Direct Disc Access)。OSのキャッシュをバイパスして精度を高めます。
  • -r1: 各エラー領域を正確に1回ずつ再試行します。データが非常に貴重な場合は、-r3などに増やすことも可能です。

フェーズ3:マウントと確認

プロセスが完了すると、disk_image.imgファイルが作成されます。これをマウントしてファイルを取り出してみましょう。

sudo mount -o loop,ro /mnt/backup/disk_image.img /mnt/media/recovery_point

データを永久に失わないための実戦経験

落下したノートPCの救出作業で、ハードディスクから異音がし始めていたことがありました。その時の私の失敗は、マップファイルの使用を忘れたことでした。進捗が70%に達したとき、ケーブルの緩みで突然電源が落ちました。最初からやり直さなければなりませんでしたが、その時には磁気ヘッドが過熱し、完全に故障してしまいました。データは二度と取り戻せなくなりました。

そのため、常にマップファイルを使用してください。それは単なる記録ではなく、あなたの作業時間を守る保険です。ハードディスクが熱すぎる場合は、扇風機などで直接風を当ててください。高温はバッドセクタを急速に広げます。ネット上の裏技にあるような、ハードディスクを冷凍庫に入れることは絶対にしないでください。結露が回路を一瞬で破壊します。

データ復旧は忍耐の戦いです。ボロボロのハードディスクから99.9%のデータを救い出すために、48時間連続でマシンを動かし続けることもあります。しかし、お客様の家族写真のフォルダが無傷で現れたとき、すべての苦労が報われるのです。

Share: