ddはなぜそんなに時間がかかるのですか?

ddはなぜそんなに時間がかかるのですか?

あるディスクを別のディスクにコピーする必要があります。次のコマンドを試してみましたが、ペデロから1 TBのディスクをコピーするのにほぼ1日かかりました。

dd if=/dev/sda of=/dev/sdb 

以下のコマンドを使用してUnix(HP-UX)システムで同じことを試みましたが、数時間以内に完了しました。

dd if=/dev/sda of=/dev/rdsk

ディスクからディスクにすばやくコピーするには、どのような方法を使用できますか?

答え1

dd(奇妙な)オプションがたくさんあります。仕事(1)

バッファサイズを明示的に指定する必要があるため、試してみてください。

dd if=/dev/sda of=/dev/sdb bs=16M

IIRCの場合、デフォルトのバッファサイズはわずか512バイトです。上記のコマンドはこれを16MBに設定します。より小さいもの(例bs=1M:)を試すことはできますが、デフォルトよりも多くを使用する必要があります(特に4 KBセクタを持つ最新のディスクハードウェアの場合、つまり高度なフォーマット)。私は少なくとも1メガバイトの2勝を無実に推薦したいと思います。

デフォルトのバッファサイズである512バイトを使用しているようです(しかし非常に間違っている可能性があります)。ハードウェアカーネルは512バイトブロックあたり4Kを送信する必要があります。

についてrdsk標準偏差(4)マニュアルページには次のように記載されています。

現在、ブロックデバイスのみが利用可能です。生のデバイスはまだ実装されていません。

ddのバッファサイズを大きくすると、読み書き動作のパフォーマンスが向上します。すべてのディスクにハードウェアの読み取り/書き込みバッファがあります。しかし、ddのバッファサイズをハードウェアバッファ以上に増やすと、ddが最初のディスクから読み取られるのに対し、2番目のディスクはそれ自体のハードウェアバッファからすべてを書き込むため、パフォーマンスが低下します。bs毎回異なるデバイスに異なるddコマンドオプションを設定する必要があります。

答え2

数年前、Unixの世界では、ddブロックデバイスをコピーするのが一般的な方法でした。 (少なくともLinuxベースのシステムでは)catほぼ常にdd

しかし、歴史的には、各システムコールがI / O操作をトリガすることを考慮すると、適切なブロックサイズが(遅い)システムコールの数を減らすのに役立ちました。デフォルトのブロックサイズは512バイト(ディスクセクタ1個)です。以前は、単一の読み取りのために複数のディスクブロックをまとめて収集することが許可されていました。この例では、32MBのブロックサイズを使用しています。

dd bs=$((512*2048*32)) if=/dev/source of=/dev/target

ところで、圧縮されていないストリームまたはリモートネットワークソースからのストリームを読み取る場合、短い読み出しが必要なブロックサイズより小さいことがわかります。ddチャンクを埋めるのに十分な入力が得られるまで、再読み込みを指示して処理する必要があります。iflag=fullblockそれ以外の場合は、破損した出力ストリームが発生することがあります。ここではそうではありませんが、完全性のために含めました。

元の質問に戻り、現在のLinuxベースのシステムでは、簡単な方法でディスクを最も効率的にコピーできます。cat

cat /dev/source >/dev/target

(あなたの質問の説明で言及されているように、pvこれは置き換えることができcat、進行状況とスループットを示すことができます。)

答え3

一般に、dd特定の選択肢は避けることができる。代わりにGNUを使用するにはいくつかの良い理由がありますddrescue。 Ubuntuでは、次のコマンドを使用してインストールできます。

sudo apt-get install gddrescue

簡単に言えば、ddrescue使いやすいです。パッケージ名とは異なり、実行可能ファイルは確かに開始がありますg

それを使うのはとても簡単です:

ddrescue inputFile outputFile logFile

ログファイル(選択した名前)を使用すると、以前のジョブを再実行することなく一時停止/停止および再開できます。これは、大規模なレプリケーションまたはディスクの復元を実行するときに便利です。デフォルトでは、進行状況、現在のコピー速度、平均コピー速度、および見つかった不良ブロックの数が表示されます。

ブロックサイズに合理的なデフォルト値を使用するので、少なくとも私の経験では、コピーは常にデバイスが処理できるほど高速です(私はすべてのサイズと種類の何百ものドライブを複製しました)。

通常、故障し始めるドライブには、断続的な速度低下、低い平均速度、突然の長い一時停止(不良セクタ)、または完全リセット(重要な表面エラー)などの速度の問題があります。ddrescueドライブが独自にリセットされても、これは上記のすべてを識別して複製を再開するのに役立ちます(ログファイルを指定した場合)。

答え4

とても良い質問です。元のインターフェイスは一部のUNIXシステム(tru64、hpux、Solaris)では実装されていますが、Linuxでは実装されていません。ネイティブインターフェイスを使用すると、UNIX I / Oをスキップするため、転送速度が速くなります。ブロックインタフェース(/dev/dskまたは/dev/disk)はUnix I / Oシステムを使用しているため、遅くなります。速度を上げるには、dd(gnu dd 使用可能) ハードウェアに応じて、bs=30Mまたは を使用します。bs=20M短い答えは次のとおりです。いいえ、少なくとも私が知っている限り、まだ実装されていません。私はカーネルバージョン2.2からLinuxを使用してきましたが、rdskUNIXで使用されているものを見たことがありません。

関連情報