ddに時間がかかりすぎるのはなぜですか?


17

あるディスクを別のディスクにコピーする必要があります。以下のコマンドを試してみましたが、1 TBのディスクをfederoでコピーするのに1日近くかかります。

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

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

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

もっと速くディスクからディスクにコピーするために使用できる代替手段は何ですか?


2
cp /dev/sda /dev/sdbまたは(pv /dev/sda > /dev/sdb プログレスバーを取得する)の方がはるかに高速です。なぜddここで使用するのですか?エラーのあるディスクを処理ddするような場合にのみ役立ちconv=sync,noerrorますが、それでも、ddrescue代わりに次のようなものを使用する方が理にかなっています(pv-Eオプション」も参照)。
ステファンシャゼラス16年

1
@StéphaneChazelas catはさらに速いかもしれませんが、違いはそれほど劇的ではありません(私の実験のように、ファイルからファイルへのデバイスよりもデバイスからデバイスへのが大きいかもしれません)。
ジル 'SO-悪である停止'

8
「Unixシステムでも同じことを試しました」 -では、Unixではない場合、どのタイプのシステムで最初に試しましたか?また、どのハードウェアなど、yaddayadda。
-marcelm


HP-UX(Integrityブレード)で最初に使用され、以前に使用されたSolarisマシンも使用しました。
KKD

回答:


27

dd多くの(奇妙な)オプションがあります。dd(1)を参照してください。

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

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

IIRC、デフォルトのバッファサイズは512バイトのみです。上記のコマンドは、16メガバイトに設定します。もっと小さいもの(たとえばbs=1M)を試すこともできますが、デフォルトよりも多く使用する必要があります(特に4Kバイトのセクターを持つ最新のディスクハードウェア、つまりAdvanced Formatで)。少なくとも1メガバイトの2の累乗を単純に推奨します。

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

に関してrdsksd(4)の manページには次のように書かれています:

現時点では、ブロックデバイスのみが提供されています。Rawデバイスはまだ実装されていません。

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


Linuxシステムでrdskを使用できるかどうか?Unixシステムで使用しました。
KKD

1
ページキャッシュはおそらく4Kbブロックで処理しますが、ddがその4Kbを読み取るために使用するsyscallの数を制御できます。読み取りサイズがいくらかあると、書き込みをストールするコストは保存されたシステムコールよりも高くなりますが、スイートスポットがどこにあるのかわかりません。
役に立たない

数MBのブロックサイズは、デフォルトの512Bよりも優れていますが、これをベンチマークしときcatも同様であることがわかりました(ファイルシステムからファイルシステムへの転送の場合、直接ブロックからブロックへのパフォーマンス特性が異なる場合があります)。ただし、いずれの場合も違いは劇的ではありませんでした。
ジル 'SO-悪であるのをやめる'

1
興味深いことに、macOS(SUS認定、ところで)では、実行時にターゲットとして使用する方が高速/dev/rdiskXddです。
アディブ

1
(私がしたように)何が起こっているのか不思議に思うかもしれませんstatus=progressが、操作の進行状況全体を出力します。
アレクサンダーレッヒ

16

ddブロックランドデバイスをコピーするには、Unixランドで何年も前から必要な方法でした。(少なくともLinuxベースのシステムでは)catほとんどの場合、それは貨物カルトの知識として前進していますdd

ただし、過去にさかのぼるまともなブロックサイズは、各システムコールがI / O操作をトリガーすることを考えると、(遅い)システムコールの数を減らすのに役立ちました。デフォルトのブロックサイズは512バイト(1ディスクセクター)です。複数のディスクブロックを1つの読み取りにまとめて収集することも-そして-受け入れられました。この例では、32MBのブロックサイズを使用しています。

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

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

cat /dev/source >/dev/target

(質問のコメントに記載されているように、pv代わりに使用できcat、進行状況とスループットの指標を提供します。)


2
特に、ddを使用しなければならなかった理由は、GNU cpのバグと90年代初期のLinuxカーネルのバグでした。歴史的なUNIXシステムでddを使用する理由は大きく異なり、ブロックデバイス全体をコピーしたいというのは珍しいことです。
Random832

1
@ Random832はディスク全体をコピーすることは珍しいことですが、パーティションをコピーする必要があることを覚えています(大きなもの
-150 MB

2
(バグの詳細:カーネルがディスク使用量のサイズを誤って報告し[cpがすべてのソースファイルがスパースファイルであると結論付ける]、スパースファイルからデバイスの宛先にコピーするときにcpがブロックをゼロにしませんでした。ソース内のブロックには、ディスク上に既に存在するガベージがあります)
-Random832

私はこの種の答えが大好きです。情報をありがとう。これがあなたの更新です。
catbadger

7

一般的に、ddいくつかの代替案を支持して回避することができます。ddrescue代わりにGNUを使用する理由はいくつかあります。Ubuntuでは、次の方法でインストールできます。

sudo apt-get install gddrescue

そして、単純にddrescue使用します。パッケージ名とは異なり、実行可能ファイルに initialがありませんg

それを使用するのは簡単です:

ddrescue inputFile outputFile logFile

ログファイル(任意の名前)を使用すると、以前の作業をやり直すことなく、一時停止/停止および再起動できます。これは、大規模なクローン作成やディスクのリカバリを行う場合に便利です。デフォルトでは、進行状況、現在のコピー速度、平均コピー速度、検出された不良ブロックの数が表示されます。

ブロックサイズには賢明なデフォルトを使用しているため、少なくとも私の経験では、コピー速度は常にデバイスが処理できる限り高速です(すべてのサイズとタイプで何百ものドライブをクローンしました)。

多くの場合、障害が発生し始めたドライブには、速度低下の問題、平均速度の低下、突然の長い一時停止(不良セクタ)、完全なリセット(重大な表面エラー)などの速度の問題があります。ddrescueドライブがそれ自体をリセットしている場合でも、上記のすべてを識別し、クローンを再起動するのに役立ちます(ログファイルを指定した場合)。


6

とてもいい質問です。rawインターフェースは、一部のUNIXシステム(tru64、hpux、solaris)で実装されていますが、Linuxでは実装されていません。unix I / Oがスキップされるため、rawインターフェースは転送を高速化します。ブロックinterface(/dev/dskまたは/dev/disk)は、unix I / Oシステムを使用するため、低速です。高速化するにはdd(gnu ddが使用可能)を使用するbs=30Mbs=20M、ハードウェアに依存します。簡単な答えは:いいえ、少なくとも私の知る限りでは実装されていません。カーネルバージョン2.2の昔からLinuxをrdsk使用していますが、Unixで使用されたことはありません。


5
なぜ2の累乗ではないブロックサイズを提案するのですか?
バジルスタリンケビッチ16年

2
@Basileディスクブロックサイズの倍数で十分なので、20MiBで十分です。
ロアイマ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.