https://naba-san.hatenablog.com/


Windows Vista/7 の bootmgr と BCD を編集する / Windows Boot Manager

はじめに

Windows Vistaと7で採用されているbootmgrのエントリが吹っ飛んだときの修復作業のまとめです。



Windows Recovery Environment (回復環境) の修復手順に関するヒントなどを扱っています。

各種編集の際には、後述するWinREを使用して下さい。WinREは、DVDなどから起動される事をお勧めします。

注意事項

・OSのバージョンは合わせる (Vista/2008, 7/2008 R2)
Service Packのバージョンも合わせる (※ちょっとめんどいけど非常に重要)

SPのバージョンが一致してない状態で修復をかけると、BCDを破損させます‥。
やらかした後は本当に後が大変でした‥1日作業になるので絶対に守って下さい。後で必ず痛い目見ます。

参考リンクと関連ツール

http://technet.microsoft.com/ja-jp/library/cc721886(WS.10).aspx
TestDisk - パーティションの回復ツール。「TestDisk」の使い方なども参照。


前提知識

Windows Vista(Windows Server 2008), Windows 7(Windows Server 2008 R2)

これらのOSは、ブートローダというかマネージャとして Windows Boot Manager が使用されています。

NT OS Loader

Windows NT, 2000, XPで使用された NT OS Loader では、その実体が「NTLDR」として、また設定ファイルが「boot.ini」に格納されていました。これらは、Windowsから認識可能な第1パーティション上のルートディレクトリに格納されます。つまり、大抵の場合はCドライブです。

Windows Boot Manager

Windows Boot Managerでは、その実体が「bootmgr」として、設定ファイルが「BCD」と呼ばれる、構造を持つバイナリファイルに格納されています。

ここで扱うのは、Legacy BIOS環境においてMBRフォーマットされたドライブのみで、EFI環境又はGPTフォーマットされたドライブについては取り扱いません。

UUID (汎用一意識別子)

UUIDも参照。
Windows Vista/7では、通常の起動手順と、休止モード等からの復旧が別々に定義されており、OSを複数インストールする場合はともかく、OSを単体インストールしているだけでもBCDへの起動エントリは複数登録されます。
これらを区別する為に、Windows Boot Managerでは登録エントリをUUIDで管理します。ここでは、「そのような識別子が存在する」という程度に理解しておけば良いと思います。

EFI領域 (システム予約領域)

Windows 7(Windows Server 2008 R2)の場合、インストールの際にシステム用のパーティションを区切ると(区切らなくても自動的に)、「システムで予約済み」という名前で100MBのパーティションが先頭に作成されます。
Windows Vistaの場合、プリインストールされた一部のOEM製品においては、同様のパーティションが先頭に作成されています(※Windows Server 2008は検証していません)。それ以外のWindows Vista(Windows Server 2008)、つまりインストールディスクを用いてインストールされた環境では、この「システム予約領域」は作成されません。


主な構成

今回は、UEFIによる起動管理を使用しない場合における、Windows Boot Managerのファイル構成等を示します。

Windows Boot Manager

ここには、「Windows Boot Manager」の実体として、次のファイルが格納されています。それぞれシステム・隠しファイル属性を持っている為、コマンドプロンプトからの編集・管理の際はattribコマンドなどを用いて属性を変更する必要があります。

・bootmgr - Windows Boot Managerの実体です。NT OS LoaderにおけるNTLDRに相当します。
・boot\ - Windows Boot Managerが使用するファイル群が格納されたディレクトリです。特に各種の言語ファイルが格納されています。
・boot\ja-JP\ - Windows Boot Managerの言語ファイルの一例です。
・boot\BCD - Windows Boot Managerが管理する、起動エントリを含む構造体バイナリファイルです。NT OS Loaderにおけるboot.iniに相当します。

※ 似たような名前でBCDのバックアップファイルが格納されている事があります。これらは編集順に全て格納されるようですので、トラブルの際は、必要に応じてこれらを「BCD」に上書きコピーすると良いかもしれません(元のファイルもバックアップコピーしておく事)。

編集・管理の際は次のコマンドが使えると思います。

(基本)
bcdedit.exe - BCDのエントリ書き換えを行う
bootrec.exe - BCDを含むブートレコードの修復・再構築を行う
(応用)
bootsect.exe - ブートレコードの書き換えを行う
attrib.exe - BCDファイルの操作等における属性変更に使用

編集・管理の際は、次のコマンドライン・オプションが使えると思います。

bcdedit /enum all /v - BCDの登録エントリを全て表示する。

bcdedit /set {UUID} hoge fuga - {UUID}のhogeの値をfugaに設定する。
(例) bcdedit /set {UUID} description "Windows Recovery Environment"
{UUID}を持つ登録エントリについて、descriptionの値に"Windows Recovery Environment"を設定します。
bcdedit /deletevalue {UUID} hoge - {UUID}の値を削除します。

Windows Recovery Environment

ここでは「WinRE」と表記します。日本語では「Windows 回復環境」と訳され、正常な起動を妨げる可能性のあるエラーの診断・復元を補助するツールから成る、Windows PEベースの回復環境です。

