使用 DD 将 Windows 系统从 NVME 512 GB 备份到 SSD 500 GB

使用 DD 将 Windows 系统从 NVME 512 GB 备份到 SSD 500 GB

我曾经有两个相同的 500 GB SSD 驱动器:一个在笔记本电脑内部,一个在外部。我会定期将dd内部 HDD 备份到外部 HDD,因为它们的容量相匹配。

我现在有一台新笔记本电脑,它有一个 512GB 的 NVME 驱动器(鼓声响起)。我有点担心这种表面上的容量增加会影响我使用完好的 500GB SSD 进行备份的能力。

我已经检查过了,并且dd似乎并不太在意在复制过程中目标文件的空间是否用尽——它只是停止了。

为了确保不会丢失操作系统驱动器中的数据,我对其进行了重新分区,仅使用 500GB(以匹配我的外部驱动器的大小),在 NVME 上留下 12 GB 的未分区空间。

问题dd:尝试使用从较小的 500GB SSD 驱动器启动还原到 512GB NVME 的 Windows 10 系统映像时,是否会发生任何低级 UEFI 混淆,如果我对上述系统映像进行分区以仅使用 NVME 上的 500GB 空间?


编辑:根据给出的建议,我将源磁盘(512 GB NVME)上的分区减少到总共约 499 GB,为分区表留出一些空间。然后,我dd对 SSD 进行了备份:

dd if=/dev/nvme of=/dev/sda ibs=8192 obs=8912 status=progress

完成后,gdisk 抱怨发现了 5 个问题。我发出了一条gdisk e命令(从磁盘加载主分区表(重建备份)),然后w(将表写入磁盘并退出)

此后,磁盘将通过验证(v),但我无法再从该磁盘启动 Windows。我该如何进一步排除故障并找出问题所在?我将尝试比较gdisk p源 NVME 驱动器和生成的克隆 SSD 的输出以获取一些线索。


编辑2:

以下是两个分区表的比较(它们匹配):

Disk /dev/nvme0n1: 477 GiB, 512110190592 bytes, 1000215216 sectors
Disk model: PC401 NVMe SK hynix 512GB               
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: gpt
Disk identifier: 4610F6E8-FE3A-4E46-AD07-2CA1F0EE3F0A

Device             Start       End   Sectors   Size Type
/dev/nvme0n1p1      2048   1023999   1021952   499M Windows recovery environment
/dev/nvme0n1p2   1024000   1228799    204800   100M EFI System
/dev/nvme0n1p3   1228800   1261567     32768    16M Microsoft reserved
/dev/nvme0n1p4   1261568 356517887 355256320 169.4G Microsoft basic data
/dev/nvme0n1p5 356517888 972947455 616429568   294G Microsoft basic data
/dev/nvme0n1p6 972949504 975046655   2097152     1G Microsoft basic data


Disk /dev/sdb: 465.8 GiB, 500107862016 bytes, 976773168 sectors
Disk model: SSD 750 EVO 500G
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 33553920 bytes
Disklabel type: gpt
Disk identifier: 4610F6E8-FE3A-4E46-AD07-2CA1F0EE3F0A

Device         Start       End   Sectors   Size Type
/dev/sdb1       2048   1023999   1021952   499M Windows recovery environment
/dev/sdb2    1024000   1228799    204800   100M EFI System
/dev/sdb3    1228800   1261567     32768    16M Microsoft reserved
/dev/sdb4    1261568 356517887 355256320 169.4G Microsoft basic data
/dev/sdb5  356517888 972947455 616429568   294G Microsoft basic data
/dev/sdb6  972949504 975046655   2097152     1G Microsoft basic data

但是,我无法从外部驱动器启动。在健康的可启动源磁盘上启动 gdisk 时,我得到:

受保护的 MBR 的 0xEE 分区过大!自动修复。

在克隆上运行 gdisk 时,我没有收到此消息。可能是因为 gdisk 在错误读取分区表时以某种方式损坏了它?

是不是因为使用了 Bitlocker 才导致 GPT 表“奇怪”?我之前使用 Truecrypt 时没有遇到任何问题。


编辑3:

我正在成功克隆驱动器上运行的操作系统上输入此内容!已接受答案中的建议已奏效。总结一下:

  • 通过将最后一个分区缩小 12 GB 多一点来减少 512 GB 源媒体上的使用空间(以允许分区表副本驻留在磁盘末尾)
  • 执行从 512 GB 源媒体克隆到较小的 500 GB 磁盘。
  • 运行 fdisk (即fdisk /dev/sdb)并选择重建备份头的选项(当更改写入磁盘时,fdisk 将默认提供此操作)

