web-dev-qa-db-ja.com

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

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

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

バイトサイズを指定する必要があるのはなぜですか?実際、2048は CDROMイメージの標準バイトサイズ ですが、bs=またはcount=を指定せずにddも機能するようです。

有限サイズのデバイスからコピーするときにnotbs=またはcount=を指定することが問題になるのはどのような状況ですか?

15
dotancohen

ddがデータのコピーに適しているのはいつですか(または、read()とwrite()が部分的である場合) は、countを使用する際の重要な注意事項を指摘します:dd can部分的なブロックをコピーするので、countを指定すると、一部のブロックが不完全であっても、指定した数のブロックの後で停止します。したがって、bs * countを指定しない限り、コピーされるのはiflag=fullblockバイト未満になる可能性があります。

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

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

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

データの回復に関する限り、ブロックサイズを小さくすると、障害が発生したハードディスクからより多くのデータを取得できます。これはdd-rescueなどのプログラムが自動的に行うことです。最初に大きなブロックを読み取りますが、ブロックが失敗した場合は、より小さなブロックサイズで再度読み取ります。 ddはこれを実行せず、ブロック全体が失敗するだけです。

13
Stephen Kitt

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です。それをそのままにしておくと、現代のほとんどの状況で唯一の影響は、コピープロセスを遅くすることです。

6
Random832

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

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

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

5
Bratchley

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

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

走行距離は、場所によって異なりますif=およびof=が設定されており、メモリが少ない場合など、どのハードウェアを使用しているかなどが示されます。

2
Drav Sloan

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

  • それぞれが1〜10 kbの1000000000000000ファイル。
  • 10 GBの単一ファイル

最初のケースでは、より低いブロックサイズを使用すると、コピー速度が向上することがわかっています。後者の場合は、ブロックサイズが大きいほど、セクタサイズが大きくなり、sector changeコマンドの数が少なくなるため、通常、I/O操作が高速になります。

1
Snazzy Sanoj