(我说的错误是指“会破坏事物”。)
假设我们即将使用dd
。我们选择了一组有效的if
、,of
以及可能的seek
和skip
。我们已仔细确保该命令不会写入超出我们预期的输出区域。
我们现在如何通过选择错误的bs
和组合巧妙地破坏事物count
?我们怎么知道?
我之所以问这个问题,是因为似乎出现了一些神奇的首选值。例如,在这个关于生成随机 1G 文件的问题中,前两个答案使用了if=/dev/urandom
、of=sample.txt
、bs=64M
和count=16
。
当然,这些并不是唯一有效的设置,但两个答案都使用了这些设置,表明这种选择特别好且合理。特别是在没有文件系统甚至物理磁盘的情况下,我不清楚设置选择是否错误——不仅效率低下,而且错误的。我的猜测是,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.img
但2GB左右,我想要复制整个文件!通过告诉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
不错。两者不能同时发生。同样,如果您不了解bs
和count
参数,您就不可能仔细确保您的输出区域是正确的。
也就是说,该bs
参数在很大程度上是一个性能调整参数。如果你指定一个bs
小于物理扇区大小的和如果您以原始模式读取/写入,或者另一个完全不正常的值,dd
则将以简单而不是微妙的方式(“中止:I/O 错误!”) 。否则,事情会变得很慢。