为什么在复制有限大小的设备时指定块大小?

为什么在复制有限大小的设备时指定块大小?

在在线教程中,通常建议使用以下命令将 CDROM 复制到 ISO 映像:

$ dd if=/dev/dvd of=foobar.iso bs=2048

为什么必须指定块大小?我注意到事实上 2048 是CDROM 映像的标准逻辑块大小但似乎dd没有指定bs=count=也有效。

什么情况下会出现问题不是指定bs=count=从有限大小的设备复制时?

答案1

dd什么时候适合复制数据? (或者,什么时候 read() 和 write() 是部分的)指出使用时的一个重要警告countdd可以复制部分块,因此当给定它时,count它将在给定数量的块之后停止,即使某些块不完整。因此,bs * count除非您指定,否则最终复制的字节数可能少于字节数iflag=fullblock

默认块大小为DD是512字节。count是一个极限;正如您的问题所暗示的那样,在复制有限大小的设备时不需要它,并且实际上只是为了复制设备的一部分。

我认为这里需要考虑两个方面:性能和数据恢复。

就性能而言,理想情况下您希望块大小至少等于底层物理块大小且是其倍数(因此读取 CD-ROM 时为 2048 字节)。事实上,现在您也可以指定更大的块大小,以便底层缓存系统有机会为您缓冲内容。但是增加块大小意味着dd必须使用更多的内存,并且如果您由于数据包碎片而通过网络进行复制,则可能会适得其反。

就数据恢复而言,如果使用较小的块大小,则可以从故障硬盘中检索更多数据;这就是诸如此类的程序dd-rescue自动执行的操作:它们最初读取大块,但如果块失败,它们会以较小的块大小重新读取它。dd不会这样做,它只会使整个块失败。

答案2

周围有一点货物崇拜dd。最初,有两个错误cp导致了问题:当报告的块大小不是 512 时(Linux 使用的块大小为 1024),它会将文件误检测为稀疏文件,并且当从目标位置复制时,它不会清除目标中的空块。稀疏文件到块设备。

您可以在以下位置找到一些对此的参考早期 Linux 邮件列表档案

因此人们习惯了 dd 是处理磁盘映像的正确方法,而 cp 则被抛在了一边。由于 dd 使用默认块大小 512,因此速度很慢(比现代系统上的 cp 慢)。但应该使用什么块大小并不明显。可能在您的情况下,有人读到 2048 是 CD-ROM 的“自然”块大小(即,CD-ROM 分为 2,352 字节扇区,其中包含 2,048 字节数据以及纠错信息),并决定将此是与 dd 一起使用的“正确”大小,事实上,如果您使用(适度)较大的块大小,您可能会获得更快的结果。事实上,出于这个原因,GNU cp 使用默认的块大小 64k。

长话短说: cp /dev/dvd foobar.iso应该可以正常工作。默认块大小为dd512。在大多数现代环境中,不使用它的唯一影响可能是使复制过程变慢。

答案3

更改块大小是更改一次缓冲或读/写量的好方法。

与它是真正的块设备还是无限/虚拟的块设备无关。这是关于dd在写出之前您希望在内存中存储多少内容。bs=设置ibs=(一次读入多少数据)和obs=(一次写出多少数据)。越高,在有足够的数据开始写入目标之前需要obs=的迭代次数就越多。ibs=dd

count=除了您想做的事情之外,也不依赖于任何其他事情。它控制需要多少个“块”(由 测量ibs=)才能dd认为其工作已完成。

答案4

BS=表示要读取或写入的块大小。保留该字段完整或不指定它似乎可以完成相同的复制工作,但使用它有隐藏的事实。例如,

  • 有1000000000000000个文件,每个文件只有1~10 kb。
  • 拥有 10 GB 的单个文件

在第一种情况下,已发现使用较小的块大小可以提高复制速度。而在后者中,更高的块大小是更好的选择,因为它增加了扇区大小,留下更少的sector change命令数量,这通常会导致更快的 I/O 操作。

相关内容