我有一台运行 Windows 7 的家用机器,我想知道是否可以执行如下命令:
dd if=/dev/${oldSataSpinningDisk} of=/dev/${newSSD}
将 SATA HDD 上运行的当前系统的内容克隆到新的 SSD?主要是,Windows 7 是否可以启动并实际运行?
答案1
为什么需要块大小bs=64
?虽然它可能不是所有情况下最快的设置,但它仍然比标准设置运行得更快(大约 4 倍)……至少在我的系统上是如此 - 似乎在许多其他系统上也是如此。蒂姆·威利斯罗夫特表示 100M 可能更快,需要更多研究可能需要 已经完成了,看看吧。
测试数据在这里: (我取消了第一次运行,因为在我看来它花费的时间太长了。)
$ sudo dd if=/dev/sdb4 of=/dev/sda2 status=progress
12962501120 bytes (13 GB, 12 GiB) copied, 394 s, 32,9 MB/s
$ sudo dd if=/dev/sdb4 of=/dev/sda2 status=progress bs=64K
13143113728 bytes (13 GB, 12 GiB) copied, 98,0026 s, 134 MB/s
更多提示和想法:
status=progress
有助于监控发生的事情,替代方案见这篇“Unix&Linux”文章。我建议添加conv=noerror,sync iflag=fullblock
错误安全 -iflag
不幸的是这不是 POSIX 要求的,但它是文档中提到和以防你使用了错误的 bs/ibs(这部分是由 Kamil Maciorowski 精炼-进一步阅读)。更多作者蒂姆·威利斯罗夫特:您可以添加惯例
conv=notrunc
。你也可以研究一下米斯蒂里那
似乎没人知道 [...] dd 是一个非对称复制程序,这意味着它会先读取,然后写入,然后返回。您可以将 dd 管道化到自身并强制它对称地执行复制,如下所示:
dd if=/dev/sda | dd of=/dev/sdb
。在我的测试中,不使用管道运行命令时,吞吐量约为 112kb/s。使用管道时,我得到了约 235kb/s。我从未遇到过这种方法的任何问题。祝你好运!
虽然他似乎误用了“对称”这个词的含义,但这可能也值得一试。有关此方法的其他信息,请访问格罗克斯达:“如果你这样做并指定了块大小,请确保在每次调用时使用相同的块大小。”(各自岗位也值得一读)
答案2
是的,这个想法是对的,但是命令很糟糕。如果出现一个读取错误,dd 命令就会跳过一个字节,从而导致分区方案出现错误。您需要指定将每个字节复制到相同的物理位置(从头开始)。
dd if=/dev/oldsataspinningdisk of=/dev/newssd bs=64K conv=noerror,sync
答案3
我最近用普通香草做了这个:
sudo dd if=/dev/sda of=/dev/sdb
使用 ubuntu mate live usb 启动我的笔记本电脑。
对于 1TB 硬盘,大约需要 6 个小时 @43mb/s,用新的 SSD 启动我的笔记本电脑,一切(所有 Windows 和 Linux 分区)都运行正常。