web-dev-qa-db-ja.com

悪いブロックのデータを読み取ると/ devから消えるハードドライブからデータを回復する

USB3ドライブエンクロージャーを介して接続されている故障した750GBハードドライブからできるだけ多くのデータを回復しようとしています。

ドライブ自体に1500を超える不良ブロックがあり、Linuxではbadblocksによって検出されます。

コンピューター(macOS 10.12を実行中)に完全にマウントされますが、破損したブロックからのデータが読み取られると、ドライブは数秒間アイドル状態になり、/devから消えてから、誰かがUSBケーブルを抜いたかのように再び表示されます。その後、すぐに再び接続しました。

最初の不良ブロックは、ディスクの先頭から約136 GiBですが、これだけではありません。これは、badblocksからの出力と、両方のddddrescueは失敗します。

ddddrescueはどちらも、ドライブが/devから消えるため、不良ブロックからデータを読み取るとすぐに失敗します。

dd if=/dev/rdisk3 of=image.img bs=16m

enter image description here

ddrescue -v /dev/disk4 image.img logfile

enter image description here

同じログファイルを使用して最初の終了後にddrescueを再実行すると、すぐに終了し、それ以上進むことはありません。

ファイルシステムをトラバースして一部のファイルに正常にアクセスできるので、 スクリプトを作成しました アクセスできるファイルとアクセスできないファイルを判別して、正常なファイルをディスクからコピーできます。ただし、これは遅いので、ディスクがさらに損傷するのではないかと心配しています。

このドライブからデータを回復できるddまたはddrescueに似たツールはありますか?これは、不良ブロックの読み取り時に自動的に終了するのではなく、ドライブが再マウントされるのを待つだけです。

私はmacOSとLinux(Ubuntu)の両方を使用できるので、どちらのプラットフォームのソリューションでもうまくいくでしょう。

3
Jack Greenhill

破損したブロックからのデータが読み取られると、ドライブは数秒間アイドル状態になり、マウントを解除してから再マウントします。

ドライブが「消えて」、後で再び現れるという同じ問題がありました。実際にはマウントもされていませんでしたが、デバイスが消えるときにddrescueが停止していました。 Linuxで使っていたのですが、状況はよく似ています。

少し簡単なシェルプログラミングを使用することをお勧めします。ドライブが実際にはしばらくすると再び表示されるという事実。言い換えれば、次のことを行います。

while [ 1 ]; do
    ddrescue -v /dev/disk4 image.img logfile
    sleep 3
done

これは次のように機能します。

  • ddrescueが開始されました
  • 実行が停止した場合、シェルは3秒間待機してから、再度開始します。
  • ddrescueは、ロギング機能を十分に活用しているため、続行できます

何度か試行した後(デフォルトは3だと思いますが、間違っている可能性があります)、ddrescueはセクターを間違いなく不良としてマークし、ドライブの他の部分の読み取りを続行します。数時間後、ddrescueが実行され、ループを強制終了できることがわかります。 Ctrl+C

2

から GNU ddrescue Manual

例6:/dev/sda1のパーティションをファイルhdimageにレスキューしているときに、/dev/sda1/devから消えます。

ddrescue -f -n /dev/sda1 hdimage mapfile     <-- /dev/sda1 fails here
  (restart /dev/sda or reboot computer and then repeat the above
   command as many times as needed until it succeeds)
ddrescue -d -f -r3 /dev/sda1 hdimage mapfile

Andrea Lazzarottoの回答 「上記のコマンドを繰り返す」の部分をカバーしています。この例には、-dスイッチを使用する追加の手順があります。 マニュアル 少し説明します:

-d
--idirect

カーネルキャッシュをバイパスして、直接ディスクアクセスを使用してinfileから読み取ります。 (O_DIRECTフラグを指定してファイルを開きます)。これを機能させるには、セクターサイズを正しく設定する必要があります。すべてのシステムがこれをサポートしているわけではありません。

さらに読むことをお勧めします マニュアルの適切なセクション 。そこから:

最初に--idirectオプションを試してください。システムで直接ディスクアクセスが利用できない場合は、rawデバイスを試してください。システムのドキュメントを読んで、rawデバイスを通常のブロックデバイスにバインドする方法を見つけてください。一部のOSは、/dev/rdiskなどの特別なデバイス名を介してrawアクセスを提供します。

MacOSは/dev/rdisk名を提供します。ただし、あなたの質問では、rdiskddと一緒に使用しますが、diskddrescueと一緒に使用するので、追加の手順の恩恵を受ける可能性があります。

Linuxユーザーは、rawコマンドが便利です。 man rawおよび例2: GNU ddrescueマニュアルの前述のセクション)でrawデバイスを使用する

2