デスクトップ ファイルWindows XP と Windows PE 2.0 によるデュアル ブート

Wes Miller

この記事で使用しているコードのダウンロード: Desktop2008_02.exe (151KB)

「デスクトップ ファイル」の以前の記事で、Windows PE を回復ツールとして使用できるようになったことについて説明し、それを 2 つ目のパーティションから使用する方法を示しました。最近あった問い合わせから、このことについて新たな説明を加える価値があると思い、Windows PE 2.0 と Windows XP を共に使用するという新しい方法について説明することにしました。

というのも、皆さんの多くは、しばらく前から Windows® XP を使用しているでしょうし、Windows PE 2.0 は、マイクロソフトが開発を推し進めているバージョンです (Windows PE 1.x は、今後更新の予定がないことに注意してください)。

Windows PE 1.x と Windows PE 2.x の重要な違いの 1 つは、Windows PE 2.x は、標準のブート インターフェイスを使用してブートできる点です (これに対して Windows PE 1.x では特殊な方法を使用する必要があります)。Windows PE 1.x と 2.x は、2 つ目のパーティションからブートできます。しかし、オペレーティング システムがインストールされているパーティションと同じブート パーティションでブートするという便利な方法を使用することで、多くのメリットがもたらされます。まず、このメリットについて説明します。

Windows の 2 種類のブート方法

Windows NT® では、デュアル ブートに対して比較的高い安定性が確保されていました。しかし、拡張ファームウェア インターフェイス (EFI) ベースのコンピュータが、従来の IBM の PC/AT BIOS に取って代わられ始めるにつれて、マイクロソフトでは、EFI とより適切に動作するように、またすべてのアーキテクチャで 1 つのブート メカニズムを使用できるように、Windows ブート メカニズムを変更しています。Windows Vista® で導入された Windows の新しいブート メカニズムは、ブート構成データベース (BCD) と呼ばれます (詳細については、microsoft.com/whdc/system/platform/firmware/bcd.mspx を参照してください)。ただし、従来の boot.ini であろうと新しい BCD メカニズムであろうと、Windows では、ブート プロセスが別のブート ローダーに移管することになっても、一般に別のオペレーティング システムをブートできます。

詳しい説明をする前に、注意事項があります。Windows PE 2.0 は、Advanced Configuration and Power Interface (ACPI) に完全に準拠し、384 MB (理想的には 512 MB) の RAM が搭載されているシステムでしか動作しません。5 月号の記事 (technetmagazine.com/issues/2007/05/DesktopFiles) で説明したように、ACPI に準拠していないシステムでは、Windows PE 2.0 をブートできません。また、Windows PE 2.0 は、RAMDisk からブートされる必要があるため、RAMDisk、スクラッチ領域、およびすべての RAM ワーキング セットを保持するのに十分な RAM が必要になります。システムに 384 MB 未満の RAM しか搭載されていない場合は、この方法は使用せずに、Windows PE 1.6 を使用してください。Windows PE のサイズを縮小することに長けている場合でも、256 MB の RAM しかないシステムで動作させることはできません。

解決できる問題

では、Windows PE 2.0 を Windows XP と同じパーティションからブートすることで、解決できる可能性がある問題について見てみましょう。

完全なシステム回復 - これは、Windows PE を Windows XP と同じパーティションから直接ブートすることで実行できるようになったタスクの 1 つです。Windows PE 2.0 (その前は Windows PE 1.6) は、完全に RAMDisk からブートできるため、ディスク全体のイメージを再作成できます。また、パーティション全体のイメージを再作成する必要がないため、ImageX を使用して Windows XP ファイルを自体で復元できます。

ユーザーがスタートアップ時に Windows PE をブートできるようにすることで、リモートで作業している場合でも、各自のシステムを回復できます。イメージは、2 つ目のパーティション、ネットワーク共有 (モバイル ユーザーがいない場合)、回復用の DVD、または USB ハード ディスクから展開できます。また、ImageX を使用している場合には、回復を実行しているパーティションにイメージを保存することもできます。このようなオンディスクの回復は、多くの問題にとって優れたソリューションです (ただし、ディスクの物理的な破損は除きます)。ユーザー データの復元に関しては、そもそもそのデータが保護されていて、回復処理の一環として復元されない限り、この方法が適していないことは明らかです。ユーザー データの損失を回避するには、移動プロファイルを使用し、PC のデータをバックアップする必要があることに注意してください。また、使用する回復メカニズムにより、データ損失の可能性を抑えられるかどうかを確認する必要もあります (データの損失には、EFS 暗号化キーの再設定によるものも含みます)。

ファイルの回復 - Windows PE では、最初にインストールされた Windows がブートされない場合でも、システムを稼働して維持するためのメカニズムも提供されます。その場合、ユーザーがすぐに作業を再開できるように、ブートとユーザー データの回復は、別のシステム (ユーザーが使用できるバックアップ システムが稼働中の場合) または別の場所で実行されます。

