我想复制全部的磁盘从 /dev/sda 准确地复制到 /dev/sdb,所以我想dd
在 Linux 中使用命令,但是有两个选项让我感到困惑,bs
和sync
。
dd if = / dev / sda of = / dev / sdb bs = 4096 conv = notrunc,noerror,sync
我应该添加
sync
选项吗wiki.archlinux.org 建议?我是否应该将其设置
bs=16384kB
为磁盘缓存大小而不是更大的数字来最大化速度?
答案1
我是否应该按照 wiki.archlinux.org 的建议添加同步选项?
如果您要使用该conv=noerror
选项,那么您最好conv=sync
与其一起使用,否则您最终可能会得到无用的备份。
根据 Linux 手册页
Each CONV symbol may be:
...
sync
pad every input block with NULs to ibs-size; when used with block or unblock, pad with spaces rather than NULs
当同时指定 或“读取错误后继续”选项时,此选项可以添加填充noerror
。当发生硬(即不可恢复)读取错误时,磁盘控制器不会为输入缓冲区提供扇区数据。如果日因为这样的错误而终止(通常会发生),那么缺少数据就不是问题了。
但是,当指定“读取错误后继续”时,缺少数据就会成为问题。如果输入缓冲区没有填充以解决无法读取的扇区,则写入的后续数据将偏离应写入的正确扇区。或者,如果后续数据跳过了与错误相对应的目标扇区(或确实发生了错误),则写入的后续数据将偏离应写入的正确扇区。寻找(在日如果将一个被跳过的扇区(用术语来说)复制到其对应的扇区,那么这些被跳过的扇区中的垃圾数据将被视为原始数据的副本。
如果你使用日复制具有整数序列号的块,则可能不需要填充来检测或解决丢失的块。原始磁盘扇区不能假定具有任何此类整数序列号,并且需要填充以尝试保持复制的文件系统的完整性。
请注意,有两个sync
选项可用日。
一个是conv=sync
,另一个是iflag=sync
。它们的含义不同。
我是否应该将 bs=16384kB 设置为磁盘缓存大小而不是更大的数字来最大化速度?
您指的是什么“较大的数字”?
块大小参数bs
与缓存大小无关(虽然我不确定您指的是哪个缓存)。16MB
可能有点过大,因为可能没有那么多 DMA 内存可供锁定。有一些基准测试可以改变块大小,我见过的测试包括这个,证实了我的怀疑,存在一个递减(或至少没有更多)的回报大小,似乎约为 512KB。
复制 HDD 时,经典值bs
曾经是磁道大小(以字节为单位)(或每磁道扇区数 * 512 字节)。但由于现代 HDD 使用分区位记录并改变面密度,因此没有固定的(或已知的)“每磁道扇区数”。现代驱动器上通常公布的“每磁道 63 个扇区”规格只是为了方便数字。
答案2
并不是说 dd 不能完成这项任务,但如果可用,您可以考虑使用 dd_rescue。它能够更好地处理任何损坏的扇区,并且在复制过程中更好地提供状态信息。语法略有不同:
# dd_rescue [options] infile outfile
# using a 1M block size allows dd_rescue to adjust it's reads/writes to the limits of the OS buffer
dd_rescue -b 1M /dev/sda /dev/sdb
#sample of the status
dd_rescue: (info): Using softbs=1048576, hardbs=4096
dd_rescue: (info): ipos: 1048576000.0k, opos: 1048576000.0k, xferd: 1048576000.0k
errs: 0, errxfer: 0.0k, succxfer: 1048576.0k
+curr.rate: 107936kB/s, avg.rate: 107268kB/s, avg.load: 98.6%
>-----------------------------------------< 100% ETA: 0:00:00
您可能会发现,稍微提高克隆速度并不比了解该过程需要多长时间更重要。
请注意,初始平均传输速度可能会产生误导,因为旋转盘片驱动器的前 50GB 左右比其余部分快 30%。它从磁盘内部物理上较短的轨道复制,随着轨道变长而变慢。当然,对于 SSD,您不会看到这种情况。
答案3
bs
表示b
每次读写n个字节。代表块大小.bs
不一定会影响输入块大小 ibs
也不是输出块大小 obs
。
sync
告诉进程等待,直到所有数据都正确写入磁盘前继续下一个堵塞。这通常可以更好地确保数据完整性并避免在断电时丢失数据(例如在驱动器刚刚完成写入数据时断开连接),但慢点。
不sync
启用复制过程总体来说会更快,设备写入可能比sync
启用时更快,但您可能会注意到,当信息完全复制后,实际上磁盘可能仍在将信息从其缓存写入实际支持。这通常适用于硬盘驱动器或当您不打算在复制完成后立即断开设备连接时。
简单的说:
sync
→ 等待信息完全写入真实支持。- 无需
sync
→发送信息到设备并让其处理真正的写入。
sync
您可以使用较大的选项来加快进程(一点点)块大小 bs
避免在短时间内重复访问磁盘从而使得整个过程变得更慢。
我一直dd
不使用这个sync
选项,也从未遇到任何问题,只需等待信息完全写入后再弹出任何设备。