考虑以下两个命令,它们都创建了一个 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 相关的问题:块大小不能大于可用内存。
当我想要或必须使用第一个案例而不是第二个案例时,是否有任何特殊情况?反之亦然?
正如您似乎基本理解的那样,第一个版本读取 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)。
| 归档时间: |
|
| 查看次数: |
11647 次 |
| 最近记录: |