Rng-tools

来自 ArchWiki
注意: 从内核 5.6 开始,不再需要 rng-tools,因为 /dev/random 不再阻塞。[1]

rng-tools 是一组与内核中随机数生成相关的实用程序。主要程序是 rngd,一个守护程序,旨在检查和从硬件设备向内核熵池馈送随机数据。

这主要用于增加内核中的熵量,以使 /dev/random 更快。默认情况下,/dev/random 非常慢,因为它仅从 设备驱动程序和其他(慢速)来源 收集熵。rngd 允许使用更快的熵源,主要是 硬件随机数生成器 (TRNG),它们存在于现代硬件中,例如 最新的 AMD/Intel 处理器Via Nano 甚至 Raspberry Pi

虽然 Linux 本身在 /dev/random 中使用 TRNG 的结果(如果可用),但它们仅用作 内核收集熵后的 XOR。因此,即使您有 TRNG,默认情况下 /dev/random 仍然很慢。rngd 直接馈送 /dev/random,从而大大增加可用熵。

安装

安装 rng-tools 软件包。启动启用 rngd.service

配置

配置文件位于 /etc/conf.d/rngd。只有一个选项,即 RNGD_OPTS,它是使用包含的 rngd.service 运行时要传递给守护程序的参数。默认参数("" 或空白)在大多数情况下都应该有效。

默认情况下,rngd 将尝试自动检测您的 TRNG 并使用它。据报告,这适用于 Raspberry Pi 和 Intel Ivy Bridge CPU,使用最新版本的 rng-tools。如果这不起作用,您可以手动传递 TRNG 使用的 设备文件,如下例所示

RNGD_OPTS="-r /dev/my_hw_random_device"
警告: 互联网上的一些教程建议对于没有 TRNG 的系统使用以下行
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