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


10

我正在尝试了解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个字节?


superuser.com/questions/359599/...为的/ dev / random和urandom的一个更完整的讨论
BobT

Answers:


8

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

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

生成器还保持熵池中噪声位数的估计。根据该熵池,创建随机数。

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



3

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

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

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

注意该命令将阻塞,直到系统中有足够的熵来生成所有数据为止。就是这样/dev/random。如果您不想等待,并且熵较小,则可以使用/dev/urandom。在绝大多数情况下/dev/urandom,首选使用。


解释为+1,尽管应该说字节计数高达512使用/dev/random实际上变得不可用,因为该命令可能要花很长时间才能完成。同样,即使bs=512 count=1似乎没有字节可用,调用似乎仍然会阻塞,对吗?切换和值的一种替代方法是使用; 即。bscountiflag=fullblockbs=512 count=1 iflag=fullblock
mklement0'2

恕我直言,这个答案应该合并到@Breakthrough的答案中。(这是我的问题的答案,而突破性的不是)。
superbob
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.