SE の雑記

SQL Server の情報をメインに Microsoft 製品の勉強内容を日々投稿

Windows Server 2012 の新規インストールをした場合の Hyper-V 2.0 のゲスト OS のインポート

one comment

自宅の検証環境の 1 台は Windows Server 2008 R2 をインストールしていたパーティションを削除して、そのパーティションに対して 2012 をインストールしています。

image

このようなインストール方法をしていますので、E ドライブに格納していたゲスト OS のファイルは一通り残っているのですが、Hyper-V では認識していない状態となっています。

Hyper-V 3.0 ではエクスポートしていないゲスト OS をインポートすることができるようになっていますので、再インストール前に E ドライブに格納していたゲスト OS を取り込むことができます。
imageimage

Windows Server 2012 では Hyper-V 関連の PowerShell のコマンドレットが充実しているので GUI で [Import-VM] を使用して、コマンドラインからインポートすることも可能です。
GUI からとコマンドラインからのインポートですが私が試した限りでは以下の状態に注意する必要があるようでした。

  • 起動中の OS のイメージ (保存状態 / 起動中のスナップショット) が含まれていない
  • 新規インストールにより仮想スイッチの ID が変わってしまっているため、ゲスト OS のネットワークアダプターを再割り当て

起動中の OS のイメージが含まれているゲスト OS についてはインポートしようとすると以下のようなエラーとなります。
image

保存された状態を削除することで、インポート作業を進めることができるようになります。
作業を進めるとネットワークアダプターの再割り当てが発生し、現状のどの仮想スイッチを割り当てるかを選択することでインポートすることができるようになります。
image

仮想スイッチ (仮想ネットワーク) の情報はレジストリの[HKLMSYSTEMCurrentControlSetserviceVMSMPParametersSwitchList] に格納されているので、事前にこのレジストリの情報をエクスポートしておくと対応付けができてよいかもしれないですね。

仮想スイッチの情報に関しては以下が参考になります。
Hyper-V: Virtual Networking Survival Guide

PowerShell で実行する場合はインポートするに際してのこれらの問題をコマンドラインで解決する必要があります。

Compare-VM というコマンドレットを使用することで、インポートしようとしているゲスト OS の構成ファイル (XML) からインポート時の問題がないかをレポートすることができます。
image

問題に応じた解決を実施し、解決した状態をインポートすることで PowerShell から再インストール前の Hyper-V 2.0 のゲスト OS をインポートすることができます。

サンプルとしては以下のような内容になるでしょうか。

$vmpath = "E:Virtual Machine"
$xml = Get-ChildItem $vmpath -Recurse "*.xml"

foreach($vmconfig in $xml){
    # スナップショットの XML は対象としない
    if((Select-Xml -Path $vmconfig.FullName -XPath "//type_id" | select {$_.Node."#text"}) -like "*Virtual Machines*"){
        Import-VM -Path $vmconfig.FullName
        $report = Compare-VM -Path $vmconfig.FullName
       
        for($i = 0 ; $i -lt $report.Incompatibilities.Length;$i++){
            $report.Incompatibilities[$i] | fl *
            switch($report.Incompatibilities[$i].MessageId){
                # 起動状態のスナップショットが存在している場合   
                21016{
                    $report.Incompatibilities[$i].Source | Remove-VMSnapshot
                }
                # ネットワークアダプターを接続されていない状態に変更
                33012{
                    if($report.Incompatibilities[$i].Message -like "*Private-1c18b32a-22b9-4c0f-832f-f1bc3022cd80*"){
                        $report.Incompatibilities[$i].Source | Connect-VMNetworkAdapter -SwitchName "Private Network"
                    }elseif($report.Incompatibilities[$i].Message -like "*90500c32-eba3-463b-a404-7d35b6954621*"){
                        $report.Incompatibilities[$i].Source | Connect-VMNetworkAdapter -SwitchName "OnBoard"
                    }else{
                        #$report.Incompatibilities[$i].Source | Disconnect-VMNetworkAdapter
                    }
                }
                default{
                    $report.Incompatibilities[$i].MessageId
                }
            }
            Import-VM -CompatibilityReport $report
        }
      }
}

特定のディレクトリ内にある、ゲスト OS の構成ファイルの XML を読み込み発生していた問題を解消して、解消状態のレポートを使用してインポートをするスクリプトになっています。

起動中の状態とネットワークを未接続にする対応しかしていませんが、これらの問題だけであればこのスクリプトでインポートできるかと思います。
# 2012/9/17 追記 : ネットワークに接続するような処理を追加し、未接続にするのはコメント化しています。

インプレースアップグレードをする場合にはこのようなスクリプトは不要だと思いますが、今回の環境は新規インストールでインストール前のドライブ文字と合わせた状態で一括でインポートをする必要があったので荒い作りの内容ではありますが作成してみました。

Handling Import-VM errors in Server 2012 Hyper-V がとても参考になりましたのでこちらも合わせて確認してみるとよいかもしれないですね。

Written by masayuki.ozawa

9月 13th, 2012 at 11:55 pm

One Response to 'Windows Server 2012 の新規インストールをした場合の Hyper-V 2.0 のゲスト OS のインポート'

Subscribe to comments with RSS or TrackBack to 'Windows Server 2012 の新規インストールをした場合の Hyper-V 2.0 のゲスト OS のインポート'.

  1. […] ざっくりとですが以下のような方法でインポートすることができます。 Windows Server 2012 の新規インストールをした場合の Hyper-V 2.0 のゲスト OS のイ… […]

Leave a Reply

*