Home > Windows にまつわる e.t.c.

VHD boot から Hyper-V VM 移行する方法


VHD boot 環境を Hyper-V VM に移行する場合、VM アーキテクチャーを合わせるために元の環境が BIOS の場合は Gen 1 VM へ、UEFI の場合は Gen 2 VM へ移行します。

BIOS 環境になっているのか、UEFI 環境になっているかの確認はこちらを見てください。

OS の起動環境が BIOS なのか、UEFI なのかを PowerShell で確認する

 

困った事に、VHD boot 環境の VHD には boot loader が含まれていないためそのままでは起動できません。

この問題は、bcdboot コマンドで boot loader を移行する VHD に書き込んでやれば解決します。

 

VHD boot(物理マシン)から VM 移行した場合は、ハードウェア環境が大幅変更になるので、ほぼ確実に再アクティベーションが必要になります。
再アクティベーション準備をお忘れなく。

 

 

BIOS 環境からの移行の場合

Windows Server 2008 R2 とかで、VHD が .vhd の場合は、作業前に Convert-VHD で .vhdx にアップデートしましょう。(必須ではありませんが推奨)

こんな感じ

Convert-VHD C:\VHD\hogehoge.vhd C:\VHD\hogehoge.vhdx

 

それでは、boot loader の書き込みを開始しましょう。

Gen 1 で VM を作り、コンバートした .vhdx と、VHD OS のインストールメディアをセットし VM を起動します。

すると、VHD での起動が出来ないのでインストールメディアで VM が起動します。
起動したら Shift + F10 でコマンドプロンプトを開きます。

以下コマンド

diskpart Diskpart 起動
list volume ボリュームの確認
select volume 1 C を選択
active ボリュームを Active にする
exit Diskpart 終了
bcdboot c:\windows /l ja-JP C:\Windows で起動する boot loader を書き込む

この状態でインストールメディアを外して VM を再起動すると VHD から OS が起動します。

 

 

UEFI 環境からの移行の場合

【制限事項】
Hyper-V では Gen 2 VM が Windows Server 2012 / Windows 8 以降なので、Gen 2 VM をサポートしていない Windows Server 2008 R2/ Windows 7 以前の OS が UEFI 環境だった場合はこの手順では移行できません。(Hyper-V VM には移行できないかも)

 

BIOS 環境の場合は、bcdboot で boot loader を VHD に書き込みましたが、UEFI 環境の場合は VHD が GPT になるので bcdboot が使えません。(bcdboot は MBR が前提)
このため、boot loader を VHD に書き込むことができません。

このため、Gen 2 VM に素の OS をインストールし、素の OS の boot loader を使って移行した VHD からの起動をします。

 

素の OS のインストールが済んだら、移行する VHD をマウントします。

光学ドライブがドライブレターの間に差待っていると気持ちが悪いので、光学ドライブを後ろのドライブレターに変更し、マウントした VHD のドライブレターを調整します。
場合によっては、マウントした VHD がオフラインになっているので、オンラインにしてドライブレターを調整します。

ドライブレター調整後

 

ドライブレター調整が済んだら、bcdboot で移行した VHD からの起動を指定(d:\windows)した boot loader を追加し再起動します。

PS C:\> bcdboot d:\windows /l ja-JP
ブート ファイルは正常に作成されました。
PS C:\> Restart-Computer

 

再起動すると boot メニューのデフォルトが移行した VHD になっているので、そのまま起動します。

boot loader 用にインストールした素の OS はからの起動は不要なので、msconfig で boot memu からも削除します。

 

素の OS の OS ボリュームも不要なので、削除するかドライブレターを削除すると良いでしょう。

 

 

BSoD で起動しない場合の対処

UEFI 環境の Windows Server 2012 R2 を Gen 2 VM に移行する場合は PnP が効いて問題なく起動できるのですが、BIOS 環境が SCSI とか Gen 1 環境とストレージタイプが違う Windows Server 2008 R2 とかの場合は PnP がうまく働かず BSoD になることがあります。
BSoD は一瞬だけ表示されすぐ再起動しちゃいますが、Stop 0x7b になっています。

VHD の OS を sysprep すれば良いのですが、元のマシンが故障して使えないとか、OEM だとか、sysprep が難しい環境の場合は以下のようにします。

 

再度インストールメディアで起動し、VHD に入っている OS のレジストリをハイブマウントし、IntelIDE を boot 時ロードの設定にします。

設定するレジストリは、オリジナルの HKEY_LOCAL_MACHINE\SYSTEM\ControlSetXXX\Services\intelide になります。

XXX が複数出来ている場合は、HKEY_LOCAL_MACHINE\SYSTEM\Select の Current に現在使用されている番号が格納されているので、そいつを確認します。

HKEY_LOCAL_MACHINE を選択し、ハイブの読み込み

C:\Windows\System32\config\system を選択(VHD が C: と認識されている場合)

マウントする名前(この例では vhd)を指定

マウントされたハイブを展開

HKEY_LOCAL_MACHINE\マウント名\SYSTEM\Select の Current の値を確認(この例では 1)

HKEY_LOCAL_MACHINE\SYSTEM\ControlSetXXX\Services\intelide(この例では ControlSet001) を開き Start の値を 0 (ブート時にロード) に変更

 

マウントされたハイブ(この例では vhd)を選択してハイブのアンロード

 

インストールメディアを外して VM を再起動すると、今度は BSoD にならず VHD から OS が起動するはずです。

 

back.gif (1980 バイト)

home.gif (1907 バイト)

Copyright © MURA All rights reserved.