当我请求更多时,为什么 dd 仅从 /dev/random 复制 128 个字节?

当我请求更多时,为什么 dd 仅从 /dev/random 复制 128 个字节?

我正在尝试理解该命令的输出dd。我试过

dd if=/dev/zero of=/dev/null bs=512 count=1

并得到(如预期的那样):

 1+0 records in
 1+0 records out
 512 bytes (512 B) copied, 2e-05 seconds, 26 MB/s

但是当我尝试

dd if=/dev/random of=/dev/null bs=512 count=1

我有

 0+1 records in
 0+1 records out
 128 bytes (128 B) copied, 0.00012 seconds, 1.1 MB/s

为什么只复制 128 个字节?

答案1

您需要使用/dev/urandom,或者“解锁”随机源。

/dev/random使用一种熵池来增加比特源的随机性。此方法将仅返回基于熵池当时状态可以返回的随机比特/字节数,因此如果使用硬件随机数生成器,这有时可能是一个常数。从Linux 手册页

生成器还会保留熵池中噪声位数的估计值。从该熵池中创建随机数。

只要您需要,该/dev/urandom文件就会继续按原样重复使用内部池来生成数字。这样做的副作用是: 请勿用于/dev/urandom加密目的,因为它的随机性不如 产生的位/dev/random。有关详细信息,请参阅上面的联机帮助页链接。

答案2

由于读取/dev/random仅返回字节数可用,您必须指定块大小1在您的示例中,您将块大小设置为 512,但在第一次读取后失败。

因此,读取精确 512 字节的正确参数是:

dd if=/dev/random of=filename bs=1 count=512

请注意,命令将阻塞,直到系统中有足够的熵来生成所有数据。这就是/dev/random工作原理。如果您不想等待并且对较少的熵感到满意,请使用/dev/urandom。在绝大多数情况下,使用/dev/urandom是首选。

相关内容