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

gol*_*lem 3 memory linux dd

考虑以下两个命令,它们都创建了一个 1KB 的哑文件

dd if=/dev/urandom of=test.file bs=1024 count=1

dd if=/dev/urandom of=test.file bs=1 count=1024
Run Code Online (Sandbox Code Playgroud)

第一个命令使用 1024 字节的块大小和 1 的块计数,第二个则相反。

我的猜测是没有区别,限制块大小是与 RAM 相关的问题:块大小不能大于可用内存。

当我想要或必须使用第一个案例而不是第二个案例时,是否有任何特殊情况?反之亦然?

G-M*_*ca' 9

正如您似乎基本理解的那样,第一个版本读取 1024 个字节,然后写入读取返回的字节数,而第二个版本读取和写入每个字节的 1024 次。复制普通文件时,较大的块大小(导致 I/O 数量较少)可能会稍微提高效率。这可能也是如此/dev/urandom

但是dd在特殊文件(即设备)上使用时需要小心。例如,

dd if= (任何输入)   of= (磁带设备)   bs=1024 count=1

将写入一个 1024 字节的磁带块; dd … bs=1 count=1024将写入 1024 个 1 个字节的块。这些不一样;由于记录间的间隙,1024 个小块将比一个大块在磁带上占用更多的空间,并且可能会导致读取磁带的问题。与您的问题更相关,如果您if=从 中读取 ( ) /dev/random,它将只返回尽可能多的高熵字节。因此,在第一个版本中,您获得的字节数可能少于 1024 个字节。但是,如果您尝试读取一个字节,并且熵池为空,则读取将阻塞(即等待)直到数据可用,因此第二个版本将保证为您提供 1024 个字节(尽管它可能需要任意很长一段时间)。

要放大有关磁带机的点:

dd if= (适当的输入)   of= (磁带设备)   bs=512 count=2

将写入两个 512 字节的磁带块。一个后续

dd if= (磁带设备)   of= (whatever)   bs=1024 count=1

可能只读取第一个块;即,前 512 个字节。

并且(命名的)管道可能会出现同样的问题/dev/random——大量读取将仅以可用字节形式返回;因此,在第一个版本中,您可能会得到少于 1024 个字节。但是,如果您尝试一次读取一个字节,读取将等到数据可用,因此第二个版本将保证为您提供 1024 个字节(或至少读取到 EOF)。