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

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

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

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

答案1

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

bs=设置块大小,例如bs=1M1MiB 块大小。

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

既然您提到/dev/random并覆盖分区...它将永远花费时间,因为/dev/random(以及/dev/urandom)太慢了。您可以直接使用shred -v -n 1它,速度很快并且通常可以在任何地方使用。

答案2

好吧,你说手册页不详细,所以我将用一个易于理解的关于移动家伙的比喻来解释它们的含义(他的名字是dd):

   bs=BYTES
          read and write up to BYTES bytes at a time

dd捡起一些东西(盒子、花瓶、床、大米​​等),移动到需要的地方然后放下。在他没有放下盒子里的物品之前,他不会选择其他任何东西,这意味着:另一个装有另一堆物品的盒子。

现在,当您需要准确地告诉他每次行程要向盒子中装载多少物体时,这就是要做的事情bs。您设置他将读取和写入的数据量。这在所有有用和常见的命令中几乎是强制性的。

   count=N
          copy only N input blocks

这决定了他将移动的盒子总数。在这种情况下,盒子是磁盘上的块。你让他搬5个盒子,即使多于5个盒子,他也只搬5个盒子(如果少于5个盒子,他会拿一个他在盒子旁边找到的花瓶来加起来)。如果你只告诉dd5count个,并将其写在某个地方,他会复制他看到的前 5 个块,并将它们写在你想要的地方。

   seek=N skip N obs-sized blocks at start of output

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

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

答案3

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

所以:

 bs x count = data size
2GB x   8   = 16GB

相关内容