dd
修理したハードドライブを複製しようとしています。dd
ドライブから10 GBチャンクにデータをコピーしようとしましたが、ドライブに含める必要があるよりも多くのデータが転送されました。ドライブ自体が機能し、パーティションをマウントできます。
これを使用して、df -h
1000204886016バイト(1TBドライブ)のドライブサイズを取得しました。
私は最初に次のことを試しました。
sudo dd if=/dev/sdb of=/dev/sdd status=progress
しかし、300GBほど経過すると速度が遅くなり、最終的に読み取りエラーで失敗した。 10GBチャンクに複製してみることにしました。 10GBの128kByteブロックサイズを読み取るには、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
最後の反復では、ドライブのシャットダウンをはるかに超えなければなりませんでしたが、続行されました。レプリカがインストールされましたが、明らかに破損しており、データがありません。
- 私の数学や私が使う引数に問題がありますか
dd
? - 10GBチャンクにデータをインポートするための "dd"コマンドを書くより良い方法はありますか?
答え1
問題は、seek
実際にはブロック数を使用するのにバイト値を使用すると仮定することです。seek=0
、などを使用する必要があります78125
。156250
ただし、以下を削除して簡素化できますdd
。
split -b 10G < /dev/sdd
答え2
答え3
私の解決策が失敗した理由は、検索フラグの機能を誤解したためであることがわかりました。出力ドライブの書き込み位置のみを移動します。したがって、スクリプトは最初の10 GBを出力にコピーし続けます。デバイスの最後まで到達しません。
入力を移動するには、スキップフラグも使用する必要があります。
sudo dd if=/dev/sdb of=/dev/sdd bs=128k count=78125 status=progress skip=n seek=n
oflag=seek_bytes
合計を設定すると、iflag=skip_bytes
ブロックではなくバイト単位で数学を実行できます。
ただし、提供されるオプションはロエマ(ddrescueを使用)と他の人(split -b 10G < /dev/sdd
)は破損したドライブを回復し、分割された転送を別々に実行するより良い方法です。