EFI領域が存在する環境では、(EFI領域ではなく)Windows システムボリューム上のルートディレクトリに「Recovery」というディレクトリが存在します。この下にUUIDの名前を持つディレクトリを一つ挟んで「Winre.wim」と「boot.sdi」といった名前でファイルが存在します。前者がWinREの実体です。

原則としてインストールディスクの修復オプションから、またEFI領域が存在するWindowsでは、起動オプションから呼び出すことができます。


設定例

下記はbcdeditで登録エントリを表示した場合の例です。
仮想マシン上でWindows 7をインストールした直後のものを掲載していますので、修復の際に参考にして頂いたらと思います。

尚、UUIDは環境により異なりますので、あくまで参考程度に使用して下さい。

C:\Windows\system32>bcdedit /enum all /v

Windows ブート マネージャー

                                                              • -

identifier {9dea862c-5cdd-4e70-acc1-f32b344d4795}
device partition=Z:
description Windows Boot Manager
locale ja-JP
inherit {7ea2e1ac-2e61-4728-aaa3-896d9d0a9f0e}
default {15755bdf-e70d-11e0-8f17-e473cdac8334}
resumeobject {15755bde-e70d-11e0-8f17-e473cdac8334}
displayorder {15755bdf-e70d-11e0-8f17-e473cdac8334}
toolsdisplayorder {b2721d73-1db4-4c62-bf78-c548a880142d}
timeout 30

Windows ブート ローダー

                                                              • -

identifier {15755bdf-e70d-11e0-8f17-e473cdac8334}
device partition=C:
path \Windows\system32\winload.exe
description Windows 7
locale ja-JP
inherit {6efb52bf-1766-41db-a6b3-0ee5eff72bd7}
recoverysequence {15755be0-e70d-11e0-8f17-e473cdac8334}
recoveryenabled Yes
osdevice partition=C:
systemroot \Windows
resumeobject {15755bde-e70d-11e0-8f17-e473cdac8334}
nx OptIn

Windows ブート ローダー

                                                              • -

identifier {15755be0-e70d-11e0-8f17-e473cdac8334}
device ramdisk=[C:]\Recovery\15755be0-e70d-11e0-8f17-e473cdac83
34\Winre.wim,{15755be1-e70d-11e0-8f17-e473cdac8334}
path \windows\system32\winload.exe
description Windows Recovery Environment
inherit {6efb52bf-1766-41db-a6b3-0ee5eff72bd7}
osdevice ramdisk=[C:]\Recovery\15755be0-e70d-11e0-8f17-e473cdac83
34\Winre.wim,{15755be1-e70d-11e0-8f17-e473cdac8334}
systemroot \windows
nx OptIn
winpe Yes
custom:46000010 Yes

休止状態からの再開

                                                              • -

identifier {15755bde-e70d-11e0-8f17-e473cdac8334}
device partition=C:
path \Windows\system32\winresume.exe
description Windows Resume Application
locale ja-JP
inherit {1afa9c49-16ab-4a5c-901b-212802da9460}
filedevice partition=C:
filepath \hiberfil.sys
pae Yes
debugoptionenabled No

Windows メモリ テスター

                                                              • -

identifier {b2721d73-1db4-4c62-bf78-c548a880142d}
device partition=Z:
path \boot\memtest.exe
description Windows メモリ診断ツール
locale ja-JP
inherit {7ea2e1ac-2e61-4728-aaa3-896d9d0a9f0e}
badmemoryaccess Yes

EMS 設定

                                                              • -

identifier {0ce4991b-e6b3-4b16-b23c-5e0d9250e5d9}
bootems Yes

デバッガー設定

                                                              • -

identifier {4636856e-540f-4170-a130-a84776f4c654}
debugtype Serial
debugport 1
baudrate 115200

RAM 不良

                                                              • -

identifier {5189b25c-5558-4bf2-bca4-289b11bd29e2}

グローバル設定

                                                              • -

identifier {7ea2e1ac-2e61-4728-aaa3-896d9d0a9f0e}
inherit {4636856e-540f-4170-a130-a84776f4c654}
{0ce4991b-e6b3-4b16-b23c-5e0d9250e5d9}
{5189b25c-5558-4bf2-bca4-289b11bd29e2}

ブート ローダー設定

                                                              • -

identifier {6efb52bf-1766-41db-a6b3-0ee5eff72bd7}
inherit {7ea2e1ac-2e61-4728-aaa3-896d9d0a9f0e}
{7ff607e0-4395-11db-b0de-0800200c9a66}

ハイパーバイザー設定

                                    • -

identifier {7ff607e0-4395-11db-b0de-0800200c9a66}
hypervisordebugtype Serial
hypervisordebugport 1
hypervisorbaudrate 115200

再開ローダー設定

                                                              • -

identifier {1afa9c49-16ab-4a5c-901b-212802da9460}
inherit {7ea2e1ac-2e61-4728-aaa3-896d9d0a9f0e}

バイス オプション

                                                              • -

identifier {15755be1-e70d-11e0-8f17-e473cdac8334}
description Ramdisk Options
ramdisksdidevice partition=C:
ramdisksdipath \Recovery\15755be0-e70d-11e0-8f17-e473cdac8334\boot.sdi

C:\Windows\system32>