彻底解决问题
--------增大/dev/random的熵池。问题的原因是由于熵池不够大,所以增大它是最彻底的方法。 通过 cat /proc/sys/kernel/random/entropy_avail
我们可以查看现在的熵池大小;我们需要找到一种方式来提高这个值就行了。如果你的CPU带有DRNG特性,可以充分利用硬件来提高熵池产生的速度 。通过 cat /proc/cpuinfo | grep rdrand
可以查看自己的CPU是否支持,一般来说Intel的Ivy_Bridge架构的CPU都支持(i3、i5需要注意是否采用该种架构,i7和xeon基本上都支持);AMD的CPU在2015年以后生成的都支持。(如果你是虚拟机需要开启额外的参数)。如果你的硬件不支持,也没有关系,我们可以让/dev/unrandom来做“熵源”。 以Centos7为例,
-
yum install rngd-tools
安装rngd服务(熵服务) -
systemctl start rngd
启动服务如果你的CPU不支持DRNG特性或者像我一样使用虚拟机,可以使用/dev/unrandom来模拟。
-
cp /usr/lib/systemd/system/rngd.service /etc/systemd/system
-
编辑
/etc/systemd/system/rngd.service
service小结,ExecStart=/sbin/rngd -f -r /dev/urandom
-
systemctl daemon-reload
重新载入服务 -
systemctl restart rngd
重启服务
经过上面的修改,我们再观察 /proc/sys/kernel/random/entropy_avail
基本上在3000左右。我们可以测试一下随机数的生成速度
-
watch -n 1 cat /proc/sys/kernel/random/entropy_avail
观察这个值 -
新打开一个shell,用dd命令测试随机数。
dd if=/dev/random of=random.dat count=40960
[root@localhost bin]# dd if=/dev/random of=random.dat count=40960 记录了0+40960 的读入 记录了6004+1 的写出 3074362字节(3.1 MB)已复制,5.01017 秒,614 kB/秒
5秒产生了40960个随机数,/proc/sys/kernel/random/entropy_avail会有剧烈的变化,所有随机数产生之后它又会保持在3000左右。