桌面文件Windows XP 和 Windows PE 2.0 的双引导

Wes Miller

下载这篇文章的代码: Desktop2008_02.exe (151KB)

在前几期的“桌面文件”中,我提到了 Windows PE 已成为一种恢复工具,还介绍了如何从另一个分区使用它。最近有人问了我一个问题,使我觉得有必要讨论一下此主题的最新发展趋势 — 同时使用 Windows PE 2.0 和 Windows XP,

毕竟许多用户可能使用 Windows® XP 一段时间了,而且 Windows PE 2.0 是 Microsoft 将继续提供支持的版本(请注意,对 Windows PE 1.x 将不再做进一步的更新)。

Windows PE 1.x 和 2.x 之间的一个重要区别在于 Windows PE 2.x 可以通过标准引导界面进行引导,而 Windows PE 1.x 必须使用特有的引导方法。尽管可以从另一个分区引导 Windows PE 1.x 或 2.x,但在操作系统所在的引导分区进行引导可能会有许多便利(我会在稍后加以介绍)。

Windows 的双引导

一直以来,Windows NT® 对双引导的支持都不太好。但是,由于基于可扩展固件接口 (EFI) 的计算机逐渐开始取代旧的 IBM PC AT BIOS,Microsoft 更改了 Windows 的引导机制,以便与 EFI 更好地协同工作并在所有体系结构中采用同一引导机制。从 Windows Vista® 开始,Windows 采用了称为引导配置数据库或 BCD 的新引导机制(请参阅 microsoft.com/whdc/system/platform/firmware/bcd.mspx)。但是,无论是使用原来的 boot.ini 还是新的 BCD 机制,Windows 通常都可以引导其他操作系统,虽然这样做就将引导过程转交给其他引导加载程序。

开始前必须先明确一点:Windows PE 2.0 只能在完全兼容高级配置与电源接口 (ACPI) 并且内存至少为 384MB(最好为 512MB)的系统上运行。我在五月份的专栏 (technetmagazine.com/issues/2007/05/DesktopFiles) 中提到,非 ACPI 系统将无法引导 Windows PE 2.0,并且由于必须将 Windows PE 2.0 引导到 RAMDisk,因此它需要配有足够的 RAM 来存放 RAMDisk、任意暂存空间以及所有 RAM 工作集。如果您的系统 RAM 少于 384MB,请趁早放弃这种途径而改用 Windows PE 1.6。即使是擅长给 Windows PE 瘦身的高手也无法在 256MB 内存的情况下流畅运行。

对了,别忘了要解决的问题

现在,让我们来了解一下通过从与 Windows XP 相同的分区引导 Windows PE 2.0 可以解决的问题。

完全系统恢复 这是通过从 Windows XP 所在分区引导 Windows PE 可以实现的其中一个任务。由于 Windows PE 2.0(与之前的 Windows PE 1.6 一样)可完全引导到 RAMDisk,因此您可以重新映像整个磁盘 — 或使用 ImageX 单独还原 Windows XP 文件,而不必重新映像整个分区。

由于允许用户在启动时引导到 Windows PE,因此现在甚至可以远程恢复系统。映像可以来自辅助分区、网络共享(如果用户不是移动用户)、恢复 DVD 或 USB 硬盘,如果使用的是 ImageX,甚至还可以将其存储在要恢复的分区上。这种磁盘恢复方法对许多问题(物理磁盘损坏除外)而言都是一种不错的解决方案。但是很明显,它不适合于还原用户数据,除非最初受到保护的数据作为恢复的一部分加以还原。请记住,应使用漫游配置文件并备份 PC 中的数据以防止此情况下的数据丢失。还应确保使用的任何恢复机制都考虑到用户的需要,减少任何潜在的数据丢失风险(包括由于重置 EFS 加密密钥而造成的丢失)。

文件恢复 Windows PE 还提供了启动和运行系统的机制(即使 Windows 的主安装不能引导)。在这种情况下,可将用户数据引导并恢复到其他系统(用户必须有热备份系统)或其他位置,以便用户能够很快重新开始工作。

