エントロピーは /dev/{,u}random
によって失われるだけではありません 、カーネルもいくらかかかります。たとえば、新しいプロセスにはランダム化されたアドレス (ASLR) があり、ネットワーク パケットにはランダムなシーケンス番号が必要です。ファイルシステム モジュールでさえ、一部のエントロピーを削除する場合があります。 drivers/char/random.c のコメントを参照してください。 entropy_avail
にも注意してください 出力プールではなく、入力プールを参照します (基本的に非ブロッキング /dev/urandom
およびブロッキング /dev/random
).
エントロピー プールを監視する必要がある場合は、watch cat
を使用しないでください。 、これは cat
の呼び出しごとにエントロピーを消費します .過去に、GPG はキーの生成が非常に遅かったため、このプールも監視したかったため、エントロピー プールを監視することのみを目的とした C プログラムを作成しました:https://git.lekensteyn.nl/c-files/tree /entropy-watcher.c.
エントロピーも消費するバックグラウンド プロセスが存在する可能性があることに注意してください。適切なカーネルでトレースポイントを使用すると、エントロピー プールを変更するプロセスを確認できます。コールチェーン (-g
を含むランダム サブシステムに関連するすべてのトレースポイントを記録する使用例 ) すべての CPU (-a
) ) 1 秒後に測定を開始し、それ自体のプロセスを無視します (-D 1000
) およびタイムスタンプ (-T
を含む) ):
sudo perf record -e random:\* -g -a -D 1000 -T sleep 60
これらのコマンドのいずれかで読み取ります (perf.data
の所有者を変更します) 必要に応じて):
perf report # opens an interactive overview
perf script # outputs events after each other with traces
perf script
出力は興味深い洞察を提供し、約 8 バイト (64 ビット) のエントロピーが私のマシンで定期的に排出される時期を示しています:
kworker/0:2 193 [000] 3292.235908: random:extract_entropy: ffffffff8173e956 pool: nbytes 8 entropy_count 921 caller _xfer_secondary_pool 5eb857 extract_entropy (/lib/modules/4.6.2-1-ARCH/build/vmlinux) 5eb984 _xfer_secondary_pool (/lib/modules/4.6.2-1-ARCH/build/vmlinux) 5ebae6 push_to_pool (/lib/modules/4.6.2-1-ARCH/build/vmlinux) 293a05 process_one_work (/lib/modules/4.6.2-1-ARCH/build/vmlinux) 293ce8 worker_thread (/lib/modules/4.6.2-1-ARCH/build/vmlinux) 299998 kthread (/lib/modules/4.6.2-1-ARCH/build/vmlinux) 7c7482 ret_from_fork (/lib/modules/4.6.2-1-ARCH/build/vmlinux) kworker/0:2 193 [000] 3292.235911: random:debit_entropy: ffffffff8173e956: debit_bits 64 5eb3e8 account.part.12 (/lib/modules/4.6.2-1-ARCH/build/vmlinux) 5eb770 extract_entropy (/lib/modules/4.6.2-1-ARCH/build/vmlinux) 5eb984 _xfer_secondary_pool (/lib/modules/4.6.2-1-ARCH/build/vmlinux) 5ebae6 push_to_pool (/lib/modules/4.6.2-1-ARCH/build/vmlinux) 293a05 process_one_work (/lib/modules/4.6.2-1-ARCH/build/vmlinux) 293ce8 worker_thread (/lib/modules/4.6.2-1-ARCH/build/vmlinux) 299998 kthread (/lib/modules/4.6.2-1-ARCH/build/vmlinux) 7c7482 ret_from_fork (/lib/modules/4.6.2-1-ARCH/build/vmlinux) ... swapper 0 [002] 3292.507720: random:credit_entropy_bits: ffffffff8173e956 pool: bits 2 entropy_count 859 entropy_total 2 caller add_interrupt_randomness 5eaab6 credit_entropy_bits (/lib/modules/4.6.2-1-ARCH/build/vmlinux) 5ec644 add_interrupt_randomness (/lib/modules/4.6.2-1-ARCH/build/vmlinux) 2d5729 handle_irq_event_percpu (/lib/modules/4.6.2-1-ARCH/build/vmlinux) 2d58b9 handle_irq_event (/lib/modules/4.6.2-1-ARCH/build/vmlinux) 2d8d1b handle_edge_irq (/lib/modules/4.6.2-1-ARCH/build/vmlinux) 230e6a handle_irq (/lib/modules/4.6.2-1-ARCH/build/vmlinux) 7c9abb do_IRQ (/lib/modules/4.6.2-1-ARCH/build/vmlinux) 7c7bc2 ret_from_intr (/lib/modules/4.6.2-1-ARCH/build/vmlinux) 6756c7 cpuidle_enter (/lib/modules/4.6.2-1-ARCH/build/vmlinux) 2bd9fa call_cpuidle (/lib/modules/4.6.2-1-ARCH/build/vmlinux) 2bde18 cpu_startup_entry (/lib/modules/4.6.2-1-ARCH/build/vmlinux) 2510e5 start_secondary (/lib/modules/4.6.2-1-ARCH/build/vmlinux)
どうやらこれは、エントロピーを入力プールから出力プールに転送することで、エントロピーの浪費を防ぐために発生するようです:
/*
* Credit (or debit) the entropy store with n bits of entropy.
* Use credit_entropy_bits_safe() if the value comes from userspace
* or otherwise should be checked for extreme values.
*/
static void credit_entropy_bits(struct entropy_store *r, int nbits)
{
...
/* If the input pool is getting full, send some
* entropy to the two output pools, flipping back and
* forth between them, until the output pools are 75%
* full.
*/
...
schedule_work(&last->push_work);
}
/*
* Used as a workqueue function so that when the input pool is getting
* full, we can "spill over" some entropy to the output pools. That
* way the output pools can store some of the excess entropy instead
* of letting it go to waste.
*/
static void push_to_pool(struct work_struct *work)
{
...
}
lsof /dev/random
を監視するのに最適なツールではありません プロセスによる読み取りが非常にで終了するため 短い時間。どのプロセスが読み取りを行っているかを取得する良い方法はわかりませんが、 inotify
を使用します 次の場合を監視できます 読み取りがあります。
基本的に 2 つの方法があります:
<オール>N 秒後に概要を取得:
inotifywatch -v -t 60 /dev/random
ライブを見る イベントへのアクセス:
inotifywait -m --timefmt '%H:%M:%S' --format '%T: %e' /dev/random
どちらもプロセスを提供せず、後者は読み取りサイズを提供しません。 1 つ目は次のような要約を提供します:
total access close_nowrite open filename
18 16 1 1 /dev/random
あなたがそれを実行していて、 dd if=/dev/random of=/tmp/foo bs=1 count=3
を実行した場合
とにかく。これは、カーネルがプールから消費するときにティックを与えません。
を使用してエントロピーの状態を確認する場合
watch cat /proc/sys/kernel/random/entropy_avail
cat
ごとに最適なアイデアではありません エントロピーを消費します。 (これについても言及している別の回答がポップアップ表示されていることがわかりました。)これにはいくつかのCコードもあり、昨日それを見つけようとしました。見つけて後で回答を更新できるかどうかを確認します。