我正在尝试了解 Linux 内核参数/proc/sys/kernel/random/
,但遇到了一些麻烦。您能帮我解决一些问题吗?
- 该参数有何
boot_id
用途?我只找到了它在启动时生成的信息,但我找不到原因。 - 我知道熵池大小是恒定的(4096 位),无法更改。为什么这个数字这么小?难道不能是 1048576 或更多吗?也许拥有许多可用的熵位并不好?
- 它与第二个问题类似,但与
entropy_avail
参数有关——不填满整个熵池的目的是什么?当我检查参数时,它在 1000 位左右波动,但池大小为 4096。当entropy_avail
达到中设置的阈值时write_wakeup_threshold
,它会下降一点(通常为 100),然后再次上升到write_wakeup_threshold
参数中指定的点。那么为什么我们需要这个 4096 的熵池大小呢? read_wakeup_threshold
我有什么理由要增加或减少和参数的值吗write_wakeup_threshold
?第一个只是让需要从设备获取熵的进程休眠/dev/random
,但是当我将其设置为 64、128 或 256 时有什么区别?它只是挂起的时间稍长一些,或者可能还有其他原因?
答案1
启动 ID 参数实际上与熵统计无关。它只是唯一地标识当前启动,如果你想知道计算机是否已重新启动或发生其他情况,这很有用。
熵池以一种实现定义的方式存储随机数据,这种方式被设计为黑匣子。一般来说,如果您依赖于熵源,那么拥有尽可能多的熵位是很好的;然而,拥有太多的熵位是浪费。如果您的服务器进行大量加密(例如生成 TLS 会话密钥,或频繁生成 RSA 密钥甚至安全令牌)或出于其他原因一直需要强随机数,那么您需要大量的熵,甚至有些设备可以发出千兆比特的熵流(来自物理源)。
通常可以通过将新大小回显到池大小文件中来更改池大小。内核将存储从各种来源获取的熵(相对事件计时是一种常用方式),以及从输入获取的熵/dev/random
(通过RNDADDENTROPY
ioctl;仅写入该设备会更改数据但不会增加名义上的熵位)。如果您有一个未充分利用的硬件熵源,您确实希望此参数不是无限的。
写入唤醒阈值很少使用,但对于排序很有用;它提供的性能增益应该很小。它的作用是当池变低时唤醒阻塞的设备以写入熵池(即,将使用上述 ioctl 向池中添加熵的源)。显然,它不一定会产生增加熵的效果。
读取唤醒阈值相反;这是我们允许从中读取任何内容之前需要可用的熵位数(即 entropy_avail 中指示的数字)/dev/random
。 /dev/urandom
忽略此参数(因为从中读取是非阻塞的并且不等待熵,而是允许读取伪随机数据)。