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


1

(错误的意思是“会破坏事物”。)

假设我们即将使用dd。我们选择了一套有效的ifof可能的seekskip。我们已经仔细确保命令不会写入我们预期的输出区域。

我们怎样才能巧妙地现在通过选择一个糟糕的组合打破东西bscount?我们怎么知道?

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

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

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

这个例子只是一个例子而不是我特别关注的事情,所以请继续处理被复制的文件系统。

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


它只是一些个人偏好。bs值不能太小或者会有严重的性能损失 - 随机/ 4K性能总是比顺序慢得多,所以我们需要使bs值足够大以便顺序。否则没有太大区别:bs = 64M count = 16,bs = 16M count = 64,或bs = 1M count = 1024。
Chris.C 2015年

这就是我所怀疑的,如果我非常乐意接受这种效果的答案来自那些对此充满信心且可以简要解释原因的人。为了更加具体地了解我的问题,何时dd会通过读取或写入“切片”文件系统块来破坏文件系统?如果发生这种情况会很明显吗?
Praxeolitic 2015年

使用旧磁带驱动器有所不同,但今天,至少对于文件,最终结果没有区别。对于(现代)原始设备,我会假设相同,但不能100%肯定。
Chris.C 2015年

@Chris.CI肯定不能要求100%的确定性,毕竟不能证明是负面的。我只是想知道是否有一些我完全没有注意到的东西。我不dd经常使用,但当我做赌注很高,这是可怕的!听起来这是您的专业领域。随意回答。
Praxeolitic 2015年

imho,当你是一个文件时,你不能破坏东西......当它是一个设备时,你真的关心原始内容吗?最糟糕的情况是再次写作。
Chris.C 2015年

Answers:


3

救命!dd很可怕!

你不是一个人。来自Linux的提示

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

但是不要担心。一旦你了解了它的复杂性,你就会被dd牛仔竞技牛仔的平静恩典所吸引。

它会破裂吗?这是什么countING bs

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

我们怎样才能巧妙地现在通过选择一个糟糕的组合打破东西bscount?我们怎么知道?

如果你的意思是“休息”意味着'意想不到的后果',那么只需在理论上指定它们。那是什么意思?好吧,假设您要复制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


如果有什么比它应该更不透明,请鼓励要求澄清!


-3

你的问题是自相矛盾的:

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

我们现在怎么能通过选择bs和count的坏组合来巧妙地分解?我们怎么知道?

如果你选择了bs和的坏组合,count你唯一可以打破的就是写过你想要的输出区域(或者没有达到它,我认为是同样的问题)

如果你已经仔细确保命令不会写入预期的输出区域,那么你就不能破坏它,因为你已经确保了你的组合bs并且count并不坏。这两者不能同时发生。同样,如果您不理解bscount参数,则无法仔细确保输出区域正确。

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

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.