最近、異常なHDDからファイルにdd
を試しました。 dd if=/dev/sdb of=somefile bs=4096 conv=noerror,sync
。私の問題は、dd
が不良ブロックに遭遇したときに多くの時間を浪費することでした。私のユースケースでは、より高速な結果を得るために、データの損失を喜んで支払います。
エラー処理を速くする方法はありますか?多分カーネルTweak(ブロックを読み取るためのより少ない労力をHDDに伝える)?または別のプログラム?
まず、ソフトウェアで使用するために、ddrescue
の代わりにdd
を使用してみます。
ddrescue
には、限られた回数だけ再試行するスイッチがあります。また、ログファイルを使用できるため、どのブロックが不良であったかを記録します。後で再試行したい場合は、sameログファイルを使用して、ddrescue
againを異なるオプション(より多くの再試行など)を使用して、必要なブロックのみを再試行します。
使用例:
# ddrescue -n /dev/sda /dev/sdb rescue.log
# ddrescue -r1 /dev/sda /dev/sdb rescue.log
ddrescue
情報ページから:
-n, --no-scrape
Skip the scraping phase. Avoids spending a lot of time
trying to rescue the most difficult parts of the file.
-r, --retry-passes=<n>
Exit after given number of retry passes. Defaults to 0.
-1 means infinity. Every bad sector is tried only once
in each pass. To retry bad sectors detected on a previous
run, you must specify a non-zero number of retry passes.
ddrescue
を使用するためのその他のソースを以下に示します。
info ddrescue
HDD自体に時間がかかりすぎる場合は、[〜#〜] tler [〜#〜]([〜#〜] t [〜# 〜] ime [〜#〜] l [〜#〜] imited [〜#〜] e [〜#〜] rror [〜 #〜] r [〜#〜] ecovery)または[〜#〜] cctl [〜#〜]([〜#〜] c [〜#〜] ommand [〜#〜] c [〜#〜] ompletion [〜#〜] t [〜#〜] ime [〜#〜] l [〜#〜] imit)。すべてのHDDに搭載されているわけではありませんが、HDDコントローラー自体の時間を制限するために使用できます。もちろん、このアプローチはddrecue
の使用と組み合わせることができます。
Linuxにはsmartctl
というツールがあります(smartmontools
パッケージ内)。
現在の設定を確認するには(「無効」は時間を無制限にすることを意味しますが、これは望ましくありません)。
# smartctl -l scterc /dev/sda
これを固定値に設定するには(この例では5.0秒。0に設定するとTLERが無効になります):
# smartctl -l scterc,50,50 /dev/sda
TLERのソース: http://en.wikipedia.org/wiki/TLER
このソフトウェアを使用すると、他の方法では読み取り不可能なディスクから良い結果が得られました。
http://www.cgsecurity.org/wiki/TestDisk
この次のものもしっかりした回復ツールです。ファイルテーブルが壊れていたり、削除されていても、ファイルを取得できます。それはいまいましい優れた法医学ツールです。本当に整理されていない方法でダンプしますが、すべてのデータを移動できます。
ディスクをレスキューするための迅速かつ迅速なオプションとして、shスクリプトファイルを使用して、shでファイルを実行できます。この行が含まれています。Sudo ddrescue
とsleep 3
をあと数回繰り返すだけです。スリープは、ドライブを数秒休止させるために使用されます。
#! /bin/sh -e
Sudo ddrescue -d -r0 -e +0 -T 1s -n /dev/drivepartition file.img log.logfile
sleep 3
上記で使用したオプション:
-r0
:再試行なし-e +0
:最初のエラーで終了-T 1s
:1秒の読み取り失敗で終了-d
:直接I/O-n
:削り取りなしオプション-R
を使用して、終了後に-A
を1回使用できます。これにより、すべてのエラーサイズが元に戻されて削除され、逆方向に再び開始されます。エラーを別の方法で読み取ることを意味します。
あなたのハードドライブのサイズとそれが持っている多くの不良ブロックに依存します。 DD a 1 tera health hdを使用してバックアップするには、通常20分かかります。不良ブロックで今朝回復したばかりで、2倍の時間がかかった。約30個の不良ブロックがある複製(ディスクのバックアップ)で問題が発生していました。私が最初に行ったことは、通常のFilezillaを使用してファイルをバックアップし、すべての適切なデータをバックアップすることです。 1つの大きなファイルが正しくコピーされていないことに気付きました(途中で停止して転送を再開します)。幸い、同じファイルの以前のバックアップがあります。ディスクを複製するには、次の手順を使用してディスク上の不良ブロックを見つける必要がありました。
まず、fdisk -lを使用して、HD情報を特定する問題のあるディスクを見つけます。
2つ目は、ディスクが/ dev/sdbだとすると、コマンドbadblocks -v/devを実行する必要があります/ sdbドライブ上のすべての不良ブロックを一覧表示します。幸いにもいくつかあります。不良ブロックが見つからない場合は、ドライブブロックに問題はなく、他の問題を解決する必要があります。私のブロックサイズは512なので、DDを実行するためにそのデフォルトの数を使用します
3番目の各ブロックは512サイズなので、bs = 512を設定します
いつものようにDDを定期的に実行するたびに、エラー後、データが破損して出力されます。それで、ページで説明されているようにパラメーターを使用します https://www.gnu.org/software/coreutils/manual/html_node/dd-invocation.html 「障害のあるディスク用」の部分を検索します。
dd if=/dev/sdb of=/dev/sda bs=512 conv=noerror,sync iflag=fullblock
少し時間がかかりました。不良ブロックが発生するたびに、障害のあるドライブを叩いたような音がしました。それはブロックごとにコピーします、そして私のすべての悪いブロックを通して同じノイズを作りました。ノイズを発生させた回数は、別の不良ブロックが見つかり、表示エラーメッセージが表示されたためです。 'conv = noerror、sync'が行うことは、不正な読み取りにNULを埋め込むことですが、 'iflag = fullblock 'は短時間の読み取りに対応しますが、最後までデータを同期し続けます。破損はまったくなく、障害のあるブロックをコピーせず、空のNULで埋めます。
DDでのコピーが完了したら、その不良ファイルを置き換えるだけで、Filezillaを過去のバックアップから戻し、すべてが正常に機能しました。これが、障害のあるドライブをバックアップしようとする他のユーザーに役立つことを願っています。
注:私の悪いブロックはお互いにかなり近いところにあります。不良が検出されたグループで一度に約4ブロック。ブロックがディスク全体にある場合、いくつかのファイルが影響を受ける可能性があります。幸い、私の場合、大きなデータベースの4GBファイルのみが影響を受けました。