我已经阅读了许多描述如何使用 的指南和论坛帖子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
改为使用,速度很快,而且通常可以在任何地方使用。
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个箱子,他会拿箱子以外的花瓶加起来)。如果你告诉dd
到count
只有5,而它的地方写,他会复制第5个盖帽,他认为,写他们在那里你想要的。
seek=N skip N obs-sized blocks at start of output
Run Code Online (Sandbox Code Playgroud)
这家伙通常会找到第一个可用的地方来放下负载,这通常是在(磁盘的)开始处,并继续填充直到结束。好吧,有了这个,你告诉你dd
从更远的地方开始,而不是大厅,从更里面的一个房间开始。它只是“跳过”起点。
现在,根据您在做什么,您将需要基于源和目标的不同组合,以及它们将被读取和写入的格式。我建议您单独搜索它们。
到目前为止,这里还没有提到的一件重要的事情是,例如,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)
归档时间: |
|
查看次数: |
75346 次 |
最近记录: |