我见过许多与使用 dd、cat 和 Clonezilla 来促进分区和设备克隆相关的问题、答案和指南。我不想继续这些讨论,而是希望dd
在这篇文章中对行为提出非常有针对性的问题。
我正在使用 Ubuntu 18.04 LTS live,从 USB 启动。我有一个 500GB 硬盘,运行 Windows7 (/dev/sda)。我调整了分区大小,未分配的空间略多于 420GB。我的目标是将启动表和分区备份到 120gb SSD (/dev/sdb)。 SSD没有分区,显示110GB未分配。
sudo dd if=/dev/sda of=/dev/sdb
遇到失败并传达“设备上没有剩余空间”。使用 gparted 抽查分区,我看到 /dev/sdb 包含相同的分区、标签、大小和未使用的分区。唯一明显的区别是未分配的空间。
我能够从 SSD 启动 Windows,但仍有一些与dd
行为相关的问题。
- 是否
dd
尝试复制未分配的设备内容? dd
有操作顺序吗? (例如分区 1->99,然后是杂项驱动器块)- 到目前为止,我是否很幸运能够立即使用这个 Windows 驱动器?我是否过于偏执地认为驱动器缺少内容?
无论如何,我确实计划在可预见的将来保留硬盘。
答案1
dd
对磁盘上的分区或任何其他结构一无所知。它无法识别磁盘的“已分配”或“未分配”部分。从dd
的角度来看,作为参数给出的设备由一系列块组成。因此,如果运行dd if=/dev/sda of=/dev/sdb
,dd
将从 的开头开始复制块/dev/sda
到 上相应编号的块/dev/sdb
,直到它读取了所有块/dev/sda
或直到遇到错误。在您的示例中,由于/dev/sdb
大小小于/dev/sda
,因此dd
被终止并显示错误消息“设备上没有剩余空间”(在 上/dev/sdb
)。
答案2
Johan Myréen 雄辩地解释了为什么你的方法会导致错误。有两种解决方法可以将驱动器复制到较小的驱动器dd
:
- 正如 mikeserv 所建议的,您可以只复制包含您感兴趣的数据的特定分区,例如 /dev/sda1,而不是复制整个设备 (/dev/sda)。这有几个缺点:您必须知道哪个分区包含您的数据,如果您擦除原始驱动器并想要恢复它,您将需要首先重新创建原始分区结构(理想情况下您有它的外观的注释) )然后恢复特定分区。 (其中任何一个都可能容易出错。)如果您计划从 SSD 运行 Windows,这可能是您的最佳选择(尽管 Windows 有时会反对硬件更改并希望重新安装,但这显然不是问题)这个案例)。
- 如果您不介意以压缩形式存储驱动器的内容,您可以尝试类似的操作
sudo dd if=/dev/sda bs=1M | gzip > /path/to/mounted/backup-drive/sda_backup.gz
(如果备份文件不是用户可写的,请使用sudo -i
root shell 或将整个命令包装为sudo sh -c '
命令'
;我这样设置是bs
因为默认的512字节对于大量数据来说效率很低;相反,gzip
您也可以使用其他压缩程序)。这可以使用 恢复zcat sda_backup.gz | dd of=/dev/sdx bs=1M
,但您无法从分区启动,甚至安装它也很棘手(请参阅这个问题关于这方面的有趣讨论; doug65536的回答也讨论了“零清洗”以提高压缩比)。
您当前状况的问题是您已将分区表从大驱动器复制到较小的驱动器,这意味着它实际上包含有关超过 120 GB 的任何内容的错误信息,尽管这并不妨碍您启动和使用分区的话,不太理想。您可以尝试使用类似的方法来修复分区表gparted
(比重新复制快得多),并希望没有其他事情被破坏,或者从头开始。