dd 的 bs 和 count 设置何时错误?

dd 的 bs 和 count 设置何时错误?

(我说的错误是指“会破坏事物”。)

假设我们即将使用dd。我们选择了一组有效的if、,of以及可能的seekskip。我们已仔细确保该命令不会写入超出我们预期的输出区域。

我们现在如何通过选择错误的bs和组合巧妙地破坏事物count?我们怎么知道?

我之所以问这个问题,是因为似乎出现了一些神奇的首选值。例如,在这个关于生成随机 1G 文件的问题中,前两个答案使用了if=/dev/urandomof=sample.txtbs=64Mcount=16

如何在 Linux 中创建 1GB 的随机文件?

当然,这些并不是唯一有效的设置,但两个答案都使用了这些设置,表明这种选择特别好且合理。特别是在没有文件系统甚至物理磁盘的情况下,我不清楚设置选择是否错误——不仅效率低下,而且错误的。我的猜测是,dd必须一次写入整数个块,这样bs内存使用量也会增加,而这些值只会影响性能。

该示例仅是一个示例,并不是我特别关心的内容,因此请继续解决所复制内容具有文件系统的情况。

对于我来说,使用 dd 总是一种可怕的信念飞跃。

答案1

救命!dd好可怕!

你并不孤单。来自Linux 技巧

“dd”命令是原始的 Unix 实用程序之一,应该放在每个人的工具箱中……有些人认为 dd 的意思是“销毁磁盘”或“删除数据”,因为如果误用,分区或输出文件很快就会被破坏。由于 dd 是用于写入磁盘头、引导记录和类似系统数据区域的工具,因此误用 dd 可能已经破坏了许多硬盘和文件系统。

但不用担心。一旦你了解了它的复杂性,你就会dd像牛仔一样从容优雅地召唤它。

会不会坏啊?这是什么count情况bs

我们先来处理第一个问题。

我们现在如何通过选择错误的bs和组合巧妙地破坏事物count?我们怎么知道?

如果您用“破坏”来表示“意外后果”,那么理论上只需指定它们即可。我的意思是什么?好吧,假设您要复制到image.img位于的 SD 卡上/dev/sdc。因此,您匹配示例中的参数:

# dd if=/home/someone/image.img of=/dev/sdc bs=64M count=16

重新使用这些设置应该没问题吧?让我们等待dd完成...现在,它说了什么?

16+0 records in
16+0 records out
1073741824 bytes (1.1 GB) copied, 34.1303 s, 31.5 MB/s

只复制了 1.1 GB!image.img2GB左右,我想要复制整个文件!通过告诉dd复制 16 个 64M 的文件(顺便说一下,其中 M=1024*1024),您指定了大小。您可以通过状态输出知道。如果您想复制整个文件,请将大小与bs和匹配count;或者完全省略这些:

# dd if=/home/someone/image.img of=/dev/sdc
4364864+0 records in
4364864+0 records out
2234810368 bytes (2.2 GB) copied, 45.9502 s, 48.6 MB/s

如果我们真的很顽皮并要求dd复制超出可用容量的数据,会发生什么情况?

# dd if=/home/someone/image.img of=/dev/sdc bs=1M count=4096
2131+1 records in
2131+1 records out
2234810368 bytes (2.2 GB) copied, 77.9768 s, 28.7 MB/s

啊,dd只复制接收到的字节数。这很方便。

监控dd

说到状态输出,dd(GNU 变体)尊重并响应 INFO 信号SIGUSR1

# echo "In another terminal or TTY"
# pkill -USR1 -n -x dd
# echo "Printed to stdout on the terminal/tty running dd:"
534+0 records in
534+0 records out
559939584 bytes (560 MB) copied, 1.68414 s, 332 MB/s

方便用于监视速度缓慢或由于某种原因预计会挂起的传输。与 配合使用效果很好watch,但一定要给出watch合理长的间隔时间。

dd还有其他我应该知道的选择吗?

dd确实还有其他选项,但在大多数情况下,如果你需要使用它们,你会知道它们的作用。不过,以下几个例子可能会给你一些启发:

  • conv=CONVS:根据一个或多个转换选项转换输入
  • seek=N并且skip=N:跳过 [输出|输入] 开头的 N 个 [obs|ibs] 大小的块
  • status=X:(禁止输出)noxfer或者none

dd现在感觉好多了!

dd太棒了!您很快就能通过互联网发送可​​启动映像,并使用和的组合将其直接写入 microSD 卡ssh

但这个dd首字母缩略词实际上代表什么呢?

最后一个问题很好。对于这个问题和其他类似的问题,我建议你参考术语文件条目dd


如果有任何内容比应有的更不透明,请鼓励您要求澄清!

答案2

您的问题自相矛盾:

我们已仔细确保命令不会写入超出我们预期的输出区域。

我们现在如何通过选择错误的 bs 和 count 组合来巧妙地破坏事物?我们怎么知道?

bs如果你选择了和的错误组合count,那么唯一可能破坏的就是写入超出预期的输出区域(或者没有到达该区域,我认为这是同一个问题)

如果您已经仔细确保命令不会写入超出预期的输出区域,那么您就不会破坏任何东西,因为您已经确保bs和的组合count不错。两者不能同时发生。同样,如果您不了解bscount参数,您就不可能仔细确保您的输出区域是正确的。

也就是说,该bs参数在很大程度上是一个性能调整参数。如果你指定一个bs小于物理扇区大小的如果您以原始模式读取/写入,或者另一个完全不正常的值,dd则将以简单而不是微妙的方式(“中止:I/O 错误!”) 。否则,事情会变得很慢。

相关内容