web-dev-qa-db-ja.com

Linuxでハードディスクから不良ブロックを読み取るのが遅すぎる

古い320Gハードドライブ(不良セクタでいっぱい)から新しいものにデータを回復しようとしています。 ddrescueはスマートであるため、このタスクに適したツールであることがわかりました algorithm 。私はすでに次のコマンドでこれを一度行っています:

ddrescue -f -n /dev/sda /dev/sdb log

Errsize 16G(未回復)で数時間で完了しましたが、まだ重要なデータが含まれている可能性があるため、次のパスを実行しました。

ddrescue -f -d /dev/sda /dev/sdb log

しかし、Linuxが各不良セクタでスタックしているため、実行速度が遅すぎます(avg 300B/s)。
これは実際にはLinuxカーネル(おそらくlibata)であり、ハードディスク自体ではありません。クリーンなDOSで実行されているツールと[〜#〜] dmde [〜#〜]でリカバリしようとしたためです。そのような問題はありませんでした。ATAタイムアウトはそこで調整でき、全体的なリカバリプロセスははるかに高速に実行されます。
しかし、Linuxではありません。
次のカーネルパラメータも試しました:libata.ignore_hpa=1libata.noacpilibata.force=noncq,norstおよびlibata.dma=0ブートラダーでコマンドラインに渡しましたが、効果がありませんでした(System Rescueを使用しています)。 LIBATAがカーネルでコンパイルされたCD)。
デバイスのタイムアウトも変更しようとしました:

echo 1 > /sys/block/sda/device/timeout

(デフォルトは30)
しかし、syslogでより多くのエラーが発生するだけで、役に立ちません。
不良ブロックの通過には、各セクターで1〜3分かかりますが、非常に遅いです。 16GBの「悪い」チャンクを解析するのにどれくらいの時間が必要ですか?一週間?月?
私はまだ回復のためにddrescueを好み(その効率的なアルゴリズムとログファイル機能のため)、カーネルドライバーを調整してata /ディスクエラー処理を高速化する方法を知りたいです。ここSUに関するGoogleと関連する質問は役に立ちませんでした。何か案は?

P.S.私の英語でごめんなさい

@ ta.speot.is

通常のバックアップから復元してみませんか?

私の友人ではなく、私の友人のこのハードディスク。とても悲しいことに、彼にはバックアップがありません。さて、ディスクがクラッシュした後、彼はバックアップを作成することを考え始めました、はい:)


[〜#〜] upd [〜#〜]:2。5年後、私はまだ答えがわかりませんが、sataコントローラーが互換性がある場合にddrescueがより速く動作することに気づきました( IDE)モードの場合、もう1つのヒントは、常に-dオプション(直接アクセス)を使用して、処理を少し高速化することです。 HDDを調整するためのhdparmオプション(-m-D-P)も見てください。これは(古いハードウェアで)役立つ可能性があります。


PD2:関連する質問に対するSlizzeredの answer に気づきました。それは素晴らしい!私は試した:

smartctl -l scterc,20,20 /dev/sda

リカバリは以前よりもはるかに高速になりました(ただし、IDEモードのみ)。

5
lolimperator

これは質問が投稿されてから数年後ですが、他の誰かを助けるでしょう。私はこの答えの大部分をどこかで見ましたが、-cオプションが古いddrescueで利用可能であったかどうかはわかりません。 -cは、一度にコピーするセクターの量を変更します。

ここに行きます:

ddrescue -d -r0 -e +0 -T 1s -n /dev/sdX recover.img recover.log -c 1 -O

Xを回復しようとしているドライブに置き換えます。データはrecover.imgというファイルに保存されるため、十分なスペースが必要です。

上記のコードの前にある「watch」プログラムを使用して、「不良領域が多すぎる」エラーが原因でコードがクラッシュしたときにコードを自動的に実行します。

1
I Craft Crafts

--skip-size=パラメーターをより大きなものに構成すると役立つ場合があります。デフォルトでは64kBのような小さなものになっていますが、最近のドライブのダメージストライプははるかに大きい可能性があります。

毎回タイムアウトを待つ必要がありますが、待機する回数は少なくなります。

0
DustWolf

DDRescue manから:

(ユーザーはいつでもプロセスを中断できますが、不良ドライブはカーネルが諦めるまでddrescueを長時間ブロックする可能性があることに注意してください)

つまり、簡単な答えは次のとおりです。DDRescueでは、カーネルタイムアウトを変更できないため、変更できません(適切なソースを適切な場所で編集し、再コンパイルする必要があります...単純ではありません!)。

Hirenのブートに含まれているいくつかのソフトウェアを使用して良い結果が得られました。

  • DataResque DD(画像を作成)
  • Roadkilの止められないコピー機(ファイルをコピーしてエラーをログに記録します)

どちらもHirenのブーツに含まれているMiniXPで実行されます。 CD/DVDまたはUSBドライブから実行されます。

アドバイス:ハードディスクは非常に高温になる可能性があります。これは悪いことであり、プロセスを悪化させます。ファンで冷やすと、寿命が延び、作業が速くなります。

0
user242903