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ストアに保存してあげる必要があります。図にすれば、以下のようなイメージです。
Boot Loader オブジェクト を作成するには、コマンドプロンプトから以下のように入力します。
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 “ と書かれたエントリがあることを確認してください。
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です。
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を立ち上げ、以下の通りレジストリを修正します。
キー: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で起動することができます。
起動後はデバイスドライバのインストールが自動的に行われます。