Hyper-V から VHD Boot への移行

前回は、従来の Boot.ini にかわる新しいブート構成情報の格納庫である BCDストア について簡単に解説しました。

ブート構成データ(BCD)ストアを理解すれば VHDブート は簡単
https://blogs.technet.com/junichia/archive/2009/10/26/3289120.aspx

これを踏まえ、Hyper-V 上に作成してあるVHDファイルを、VHD Bootに移行してみます。何を行っているのかが理解しやすいように、ショートカット的な作業は一切行っていません。

1. VHD Boot 用の Boot Loader オブジェクトを作成する

前回の解説でも触れていますが、新しいOSをブートできるようにするには、Boot Loader オブジェクトを新たに作成し、BCDストアに保存してあげる必要があります。図にすれば、以下のようなイメージです。

BCDStore2

Boot Loader オブジェクト image を作成するには、コマンドプロンプトから以下のように入力します。

C:\> bcdedit /create /d “Winodws 7 – VHD Boot” /application OSLOADER エントリ {59a1b361-8694-11de-ba0c-ea7587cc7300} は正常に作成されました。

これでひとまず「空のオブジェクト」が出来ました。/d は description のことです。ここでは、"Winodws 7 - VHD Boot"という文字列を設定しました。/application は ApplicationタイプのBCDオブジェクトを作成することを示しており、そのあとに osloader と指定することで ブートローダーオブジェクトとなります。

/application には、osloader 以外にも、BOOTSECTOR/RESUME/STARTUP などを指定することができますが、ひとまず今回は説明しません。

コマンドの実行後に出力されるCLSID {59a1b361-8694-11de-ba0c-ea7587cc7300} は、このオブジェクトを識別するための IDとなります。他のオブジェクトのIDとものすごーく似ていますが、微妙に違うので注意してください。

ためしに、以下のコマンドで、いま作成した Boot Loaderオブジェクトを参照してみてください。/enum OSLOADER は、OSLOADERオブジェクトを全て表示するという意味です。

C:\> bcdedit /enum OSLOADER

出力されたエントリの中に、”Winodws 7 – VHD Boot “ と書かれたエントリがあることを確認してください。

image

2. 起動に必要なパラメタを設定する

いま作成した Boot Loader オブジェクトには、identifier と description 以外のパラメタが何も設定されていません。そこで、OSの起動に必要な情報を埋め込んであげる必要があります。まずは、以下をご覧ください。これは上記画面ショットの中から既存のOSブートローダー情報を抜き出したものです。

Windows ブート ローダー
--------------------------------
identifier {current}
device partition=C:
path \Windows\system32\winload.exe
description Windows Server 2008 R2
locale ja-JP
inherit {bootloadersettings}
recoverysequence {9afda1cc-9772-11de-abb0-e0195a1514fa}
recoveryenabled Yes
osdevice partition=C:
systemroot \Windows
resumeobject {9afda1ca-9772-11de-abb0-e0195a1514fa}
nx OptOut
hypervisorlaunchtype Auto

identifier や description 以外に、多くの情報が必要であることがわかります。

そこで、同じように必要なパラメタを埋め込んでいきましょう。

BCDオブジェクトにパラメタを設定するには、「BCDEDIT /Set {CLSID} <パラメタ名> <値> 」を使用します。

今回のCLSIDは {9afda1d7-9772-11de-abb0-e0195a1514fa}   です。

■ブートパーティションとシステムパーティションの指定

ブートパーティションとOSがインストールされているパーティションを指定します。通常は partition=C: などと指定しますが、VHD Boot を行う場合には、VHD=<VHDファイルのパス> を指定します。以下の例では、「C:\VHDBOOT\Win7_VHDBoot\Win7_VHDBoot.vhd」 がVHDファイルのパスです。

C:\>bcdedit /set {9afda1d7-9772-11de-abb0-e0195a1514fa} device VHD=[C:]\VHDBOOT\Win7_VHDBoot\Win7_VHDBoot.vhd
C:\>bcdedit /set {9afda1d7-9772-11de-abb0-e0195a1514fa} osdevice VHD=[C:]\VHDBOOT\Win7_VHDBoot\Win7_VHDBoot.vhd

注意しなければならないのは、ドライブ名を [ ] でくくるという点です。

■ブートローダーのパス

ドライブを指定する必要はありません。

C:\>bcdedit /set {9afda1d7-9772-11de-abb0-e0195a1514fa} path \Windows\system32\winload.exe

■OSのシステムルートのパス

C:\>bcdedit /set {9afda1d7-9772-11de-abb0-e0195a1514fa} systemroot \Windows

■ブートローダーのロケール

C:\>bcdedit /set {9afda1d7-9772-11de-abb0-e0195a1514fa} locale ja-JP

■HALの再認識を有効にする

ハードウェアが変わることになるので、念のために入れておいてください。

C:\>bcdedit /set {9afda1d7-9772-11de-abb0-e0195a1514fa} detecthal yes

■ブートメニューの編集

作成したエントリがブートメニューに表示されるように、以下のコマンドで設定します。/addlast はメニュー一覧の最後に追加することを表しています。

C:\>bcdedit /displayorder {9afda1d7-9772-11de-abb0-e0195a1514fa} /addlast

コマンドプロンプトから bcdedit と入力すると、以下のように表示されていればOKです。

 image

3.AHCIドライバ(Msahci.sys)を有効にする

全項までで、ひとまずVHDブートに関する設定は完了です。

が、このままOSを起動すると以下の STOPエラー が表示されることがあります(見ずらい画面ですいません)。

STOP 0x0000007B INACCESSABLE_BOOT_DEVICE

詳細はこちらをご覧ください。COMPUTERWORLDさんのサイトにも詳しく対処法が掲載されており、MSのKBよりもわかりやすいかもしれません。

COMPUTERWORLD Windows 7の仮想ハードディスクがスゴイ!─(4)https://www.computerworld.jp/topics/win7/151889-2.html

対処するには、Hyper-V上でWindows 7を立ち上げ、以下の通りレジストリを修正します。

image 
キー:HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\Msahci
値の名前:Start
値:0

4.Hyper-V上の仮想OSをシャットダウン

Hyper-V上で動作している仮想OSをシャットダウンしておきましょう。

以上で設定は完了です。

コンピューターを再起動すると、ブートメニューには先ほど追加したメニュー(今回は「Winodws 7 – VHD Boot 」)が追加され、これを選択するとこれまでHyper-Vで使用していたゲストOSをVHD Bootで起動することができます。

起動後はデバイスドライバのインストールが自動的に行われます。