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


24

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

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


尝试使用ddPOSIX版本GNU文档
jw013 2014年

Answers:


27

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

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,它很快并且通常可以在任何地方使用。


21

好的,您说手册页没有详细说明,所以我将用易于理解的隐喻来解释它们的含义,这些隐喻是关于一个动人的家伙(它的名称为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个,他会带一个他在箱子旁边找到的花瓶加起来)。如果你告诉ddcount只有5,而它的地方写,他会复制第5个盖帽,他认为和你想让他们写。

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

通常,拉手会找到第一个放置负载的可用位置,该位置通常在(磁盘的)开始处,然后继续填充直到结束。好吧,这样您就告诉dd要进一步开始,比如说要代替大厅,从更远的房间之一开始。它只是“跳过”起始块。

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


“他会拿起在盒子旁边找到的花瓶来添加它”。这个比喻代表什么?
伊尼

1
@Ini如果有一个相邻的块不属于if读取,则dd也会读取并移动它。花瓶不是盒子,但dd会移动它。
Braiam '18
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.