入力デバイスの終わりを超えて実行されているdd

Aug 18 2020

dd修復したハードドライブのクローンを作成しようとしています。ddドライブから10GBのチャンクでコピーデータを作成しようとしていますが、ドライブに含まれるはずのデータよりも多くのデータが転送されています。ドライブ自体が機能し、ドライブ上のパーティションをマウントできます。

を使用しdf -hて、ドライブのサイズを1000204886016バイト(1TBドライブ)にしました。

私は最初に試しました:

sudo dd if=/dev/sdb of=/dev/sdd status=progress

しかし、それは約300GB後にクロールまで遅くなり、最終的には読み取りエラーのために失敗しました。10GBのチャンクでコピーしてみることにしました。128kByteのブロックサイズで10GBを読み取るには、78125ブロックをコピーする必要があると計算しました。

これを行うために私は使用しています:

sudo dd if=/dev/sdb of=/dev/sdd bs=128k count=78125 status=progress oflag=seek_bytes seek=n

dd毎回10240000000バイトが転送されたと報告していました。各反復のシーク値を計算するために、転送されたバイトを集計し、1GBを差し引いて、オーバーラップがあることを確認しました。結果のシーケンスは次のとおりです。

seek=0
seek=9240000000
seek=18480000000
seek=27720000000
seek=36960000000
...
seek=1071840000000

個別のddコマンドを使用してシェルスクリプトでそれらを作成し、実行しました。必要なだけのデータをコピーするために、最後の反復を自由に残しました。

sudo dd if=/dev/sdb of=/dev/sdd bs=128k count=78125 status=progress oflag=seek_bytes seek=0
sudo dd if=/dev/sdb of=/dev/sdd bs=128k count=78125 status=progress oflag=seek_bytes seek=9240000000
sudo dd if=/dev/sdb of=/dev/sdd bs=128k count=78125 status=progress oflag=seek_bytes seek=18480000000
sudo dd if=/dev/sdb of=/dev/sdd bs=128k count=78125 status=progress oflag=seek_bytes seek=27720000000
sudo dd if=/dev/sdb of=/dev/sdd bs=128k count=78125 status=progress oflag=seek_bytes seek=36960000000
    ...
sudo dd if=/dev/sdb of=/dev/sdd bs=128k status=progress oflag=seek_bytes seek=1071840000000

その最後の反復までにドライブの終わりをはるかに超えて実行されているはずですが、それは継続していました。クローンはマウントされますが、明らかに破損しており、データが欠落しています。

  1. 私の数学、または私が使用した引数に何か問題がありddますか?
  2. データを10GBのチャンクで取得するための「dd」コマンドを作成するためのより良い方法はありますか?

回答

3 thatotherguy Aug 18 2020 at 02:31

問題はseek、実際にはブロックカウントを取るのに、バイト値を取ると想定していることです。あなたは使用する必要がありseek=078125156250、など

ただし、dd:を削除することで、大幅に簡略化できます。

split -b 10G < /dev/sdd
3 roaima Aug 18 2020 at 06:36

ddを使用して、修復したハードドライブのクローンを作成しようとしています

しないでください。

ddrescue代わりに使用してください。これは、読み取り不可能なブロックやその他のメディアエラーにうまく対処します。

2 alphasierra Aug 21 2020 at 03:06

私の解決策が失敗した理由は、シークフラグが何をしたかを誤解していることであることがわかりました。出力ドライブの書き込み位置をシフトするだけでした。そのため、スクリプトは最初の10GBを出力に何度もコピーしていました。デバイスの最後に到達することはありません。

入力をシフトするには、スキップフラグも使用する必要があります。

sudo dd if=/dev/sdb of=/dev/sdd bs=128k count=78125 status=progress skip=n seek=n

を設定するoflag=seek_bytesiflag=skip_bytes、ブロックではなくバイト単位で計算を実行できるようになります。

ただし、roaima(ddrescueを使用)と他の人split -b 10G < /dev/sdd)によって提示されたオプションは、損傷したドライブを回復し、それぞれセグメント化された転送を実行するためのより良い方法です。