有限サイズのデバイスをコピーするときにブロックサイズを指定するのはなぜですか?


14

オンラインチュートリアルでは、次のコマンドを使用してCDROMをisoイメージにコピーすることをお勧めします。

$ dd if=/dev/dvd of=foobar.iso bs=2048

なぜバイトサイズを指定する必要があるのですか?私は実際に2048年であることに気づくCDROMイメージのための標準的なバイトサイズが、それはと思われるdd指定せずにbs=、またはcount=同様に動作します。

どのような状況で、指定しないのが問題になるのbs=count=、または有限サイズのデバイスからコピーするのは問題になりますか?

回答:


12

ddはデータのコピーに適していますか?(またはwhen are read()およびwrite()partial)はcountddを使用するときに重要な注意事項を指摘します。したがって、部分ブロックをコピーできるためcount、ブロックの一部が不完全であっても、指定された数のブロックの後に停止します。したがってbs * count、を指定しない限り、コピーされるバイト数が少なくなる可能性がありますiflag=fullblock

ddのデフォルトのブロックサイズは512バイトです。count制限です。あなたの質問が示唆するように、有限サイズのデバイスをコピーする場合、それは必須ではなく、実際にはデバイスの一部のみをコピーすることを意図しています。

ここで考慮すべき2つの側面があると思います:パフォーマンスとデータ回復。

パフォーマンスに関する限り、理想的には、ブロックサイズを、基礎となる物理ブロックサイズ(CD-ROMを読み取る場合は2048バイト)と少なくとも等しいか、その倍数にする必要があります。実際、最近では、より大きなブロックサイズを指定して、基礎となるキャッシングシステムにバッファリングする機会を与えることができます。ただし、ブロックサイズddを大きくすると、それだけ多くのメモリを使用する必要があり、パケットの断片化のためにネットワーク経由でコピーする場合は逆効果になる可能性があります。

データリカバリに関する限り、より小さいブロックサイズを使用すると、故障したハードディスクからより多くのデータを取得できます。これは、プログラムなどdd-rescueが自動的に行うことです。最初は大きなブロックを読み取りますが、ブロックが失敗すると、より小さいブロックサイズで再読み取りします。ddこれを行わず、ブロック全体が失敗するだけです。


2
特にパフォーマンス。たとえば、dd bs=4m iflag=fullblockvs dd bs=1111を使用してSDカードにパーティションイメージを書き込み、前者が提供する大幅に高いデータレートに注意してください。これは、前者がSDカードの自然なブロックサイズと一致するのに対し、後者はSDコントローラーが部分的な物理ブロックを書き込むために多くの読み取り、コピー、再フラッシュを行う必要があるためです。fullblockちなみに、その重要性は過小評価すべきではありません。それbsがなければ、それは最大値に過ぎず、部分的な読み取りはその後の不整合を持続させる可能性があるからです。
ジェイソンC

6

周りに貨物カルトが少しありddます。元々、cp問題を引き起こすバグが2つありました。512以外のブロックサイズで報告されるとファイルがスパースとして誤検出され(Linuxは1024のブロックサイズを使用)、コピー元から空のブロックをクリアしませんでした。ブロックデバイスへのスパースファイル。

これについては、初期のLinuxメーリングリストアーカイブで参照できます。

そのため、人々はddがディスクイメージを処理する正しい方法であることに慣れ、cpは途中で落ちました。また、ddは512のデフォルトブロックサイズを使用するため、低速です(最新のシステムのcpよりも遅い)。しかし、どのブロックサイズを使用すべきかは明らかではありません。おそらくあなたの場合、誰かが2048がCD-ROMの「自然な」ブロックサイズであると読んでいて(つまり、CD-ROMは2,048バイトのデータとエラー修正情報を含む2,352バイトのセクターに分割されています)、これを決定しましたは、ddで使用する「適切な」サイズです。実際には、(適度に)大きなブロックサイズを使用すると、おそらくより高速な結果が得られます。実際、GNU cpはこの理由で64kのデフォルトブロックサイズを使用します。

tl; dr: cp /dev/dvd foobar.iso正常に動作するはずです。のデフォルトのブロックサイズddは512です。ほとんどの現代の状況でそれをそのままにしておく唯一の効果は、コピープロセスを遅くすることです。


GNU cpはデフォルトで128kブロックサイズ(64kではない)を使用します。eklitzke.org/ efficient
file

5

ブロックサイズを変更することは、バッファリングされる量または一度に読み書きされる量を変更する良い方法です。

実際のブロックデバイスであるか、無限/仮想デバイスであるかは関係ありません。dd書き出す前にメモリにどれだけ保存したいかについてです。(一度に読み込むデータの量)と(一度に書き出すデータの量)のbs=両方を設定します。高いほど、宛先への書き込みを開始するのに十分なデータを取得する前に、より多くの反復が必要になります。ibs=obs=obs=ibs=dd

count=また、やりたいこと以外に依存していません。ジョブが完了したと見なすibs=ためddに必要な「ブロック」(で測定)の数を制御します。


注意スティーブンスポイントdd部分ブロックをコピーする-それは、常にではありませんbs * count
Dravスローン

一部のUNIXシステムでは、ネイティブブロックサイズの倍数を読み取る必要があることに注意してください。ブロックデバイスのcdromドライブから読み取る場合、それddなしbs=2048またはその倍数でエラーが発生します。
ウルテル

2

ブロックサイズオプションをdd有効にすると、出力I / Oサブシステムに書き戻す前に、入力I / Oサブシステムからメモリにコピーされるデータの量を効果的に指定します。出力は同じで(ディスク全体がコピーされるため)、チャンクは指定した異なるサイズで読み込まれます(ほとんどのdd実装では512バイトのデフォルトのブロックサイズが使用されます)。

大量のスペアメモリがあり、ブロックサイズを大きくすると、より大きなデータチャンクを連続して読み取り、バッファリングして出力先にフラッシュできます。ブロックサイズを小さくすると、個々のlseek、memsetなどの観点からより多くのオーバーヘッドが必要になります。

マイレージは、メモリが少ない場合if=などof=、設定されている場所、使用しているハードウェアによって異なります。


1

BSは=読み書きするためのブロックサイズを表します。フィールドをそのままにしておくか、フィールドを指定しないと、同じコピーの仕事をするように見えるかもしれませんが、それを使用することに隠された事実があります。例えば、

  • わずか1〜10 kbのファイルがそれぞれ1000000000000000個あります。
  • 10 GBの単一ファイルを持つ

最初のケースでは、より小さいブロックサイズを使用すると、コピー速度が向上することがわかりました。後者では、セクターサイズを増やしてsector changeコマンドの数を減らし、通常はより高速なI / O操作が可能になるため、ブロックサイズを大きくする方が適切なオプションです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.