dd 的命令选项 bs=1024 count=1 和 bs=1 count=1024 有什么区别

dd 的命令选项 bs=1024 count=1 和 bs=1 count=1024 有什么区别

考虑以下两个命令,它们都创建一个 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)。

相关内容