系统修复 最后,在 Windows XP 分区上引导 Windows PE 后,可通过运行一组故障排除脚本或一个简单的、用户驱动的修复或恢复应用程序来修复系统。此过程类似于完全系统恢复,但它涉及的范围较小,并且不会危及用户数据。

现在我们了解了在 Windows XP 分区上引导 Windows PE 可实现的功能,接下来让我们看一看后台情况以便将此过程应用到所需的任何解决方案中。

在 Windows Vista 之前

在 Windows Vista 出现之前,对于基于 BIOS/主引导记录 (MBR) 的系统,其引导方式如下所述。BIOS 指向引导设备(对硬盘而言,它指向磁盘的 MBR)。MBR 执行可指定待引导分区的代码。注意,它是设置了活动标记的第一个分区。在最早版本的 diskpart 中,无法将分区设为不活动(即无法移除活动标记)。在 diskpart 中添加了开关来解决此问题 — 否则,它将是分区表顺序中具有活动标记的第一个分区。该分区包含引导扇区 — 它会指出接下来要执行的代码。从 Windows NT 到 Windows Server® 2003,要运行的代码都位于一个名为 ntldr 的没有扩展名的文件中。如果磁盘已格式化但未安装 Windows,则当您试图进行引导时,将看到错误消息“NTLDR not found”。

您可能有兴趣知道 ntldr 是完全向后兼容的,而不会向前兼容。这就表示 Windows XP 的 ntldr 可引导 Windows 2000,反之却不行。这就是实现双引导必须首先安装旧版本操作系统的原因。并且由于 ntldr 没有附带版本号,因此弄清这一点显得尤为重要。

Ntldr 是一个启动 NTDetect.com 的实模式(16 位)应用程序,它执行基本的设备检测然后启动内核 ntoskrnl.exe(这可能是多个文件中的其中一个文件 — 始终重命名为 ntoskrnl.exe)。内核是 Windows 引导过程中的关键组件。

此引导过程摘要显得有点简单,我省略了 Win32® 的整个初始化过程,因为它与本讨论并不相关。如果希望了解有关此引导过程的更多信息,建议您阅读 Mark Russinovich 和 David Solomon 合著的《Windows Internals, Fourth Edition》(Windows 内核,第四版)(Microsoft Press®,2004)。

另外,还要注意,从光盘引导时,Windows Setup 和 Windows PE 运行的是 setupldr.bin 而不是 ntldr。此文件实际包含的引导代码略有不同,目的是为了使其可以从光盘引导(ntldr 则不能)。这就是为什么引导 Windows PE 1.x 时,必须将 setupldr.bin 重命名为 ntldr 并放到磁盘上的原因所在。也是为什么该文件无法随后加载 boot.ini 文件的原因(因为 setupldr.bin 仅用于光盘引导,因此 boot.ini 并非是必需的文件)。

Windows Vista 及更高版本

Windows Vista 更改了此过程的许多方面。Windows Server 2008 对其做了进一步的更改,包括允许 IA32(支持 32 位)从 EFI 引导(到目前为止,除了基于 Itanium 的系统以外均无法实现此引导)。对于基于 BIOS 的系统,引导过程的初始步骤大部分都没变。关键区别在于 BOOTMGR 是引导加载程序,初始化后执行以下步骤。

它在引导目录中查找 BCD 文件(实际上是其自身的注册表配置单元)。BCD 包含要引导的引导条目(包括默认条目)。请参见图 1 了解映像类型(可执行文件类型),参见图 2 了解要启动的特定应用程序类型。ntldr 可以引用一个(或多个)此类条目。但其中仅有一个条目可实际引用众所周知的用于加载 ntldr 的 GUID(请参见图 3 中的第五行)。bootmgr 随后决定接下来要加载的条目,具体取决于是否正在引导系统、系统是否正在休眠或者是否要引导到 ntldr 或其他引导管理器(在这种情况下它会指向另一个引导扇区并启动该加载程序)。在使用非 Windows 操作系统进行双引导时,这种情况最常见。可在以下网站找到更多信息:microsoft.com/whdc/system/platform/firmware/bcd.mspx