システムの修復 - Windows XP で Windows PE をブートすることで、トラブルシューティング用の一連のスクリプトを実行するか、ユーザーによる操作を必要とする簡単な修復アプリケーションや回復アプリケーションを実行して、システムを修復することができます。このプロセスは、完全なシステム回復のプロセスと似ていますが、範囲がより絞り込まれています (そのため、ユーザー データ破損のリスクがありません)。

Windows PE を Windows XP と同じパーティションでブートする場合のメリットについて理解できたところで、次に、目的のソリューションにプロセスを適用できるよう、その詳細について見てみましょう。

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 ビット) アプリケーションです。NTDetect.com により、基本的なデバイス検証が実行され、カーネル ntoskrnl.exe が実行されます (ntoskrnl.exe は、複数ファイルの 1 つである場合がありますが、必ず ntoskrnl.exe という名前に変更されます)。カーネルは、Windows ブート プロセスの重要なコンポーネントです。

ここで説明したブート プロセスの概要は、いくらか単純化しています。Win32® の初期化についてはすべて省略しましたが、ここでの説明には関係がないので問題ありません。詳細については、Mark Russinovich と David Solomon 共著の『Windows Internals, Fourth Edition』(Microsoft Press®、2004 年) を参照することをお勧めします。

もう 1 つ注目すべき点は、CD からブートするとき、Windows セットアップと Windows PE では、ntldr ではなく setupldr.bin が実行されることです。実は、このファイルには、若干異なるブート コードが含まれています。そのため、ntldr ではできない CD からのブートが可能になります。Windows PE 1.x をブートするために、setupldr.bin の名前を ntldr に変更してディスクに配置するのは、このことが理由です。また、このファイルがその後 boot.ini ファイルを読み込めない理由も同様です (setupldr.bin は CD ブート専用にデザインされていて、boot.ini は必要ないとされているからです)。

Windows Vista 以降

Windows Vista では、このプロセスの多くの部分が変更されました。Windows Server 2008 では、このプロセスがさらに変更され、(Itanium ベースではないシステムでは使用できなかった) EFI からのブートで IA32 (32 ビットのサポート) が使用されます。BIOS ベースのシステムに関しては、ブート プロセスの初期手順の大部分は変更されていません。主な変更点は、BOOTMGR が、初期化されるブート ローダーで、次の手順を実行する点です。

BOOTMGR は、ブート ディレクトリで BCD ファイルを検索します。検索する場所は、実質的には BOOTMGR 自体のレジストリ ハイブです。BCD には、ブートするブート エントリ (既定のエントリを含む) が含まれます。イメージの種類 (実行可能なファイルの種類) については 図 1 を、実行する具体的なアプリケーションの種類については 図 2 を参照してください。これらのエントリの 1 つ (または複数) は、ntldr を参照できます。これらのうち 1 つだけが、ntldr の読み込みに使用される既知の GUID を実際に参照できます (図 3 の 5 行目参照)。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 PE が Windows Vista のブート マネージャを使用して仲介役としてどのような役割を果たしているのか、おわかりになり始めたでしょう。この役割により、統合された回復ツールに Windows PE 2.0 を追加しながら、Windows XP またはそれ以前のバージョンの Windows も引き続きブートすることが可能になります。

もちろん、ブート プロセスに別の手順を追加することになりますが、それはマイクロソフトによってデザインされた手順です。新しい BOOTMGR のインフラストラクチャは、既存の ntldr と他のサードパーティ製ブート マネージャとの下位互換性を維持する必要があることが認識されていたため、BOOTMGR は、そうしたソリューションをサポートするように意図的に構築されています。

Windows のブート方法と新しい BCD の動作方法がわかったところで、この 2 つを組み合わせて、Windows PE 2.0 を既存の Windows XP で使用するにはどうするのでしょうか。Windows Vista のブート セクタ (システムに BOOTMGR の起動を指示するブート コード) を変更するには、2 つの方法があります。その 1 つは、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

このコマンドにより、ブート セクタが、BOOTMGR の起動方法を認識する Windows Vista 対応のブート セクタとして設定されます。

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. 続いて、Windows PE を読み込むための BCD エントリを作成します。

    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 が返されます。{YOURGUID} を、返された実際の GUID に置き換えます。図 4 に示すように、これらはハード ディスクから Windows PE をブートする RAMDisk のエントリです。

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 を実行した場合の出力の一例です。このコマンドは、エントリを追加した後の BCD のエントリをすべて一覧表示します (これは Windows PE 1.6 内から実行できます)。

出力例

出力例  (画像を拡大するには、ここをクリックします)

私は、このタスクを自動的に実行できるスクリプトの作成に取り組んできました。現時点では、ハード ディスクへのブート ファイルのコピーと、BCD エントリの設定のみ実行できます。Windows の実行中に、ブート セクタを新しい Windows Server 2008 対応のブート セクタとして設定することはできません。その作業は、Windows PE 環境を使用してオフラインで実行する必要があります。このスクリプトは、TechNet Magazine** Web サイト (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 社に勤務し、その後はマイクロソフトでプログラム マネージャとして働いていました。Wes の連絡先は、technet@getwired.com (英語のみ) です。

© 2008 Microsoft Corporation and CMP Media, LLC. All rights reserved; 許可なしに一部または全体を複製することは禁止されています.