dd 命令中的“bs”、“count”和“seek”有什么区别?

Eri*_*ric 32 dd

我已经阅读了许多描述如何使用 的指南和论坛帖子dd,但我注意到的一件事是人们总是对bs=,count=seek=开关使用不同的值。

请有人解释这些开关的确切作用(手册页不是很详细),并解释它们对于不同任务的最佳设置,例如从 /dev/random 或 /dev/zero 创建文件,并覆盖分区和外部驱动器。

fro*_*utz 31

我真的不知道如何比手册页更好地解释这一点。

bs=设置块大小,例如bs=1M将是 1MiB 块大小。

count=仅复制此数量的块(默认情况下 dd 将永远继续运行或直到输入用完)。理想情况下,块是有bs=大小的,但可能存在不完整的读取,因此如果您使用count=它来复制特定数量的数据 ( count*bs),您还应该提供iflag=fullblock.

seek= 在输出中寻找此数量的块,而不是写入输出设备的最开头。

因此,例如,这会将价值 1MiB 的内容复制y\n到输出文件的 8MiB位置。所以总文件大小将为 9MiB。

$ yes | dd bs=1M count=1 seek=8 iflag=fullblock of=outputfile
$ ls -alh outputfile
9.0M Jun  3 21:02 outputfile
$ hexdump -C outputfile
00000000  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
*
00800000  79 0a 79 0a 79 0a 79 0a  79 0a 79 0a 79 0a 79 0a  |y.y.y.y.y.y.y.y.|
*
00900000
Run Code Online (Sandbox Code Playgroud)

既然你提到/dev/random并覆盖分区......这将永远需要,因为/dev/random(以及/dev/urandom)太慢了。您可以shred -v -n 1改为使用,速度很快,而且通常可以在任何地方使用。

  • 更准确地说,`count=N` 复制**至多** N 个块。如果输入是一个块,它不会重复该单个块 N 次。 (2认同)

Bra*_*iam 23

好吧,你说手册页不详细,所以我会用一个容易理解的比喻来解释他们的意思,这个比喻是一个移动的人(他的名字是dd):

   bs=BYTES
          read and write up to BYTES bytes at a time
Run Code Online (Sandbox Code Playgroud)

dd捡起某物(盒子、花瓶、床、大米​​等),将其移到需要放置的地方,然后将其放下。在他不放下重担之前,他不会选择其他任何东西。现在,当您需要准确地告诉他每次旅行应该挑选多少物品时,这就是该bs做的。您设置他将读取和写入的数据量。这在所有有用和常用的命令中几乎是强制性的。

   count=N
          copy only N input blocks
Run Code Online (Sandbox Code Playgroud)

这决定了他将移动的盒子总数。在此上下文中,框是磁盘上的块。你叫他搬5个箱子,他只搬5个箱子,超过5个箱子就搬5个箱子(如果少于5个箱子,他会拿箱子以外的花瓶加起来)。如果你告诉ddcount只有5,而它的地方写,他会复制第5个盖帽,他认为,写他们在那里你想要的。

   seek=N skip N obs-sized blocks at start of output
Run Code Online (Sandbox Code Playgroud)

这家伙通常会找到第一个可用的地方来放下负载,这通常是在(磁盘的)开始处,并继续填充直到结束。好吧,有了这个,你告诉你dd从更远的地方开始,而不是大厅,从更里面的一个房间开始。它只是“跳过”起点。

现在,根据您在做什么,您将需要基于源和目标的不同组合,以及它们将被读取和写入的格式。我建议您单独搜索它们。

  • “他会拿一个他在盒子旁边找到的花瓶来把它加起来”。这个比喻代表什么? (2认同)
  • @Ini 如果有一个不属于 if read 的相邻块,dd 将读取它并移动它。花瓶不是盒子,但 dd 会移动它。 (2认同)

bal*_*alu 5

到目前为止,这里还没有提到的一件重要的事情是,例如,dd bs=16G要求您至少有 16 GB 的可用 RAM。但是,如果不这样做,您可以使用较小的块大小bs(例如2G),然后通过设置counts为大于 1 的数字来进行多轮。(在这种情况下,8要实现[高达] 16 GB 的输出[取决于输入]。)

所以:

 bs x count = data size
2GB x   8   = 16GB
Run Code Online (Sandbox Code Playgroud)

  • 是否存在“最佳”块大小/计数组合,或者只要“blocksize < ram && blocksize*count = size_of_data”就没关系? (2认同)
  • @lucidbrot我不是专家,但我认为最优性(就性能而言)很大程度上取决于输入/输出设备的具体情况,这里没有一般答案。例如,如果源设备是 HDD,则块大小可能应该考虑在不移动磁头(即不会产生额外延迟)的情况下可以立即从 HDD 读取多少数据。显然,这还取决于所使用的文件系统以及源数据连续存储的程度(而不是分段/拆分)。 (2认同)