为什么克隆的Windows 7 BCD包含不完整的数据(并因此阻止了启动)?


9

我不幸地需要克隆一个双引导Windows XP / 7盒,用一个较小的硬盘盒来代替它的硬盘。我很难启动它,想了解正在发生的事情以及是否可以做得更好。

背景:计算机上有一个750Gb驱动器,上面带有3个分区:

  • Windows XP
  • Windows 7的
  • 数据

原始安装是通过没有单独的Windows 7恢复分区的方式完成的。我希望这个事实可以简化一些事情。

我将其替换为80Gb驱动器。分区已经从Windows 7中缩小了,因此它们适合较小的磁盘。

我使用GPartedPartedMagicLinux 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看起来与原始分区不同,并且足以防止启动?

接下来要问我是否应该以其他方式这样做?

Answers:


13

克隆包含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标记为活动分区的分区上的一个- 活动分区。列出其内容(按详细程度的升序排列:)

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为on C:且7为on 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,使系统能够成功引导。

进一步阅读:

(全磁盘克隆不应遭受这些问题,因为副本上的分区布局应与原始磁盘完全相同)


请注意,这bcdboot提供了一种更简便的方法来重新创建启动项,但是我不确定它是否适用于XP / W7双重启动方案。
哈里·约翰斯顿

我喜欢您的回答,但是请您把它整理一下吗?我认为这里有很多无关的信息(例如示例命令,当您紧接后面的实际命令时等等)。
Bigbio2002

我很高兴您喜欢分析器,但我认为那里没有太多无关紧要的信息。我有一个一般性的解释,最后还有一个真实的例子,它实际上演示了如何确定每个需要更改的条目的分区。我需要以上所有知识来修复克隆的系统,因此,将其作为完整的答案来完整介绍给他人。
starfry

8

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


这很有趣,并且肯定可以解释为什么它不起作用-分区偏移量肯定会有所不同。为什么-哦-为什么没有更正式地记录下来,这是任何人的猜测!是否有一种可接受的(官方或非官方的)方式来“修复”克隆磁盘上的内容?
starfry

我想官方的方法是“从预先准备好的系统修复光盘(或真实的安装介质,如果有的话,而不是DOEM恢复介质)启动并运行Startup Repair;如果失败,请重新安装操作系统。不确定启动修复是否还会恢复XP。
谢尔盖·弗拉索夫

@starfry那里有许多BCD编辑器,包括内置的命令行一(bcdedit)。我自己更喜欢Visual BCD Editor。如果可以进入Windows环境,Visual BCD可以很容易地设置启动设备。您可以通过打开命令提示符(我认为是F11等)并bcdedit在此处使用从启动DVD中执行相同的操作。如果您愿意手动修复它,建议您不要使用系统修复,因为我之前已经让系统修复删除了磁盘恢复环境。
鲍勃

谢谢谢尔盖和@bob。我接受了这个答案,因为它驱使我完全了解发生了什么。我已经在另一个答案中记录了我现在所知道的内容。
starfry 2013年

请原谅我的无知,但是如果@starfry是通过sda(不是分区的sda1)而是整个驱动器的sda逐字节复制的字节,那么分区偏移量为何会不同?
barlop
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.