经过这些操作后,我已经能够成功使用该驱动器。

答案1

分区大小与磁盘大小

您应该将分区设置为略小于 500 GB,就像它最初略小于 512 GB 一样。我会将其缩小到 ~495 GB,以保留安全缓冲区。

(原因:分区不会占据整个磁盘的 100.000% - 它们需要为分区表本身留下几千字节(几个扇区)。因此,如果您的磁盘正好是 500 GB,它实际上无法容纳 500 GB 的分区 - 它更像是 ~499.999 GB。)

二级分区表

除此之外,截断的映像应该可以正常启动和工作,但操作系统可能会抱怨“备份” GPT 分区表丢失,因为它位于磁盘的最后一个扇区,而您将其截断。(对于 GPT,主分区表从扇区 1 开始,并将在克隆后继续存在,扇区 0 中的保护性 MBR 也是如此。)

恢复后,让分区工具以某种方式更新 GPT(例如在 Linux 上运行gdiskfdisk只是要求它写入表),以便重新创建备份 GPT。

“可用 LBA”范围

GPT 还指定了“可用”扇区的范围,通常设置为整个磁盘(减去分区使用的区域)。当映像到更大的磁盘时,该范围不会神奇地自动更新;分区工具再次需要写入新值。

这对于正常使用来说不是问题,因为操作系统无论如何都不会尝试将任何数据写入分区边界之外。但是,一些分区工具仅使用 GPT 指定的范围,而忽略实际磁盘大小;例如,当将 128GB 磁盘映像到 512GB 磁盘时,这些工具可能会拒绝放置任何超出原始 128GB 大小的分区。但是,使用其他分区工具通常就足够了(例如,Linuxgdisk通常会修复混乱)。

最后,如果原始源和最终目的地完全相同的 512GB,则您无需修复两次 - 无论如何,扇区范围最终都会再次正确。


$ fallocate --length=10G 测试.img

$ fdisk 测试.img
...
创建了一个新的 GPT 磁盘标签(GUID:F3936D7A-D5D9-ED43-950F-5CF3B37E0FAA)。
创建了类型为“Linux 文件系统”、大小为 8 GiB 的新分区 1。
...

$ truncate --size=9G test.img

$ fdisk 测试.img
...
GPT PMBR 大小不匹配(20971519 != 18874367)将通过写入进行纠正。
...

$ gdisk 测试.img
GPT fdisk (gdisk) 版本 1.0.4

警告!磁盘大小小于主标题所指示的大小!正在加载
磁盘最后一个扇区的次级标头!您应该使用“v”来
验证磁盘完整性,也许专家菜单上的选项可以修复
磁盘。
警告:备份 GPT 标头无效,但主标头有效;正在重新生成
来自主标题的备份标题。

警告!读取分区表进行 CRC 校验时发生错误 25!
警告!一个或多个 CRC 不匹配。您应该修复磁盘!
主标题:确定
备份标头:错误
主分区表:确定
备份分区表:错误
...

但是,我无法从外部驱动器启动

您已从 NVMe 磁盘移至 SATA/AHCI 磁盘,甚至移至 USB 存储;此时系统可能没有活动的 USB 驱动程序。(这类似于常见的“我从 IDE 切换到 AHCI 模式”问题;必须事先手动启用新驱动程序。)

因此,如果磁盘通过 SATA 连接到 AHCI 控制器,请使用sc qc storahci以确保驱动程序设置为 BOOT_START,同样如此iaStorA。我不确定 USB 大容量存储需要哪个驱动程序。

无论如何,一旦将其写入另一个 NVMe 磁盘,系统就应该重新启动。

以下是两个分区表的比较(它们匹配):

确实如此(因为您克隆了实际字节),但仅供参考,GPT 中还有一些数据未在正常模式下显示。例如,分区 GUID 和标志仅在“专家”模式下可见,并且 UEFI 启动菜单使用分区 GUID 来匹配启动分区。

受保护的 MBR 的 0xEE 分区过大!自动修复。

保护性 MBR 不参与启动过程;它是一个虚拟分区表,只有一个覆盖整个磁盘的大型分区。(它保护磁盘不被旧的仅 MBR 分区工具损坏。)了解 GPT 的系统通常会忽略保护性 MBR。

相关内容