Ubuntuシステムで次のコマンドを実行します。
dd if=/dev/random of=rand bs=1K count=2
ただし、実行するたびに異なるサイズのファイルが表示されます。なぜこれですか?任意のデータで埋められた特定のサイズのファイルを生成する方法は?
ベストアンサー1
あなたが観察している特別な行動はdd
Linuxの特別な行動の組み合わせです/dev/random
。ちなみに、どちらも作業に適したツールではありません。
Linuxは/dev/random
データをほとんど返しません。これは、擬似乱数発生器のエントロピーが非常に急速に消えるという仮定に基づいている。新しいエントロピーはゆっくりと収集されるため、/dev/random
通常は一度に数バイトしか提供されません。
dd
オリジナルのテープデバイスで動作するように設計された古くて気まぐれなプログラムです。 1kBブロックを読み取るように指示すると、ブロックを読み取ろうとします。読み取りで1024バイト未満を返すと、それはすべてです。だから二度電話をdd if=/dev/random bs=1K count=2
かけました。read(2)
から読み取るため、/dev/random
これら2つのread
呼び出しは通常、利用可能なエントロピーに依存する数バイトだけを返します。また、見ることができますddはいつデータのコピーに適していますか? (またはread()とwrite()が部分的な場合)
オペレーティングシステムのインストーラやレプリケーションプログラムを設計しない限り、/dev/random
Linuxでは絶対に使用しないでください/dev/urandom
。マニュアルurandom
ページは少し誤解を招く場合があります。/dev/urandom
実際には暗号化に機能し、長期鍵を生成することもできます。唯一の制限/dev/urandom
は、十分なエントロピーを提供する必要があることです。 Linuxディストリビューションは通常、再起動の間にエントロピーを保存するため、新しくインストールした場合にのみエントロピーが不足する可能性があります。実際、エントロピーは決して消えません。もっと情報が欲しいなら読んでください/dev/urandomのrandはログインキーにとって安全ですか?そしてフィード/dev/ランダムエントロピープール?。
のほとんどの用途は のdd
ようなツールでよりよく表現できます。 2kBのランダムバイトが必要な場合は、次を実行します。head
tail
head -c 2k </dev/urandom >rand
以前のLinuxカーネルを使用すると、外れることがあります。
dd if=/dev/urandom of=rand bs=1k count=2
/dev/urandom
要求された数のバイトを返すのが良いからです。しかし、カーネル3.16からはもうそうではありません。これで32MBに制限されます。。
通常、固定数のバイトを抽出し、そのdd
入力が通常のファイルまたはブロックデバイスから出ていない場合は、バイト単位で読み取る必要がありますdd bs=1 count=2048
。