我读过许多描述如何使用 的指南和论坛帖子dd
,但我注意到的一件事是人们总是对bs=
,count=
和seek=
开关使用不同的值。
请有人能解释一下这些开关的确切作用(该man
页面不是很详细),并解释它们对于不同任务的最佳设置是什么,例如从 或 创建文件/dev/random
,/dev/zero
以及覆盖分区和外部驱动器。
答案1
我真的不知道如何比手册页更好地解释这一点。
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
既然您提到/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个盒子,他会拿一个他在盒子旁边找到的花瓶来加起来)。如果你只告诉dd
5count
个,并将其写在某个地方,他会复制他看到的前 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