中央处理器是AMD GX-412TC SOC:
GX-412TC GE412TIYJ44JB 4 6W 2MB 1.0GHz/ 1.4GHz 不适用 DDR-1333 0-90°C
其中没有rdrand
:
grep rdrand /proc/cpuinfo
# nothing
syslog
我在机器启动后看到以下消息:
kernel: random: dd: uninitialized urandom read (512 bytes read)
kernel: random: cryptsetup: uninitialized urandom read (32 bytes read)
这些消息到底意味着什么?我能做什么?
这是否意味着dd
并cryptsetup
尝试读取/dev/urandom
,但没有足够的熵?
我正在使用haveged
守护程序,但它是在引导过程后期启动的,在出现此消息之后。
这是我的引导脚本启动顺序:
/etc/rcS.d/S01hostname.sh
/etc/rcS.d/S01mountkernfs.sh
/etc/rcS.d/S02mountdevsubfs.sh
/etc/rcS.d/S03checkroot.sh
/etc/rcS.d/S04checkfs.sh
/etc/rcS.d/S05mountall.sh
/etc/rcS.d/S06bootmisc.sh
/etc/rcS.d/S06procps
/etc/rcS.d/S06urandom
/etc/rcS.d/S07crypto-swap
/etc/rc2.d/S01haveged
/etc/rc2.d/S01networking
/etc/rc2.d/S04rsyslog
/etc/rc2.d/S05cron
/etc/rc2.d/S05ssh
系统日志中的消息来自这两个脚本:
/etc/rcS.d/S06urandom -> dd
/etc/rcS.d/S07crypto-swap -> cryptsetup
应该haveged
先开始urandom
?
我使用的是 Debian 10。
另外,我应该补充一点,这台机器是裸板,没有键盘。唯一的接口是串行控制台。我认为这会对可用熵产生影响,这也是我haveged
首先安装的原因。如果没有haveged
,sshd
守护进程将在几分钟内不会启动,因为它没有足够的熵。
答案1
您的诊断是正确的:尝试在空熵池上进行读取。这是 ”启动时间熵饥饿”。
如果您有 EFI 系统,您可以利用 systemd-boot,忽略警告(您使用的是可预测的加密货币,但是在最多仍然比没有加密更好的用例),或者尝试从其他来源记入熵 -如果可供使用的话- 将其添加到内核命令行
rng_core.default_quality=X
(从 X=1000 开始,然后从那里向下)。
还有其他收集熵的技术; SOC 可能有一些可用的引脚,并且有硬件驱动程序模块允许从它们收集熵。然后只需连接一些合适的晶体管和电阻器设置(或在某些情况下,驻极体麦克风)即可收集一些热噪声。
或者,5.4+ 系列内核具有更有效的熵收集,这可能就足够了。
答案2
为了让 hasged 工作,它必须与你的内核兼容——有一个问题,haveged 在 >=5.x 的内核版本中不执行任何操作,请参阅哈格德仍然有用/相关吗?第57章在 GitHub 上。
维护者很友善地重新引入了功能,但必须发布这些补丁,然后首先将其放入各个发行版中......旧版本要么根本无法启动,要么实际上不会做任何事情,即使它是正在运行(使用 进行检查strace
),因为内核的熵池似乎不再缺乏 - 但由于某种原因 crng init 仍然需要时间。
它还必须很早就运行,因此如果您正在使用 initramfs,那么您还必须在使用随机设备之前一段时间在 initramfs 中开始运行。在传统的 init 系统中,haveged 应该在/proc
/sys
/dev
可用时立即运行。
我不确定 haveged 到底需要多长时间才能将熵发送到内核......它必须首先自己收获随机性,并且它也对此运行一些质量测试。在我的上一次测试中(使用修补后的haveged),启动haveged和内核报告之间有大约半秒的延迟random: crng init done
。
除了 haged 之外,您还可以考虑保存/恢复随机种子,如果您有网络,一点流量也可能有助于内核收集一些熵。