Rng-tools
/dev/random 不再会阻塞。[1]该 rng-tools 是一组与内核中随机数生成相关的实用工具。主程序是 rngd,一个旨在检查来自硬件设备到内核熵池的随机数据并为其提供数据的守护进程。
这主要有助于增加内核中的熵数量,从而使 /dev/random 运行得更快。默认情况下,/dev/random 非常慢,因为它只从 设备驱动程序和其他(缓慢的)源收集熵。rngd 允许使用更快的熵源,主要是现代硬件中存在的 硬件随机数生成器(TRNG),例如 最近的 AMD/Intel 处理器、Via Nano 甚至 Raspberry Pi。
虽然 Linux 本身会使用 TRNG 在 /dev/random 中的结果(如果可用),但它们仅在 内核收集熵后的 XOR 中使用。因此,即使您拥有 TRNG,/dev/random 默认情况下仍然很慢。rngd 会自己向 /dev/random 提供数据,极大地增加了可用熵。
安装
安装 rng-tools 包。启动并启用 rngd.service。
配置
配置文件位于 /etc/conf.d/rngd。不过只有一个选项,那就是 RNGD_OPTS,即在通过包含的 rngd.service 运行守护进程时要传递给它的参数。默认参数("",即空白)在大多数情况下都应该有效。
默认情况下,rngd 会尝试自动检测您的 TRNG 并使用它。据报道,对于使用最新版本 rng-tools 的 Raspberry Pi 和 Intel Ivy Bridge CPU,此功能有效。如果不起作用,您可能需要手动传递 TRNG 使用的 设备文件,如下例所示。
RNGD_OPTS="-r /dev/my_hw_random_device"
RNGD_OPTS="-o /dev/random -r /dev/urandom"当然,这是一个非常糟糕的主意,因为您只是用来自内核本身的熵来填充内核熵池!如果您的系统没有可用的 TRNG,请考虑改用 haveged。有关详细信息,请参阅 FS#34580。
默认情况下,rngd 会填充熵池,直到至少有 2048 位熵可用。这是为了避免 TRNG 主导池的内容。如果您真的信任您的 TRNG,可以覆盖此设置。为此,请将 "--fill-watermark=4096" 传递给 RNGD_OPTS,例如(4096 是内核熵池的默认最大大小,您也不应传递大于最大值的值)。这样做可能会进一步提高 /dev/random 的性能,但可能会降低随机数质量。但是,值得注意的是,默认设置对于大多数用户场景已经足够了。
测试和使用
您可以在启用其服务之前通过运行以下命令来测试 rngd 是否正常工作:
# rngd -f
一个简单的测试,用于查看一切是否按预期工作,是在(另一个终端)中运行以下 dd 命令:
$ dd if=/dev/random of=/dev/null bs=1024 count=1 iflag=fullblock
没有 rngd,上述命令将花费大量时间运行。如果 rngd 工作正常,结果应该几乎是瞬时的。
1+0 records in 1+0 records out 1024 bytes (1.0 kB, 1.0 KiB) copied, 0.0199623 s, 51.3 kB/s
dd 输出中的速度大约50 kB/s 表明一切正常。作为比较,没有 rngd,您可能会得到 0.0 kB/s(因为速度太低)。
另一个有趣的测试是运行 rngtest,以使用 FIPS 140-2 测试来检查数据。
$ rngtest -c 1000 </dev/random
rngtest 5 Copyright (c) 2004 by Henrique de Moraes Holschuh This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. rngtest: starting FIPS tests... rngtest: bits received from input: 20000032 rngtest: FIPS 140-2 successes: 999 rngtest: FIPS 140-2 failures: 1 rngtest: FIPS 140-2(2001-10-10) Monobit: 1 rngtest: FIPS 140-2(2001-10-10) Poker: 0 rngtest: FIPS 140-2(2001-10-10) Runs: 0 rngtest: FIPS 140-2(2001-10-10) Long run: 0 rngtest: FIPS 140-2(2001-10-10) Continuous run: 0 rngtest: input channel speed: (min=301.394; avg=417.091; max=693.187)Kibits/s rngtest: FIPS tests speed: (min=64.656; avg=91.010; max=123.055)Mibits/s rngtest: Program run time: 47037492 microseconds
在 1000 次测试中有少量测试失败对于任何随机数生成器来说都是正常的,但是如果失败次数过多(例如 10 次),则可能存在问题。
之后,您可以启动/启用 rngd.service。