2012-12-08

[windows] Windows 回復環境 (WinRE) を修理する

Windows 本体が起動しない場合は WinRE もしくはインストールメディアから利用可能なスタートアップ修復によって自動修復することができます。しかしインストール済みの WinRE 自体が起動しなくなった場合は自分で修理する必要があるようです。

winre.win の入ったパーティーションの開始位置をずらした場合や、BCD (ブート構成データ) から WinRE 自体のエントリをうっかり消去してしまった場合は、bootrec /rebuildbcd を使っても自動修復できません。そこで bcdedit を使ってちまちま再設定するのではなく reagentc を使うと以下の手順で簡単に再設定出来ることが分かりました。
  1. winre.win というイメージをインストールディスクから抽出するか設置先から救出してきて、C:\Windows\System32\Recovery に戻します
  2. reagentc /enable というコマンドで BCD エントリとディスクイメージの設置 (winre.win のコピーではなく移動w) が完了します
  3. 内部状態 ReAgent.xml には設定していると記録されていて、実際には BCD エントリが存在していない矛盾した状態になっているとエラーが出ます。その場合は ReAgent.xml を初期化すると無事動きます。
    初期状態の ReAgent.xml は C:\Windows\WinSxS 内のどこかにあるようなので検索してみてください。手元の Windows 8 では C:\Windows\WinSxS\x86_microsoft-windows-winre-recoveryagent_... みたいな所にありました。
Windows 回復環境の現在の設定状況については reagentc /info で調べることができ、WinRE の無効化は reagentc /disable で行えます。

壊れる原因について
Windows において MBR 経由の従来型のブート方式ではパーティーションごとの UUID 的な何かではなく、ディスク内でのパーティーションの開始位置によってどの OS を起動するべきかを BCD 内で指定しています。

よって gparted などで C:\Windows の入った領域の開始位置をずらす操作 (右側への拡張と縮小ではなく、左側への移動) を行うとブート不能になり、スタートアップ修復が必要になります。

スタートアップ修復を行おうにも何もブートしない場合はインストールメディアから起動すればスタートアップ修復が行えます。

スタートアップ修復に頼らずに BCD を修復するには
Windows に関しては WinRE 内に収録されている bootrec /rebuildbcd でおそらく復活します。

手動で直したい場合には BCD を bcdedit で更新すると直ります。具体的には以下の手順で行えます。
  1. WinRE のコンソールを開きます。
  2. bcdedit /enum osloader で identifier を確認します。device の所が Unknown になっているエントリが壊れています。
  3. diskpart を使って list volume などでドライブレターを確認し、dir /a c:\ などで内容を確認します。
  4. bcdedit {identifier} /set device partition=C: などと OS の入っているドライブを指定して正しいパーティーション開始位置をセットします

関連情報
スタートアップ修復 - Microsoft Windows
GParted FAQ - 14: After resizing my Windows 7 or Vista partition, my computer won't boot. How can I fix this?
win7 システムの修復
Installing WinRE to hard disk - MSFN Forum