Answers:
dd什么时候适合复制数据?(或者,当read()和write()方法部分)使用时,指出一个重要的警告count
:dd
可以复制的分块,给了这么当count
块的给定数量后停止,即使一些块不完整。因此bs * count
,除非指定,否则最终复制的字节数可能少于字节iflag=fullblock
。
dd的默认块大小为512字节。count
是一个极限;正如您的问题所暗示的那样,在复制有限大小的设备时不需要这样做,并且实际上只打算复制设备的一部分。
我认为这里有两个方面需要考虑:性能和数据恢复。
就性能而言,理想情况下,您希望块大小至少等于基础物理块大小(并且是其倍数)(因此,读取CD-ROM时为2048字节)。实际上,如今您还可以指定更大的块大小,以使基础缓存系统有机会为您缓冲内容。但是增加块大小意味着dd
必须使用更多的内存,如果由于数据包碎片而在网络上进行复制,可能会适得其反。
就数据恢复而言,如果使用较小的块大小,则可以从出现故障的硬盘中检索更多数据;这是程序之类的dd-rescue
自动执行的程序:它们最初读取大块,但是如果块失败,则以较小的块大小重新读取。dd
不会这样做,只会使整个块失败。
周围有一些杂货店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
应该工作正常。默认的块大小为dd
512。在大多数现代情况下,使其保持沉默的唯一效果可能是使复制过程变慢。
更改块大小是一次更改缓冲或读取/写入多少的好方法。
与它是真正的块设备还是无限/虚拟设备无关。这是关于在dd
将其写出之前要在内存中存储多少。bs=
设置ibs=
(一次读取多少数据)和obs=
(一次写入多少数据)。越高,在您有足够的数据开始写入目标之前obs=
,ibs=
将需要更多的迭代dd
。
count=
除了要执行的操作外,它也不依赖其他任何内容。它控制需要多少“块”(以衡量ibs=
),dd
以考虑其工作已完成。
dd
复制部分块-并非总是如此bs * count
。
dd
没有此值bs=2048
或某些倍数会给出错误。
dd
有效地使用blocksize选项可指定在尝试写回输出I / O子系统之前,将从输入I / O子系统复制到内存的数据量。输出是相同的(复制整个磁盘时),只是以您指定的不同大小读取块(大多数dd
实现使用512字节的默认块大小)。
如果您有大量的备用内存并增加了块大小,则可以连续读取更多更大的数据块,进行缓冲并刷新到输出目标。较低的块大小在每个单独的leek,memset等方面都需要更多的开销。
如果内存不足等,则里程数可能会因位置if=
和of=
设置以及所使用的硬件而异。
dd bs=4m iflag=fullblock
vs 将分区映像写入SD卡,dd bs=1111
并注意到前者将为您提供更高的数据速率。这是因为前者与SD卡上的自然块大小保持一致,而后者则需要SD控制器进行大量读取,复制和刷新操作以写入部分物理块。fullblock
顺便说一句,不应该低估的重要性,因为没有它,bs
仅仅是最大的,部分读取可能会导致持续的后续错位。