元の質問:
私が 2つの同一のハードドライブ を持っている場合、次の特性があります:
完全な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時間かかったと思います。
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で作成しました。異なるディスク間のコピーでは、cat
はcp
よりも高速で、ブロックサイズがcp
はdd
よりも高速でした;ブロックサイズが大きい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
を使用するため、人間が読めるようになります(dd
が1234 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
を超えてコピーした場合は、すでにコピーされた一部が再コピーされますが、通常は害はありません。したがって、疑わしい場合は、すでにコピーされたと思われる値よりも少し小さい値を選択する必要があります。
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を使用します)。
bs=
引数を使用して適切なブロックサイズを使用します。 スーパーユーザーのこのスレッド を見て、いくつかの値を試してみてください。dd
呼び出しを使用し、パイプを使用してそれらを接続します(dd if=/dev/sda bs=1M | dd of=/dev/sdb bs=1M
)。direct
引数のような他の最適化を試すことができます。HDClone と呼ばれる商用ソフトウェアがあります。フリーウェアと商用の両方としてライセンスされています。どちらのバージョンでも、起動可能なペンドライブまたはDVDを作成できるだけでなく、ディスクをコピーすることもできます。ソースHDと宛先HDを接続し、GUIベースの指示に従います。
無料版は約80MB /秒の速度で転送されますが、有料版ははるかに高速になります。 NTFSおよびFATファイルシステムの場合、有料バージョンは、HDの占有ビットのみを複製するように構成できるため、各複製の速度が大幅に向上します。
「gparted」を試しましたか?パーティションをあるドライブから別のドライブに文字どおりコピーして貼り付け、必要に応じてそれに応じてサイズを変更できます。転送速度と残り時間を取得します。 Linuxパーティションの下に「e2image」を使用します。