1KBのダムファイルを作成する次の2つのコマンドを考えてみましょう。
dd if=/dev/urandom of=test.file bs=1024 count=1
dd if=/dev/urandom of=test.file bs=1 count=1024
最初のコマンドはブロック サイズ 1024 バイトとブロック数 1 を使用し、2 番目のコマンドはその逆を使用します。
私の推測では、違いはなく、ブロック サイズの制限は RAM 関連の問題です。つまり、使用可能なメモリよりも大きいブロック サイズを持つことはできません。
2 番目のケースよりも 1 番目のケースを使用したい、または使用しなければならない特別なケースはありますか? またその逆はどうですか?
答え1
基本的に理解されているように、最初のバージョンでは 1024 バイトの読み取りを 1 回実行し、その後、読み取りから返されたバイト数を書き込みますが、2 番目のバージョンでは 1 バイトずつの読み取りと書き込みを 1024 回実行します。通常のファイルをコピーする場合、ブロック サイズが大きいほど (I/O の数が少なくなるため)、わずかに効率が良くなる可能性があります。これは、に/dev/urandom
も当てはまる可能性があります。
しかし、特殊なファイル(デバイスなど)で使用する場合は注意が必要ですdd
。例えば、
dd if=(どんな入力でも) の=(磁気テープ装置) bs=1024 カウント=1
は、1024 バイトのテープ ブロックを 1 つ書き込みます。 は、
dd … bs=1 count=1024
1 バイトずつのブロックを 1024 個書き込みます。 これらは同じではありません。レコード間のギャップがあるため、1024 個の小さなブロックは 1 つの大きなブロックよりもテープ上で多くのスペースを占め、テープの読み取りで問題が発生する可能性があります。 ご質問に関連して、if=
から ( )を読み取ると/dev/random
、使用可能な高エントロピー バイト数のみが返されます。 したがって、最初のバージョンでは、1024 バイト未満になる可能性があります。 ただし、1 バイトを読み取ろうとしたときにエントロピー プールが空の場合、読み取りはデータが使用可能になるまでブロック (つまり待機) されるため、2 番目のバージョンでは 1024 バイトが取得されることが保証されます (ただし、任意の長い時間がかかる場合があります)。
テープ ドライブに関する点を詳しく説明します。
dd if=(適切な入力) の=(磁気テープ装置) bs=512 カウント=2
512バイトのテープブロックを2つ書き込みます。その後
dd if=(磁気テープ装置) の=(何でも) bs=1024 カウント=1
最初のブロック、つまり最初の 512 バイトのみを読み取る可能性があります。
また、(名前付き) パイプでも同じ問題が発生する可能性があります/dev/random
。つまり、大きな読み取りでは、使用可能なバイト数のみが返されます。したがって、最初のバージョンでは、1024 バイト未満しか取得できない可能性があります。ただし、一度に 1 バイトずつ読み取ろうとすると、読み取りはデータが使用可能になるまで待機するため、2 番目のバージョンでは 1024 バイト (または少なくとも EOF まで読み取られる) が取得されることが保証されます。