Cra*_*cks 3 random linux-kernel
我的系统(Linux 4.13.0-38-generic,16.04.1-Ubuntu,Intel® Celeron(R) CPU G3930 @ 2.90GHz × 2,主磁盘是 SSD)上的“熵创建”速度是不切实际的慢很多每秒小于 1 位。
注意:我用这个命令判断熵产生的速率:
watch -n1 cat /proc/sys/kernel/random/entropy_avail
Run Code Online (Sandbox Code Playgroud)
另一方面,底层 Linux CSPRNG 正在以每秒 187 Mb 的良好速度生成数据:
$ dd if=/dev/urandom of=/dev/null bs=1M count=1024 iflag=fullblock
1024+0 records in
1024+0 records out
1073741824 bytes (1.1 GB, 1.0 GiB) copied, 5.74347 s, 187 MB/s
Run Code Online (Sandbox Code Playgroud)
我安装了rng-tools. 它正在/dev/hwrng按预期工作和阅读:
% systemctl status rng-tools
? rng-tools.service
Loaded: loaded (/etc/init.d/rng-tools; bad; vendor preset: enabled)
Active: active (running) since Sat 2018-04-28 13:17:17 PDT; 33s ago
Docs: man:systemd-sysv-generator(8)
Process: 15840 ExecStop=/etc/init.d/rng-tools stop (code=exited, status=0/SUCC
Process: 23876 ExecStart=/etc/init.d/rng-tools start (code=exited, status=0/SU
CGroup: /system.slice/rng-tools.service
??23878 /usr/sbin/rngd -r /dev/hwrng
Run Code Online (Sandbox Code Playgroud)
但是,熵率几乎没有变化,仍然远低于每秒 1 位。
据推测,硬件 RNG 每秒产生的数据远远超过 1 位。那么为什么熵产生的速度没有显着增加呢?
我找到了答案。
该rnd-tools服务所调用的程序/usr/sbin/rngd。在Ubuntu 文档中查找它可以看到有一个参数:
-W n, --fill-watermark=nnn
一旦我们开始这样做,就向随机设备提供熵,直到 其熵池中至少有填充水印位的熵可用(默认值:2048)。将这个设置得太高会导致
rngd控制熵池的内容。低值会在熵饥饿期间损害系统性能。不要将fill-watermark设置 为高于熵池的大小(通常为 4096 位)。
所以我对“熵创造”率的测试只在缓冲区超过一半时进行,这就是它没有增加的原因。
使用此命令清空缓冲区很容易检查:
dd if=/dev/random of=/dev/null bs=256 count=1 iflag=fullblock
Run Code Online (Sandbox Code Playgroud)
这清除了 2048 位的熵,然后缓冲区在几分之一秒内返回到半满。