我正在尝试理解该命令的输出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
是首选。