Figure 3 标准应用程序对象

说明 BCDEdit ID GUID
Windows 引导管理器 {bootmgr} 9dea862c-5cdd-4e70-acc1-f32b344d4795
固件引导管理器 {fwbootmgr} a5a30fa2-3d06-4e9f-b5f4-a01df9d1fcba
Windows 内存测试程序 {memdiag} b2721d73-1db4-4c62-bf78-c548a880142d
Windows 恢复应用程序 无别名 147aa509-0358-4473-b83b-d950dda00615
传统 Windows 加载程序 {ntldr} 466f5a88-0af2-4f76-9038-095b170dc21c
当前引导条目 {current} fa926493-6f1c-4193-a414-58f0b2456d1e
默认引导条目 {default} 无预定义的 GUID
     

Figure 2 应用程序类型

说明 说明
固件引导管理器 0x1 仅适用于 EFI 系统。
Windows 引导管理器 0x2 控制引导流。在双引导系统中,向用户显示引导选择菜单。
Windows 引导加载程序 0x3 加载特定的 Windows 版本或配置。
Windows 恢复应用程序 0x4 当计算机从休眠状态恢复时将 Windows 还原到其运行状态。
Windows 内存测试程序 0x5 内存诊断应用程序。
Ntldr 0x6 仅适用于 PC/AT BIOS 系统。加载 Windows Vista 之前的 Windows 版本。
引导扇区 0x8 16 位实模式应用程序。仅适用于 PC/AT BIOS 系统。可用于重新启动引导过程并加载非 Windows 操作系统。
     

Figure 1 映像类型

说明
固件应用程序 0x1
引导应用程序 0x2
基于 Ntldr 的加载程序对象 0x3
实模式应用程序 0x4
   

您会注意到,改进后的 Windows Vista 引导基础架构与以前的版本相比更具条理性 — 除 bootmgr 外,所有引导代码均位于根级别 \boot 目录中,并且在 BCD 指定后,还可以转到 Windows 特定的二进制文件中。

引导 Windows XP 和 Windows PE 2.0

现在让我们来了解一下使用 Windows Vista 引导管理器,如何能够以 Windows PE 为中介,在继续引导 Windows XP 或 Windows 早期版本的同时,将 Windows PE 2.0 添加到集成的恢复工具组中。

当然,还要向引导过程中添加另一个 Microsoft 事先设计好的步骤。由于新的 bootmgr 基础架构需要向后兼容现有的 ntldr 和其他第三方引导管理器,因此专门构建了 bootmgr 来支持此类解决方案。

因此,在研究了 Windows 的启动方式以及新 BCD 的工作方式后,我们如何才能将二者联系起来并将 Windows PE 2.0 应用到现有的 Windows XP 安装呢?有两种方法可记下 Windows Vista 引导扇区(用来告知系统启动 bootmgr 的引导代码)。其中一种方法是使用 diskpart,通过 Windows PE 2.0 创建并格式化一个新分区。但在这里不能选择此方法,因为您已安装了 Windows XP 并且不希望损坏或移动它。因此改为使用以下过程:

  1. 确保 Windows PE 2.0 引导光盘上有 bootsect.exe 和 bcdedit.exe 的副本(都可以在 Windows Vista 安装 DVD 上找到)。
  2. 将 Windows XP 系统引导到 Windows PE 2.0 光盘。
  3. 引导后,运行以下命令:
    bootsect.exe /NT60 ALL

这会将引导扇区设置为 Windows Vista 兼容的引导扇区,它知道如何启动 bootmgr。

4. 将引导管理器复制到硬盘:

    xcopy BOOTMGR C:\BOOTMGR /I

5. 将 boot.SDI 文件复制到硬盘上的 \BOOT 目录中。必须在引导前制作一个副本,因为 Windows PE 运行时会锁定此文件,从而无法复制:

    xcopy BOOT.SDI C:\BOOT\ 

相应地更正源路径。

6. 将 boot.WIM 复制到硬盘。与 SDI 类似,应准备一份辅助副本,否则您将无法复制正在运行的文件:

    xcopy BOOT.WIM C:\BOOT\BOOT.WIM 

