当我将带有 Windows 的可启动 NTFS 分区移动到不同的块偏移时,需要更新什么才能使其再次可启动?
背景: 我打算编写一个程序来执行必要的操作,这就是为什么我不寻求如何通过从 Windows DVD 启动来使用 Microsoft 工具的指南。相反,我需要如何自己修改这些东西,这样我就可以编写一个解决方案,让普通 PC 用户在想要将 Windows 系统移动到更大的硬盘时更容易使用。
具体来说,这是我尝试过的:
我有一个带有多个分区的磁盘,其中一个是带有 Windows 的 NTFS 分区,并且该磁盘使用普通的旧 MBR 块 0 作为分区布局(不超过 4 个分区)。
现在我格式化并分区一个新的、更大的磁盘。我在那里为 NTFS 分区腾出空间,并将内容从旧磁盘的 NTFS Windows 分区复制到那里。然后我将分区设为“活动”。
但是,当我尝试从该磁盘启动时,我立即收到“读取错误”消息并且启动停止,确切的文本是:
A disk read error occurred
Press Ctrl+Alt+Del to restart
我验证了两个磁盘在块 0 中具有相同的引导扇区代码。
我觉得其他东西可能需要更新。我猜某个地方有一个绝对我需要更新的块引用,可能指向下一级加载器或者 NT 内核。
更新:我发现这这篇文章深入探讨了我想知道的内容。但是,它说要修改 boot.ini,但我这里安装了 Windows 7,其中似乎发生了以下变化:没有 boot.ini,但有一个名为系统容量信息其中包含 GUID 和其他数据,听起来与我的问题有关。继续挖掘……
更新 2:感谢看起来很糟糕但信息量很大的网站由星人,我能够弄清楚第一步:NTFS 引导扇区有一个“隐藏”扇区的字段。该字段必须包含引导扇区的扇区号。这解决了“读取错误”消息。但是现在,我得到的却是“BOOTMGR 丢失”错误。看起来还有另一个地方需要调整块号,但我在代码列表中找不到有关此内容的任何信息。
我确实发现很多帮助网站都推荐使用 Windows 工具来修复“BOOTMGR 丢失”问题,但似乎没有人知道幕后发生了什么。这有点像在 Windows 出现小问题时建议重新安装。至少,这些修复似乎有效,主要涉及 Bcdedit 和 Bootrec 工具。现在,谁知道它们在移动分区方面做什么,尤其是后者?
更新 3:经过多次反复尝试,我现在相信解决方案在于BCD 模板注册表文件,通常位于 \Windows\System32\config 中。如果我使用“bcdboot”命令更新它,Windows 将从它启动。我现在正在弄清楚此注册表包含哪些与上述问题相关的信息。欢迎任何指向此注册表内容的指针。
更新 4:事实证明,虽然 BCD-Template 文件被重写并且二进制内容与其前身不同,但里面的值并没有改变。所以 bcdboot.exe 写入的一定是其他东西。我之前已经检查过它是否更改了分区的前 32 个引导块,但它们似乎保持不变。Parititon 映射也没有改变。那么除了 BCD 注册表之外,bcdboot 还修改了什么?有什么关于如何跟踪它的提示吗?是否有低级工具可以向我显示程序写入了哪些文件?
更新 5:答案似乎是:c:\Boot\BCD 也发生了变化,这似乎是启动管理器进程的关键文件。我稍后会调查此事……
更新 6:一个重要的细节似乎是,我在安装 Windows 7 时最初创建了两个分区:一个 204800 个扇区的小分区,似乎是引导分区,后面是包含 Windows 系统的实际大分区(驱动器 C:)。当我尝试将此安装传输到新的、更大的磁盘时,我在新驱动器上保留了相同的两个分区,尽管它们最终位于不同的偏移量。仅此一点就导致了“BOOTMGR 丢失”消息。从那时起,我只在 Windows 分区上使用 bcdboot.exe,这添加该分区上的 \Boot\BCD 文件。该文件(和文件夹)最初确实只存在于较小的分区上。因此,在我的情况下,这个问题可能更复杂,因为一个分区(引导程序)引用了另一个分区(包含操作系统的分区),而其他人可能只需要处理一个包含两者的分区,也许解决方案更简单。
更新 7:又发现了一个细节:\Boot\BCD 文件记录了 MBR 的序列号。如果该数字不匹配,系统将无法启动。接下来我将测试其中是否还存储了绝对块引用。
答案1
更简单的方法?
将 Windows Vista 或 Windows 7 安装光盘放入光盘驱动器,然后启动计算机。
出现提示时按任意键。
选择语言、时间、货币、键盘或输入法,然后单击下一步。
单击修复计算机。
单击要修复的操作系统,然后单击下一步。
在系统恢复选项对话框中,单击命令提示符。
键入 Bootrec.exe,然后按 ENTER。
Bootrec.exe 选项
Bootrec.exe 工具支持以下选项。请使用适合您情况的选项。
注意:如果重建 BCD 不能解决启动问题,您可以导出并删除 BCD,然后再次运行此选项。通过这样做,您可以确保 BCD 已完全重建。
为此,请在 Windows RE 命令提示符下键入以下命令:
bcdedit /export C:\BCD_Backup
c:
cd boot
attrib bcd -s -h -r
ren c:\boot\bcd bcd.old
bootrec /RebuildBcd
或 /FixMbr 或 /FixBoot 或 /ScanOs 或 /RebuildBcd 视情况而定。
看:支持.Microsoft.com更多细节。