啟動時的系統日誌消息:未初始化的 urandom 讀取
CPU 為AMD GX-412TC SOC:
GX-412TC GE412TIYJ44JB 4 6W 2MB 1.0GHz/ 1.4GHz N/AN/A 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
syslog 中的消息來自以下兩個腳本:
/etc/rcS.d/S06urandom -> dd /etc/rcS.d/S07crypto-swap -> cryptsetup
應該
haveged
在開始之前urandom
?我正在使用 Debian 10。
另外,我應該補充一點,這台機器是一塊裸板,沒有鍵盤。唯一的介面是串列控制台。我認為這會對可用熵產生影響,這也是我
haveged
首先安裝的原因。沒有haveged
,sshd
守護程序將在幾分鐘內無法啟動,因為它沒有足夠的熵。
要讓 haveged 工作,它必須與您的核心兼容——在核心版本 >=5.x 中,haveged 沒有做任何事情是有問題的,看看haveged 是否仍然有用/相關?#57在 GitHub 上。
維護者很友好地重新引入了功能,但是必鬚髮布這些更新檔,然後首先將其放入各種發行版中……舊版本要麼根本無法啟動,要麼實際上不會做任何事情,即使它是執行(檢查
strace
),因為核心的熵池似乎不再缺少 - 但 crng init 由於某種原因仍然需要時間。它還必須在很早的時候執行,所以如果您使用的是 initramfs,那麼您還必須在使用隨機設備之前的一段時間內開始使用 initramfs。在傳統的 init 系統中,haveged 應該在
/proc
/sys
/dev
可用時立即執行。我不確定 hasged 需要多長時間才能將熵發送到核心……它必須首先自己收集隨機性,並且它也會對此進行一些質量測試。在我的最後一次測試中(使用已修補的 haveged),在啟動 haveged 和 kernel reporting 之間有大約半秒的延遲
random: crng init done
。除了 haveged,您還可以考慮保存/恢復隨機種子,如果您有網路,一點流量也可能有助於核心收集一些熵。
您的診斷是正確的:嘗試對空熵池進行讀取。這是“啟動時熵飢餓”。
如果您有 EFI 系統,您可以利用 systemd-boot,忽略警告(您使用的是可預測的加密,但在大多數案例中,這仍然比沒有加密要好),或者嘗試從其他來源記入熵 -如果可用- 將其添加到核心命令行
rng_core.default_quality=X
(從 X=1000 開始,從那裡往下走)。
還有其他收集熵的技術;SOC 可能有一些可用的引腳,並且有允許從它們收集熵的硬體驅動程序模組。然後只需連接一些合適的晶體管和電阻器設置(或在某些情況下,駐極體麥克風)以收集一些熱雜訊。
或者,5.4+ 系列核心具有更有效的熵收集,這可能就足夠了。