相应地更正源路径。

7. 现在创建新的 BCD 存储:

    bcdedit /createstore

8. 接下来创建 BCD 条目以加载 Windows PE:

    bcdedit /create {ramdiskoptions} /d "Boot Windows PE"
    bcdedit /set {ramdiskoptions} ramdisksdidevice partition=c:
    bcdedit /set {ramdiskoptions} ramdisksdipath \boot\boot.sdi
    bcdedit /create /d "Windows PE" /application OSLOADER

9. 最后一行将返回 GUID。使用返回的实际 GUID 替换 {YOURGUID}。它们是 RAMDisk 的条目,用来从硬盘引导 Windows PE(如图 4 所示)。

Figure 4 RAMDisk 的条目,从硬盘引导 Windows PE

bcdedit /set {YOURGUID} device ramdisk=[c:]\boot\boot.wim,{ramdiskoptions}
bcdedit /set{YOURGUID} path \windows\system32\winload.exe
bcdedit /{YOURGUID} osdeviceramdisk=[c:]\boot\boot.wim,{ramdiskoptions}
bcdedit /set{YOURGUID} systemroot \windows
bcdedit /set{YOURGUID} winpe yes
bcdedit /set {YOURGUID} detecthal yes

10. 现在,创建 bootmgr 条目以启动引导管理器:

    bcdedit /create {bootmgr} /d
    "Boot Manager"
    bcdedit /set {bootmgr} device boot

11. 最后,为现有的 Windows 安装设置 BCD 条目(将 Windows XP 中的显示文本更改为您希望在引导管理器引导菜单中显示的任意文本)。最后的命令还会将它设置为引导菜单中的第一个(默认)条目:

    bcdedit /create {ntldr} /d "Windows XP"
    bcdedit /set {ntldr} device partition=C:
    bcdedit /set {ntldr} path \ntldr
    bcdedit /displayorder {ntldr} /addfirst

12. 现在,通过选择适当的引导菜单条目,即可重新启动系统并使其启动先前安装的 Windows 或 Windows PE 2.0。图 5 显示了 bcdedit /enum all 的示例输出。此命令将在向 BCD 中添加完条目后列出所有条目(来自 Windows PE 1.6)。

示例输入

示例输入  (单击该图像获得较大视图)

我一直在使用一个脚本来自动执行此任务。目前它只能将引导文件复制到硬盘并设置 BCD 条目。还无法在运行 Windows 的同时将引导扇区设置为新的 Windows Server 2008 的值 — 必须在 Windows PE 环境下脱机执行。您可在**《TechNet 杂志》网站的代码下载部分找到此脚本,网址为 technetmagazine.com。要运行该脚本,运行 VBScript 的目录下必须具有下列项:

  1. BCDEdit
  2. BOOTMGR
  3. \BOOT\ 目录(来自 Windows Vista 或 Windows PE 2.0 媒体)
  4. \SOURCES\ 目录,包含有效的、可引导的 Windows PE 2.0 BOOT.WIM 文件

它会创建 BCD 并复制相应的引导文件。引导到 Windows PE 并运行 bootsect 后,即可进行双引导。

撤消双引导

撤消双引导要比实现双引导容易得多。只需运行以下命令将引导扇区还原到之前的 Windows Vista 引导扇区即可:

bootsect.exe /NT52 ALL

还原完毕后,即可删除 bootmgr 和 \boot 目录。下次重新启动时,引导扇区将改为强制启动 ntldr,而从引导流中彻底移除 Windows PE 2.0 和所有 Windows Vista 引导二进制文件。

Wes Miller 是位于德克萨斯州奥斯汀市的 Initiate Systems 公司 (InitiateSystems.com) 的技术产品经理。在此之前,他在 Winternals Software 公司任职,并曾在 Microsoft 担任项目经理。Wes 的联系方式如下:technet@getwired.com

© 2008 Microsoft Corporation 与 CMP Media, LLC.保留所有权利;不得对全文或部分内容进行复制.