考虑以下两个命令,它们都创建一个 1KB 大小的哑文件
dd if=/dev/urandom of=test.file bs=1024 count=1
dd if=/dev/urandom of=test.file bs=1 count=1024
第一个命令使用 1024 字节的块大小和 1 的块数,第二个命令则相反。
我的猜测是没有区别,限制块大小是一个与 RAM 相关的问题:块大小不能大于可用内存。
是否存在特殊情况,我需要或必须使用第一种情况而不是第二种情况?反之亦然?
答案1
您似乎基本上明白了,第一个版本读取 1024 个字节,然后写入从读取中返回的任意数量的字节,而第二个版本读取和写入 1024 个字节。复制普通文件时,较大的块大小(导致 I/O 数量较少)可能稍微更有效率。这可能/dev/urandom
也是如此。
但在特殊文件(即设备)上使用时需要小心dd
。例如,
dd 如果=(无论输入什么) 的=(磁带设备) bs=1024 计数=1
将写入一个 1024 字节的磁带块;
dd … bs=1 count=1024
将写入 1024 个每个 1 字节的块。 它们是不一样的; 由于记录间间隙,1024 个小块将比一个大块占用更多的磁带空间,并且可能会导致读取磁带时出现问题。 与您的问题更相关的是,如果您if=
从 读取()/dev/random
,它将只返回可用的高熵字节数。 因此,在第一个版本中,您可能会获得少于 1024 个字节。 但是,如果您尝试读取一个字节,并且熵池为空,则读取将阻塞(即等待)直到数据可用,因此第二个版本可以保证为您提供 1024 个字节(尽管这可能需要任意长的时间)。
详细阐述一下有关磁带驱动器的观点:
dd 如果=(适当输入) 的=(磁带设备) bs=512 计数=2
将写入两个 512 字节的磁带块。后续
dd 如果=(磁带设备) 的=(任何) bs=1024 计数=1
可能只读取第一个块;即前 512 个字节。
并且(命名)管道可能会出现同样的问题/dev/random
——大量读取将仅返回可用的字节;因此,在第一个版本中,您可能会获得少于 1024 个字节。但是,如果您尝试一次读取一个字节,则读取将等到数据可用,因此第二个版本将保证为您提供 1024 个字节(或至少读取到 EOF)。