GNU/Linux >> Linux の 問題 >  >> Linux

/dev/random の dd でファイル サイズが異なるのはなぜですか?

dd の特異な動作の組み合わせを観察しています。 Linux の /dev/random の独特な振る舞いで .ちなみに、どちらも仕事に適したツールになることはめったにありません.

Linux の /dev/random 控えめにデータを返します。これは、疑似乱数ジェネレーターのエントロピーが非常に速い速度で消滅するという仮定に基づいています。新しいエントロピーの収集は遅いため、/dev/random 通常、一度に数バイトしか解放しません。

dd は、当初はテープ デバイス上で動作することを意図した、古くて厄介なプログラムです。 1kB の 1 ブロックを読み取るように指示すると、1 ブロックを読み取ろうとします。読み取りが 1024 バイト未満を返した場合は、それで十分です。つまり dd if=/dev/random bs=1K count=2 2 つの read(2) を作成します 呼び出します。 /dev/random から読んでいるので 、2 つの read 呼び出しは通常、使用可能なエントロピーに応じてさまざまな数のバイトを返します。 dd がデータのコピーに適している場合も参照してください。 (または、read() と write() が部分的な場合)

OS インストーラーまたはクローン作成者を設計している場合を除き、/dev/random を使用しないでください。 Linux では常に /dev/urandom . urandom man ページはやや誤解を招く可能性があります。 /dev/urandom 実際、長寿命の鍵を生成するためにさえ、暗号化に適しています。 /dev/urandom の唯一の制限 十分なエントロピーを提供する必要があるということです。 Linux ディストリビューションは通常、再起動の合間にエントロピーを保存するため、十分なエントロピーが得られないのは新規インストール時だけです。エントロピーは実際には減りません。詳細については、Is a rand from /dev/urandom secure for a login key? を参照してください。 /dev/random エントロピー プールを供給していますか?

dd のほとんどの用途 head などのツールでより適切に表現されます または tail . 2kB のランダム バイトが必要な場合は、実行します

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 .


man 4 random から RHEL 5 ボックス:

<ブロック引用>

読み取り時に、/dev/random デバイスは、エントロピー プール内の推定ノイズ ビット数内のランダム バイトのみを返します。

そのマシンでサイズが 213 バイトのファイルを取得します。男 4 ランダムに戻る:

<ブロック引用>

読み取られると、/dev/urandom デバイスは要求されたバイト数を返します。

dd if=/dev/urandom of=rand bs=1K count=2 を呼び出すたびに 2048 バイトを取得します

この違いは、 dd if=/dev/random ... の呼び出しの間にマシンが生成するエントロピーの量によるものだと結論付けています


なぜ dd は データをドロップしますか? ... ジル dd について、この魅力的な質問を投げかけました :
dd がデータのコピーに適しているのはいつですか? (または、read() と write() が部分的な場合)
以下はその質問の抜粋です:

* ... dd のせいにするのは難しくありません。たとえば、次のコードを試してください:**
yes | dd of=out bs=1024k count=10
出力ファイルのサイズを確認します (おそらく 10 MB をはるかに下回ります)。

私のコメント(質問の最後)は別として、このようなものは見るのが難しいです...ファイル $trnd であなたのバイトをキャッチします . bs=8 を半恣意的に選択しました

マウスを動かして、速度が上がるのを見てください。
コンピューターがアイドル状態 (AFK でネットワーク アクティビティなし) で、エントロピー プールを使い果たした後、2時間かかりました 12分 1192 だけを集める バイト、その時点でキャンセルしました。

その後、マウスを動かし続けたところ、1 とかなり短くなりました。 15 秒 同じバイト数を収集します。

これは、エントロピーの収集が CPU 速度ベースではなく、ランダム イベントであることを明確に示しています。 ベースであり、私の Ubuntu システムはマウスをその 重要 の 1 つとして使用します。 ランダム要因。

get=2048
trnd=/tmp/$USER.rnd; >"$trnd"
while (( $(wc -c <"$trnd") < $get )) ;do
    dd if=/dev/random bs=8 count=1 2>/dev/null >>"$trnd"
    echo -n "itt: $((i+=1))  ct: "; wc -c <"$trnd"
done
truncate -s $get "$trnd"
echo -e "\nfinal count: "; wc -c <"$trnd"

Linux
  1. / dev/randomを使用してLinuxでランダムパスワードを生成する方法

  2. Linuxは複数の連続したパスセパレーター(/ home //// username /// file)をどのように処理しますか?

  3. / dev / stdin、/ dev / stdout、および/ dev / stderrはどの程度移植可能ですか?

  1. Linux – / dev / urandomで「u」という文字は何を意味しますか?

  2. Linux の /dev/zero および /dev/null ファイルとは

  3. `cat /dev/urandom` が端末を破壊するのはなぜですか?

  1. Linux が NVMe ドライブを /dev/sda ではなく /dev/nvme0 としてリストするのはなぜですか?

  2. Linux:/dev/console 、 /dev/tty 、 /dev/tty0 の違い

  3. /dev/random に書き込んでも /dev/random からの並列読み取りが速くならないのはなぜですか?