dd は入力デバイスの最後まで実行されます。

dd は入力デバイスの最後まで実行されます。

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

これを使用して、df -h1000204886016バイト(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

最後の反復では、ドライブのシャットダウンをはるかに超えなければなりませんでしたが、続行されました。レプリカがインストールされましたが、明らかに破損しており、データがありません。

  1. 私の数学や私が使う引数に問題がありますかdd
  2. 10GBチャンクにデータをインポートするための "dd"コマンドを書くより良い方法はありますか?

ベストアンサー1

問題は、seek実際にはブロック数を使用するのにバイト値を使用すると仮定することです。seek=0、などを使用する必要があります78125156250

ただし、以下を削除して簡素化できますdd

split -b 10G < /dev/sdd

おすすめ記事