Linux 打算合併 /dev/random 與 /dev/urandom 遇到的問題
在 Hacker News 上看到「 Problems emerge for a unified /dev/*random (lwn.net)」的,原文是「 Problems emerge for a unified /dev/*random」(付費內容,但是可以透過 Hacker News 上的連結直接看)。
標題提到的兩個 device 的性質會需要一些背景知識,可以參考維基百科上面「 /dev/random」這篇的說明,兩個都是 CSPRNG,主要的分別在於 /dev/urandom
通常不會 block:
The
/dev/urandom
device typically was never a blocking device, even if the pseudorandom number generator seed was not fully initialized with entropy since boot.
而 /dev/random
不保證不會 block,有可能會因為 entropy 不夠而卡住:
/dev/random
typically blocked if there was less entropy available than requested; more recently (see below, different OS's differ) it usually blocks at startup until sufficient entropy has been gathered, then unblocks permanently.
然後順便講一下,因為這是 crypto 相關的設計修改,加上是 kernel level 的界面,安全性以及相容性都會是很在意的點,而 Hacker News 上的討論裡面很多是不太在意這些的,你會看到很多「很有趣」的想法在上面討論 XDDD
回到原來的文章,Jason A. Donenfeld (Linux kernel 裡 RNG maintainer 之一,不過近期比較知名的事情還是 WireGuard 的發明人) 最近不斷的在改善 Linux kernel 裡面這塊架構,這次打算直接拿 /dev/random
換掉 /dev/urandom
:「 Uniting the Linux random-number devices」。
不過換完後 Google 的 Guenter Roeck 就在抱怨在 QEMU 環境裡面炸掉了:
This patch (or a later version of it) made it into mainline and causes a large number of qemu boot test failures for various architectures (arm, m68k, microblaze, sparc32, xtensa are the ones I observed). Common denominator is that boot hangs at "Saving random seed:". A sample bisect log is attached. Reverting this patch fixes the problem.
他透過 git bisect 找到發生問題的 commit,另外從卡住的訊息也可以大概猜到在虛擬機下 entropy 不太夠。
另外從他們三個 (加上 Linus) 在 mailing list 上面討論的訊息可以看到不少交流:「 Re: [PATCH v1] random: block in /dev/urandom」,包括嘗試「餵」entropy 進 /dev/urandom
的 code...
後續看起來還會有一些嘗試,但短期內看起來應該還是會先分開...