web-dev-qa-db-ja.com

HDDからHDDへの完全なDDコピー

元の質問:

私が 2つの同一のハードドライブ を持っている場合、次の特性があります:

  • SATA 6.0 Gb/s
  • 5400 rpm
  • 3TB

完全なddコピーが完了するまでにどのくらいの時間がかかりますか?

これまでのところ、それは5時間実行されており、まだ続いています...

Linux Ubuntu 12.04 64ビットを使用していますが、使用しているコマンドは次のとおりです。

dd if=/dev/sdb of=/dev/sdc

更新:1

進行状況を確認できるようになり、コピー430GBで6時間以上かかりました。 HDDは3TBです...

これを行うより速い方法はありませんか?


更新:2

これは以前よりもずっといいようです(提案のためのGroxxdaに感謝します):

Sudo dd if=/dev/sdb bs=128K | pv -s 3000G | Sudo dd of=/dev/sdc bs=128K

ETAは3TBで約9時間ですが、6時間で430GBに達する前は、前のコマンドを使用して約36時間かかったと思います。

37
oshirowanen

ddは、人々がテープを使用していたとき(ブロックサイズが重要であったとき)、およびcatなどの単純なツールがバイナリセーフではない可能性があるときに便利でした。

現在、dd if=/dev/sdb of=/dev/sdcは、複雑でエラーが発生しやすい slowcat /dev/sdb >/dev/sdcの記述方法です。 ddは、比較的まれないくつかのタスクに役立ちます ですが、それを信じるチュートリアルの数よりもはるかに有用ではありません。 ddには魔法はありません。魔法はすべて/dev/sdbにあります。

新しいコマンドSudo dd if=/dev/sdb bs=128K | pv -s 3000G | Sudo dd of=/dev/sdc bs=128Kも不必要に遅く、複雑です。データは一度に128kB読み取られます(これは、ddのデフォルトの512Bよりも優れていますが、さらに大きな値ほど良くありません)。次に、書き込まれる前に2つのパイプを通過します。

より単純で高速なcatコマンドを使用します。 (一部の ベンチマーク 私は数年前にLinuxで作成しました。異なるディスク間のコピーでは、catcpよりも高速で、ブロックサイズがcpddよりも高速でした;ブロックサイズが大きいdd同じディスクにコピーするときは少し高速でした。)

cat /dev/sdb >/dev/sdc

このコマンドをSudoで実行する場合は、ルートとしてリダイレクトを実行する必要があります。

Sudo sh -c 'cat /dev/sdb >/dev/sdc'

Linuxを使用しているため、進行状況レポートが必要な場合は、catプロセスのPID(1234など)をメモし、その入力(または出力)ファイル記述子の位置を確認することで簡単に取得できます。

# cat /proc/1234/fdinfo/0
pos:    64155648 
flags:  0100000

進行状況レポートが必要で、UNIXバリアントがファイル記述子の位置を取得する簡単な方法を提供していない場合、pvの代わりに cat をインストールして使用できます。

ddはデフォルトで非常に小さなブロックサイズ(512バイト)を使用します。その結果、オーバーヘッドが大きくなります(512バイトごとにread()およびwrite() syscall)。

より大きなブロックサイズを使用すると、はるかに高速になります。最適な速度はbs=64kから始まります。ほとんどの人はさらに大きなbs=1Mを使用するため、人間が読めるようになります(dd1234 blocksをコピーしたと言ったとき、数学を行わなくても1234 MiBであることがわかります)。さらに大きなブロックサイズを使用しても、速度が向上する可能性は低く、メモリ消費量が増えるだけです。

したがって、コマンドは次のようになります。

dd bs=1M if=/dev/sdb of=/dev/sdc

すでに低速のddを実行している場合は、中断して高速のddインスタンスで再開できます。このため、コピーがどこまで進んだかを知ることが重要です。 ddは通常、キャンセル時に進行状況を出力します。または、実行中にUSR1シグナルを送信して、進行状況を出力することもできます。

kill -USR1 $(pidof dd)

たとえば、それが1234MiBより多くコピーした場合、次のコマンドを使用して1234MiBの位置から再開できます。

dd bs=1M seek=1234 skip=1234 if=/dev/sdb of=/dev/sdc

コピーが1234MiBより少ない場合、コピーは不完全になります。 1234MiBを超えてコピーした場合は、すでにコピーされた一部が再コピーされますが、通常は害はありません。したがって、疑わしい場合は、すでにコピーされたと思われる値よりも少し小さい値を選択する必要があります。

7
frostschutz

進行中のddプロセスに関する統計の取得

killコマンドと適切な信号を使用して、ddの統計を標準エラーに出力できます。
GNU dd manページから:

Sending a USR1 signal to a running 'dd' process makes it print I/O statistics to standard error and then resume copying.
      $ dd if=/dev/zero of=/dev/null& pid=$!
      $ kill -USR1 $pid
      18335302+0 records in 18335302+0 records out 9387674624 bytes (9.4 GB)  copied,  34.6279 seconds, 271 MB/s

ddの実装によって異なる可能性があるため、最初に正しいシグナルについてマニュアルページを確認してください:(BSD ddはSIGINFOを使用します)。

プロセスのスピードアップ

  1. 各HDDをそれぞれのSATAポートに接続して、データを1つのデバイスから読み取り、同時に別のデバイスに書き込むことができるようにします。
  2. bs=引数を使用して適切なブロックサイズを使用します。 スーパーユーザーのこのスレッド を見て、いくつかの値を試してみてください。
  3. 読み取りと書き込みに別々のdd呼び出しを使用し、パイプを使用してそれらを接続します(dd if=/dev/sda bs=1M | dd of=/dev/sdb bs=1M)。
    これを行ってブロックサイズを指定する場合は、各呼び出しで同じブロックサイズを使用するようにしてください。
  4. direct引数のような他の最適化を試すことができます。
  5. ハードディスクがマウントされていないことを確認してください。マウントされていない場合、コピーが破損する可能性があります。
5
groxxda

HDClone と呼ばれる商用ソフトウェアがあります。フリーウェアと商用の両方としてライセンスされています。どちらのバージョンでも、起動可能なペンドライブまたはDVDを作成できるだけでなく、ディスクをコピーすることもできます。ソースHDと宛先HDを接続し、GUIベースの指示に従います。

無料版は約80MB /秒の速度で転送されますが、有料版ははるかに高速になります。 NTFSおよびFATファイルシステムの場合、有料バージョンは、HDの占有ビットのみを複製するように構成できるため、各複製の速度が大幅に向上します。

0
Gerold manders

「gparted」を試しましたか?パーティションをあるドライブから別のドライブに文字どおりコピーして貼り付け、必要に応じてそれに応じてサイズを変更できます。転送速度と残り時間を取得します。 Linuxパーティションの下に「e2image」を使用します。

0
ioannis