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


14

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

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

为什么必须指定字节大小?我注意到实际上2048是CDROM映像标准字节大小,但似乎dd没有指定bs=count=同样有效。

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

Answers:


12

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

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

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

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

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


2
尤其是性能;例如,使用dd bs=4m iflag=fullblockvs 将分区映像写入SD卡,dd bs=1111并注意到前者将为您提供更高的数据速率。这是因为前者与SD卡上的自然块大小保持一致,而后者则需要SD控制器进行大量读取,复制和刷新操作以写入部分物理块。fullblock顺便说一句,不应该低估的重要性,因为没有它,bs仅仅是最大的,部分读取可能会导致持续的后续错位。
杰森·C

6

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

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

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

tl; dr: cp /dev/dvd foobar.iso应该工作正常。默认的块大小为dd512。在大多数现代情况下,使其保持沉默的唯一效果可能是使复制过程变慢。


它可能已更改,无论如何GNU cp默认使用128k块大小(而不是64k),请参阅eklitzke.org/efficiency-file-copying-on-linux
apurkrt

5

更改块大小是一次更改缓冲或读取/写入多少的好方法。

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

count=除了要执行的操作外,它也不依赖其他任何内容。它控制需要多少“块”(以衡量ibs=),dd以考虑其工作已完成。


请注意,斯蒂芬斯(Stephens)会dd复制部分块-并非总是如此bs * count
Drav Sloan'3

请注意,在某些Unix系统上,您必须读取本机块大小的倍数;否则,请参见图11 。从块设备cdrom驱动器读取数据时,如果dd没有此值bs=2048或某些倍数会给出错误。
Wurtel

2

dd有效地使用blocksize选项可指定在尝试写回输出I / O子系统之前,将从输入I / O子系统复制到内存的数据量。输出是相同的(复制整个磁盘时),只是以您指定的不同大小读取块(大多数dd实现使用512字节的默认块大小)。

如果您有大量的备用内存并增加了块大小,则可以连续读取更多更大的数据块,进行缓冲并刷新到输出目标。较低的块大小在每个单独的leek,memset等方面都需要更多的开销。

如果内存不足等,则里程数可能会因位置if=of=设置以及所使用的硬件而异。


1

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

  • 具有1000000000000000个文件,每个文件只有1〜10 kb。
  • 一个文件只有10 GB

在第一种情况下,发现使用较小的块大小可以提高复制速度。而在后者中,较高的块大小是一个更好的选择,因为它增加了扇区大小,而减少了sector change命令数量,这通常导致更快的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.