为什么克隆的 Windows 7 BCD 包含不完整的数据(因此无法启动)?

为什么克隆的 Windows 7 BCD 包含不完整的数据(因此无法启动)?

我曾经不幸需要克隆一个双启动的 Windows XP/7 机箱,用一个较小的硬盘替换它的硬盘。我很难让它启动,我想了解发生了什么,以及我是否可以做得更好。

背景:该机器有一个750Gb的驱动器,上面有3个分区:

  • Windows XP
  • Windows 7的
  • 数据

最初的安装方式是没有单独的 Windows 7 恢复分区。我希望这个事实能使事情变得简单一些。

我用 80Gb 的硬盘替换它。Windows 7 中的分区已经缩小,因此可以装入较小的磁盘。

我使用GParted(来自PartedMagicLinux LiveCD)复制分区。我将 Windows XP 分区标记为活动分区(与原始磁盘上的分区相同)。

CloneZilla由于从较大磁盘转换到较小磁盘,我无法使用或进行整个磁盘复制。

复制分区后,我手动复制了引导加载程序(注意不要复制分区表):

$ dd if=/dev/sda of=/dev/sdb bs=446 count=1

我移除了原来的磁盘,设置了新的磁盘,使其物理连接与原来的相同(IDE 通道 1 主),然后尝试启动。这成功显示了启动菜单,但在选择任一选项时失败(有两个:一个用于 XP,一个用于 Win7)。

我做了大量研究,发现 Windows 7 启动配置数据并不包含应有的所有内容。我比较了原始磁盘和新磁盘的 BCD 输出,发现后者的设备条目是unknown。因此,我手动更改了它们以匹配原始条目 - 如下所示:

$ bcdedit /set {ntldr} device partition=C:
$ bcdedit /set {default} device partition=D:
$ bcdedit /set {default} osdevice partition=D:

然后重新启动。这次我可以启动 XP 和 Win7。我需要做更多测试,因为两个 BCD 之间似乎还有其他差异,但进行上述更改至少可以进行启动。

所以我的问题实际上是问为什么克隆分区上的 BCD 看起来与原始分区不同,并且足以阻止启动?

接下来的问题是,我是否应该用另一种方式来做这件事?

答案1

克隆包含 Windows 操作系统的分区后,如果克隆的分区在克隆磁盘上的位置与原始磁盘上的位置不完全相同,则需要修复启动配置数据。

自 Windows Vista 以来,Windows 启动机制将其配置存储为“启动配置数据”(BCD),这指的是分区,不是通过分区号,而是通过磁盘签名和扇区偏移量。磁盘签名是嵌入在主引导记录中的 32 位值。复制扇区 0 的前 446 个字节将复制磁盘签名。

如果克隆活动导致克隆的磁盘分区具有与原始分区不同的起始扇区地址(除非使用全盘克隆,否则很有可能),那么克隆很可能无法启动,直到应用这些补救措施。

基本上,扇区偏移需要更新,为此,您需要使用恢复控制台(Windows 7 安装 DVD 上提供)。确保只连接了克隆的驱动器并从 Windows 7 安装 DVD 启动。在第一个屏幕上选择语言并点击“下一步”。在下一个屏幕(显示“立即安装”)按 SHIFT+F10 获取命令提示符。

首先,确认现有的驱动器号及其所涉及的分区:

diskpart
list volume
exit

此外,如果需要,请重新确认活动分区:

diskpart
select disk 0
select part 1
detail part
select part 2
detail part
... and so-on
exit

在 BIOS 系统中,BCD 存储在一个文件中,X:\Boot\BCD其中X是活动分区的驱动器号(对于 UEFI,它位于 EFI 系统分区中)。它通常是隐藏的,但可以使用以下命令查看

dir /AH X:\Boot

可以像这样备份:

bcdedit /export X:\path\to\bcd\backup

并恢复

bcdedit /import X:\path\to\bcd\backup

如果磁盘上有多个操作系统,则可能会有多个 BCD。活动 BCD 是\Boot\BCD分区上标记为活动的 BCD -活动分区. 列出其内容(按详细程度递增的顺序:)

bcdedit
bcdedit /enum
bcdedit /enum ALL
bcdedit /enum ALL /v

要修复活动 BCD,请为正确的分区建立驱动器号并执行以下操作:

bcdedit /set {default} osdevice partition=X:
bcdedit /set {default} device partition=X:
bcdedit /set {bootmgr} device partition=X:
bcdedit /set {memdiag} device partition=X:
bcdedit /set {ntldr} device partition=X:

或者,修复另一个 BCD(在这些示例中为“X:\boot\bcd”):

bcdedit /store X:\boot\bcd /set {default} osdevice partition=X:
bcdedit /store X:\boot\bcd /set {default} device partition=X:
bcdedit /store X:\boot\bcd /set {bootmgr} device partition=X:
bcdedit /store X:\boot\bcd /set {memdiag} device partition=X:
bcdedit /store X:\boot\bcd /set {ntldr} device partition=X:

例如,我的系统有 XP 和 7,它们显示 XP 已打开C:,7 已打开D:,活动分区为C:。那么活动 BCD 将位于c:\boot\BCD。启动管理器将位于C:\bootmgr,内存诊断程序将位于C:\boot\memtest.exe,所需的命令将是:

bcdedit /set {ntldr} device partition=C:
bcdedit /set {memdiag} device partition=C:
bcdedit /set {bootmgr} device partition=C:
bcdedit /set {default} device partition=D:
bcdedit /set {default} osdevice partition=D:

完成这些更改后,重新启动计算机(按 Alt-F4 即可)并取出 DVD 可使系统成功启动。

进一步阅读:

(整个磁盘克隆不会出现这些问题,因为副本上的分区布局应该与原始副本完全相同)

答案2

根据这是关于 BCD 内部的非官方文档,BCD 存储中的分区实际上是通过磁盘签名和分区偏移量来标识的。您复制了磁盘签名(MBR 字节 440–443),但很可能在将分区放在较小的磁盘上时更改了分区偏移量,因此 BOOTMGR 不再能够找到这些分区。

相关内容