共用方式為


桌面檔案Windows XP 和 Windows PE 2.0 雙重開機

Wes Miller

下載本文程式碼: Desktop2008_02.exe (151KB)

在上一期的《桌面檔案》中,我曾提到 Windows PE 已變成一種修復工具,另外也說明了如何從第二個磁碟分割來使用它。我最近收到的疑問,讓我聯想到將這進一步發揚光大的作法,可能值得探討一番,那就是併用 Windows PE 2.0 和 Windows XP。

畢竟,諸位讀者中很多人使用 Windows® XP 已有一段時間,而 Windows PE 是 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 開機機制,自 Windows Vista® 開始稱為開機設定資料庫 (Boot Configuration Database),或 BCD (請參閱 microsoft.com/whdc/system/platform/firmware/bcd.mspx)。不過無論您指的是舊版的 boot.ini 或是新的 BCD 機制,Windows 通常都可以啟動其他作業系統,即使是要將開機處理序交由其他開機載入器進行。

開始前,一定要記住 Windows PE 2.0 只能在同時具有完整進階組態與電源介面 (ACPI) 功能且 384MB (理想是 512MB) RAM 的系統上運作。如我在五月號的專欄 (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 的話,甚至可以將它存放到要復原的磁碟分割上。這類的磁碟上 (on-disk) 復原是許多問題的最佳解決方案 (除了實體磁碟損毀例外)。但除非資料原先有受到保護,然後作為復原的一部分進行還原,否則對於還原使用者資料顯然沒什麼效用。請記住,您應該使用漫遊設定檔並從電腦備份資料,來預防這類的損失。您更應該確保所採用的任何一種復原機制都能為使用者緩和任何可能的資料損失 (包括因 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」的錯誤訊息。

您應該很樂於知道 ntldr 完全與舊版相容,但是它當然不與未來版本相容。這表示 Windows XP 的 ntldr 可以啟動 Windows 2000,但反之則不然。這也正是為什麼如果您打算雙重開機,一定要先安裝最舊版的作業系統的原因。再加上 ntldr 並沒有版本編號,因此牢記這一點更是重要。

Ntldr 是真實模式 (16 位元) 應用程式,它會啟動 NTDetect.com,這個 NTDetect.com 會執行基本的裝置偵測,然後啟動核心:ntoskrnl.exe (這可能是好幾個檔案之一 — 永遠重新命名為 ntoskrnl.exe)。核心是 Windows 開機程序的重要元件。

以上簡述的開機程序有點過分簡化,而且我也省略了 Win32® 的整個初始化作業,不過那跟本文的討論範圍無關。如果您想瞭解更詳細的資訊,我建議您閱讀 Mark Russinovich 和 David Solomon 合著的《Windows Internals》第四版 (Microsoft Press®,2004 年)。

另外一件要注意的事,就是當您從 CD 開機時,Windows 安裝程式和 Windows PE 會執行 setupldr.bin 而非 ntldr。這個檔案實際上包含的開機程式碼有點不太一樣,所以才能從 CD 開機 (ntldr 則不能)。這是為什麼在啟動 Windows PE 1.x 時,您必須將 setupldr.bin 重新命名為 ntldr,並把它放到磁碟上的緣故。這也是為什麼檔案之後無法載入 boot.ini 檔案 (因為 setupldr.bin 的設計只能從 CD 開機,結果 boot.ini 被認為是不必要的) 的原因。

Windows Vista 及之後版本

Windows Vista 變更了這個程序的許多部分,而 Windows Server 2008 更是將它改頭換面,它啟用 IA32 (32 位元支援) 從 EFI 開機 — 到目前為止,只有 Itanium 架構系統才辦得到。對於以 BIOS 為主的系統,開機程序的初始步驟大致上保持不變。主要的差別在於,初始化並執行後續步驟的開機載入器是 BOOTMGR。

它會在開機目錄中尋找 BCD 檔案,這實際上是它自己的登錄 Hive。BCD 包含要啟動的開機項目 (包括預設值)。請參閱 [圖 1] 查看映像類型 (可執行檔類型),並參閱 [圖 2] 查看要啟動的特定應用程式類型。這些項目當中的一個 (或多個) 項目可以作為 ntldr 的參考。但實際上只有一個項目可以參考用來載入 ntldr 已知 GUID (請參閱 [圖 3] 的第五行)。然後 bootmgr 會根據系統是否正在開機、進入休眠或開機至 ntldr 或其他開機管理程式 (在這種情況下,它會指向其他開機磁區,並啟動該載入器),來決定接下來要載入的項目。如果您是從非 Windows 作業系統進行雙重開機,這是最常見的情況。您可以在 microsoft.com/whdc/system/platform/firmware/bcd.mspx 找到更詳細的資訊。

Figure 3 標準應用程式物件

描述 BCDEdit 識別碼 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 開機 CD 上有 bootsect.exe 和 bcdedit.exe 的複本 (您可以在 Windows Vista 安裝 DVD 上找到這兩個檔案)。
  2. 將 Windows XP 系統開機到 Windows PE 2.0 CD。
  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 從硬碟啟動 Windows PE 的 RAMDisk 項目

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 的範例輸出。這個命令會列出加入項目 (這是從 Windows PE 1.6 裡面加入的) 後在 BCD 中的全部項目。

範例輸入

範例輸入  (按影像可放大)

我還在努力設計一個可以自動執行這項工作的指令碼。目前它只能將開機檔案複製到硬碟,然後設定 BCD 項目。它無法在執行 Windows 的同時將開機磁區設成新的 Windows Server 2008 值 — 這必須在 Windows PE 中以離線狀態進行。您可以在 TechNet Magazine 網站的程式碼下載區找到這個指令碼,網址是 technetmagazine.com。若要執行這個指令碼,您應該將下列項目放在執行 VBScript 的同個目錄中:

  1. BCDEdit
  2. BOOTMGR
  3. \BOOT\ 目錄 (從 Windows Vista 或 Windows PE 2.0 媒體)
  4. 含有效、可開機 Windows PE 2.0 BOOT.WIM 檔案的 \SOURCES\ 目錄

它會建立 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 and CMP Media, LLC. 保留所有權利;未經允許,嚴禁部分或全部複製.