Windows 10 Insider PreviewでのNested Virtualization利用手順

Nested Virtualization(入れ子になった仮想化)とは仮想マシンの上で更に仮想マシンを動かすことを可能とした仮想化拡張機能の一つです(仮想マシンのHyper-Vホスト化の実現)。
(Windows 7でのVirtual PC 2007 SP1ではNested Virtualizationはできませんでした(エラー表示)
※MSDNでの日本語版解説サイト:https://msdn.microsoft.com/ja-jp/virtualization/hyperv_on_windows/user_guide/nesting
Nested Virtualizationの最大の利点はHyper-Vホストの動作検証(レプリケーションテスト等)やHyper-Vホストの環境設定変更テストが仮想マシン環境で手軽に行えることかと思います。
(1個のドメインサーバ用仮想マシンの中でドメインメンバ用仮想マシンも実行させて両者の連携機能を確認するということも可能となります)
更に仮想マシン環境でのHyper-Vホストの性能モニタリング情報を元に最適なリソース割り当て設計も行えるようになります。
つまり今までテスト環境の構築が複雑だったものが簡素化されるというメリットが期待できます。
もちろん企業での仮想環境管理者の負担も軽くなるというメリットも出てくると思われます。

元々Windows Serer 2016/Hyper-V Server 2016にHyper-VのNested Virtualization機能が搭載されるとアナウンスされていましたが2015年8月19日に公開されたそれらのTechnical Preview 3(Build 10514) 版ではまだNested Virtualization機能は含まれていませんでした(構成バージョンは6.2)。
しかしながら2015年10月12日に公開されたWindows 10 Insider Preview Build 10565(以下Windows 10 IPと略すことがあります)にはクライアントHyper-VでのNested Virtualization機能の第1リリース版が含まれています(構成バージョは7.0)。

下記はWindows 10 Insider PreviewをHyper-Vホストとする環境で3重にネストされた3個の仮想マシンのデスクトップ例です(ここではいずれのOSもWindows 10 IP にしていますがネストされた最後のレベルの仮想マシンのOSはWindows 10 IP以外でも動作します)。
※Nested Virtualization環境での実Hyper-Vホスト上で直接実行される仮想マシンをThe first layer VMといいます(日本語では第1レイヤ仮想マシン/第1レベル仮想マシン)。
・Hyper-Vホスト上の第1レベルの仮想マシン(現時点ではそのOSはWindows 10 IPに限定されます) :HVW10VML1b
・第1レベルの仮想マシン(HVW10VML1b)上の第2レベルの仮想マシン(現時点ではそのOSはWindows 10 IPに限定されます):HVW10VML2
・第2レベルの仮想マシン(HVW10VML2)上の第3レベルの仮想マシン:HVW10VML3(第3レベルの仮想マシンでのWindowsセットアップの開始インストール中の様子)



Hyper-Vの仮想マシンの構成バージョン7.0から仮想マシンプロセサにExposeVirtualizationExtensionsという属性が追加されたと考えている人もいるようですが構成バージョンが5.0の仮想マシンにもExposeVirtualizationExtensions属性を追加できます(実例は後述します)。
その属性がTrueになっている場合はその仮想マシンのWindowsにHyper-Vプラットフォームをインストールすることが可能です。
そのExposeVirtualizationExtensions属性がFalseかTrueかの確認はPowerShellで下記のコマンドレットの実行で行こなえます。
PS ... > Write-Host (Get-VMProcessor -VM (Get-VM -Name "仮想マシン名")).ExposeVirtualizationExtensions

従来のHyper-Vの場合、仮想マシンの中では「Hyper-V Hypervisor」コンポーネントをインストールすることができませんでした(グレー表示)。



しかし仮想マシンの構成バージョンに関係なく仮想マシンプロセサのExposeVirtualizationExtensions属性がTrueになっていると仮想マシンの中でも「Hyper-V Hypervisor」コンポーネントをインストールできるようになります。



ExposeVirtualizationExtensions属性の有無やFalse/Trueに関わらず「Hyper-V Hypervisor」コンポーネントをインストールすることもできます。
それは「Hyper-V Hypervisor」コンポーネントをインストールしたい仮想ディスクでVHDブートして実環境でその仮想ディスクに「Hyper-V Hypervisor」コンポーネントをインストールする方法です。
「Hyper-V Hypervisor」コンポーネントをインストールした仮想ディスクで、かつBCDに「hypervisorlauchtype Auto」指定があってもその仮想ディスクを使用した仮想マシンのExposeVirtualizationExtensions属性がTrueでない場合はその仮想マシンを起動しようとすると「Hyper-Vコンポーネントの1つが実行されていない」旨のエラーとなって仮想マシンの起動はできません。

ここではWindows 10 IP(64ビット版)のNested Virtualization機能の利用手順を中心にその対応ツールを含めて紹介致します。
今回使用したPCのハードウェア/ソフトウェア構成は以下の通りです。



■ Nested Virtualizationの特徴・制約事項について
(1)Nested Virtualizationを使用する実機でのHyper-Vホストとして実行させるOSは2015年10月時点ではWindows 10 Insider Preview(Build 10565)に限定されます。
Windows Server 2016 Technical Preview 3(Build 10514)をHyper-Vホストにしてその上でHyper-V Hypervisorが導入されているWindows 10 Insider Previewを仮想マシンとして実行させてもそのWindows 10 Insider Previewの上で他の仮想マシンを起動することはできません(Hyper-Vコンポーネントの1つが実行されていない旨のエラーとなります)。
(2)仮想マシンを仮想Hyper-Vホスト(擬似的なHyper-Vホスト)として機能させるためにはその仮想マシンのOSも2015年10月時点ではWindows 10 Insider Preview(Build 10565)だけです。
(3)仮想Hyper-Vホスト上で実行させる仮想マシンのゲストOSはWindows 10 Insider Preview(Build 10565)に限定されません。
(4)仮想Hyper-Vホストとして動作させる仮想マシにはNested Virtuaization可能属性(ExposeVirtualizationExtensions属性)をTrueにしておく必要があります。
(4)仮想Hyper-Vホストとして機能させる仮想マシンについては以下の制約があります。
・起動メモリは4096MB以上
・動的メモリは使用しない
・動的メモリは使用しなくてもその仮想マシン実行時にPowerShell(Set-VMMemoryコマンドレット)によるメモリの追加・削減(オンラインメモリサイズ変更)は使用禁止です。
※Windows Server 2016/Hyper-V Server 2016では動的メモリオプションが無効でもSet-VMMemoryコマンドレットで仮想マシンのメモリ割り当て量を変更することが可能となります。
・稼働中の仮想マシンの[保存]や[復元]は使用禁止です。
・仮想マシンのチェックポイントも使用禁止です。
・ネットワークアダプタのスプーフィングオプションは有効にしておきます(無効の場合その仮想マシンの上で実行される仮想マシンがDHCPでのIPアドレス取得が不正になったり、スタティックIPアドレス指定でもネットワーク接続できなくなったりします)。
・仮想Hyper-Vホストとなる仮想マシンをライブマイグレーションの対象にすることはできません。
・仮想Hyper-Vホストで[管理オペレーティングシステムにこのネットワークアアプタの共有を許可する]オプション適用の仮想スイッチを定義するとネットワーク接続でブリッジ構成が作成されます。
ブリッジ構成を作成した後でネットワークアダプタのMACアドレスを変更してもブリッジで使用されるMACアドレスは変更前のMACアドレスとなりますので一旦仮想スイッチを削除(ブリッジ構成解除)してからMACアドレス変更をします。
尚、ネットワーク接続で「識別されていないネットワーク」という表示がされるのはデフォルトゲートウェイの設定が何かの要因で消えた際に起こります。


■ Nested Virtualization機能の一般的な利用手順について
Hyper-Vホスト、第1レベルの仮想マシン、第2レベルの仮想マシンの全てがWindows 10 Insider Previewの場合のNested Virtualization機能の一般的な利用手順について以下に示します。

  1. Hyper-Vホストの導入

  2. 第1レベルの仮想マシンの作成とNested Virtualization機能の有効化及びHyper-V全コンポーネントの導入

  3. 第2レベルの仮想マシン(ここでは末端のゲスト仮想マシン)の作成と実行



■ Nested Virtualization機能の有効化ツール(Enable-NestedVm.ps1)について


■ 旧構成バージョンの仮想マシンでのNested Virtualization機能の適用
Windows 10 IPで作成した仮想マシンの構成バージョンは7.0ですが、Hyper-V Server 2012 R2で作成した仮想マシンの構成バージョンは5.0です。
ここでは構成バージョンが5.0の仮想マシンでNested Virtualization機能が使用できるかどうかを検証した結果を紹介致します。
結論から言うと「構成バージョンが5.0の仮想マシンでもNested Virtualization機能が使用可能」という結果が得られました。
このため仮想マシンの構成バージョンの手動アップグレード(PowerShellのUpdate-VMVersionコマンドレットによるアップグレード)の実施は不要です。
しかしMicrosoftが古い構成バージョンについても正式サポートしているかどうかについては定かではありません。
ちなみにWindows 10 IPのHyper-Vマネジャには古い構成バージョンの仮想マシンに対して[構成バージョンのアップグレード]というメニューが追加されました(但しアップグレードすると以前のバージョンのWindowsへのその仮想マシンの移行やインポートはできなくなります)。
もちろんWindows Server 2016 Technical Preview 3版のHyper-V Managerにも[Upgrade Configuration Version]というメニューが表示されるようになっています。

構成バージョンが5.0の仮想マシンでNested Virtualization機能が使用できるかどうかを検証した手順の流れは以下の通りです。
  1. Hyper-V Server 2012 R2に接続したHyper-Vマネジャによる上記vmconf50仮想マシンの定義
    (1)仮想マシンの新規作成ウィザードでの要約画面


    (2)「設定」では[MACアドレスのスプーフィングを有効にします]はoff(デフォルト)のまま。
    (3)OSはインストールしていないため仮想マシンvmconf50の起動は不可

  2. vmconf50仮想マシンにOSをインストールしていない状態のままでエクスポート


  3. エクスポートされたvmconf50仮想マシンをNested Virtualization機能の実機テスト環境(OS:Windows 10 IPでHyper-V全コンポート導入済みでかつ仮想スイッチも定義済みのHyper-Vホスト:W10IPHVHOST)にインポート


  4. インポートしたvmconf50仮想マシンに対するEnable-NestedVm.ps1の実行
    Enable-NestedVm.ps1の実行ではMACアドレスのスプーフィングが有効となり起動メモリは4096MB(4GB)に設定変更されます。
    最終的にはNested Virtualization機能が有効であることを示すExposeVirtualizationExtensions属性がTrueになります。
    またEnable-NestedVm.ps1を実行しても構成バージョンは5.0のまま変化しません。


  5. vmconf50仮想マシンの仮想ディスクをHyper-V Server 2012 R2環境でWindows 10 IPをインストールした仮想マシンHVSW10IPの仮想ディスクに指定変更

  6. vmconf50仮想マシンを起動してHyper-VのHyper-V Hypervisor含めた全コンポーネントを選択してインストール
    下記はHyper-VのHyper-V Hypervisor含めた全コンポーネントのインストール結果の確認画面です。


    余談ですがvmconf50仮想マシンの仮想ディスクをHyper-V Server 2012 R2環境でWindows 10 Proをインストールした仮想マシンHVSW10Proの仮想ディスクに指定変更した場合ではたとえExposeVirtualizationExtensions属性がTrueの仮想マシンであってもHyper-V Hypervisorの選択はできません

  7. vmconf50仮想マシンの中に外部接続用仮想スイッチを定義

  8. Hyper-V Server 2012 R2環境でWindows 10 Proをインストールした仮想マシンHVSW10Pro(構成バージョン5.0)をエクスポート


  9. エクスポートされた仮想マシンHVSW10Proをvmconf50仮想マシン側にインポート


  10. 第1レベルの仮想マシン(vmconf50:仮想マシンで実装された仮想Hyper-Vホスト)の上で第2レベルの仮想マシン(HVSW10Pro:相対的なゲスト)を起動してのデスクトップ操作(Nested Virtualization機能の最終動作検証)


    ・実寸画像はこちらです。

  11. ネットワークアダプタのスプーフィングオプションを無効にした場合のネットワーク接続不可確認
    仮想Hyper-Vホストとなったvmconf50仮想マシンのネットワークアダプタのスプーフィングオプションを無効にしてみました。
    [結果]
    (1)vmconf50仮想マシン自体のネットワーク機能は問題なく動作します。
    (2)vmconf50仮想マシンの上で起動した第2レベルの仮想マシン(HVSW10Pro:相対的なゲスト)のDHCPでのIPアドレス取得が不正になります。
    (3)仮想マシン(HVSW10Pro:相対的なゲスト)をDHCPからスタティックIPアドレス指定に変更してもネットワーク接続はできません。


■ 第3レベルの仮想マシンを実行させる方法について
本ページの最初で提示されている画像は3重にネストされた3個の仮想マシンのデスクトップ例です。
第2レベルの仮想マシン上で更に第3レベルの仮想マシンを動かすためには第2レベルの仮想マシン自体も仮想Hyper-Vホストとして動作させる必要があります。
これについても第1レベルの仮想マシンを仮想Hyper-Vホストとして動作させるために設定したりHyper-Vコンポーネントを全てインストールしたりした手順をそのまま実行すればOKです(ネストを増やす場合はそれらの手順を再帰的に繰り返すだけでOKです)。
第2レベルの仮想マシンを仮想Hyper-Vホストとして動作させるためには第1レベルの仮想マシン上で第2レベルの仮想マシンを対象にしたEnable-NestedVm.ps1を実行します。
例えばHyper-V Server 2016 Technical Preview 3はまだNested Virtualizationに対応していませんので仮想Hyper-Vホストとして動作させることはできませんが以下のようにEnable-NestedVm.ps1の実行自体はOKとなります。
ここではHyper-V Server 2016 Technical Preview 3をインストールしてある仮想マシンをHVSHVS16TP3とします。
・第1レベルの仮想マシン(vmconf50)上でのEnable-NestedVm.ps1実行までの操作
・第1レベルの仮想マシン(vmconf50)上でのEnable-NestedVm.ps1実行結果
・第2レベルの仮想マシン(HVSHVS16TP3)のOSであるHyper-V Server 2016 Technical Preview 3上での第3レベル仮想マシン(ゲスト)の起動失敗(one of the Hyper-V components is not runningエラー)


・実寸画像はこちらです。

3重の仮想マシンの例ではありませんが一つの仮想マシン(OS:Windows 10 IP)の上でドメインサーバ用仮想マシン(OS:Windows Server 2016 Technical Preview 3)とドメインメンバ用仮想マシン(OS:Windows 10 Pro)を同時に実行させた例はこちらです。
ちなみに一つの仮想マシン(OS:Windows 10 IP)の上でWindowsサーバ用仮想マシン(OS:Windows Server 2016 Technical Preview 3)とHyper-Vサーバ用仮想マシン(OS:Hyper-V Server 2016 Technical Previrew 3)を同時に実行させた例はこちらです。


■ ネストされた仮想Hyper-Vホストのリモート管理手順について
クライアントベースのWindows(Windows 8/8.1, Windows 10, Windows 10 IP)に付属のクライアントHyper-Vのホストは他のマシンからのリモート管理が可能です。
ここではWindows 10 IPで構築したネストされた仮想Hyper-Vホストを他のマシンのHyper-Vマネジャから接続して利用可能とする手順について紹介します。
  1. 前提条件
    (1)実Hyper-Vホスト及び仮想Hyper-Vホスト共にAdministratorユーザが有効化されているものとします。
    (2)実Hyper-Vホスト及び仮想Hyper-VホストにHyper-Vマネジャで接続する側(Hyper-Vクライアント)もAdministratorユーザが有効化されているものとします。
    (3)リモート接続を確実なものとするためにここではリモート管理の対象となるHyper-Vホスト(実Hyper-Vホスト及び仮想Hyper-Vホスト)とHyper-VクライアントのAdministratorのパスワードは一致させておき更にHyper-VクライアントにはAdministratorでサインインするものとします。
    これはHyper-VクライアントのHyper-VマネジャがHyper-Vホストに接続する場合、現在そのHyper-Vクライアントにサインイン中のユーザ資格情報(ユーザ名/パスワード)を使用してリモートのHyper-Vホストに接続しようとするためです。
    Windows ServerやHyper-V Serverで構築したHyper-Vホストのリモート管理ではHyper-Vクライアント側でCMDKEYコマンドを使用して各Hyper-Vホストごとに接続ユーザの資格情報を登録しておけばHyper-VホストにないアカウントでHyper-Vクライアントにサインインしてもリモート接続できますがクライアントHyper-V接続の場合はCMDKEYで登録した資格情報が有効に機能しないケースがあるようです。
    (4)Hyper-VクライアントがWindows 10/Windows 10 IPの場合はWinRMがリモート接続のインタフェースとして使用されますのでリモート接続される側のHyper-VホストでWinRMサーバとしての設定をするものとします。
    尚、Hyper-VクライアントがWindows 8/8.1の場合はリモート接続される側のHyper-VホストにおけるWinRMサーバとしての設定は特に必要ありませんがWindows 10/Windows 10 IPからのも接続もできるようにWinRMサーバとしての設定をするものとします。
    (5)今回ここでサンプル紹介するNested Virtualization環境でのホスト構成は以下の通りです。
    ホスト種別仮想マシン名ホスト名備考
    実Hyper-Vホスト
    -
    W10IPHVHOST
    OS = Windows 10 IP
    第1レベルの仮想Hyper-Vホスト
    (仮想マシン)
    HVW10VML1b
    HVW10VML1b
    OS = Windows 10 IP
    第2レベルの仮想Hyper-Vホスト
    (仮想マシン)
    HVW10VML2
    HVW10VML2
    OS = Windows 10 IP
    末端仮想マシン
    HVW10VML3
    HVW10VML3
    OS = Windows 10 IP

  2. 実Hyper-VホストでのWinRMサーバ設定
    実Hyper-VホストにAdministratorでサインインして以下のwinrmコマンドを実行するだけです。
    winrm quickconfig ※ またはwinrm qc
    (1)winrm quickconfigの質問に対してはすべてyで応答します。
    (2)実Hyper-Vホストにおいて既にWinRMサービス(Windows Remote Management (WS-Management))のスタートアップの種類が「自動」になっていればwinrm quickconfigを実行しても「WinRM サービスの種類を遅延自動開始に設定します。」というメッセージやその設定変更確認の質問は表示されません。



  3. 仮想Hyper-VホストでのWinRMサーバ設定
    実Hyper-VホストでのWinRMサーバ設定と同じで各仮想Hyper-Vホストを起動して以下のwinrmコマンドを実行するだけです。
    winrm quickconfig ※ またはwinrm qc

  4. クライアントからのHyper-Vホスト接続


■ 仮想Hyper-Vホストの中の仮想マシンウィンドウの外出し方法
Nested Virtualization環境において仮想Hyper-Vホストの中のHyper-Vマネジャで仮想マシンを起動するとその仮想マシン接続ウィンドウは仮想Hyper-Vホストのウィンドウの中に表示されます。
ディスプレイ解像度をあまり大きくできないマシン環境では仮想Hyper-Vホストのウィンドウの大きさもあまり大きくできず手狭になりその中で仮想マシンを操作するのはウィンドウ移動操作が多くなって使い勝手が低下します。
そこで仮想Hyper-Vホストの中の仮想マシンウィンドウをその仮想Hyper-Vホストの外側に(引っ張り出す感覚で)表示する方法をここで紹介します。
仮想Hyper-Vホスト自体の操作がほとんどなくてその中の仮想マシン群操作が多い場合に多少役立つのではないかと思います。
尚、この手順は上述した「ネストされた仮想Hyper-Vホストのリモート管理手順」の応用操作手順となります。



  1. 前提条件
    (1)仮想Hyper-Vホストの中の仮想マシンウィンドウの外出しは実Hyper-Vホストで行なうものとします。
    ※Hyper-Vホストにリモート接続した他のマシンで仮想Hyper-Vホストの中の仮想マシンウィンドウを外出しする手順も同様に行なえます。
    (2)今回ここでサンプル紹介するNested Virtualization環境でのホスト構成は以下の通りです。
    ホスト種別仮想マシン名ホスト名備考
    実Hyper-Vホスト
    -
    W10IPHVHOST
    OS = Windows 10 IP
    第1レベルの仮想Hyper-Vホスト
    (仮想マシン)
    vmconf50
    HVSW10IP
    OS = Windows 10 IP
    末端仮想マシン
    HVSWS16TP3DC
    :(以下省略)
    :
    :
    HVSWS16TP3DC
    :(以下省略)
    :
    :
    OS = Windows Server 2016 Technical Preview 3
    :(以下省略)
    :
    :

  2. 実Hyper-Vホスト側での実Hyper-Vホスト/仮想Hyper-VホストのWinRMサーバ設定
    (1)上記の「ネストされた仮想Hyper-Vホストのリモート管理手順について」で示した方法(「winrm quickconfig」)で実Hyper-Vホスト側にて実Hyper-Vホストとすべての仮想Hyper-VホストについてWinRMサーバ設定を実施します。

  3. 実Hyper-Vホストから各仮想Hyper-Vホストへの接続
    (1)Administratorでサインインします。
    (2)実Hyper-Vホスト側のhostsファイルに各仮想Hyper-VホストのIPアドレスを登録します。
    (3)以下のコマンドを実行してHyper-Vマネジャから接続させたい仮想Hyper-Vホスト(ここでは第1レベルの仮想Hyper-Vホスト)を信頼できるホストとしてTrustedHostsリストに登録します。
    winrm set winrm/config/client @{TrustedHosts="HVSW10IP"} ※ TrustedHostsリストの上書き用コマンドの例です

    (4)Hyper-Vマネジャでの接続指定方法と仮想マシン操作方法;
    (4-1)Administratorでサインインしたままとします。
    (4-2)Hyper-Vマネジャを起動します。
    実Hyper-Vホストであるホスト「W10IPHVHOST」はHyper-Vマネジャに自動表示されます。
    (4-3)Hyper-Vマネジャで実Hyper-Vホスト(W10IPHVHOST)内の第1レベルの仮想Hyper-Vホストとなる仮想マシン(vmconf50)を起動します。
    (4-4)第1レベルの仮想Hyper-Vホストとなる仮想マシン(vmconf50)の起動後、実Hyper-VホストのHyper-Vマネジャで[サーバに接続]を起動します。
    (4-5)「コンピュータの選択」ダイアログの「別のコンピュータ:」欄に接続する第1レベルの仮想Hyper-Vホスト名(HVSW10IP)を指定して<OK>をクリックします。
    (4-6)Hyper-Vマネジャのサーバ欄に第1レベルの仮想Hyper-Vホスト名(HVSW10IP)が追加表示されます。



    (4-7)続いて実Hyper-Vホスト側のHyper-Vマネジャで第1レベルの仮想Hyper-Vホスト(HVSW10IP)内の仮想マシン(HVSWS16TP3DC)を起動すれば仮想マシン(HVSWS16TP3DC)のウィンドウは第1レベルの仮想Hyper-Vホスト(HVSW10IP)のウィンドウの外側に表示されます。
    ※第1レベルの仮想Hyper-Vホスト(HVSW10IP)内のHyper-Vマネジャから仮想マシン(HVSWS16TP3DC)を起動してしまうと仮想マシン(HVSWS16TP3DC)のウィンドウは第1レベルの仮想Hyper-Vホスト(HVSW10IP)のウィンドウの内側に表示されてしまい窮屈な感じになります。



    ・実寸画面はこちらです。

    ・上記の「ネストされた仮想Hyper-Vホストのリモート管理手順について」で使用したNested Virualization環境で第2レベルの仮想Hyper-Vホスト(HVW10VML2)自体を第1レベルの仮想Hyper-Vホスト(HVW10VML1b)のウィンドウの外側に表示させた例はこちらです。


    ■ ネストされた仮想マシンに対するPowerShell Directセッションの生成手順について
    仮想マシンをリモート管理するPowerShell Direct機能はWindows 10以降/Windows Server 2016 Technical Previewでのサポート機能です。
    PowerShell Direct機能によってEnter-PSSessionコマンドレット(対話セッションの開始)やInvoke-Commandコマンドレットに「-VMName 仮想マシン名」を指定できるようになりました。
    ※例えば従来のHyper-V Server 2012 R2に対してWindows 10 ProからのEnter-PSSessionやInvoke-Commandで「-VMName 仮想マシン名」を指定すると「パラメタ名 'VMName' に一致するパラメタが見つかりません」エラーとなります。
    尚、Enter-PSSessionコマンドレット/Invoke-Commandコマンドレットの-VMName引数に指定できる仮想マシンは構成バージョンが6.2以降のものに制限されます(5.0の場合は6.2以上にアップグレードする必要があります)。
    PowerShell Directの詳細はhttps://msdn.microsoft.com/en-us/virtualization/hyperv_on_windows/user_guide/vmsessionをご参照下さい。

    ここではWindows 10 IPで構築したネストされた仮想マシンに対するPowerShell Directセッション(仮想マシンセッション/VMセッションともいいます)の生成手順(PowerShell Directセッションへの入り方/接続方法)について説明します。
    基本的な考えは第Nレベルの仮想マシンのPowerShell Directセッションに入る場合は、第N-1レベルの仮想マシン(仮想Hyper-Vホストとして機能している仮想マシン)のPowerShellセッションに入ってから第Nレベルの仮想マシンのPowerShell Directセッションに入るということです。

    第0レベルの仮想マシンは実際には仮想マシンではなく実Hyper-Vホストを指します。
    ※第Nレベルの仮想マシンのPowerShell Directセッションに入ってから更に第N+1レベルの仮想マシンのPowerShell Directセッションに入るというネストはできません。
    実際には以下のようなケースとなります。

    1. 前提条件
      (1)Enter-PSSEssion -ComputerNameやEnter-PSSEssion -VMNameを実行してリモート接続する側もここではWindows 10 IPとします(Pro, Homeどちらも利用可能)。
      ※実際にはWindows 10 HomeやWindows 10 HomeからアップグレードされたWindows 10 Home IPもリモート接続する側になれます。
      (2)Enter-PSSEssion -ComputerNameやEnter-PSSEssion -VMNameでリモート接続される実Hyper-Vホスト及び仮想マシン共にAdministratorユーザが有効化されているものとします。
      (3)リモート接続する側(セッションクライアント)のリモート接続する側にはAdministratorユーザは不要です。
      (4)Enter-PSSEssion -ComputerName及びEnter-PSSEssion -VMNameコマンドレットでは「-Credential "リモートホスト名\Administrator"」を指定するものとします。
      (5)リモート接続される側はWinRMサーバとしての設定をするものとします。
      (6)今回ここでサンプル紹介するNested Virtualization環境でのPowerShell Direct接続される側のネストされたマシン構成は以下の通りです。
      ホスト種別仮想マシン名ホスト名備考
      実Hyper-Vホスト
      -
      W10IPHVHOST
      OS = Windows 10 IP
      第1レベルの仮想Hyper-Vホスト
      (仮想マシン)
      HVW10VML1b
      HVW10VML1b
      OS = Windows 10 IP
      第2レベルの仮想Hyper-Vホスト
      (仮想マシン)
      HVW10VML2
      HVW10VML2
      OS = Windows 10 IP
      末端仮想マシン
      HVW10VML3
      HVW10VML3
      OS = Windows 10 IP



    2. 第N-1レベルの仮想マシンでのWinRMサーバ設定
      第N-1レベルの仮想マシンを起動してAdministratorでサインインして以下のwinrmコマンドを実行するだけです。
      winrm quickconfig ※ またはwinrm qc
      (1)winrm quickconfigの質問に対してはすべてyで応答します。
      (2)実Hyper-Vホストにおいて既にWinRMサービス(Windows Remote Management (WS-Management))のスタートアップの種類が「自動」になっていればwinrm quickconfigを実行しても「WinRM サービスの種類を遅延自動開始に設定します。」というメッセージやその設定変更確認の質問は表示されません。



    3. クライアントからのリモート接続
      (1)Administrator以外のアカウントでサインインします。
      (2)WinRMクライアント側のhostsファイルにEnter-PSSEssion -ComputerNameでリモート接続するホスト名に対するIPアドレスを登録します(メモ帳を[管理者として実行]で起動してhostsファイルを編集します)。
      (3)WinRMサービス(Windows Remote Management (WS-Management))のスタートアップの種類を手動から自動に変更して<開始>でサービスを起動します(winrmコマンドの実行に必要なサービスです)。
      (4)コマンドプロンプト(管理者)を起動し、Enter-PSSEssion -ComputerNameでリモート接続するホストを以下のコマンドを実行して信頼できるホストとしてTrustedHostsリストに登録します。
      winrm set winrm/config/client @{TrustedHosts="Enter-PSSEssion -ComputerNameでリモート接続するホスト名"} ※ TrustedHostsリストの上書き用コマンドの例です
      [注1]実Hyper-Vホスト自体をWinRMクライアントにする場合自分自身をTrustedHostsリストに登録する必要はありません。
      [注2]Enter-PSSEssion -VMNameで接続される仮想マシンのホストはTrustedHostsリストに登録する必要はありません。
      [注3]既に別のホストをTrustedHostsリストに登録してあればそれに上書きしないように注意して下さい。
      登録済みの信頼できるホスト一覧は「winrm get winrm/config/client」で確認できます。

      以下では第N-1レベルの仮想マシンのホストがHVW10VML1bで、第Nレベルの仮想マシンがHVW10VML2の場合の例で説明します。
      ここから先はクライアント側のWinRMサービスが停止した状態でも構いません。

      (5)Enter-PSSEssion -ComputerNameの実行による第N-1レベルの仮想マシン(HVW10VML1b)へのリモート接続の実行
      PowerShellで以下のコマンドレットを実行します。
      > Enter-PSSession -ComputerName HVW10VML1b -Credential "HVW10VML1b\Administrator"
      →「資格情報の要求」ダイアログが表示されますので接続先のHVW10VML1bホストのAdministratorユーザのパスワードを入力して<OK>をクリックします。

      資格情報がHVW10VML1bで承認されると以下のPowerShellプロンプト表示に変わります。
      [HVW10VML1b]: PS C:\Users\Administrator\Documents>

      (6)Enter-PSSession -VMNameの実行による第Nレベルの仮想マシン(HVW10VML2)へのリモート接続の実行
      (6-1)PowerShellで以下のコマンドレットを実行します。
      > Enter-PSSession -VMName HVW10VML2 -Credential "HVW10VML2\Administrator"
      →「資格情報の要求」ダイアログが表示されますのでHVW10VML2ホストのAdministratorユーザのパスワードを入力して<OK>をクリックします。

      資格情報がHVW10VML2で承認されると以下のPowerShellプロンプト表示に変わります。
      [HVW10VML1b]: [HVW10VML2]: PS C:\Users\Administrator\Documents>
      これでHVW10VML2仮想マシンのPowerShell Directセッションの生成・接続は完了です。

      (6-2)HVW10VML2仮想マシンのPowerShell Directセッションでの仮想マシン管理
      以下のコマンドレット等を使用してみました。
      ・Get-VM(HVW10VML2仮想マシンの中での更なる仮想マシン情報を表示します)
      ・Get-VMHost
      ・Get-WSManCredSSP

      下記はPowerShell Directセッションの生成・接続と仮想マシン管理のコマンドレット実行例です(リモート接続元がWindows 10 Pro IPの例)。



      ・リモート接続元がWindows 10 Home IPの例はこちらです。
      ※ Windows 10 Home IPのPowerShell ISEを使用した場合の例はこちらです。
      ・リモート接続元がWindows 10 Proの例はこちらです。
      ・リモート接続元がWindows 10 Homeの例はこちらです。
      ・リモート接続元がWindows 10 HomeからアップグレードされたWindows 10 Home IPの例はこちらです。

      (6-3)PowerShell Directセッションからの接続解除
      以下のコマンドレットでPowerShell Directセッションからの接続解除が行えます。
      > Exit-PSSession
      Exit-PSSessionの実行によって以下のPowerShellプロンプト表示に変わります。
      [HVW10VML1b]: PS C:\Users\Administrator\Documents>

      (6-4)HVW10VML1bとのセッション接続解除
      以下のコマンドレットでHVW10VML1bとのセッション接続解除が行えます。
      > Exit-PSSession

      (7)Invoke-Command -VMNameの利用による第Nレベルの仮想マシン(HVW10VML2)のPowerShellリモート実行例
      PowerShell DirectではEnter-PSSession -VMNameの実行による仮想マシンへのリモート接続の他にInvoke-Command -VMNameによる仮想マシンセッションの実行もサポートしています。
      Invoke-Command -VMNameはEnter-PSSession -ComputerNameでPowerShellセッションに入ってから実行します。
      Invoke-Command -VMNameは以下のように指定して使います(Invoke-Command -VMName実行の度に代替資格情報として「-Credential "HVW10VML2\Administrator"」を指定します)。
      > Invoke-Command -VMName HVW10VML2 -ScriptBlock { Get-VM | Where-Object {$_.State -eq 'Running' }} -Credential "HVW10VML2\Administrator"
      →「資格情報の要求」ダイアログが表示されますのでHVW10VML2ホストのAdministratorユーザのパスワードを入力して<OK>をクリックします。

      下記はInvoke-Command -VMNameの実行例です(リモート接続元がWindows 10 Home IPの例)。



      (8)Windows 10 Home IP版からのネストされた仮想マシンへのRDP接続
      Windows 10 Home IP版にはHyper-Vマネジャが付属していないため仮想マシンのリモート操作はRDP接続操作となります。
      上記のHVW10VML1b仮想マシンにRDP接続してからその中で動作しているHVW10VML2仮想マシンを操作してみました。



      (9)Windows 10 Home版からのネストされた仮想マシンへのVNC接続
      Windows 10 Home版にはRDP接続クライアントが付属していますがVNCを利用したいというユーザもいるかと思います。
      上記のHVW10VML1b仮想マシン側でVNCサーバを起動しておけば、Windows 10 Home側のVNCクライアントからVNC接続してリモート操作が可能となります。
      ここでは無償のVNCアプリケーションでインストール不要のケボウリモートデスクトップ(KeBORD ver 1.0.0)を使用したVNC接続例を紹介します。
      • HVW10VML1b仮想マシン側でのVNCサーバ起動
        (1)KeBORDのkebord.exeを起動してサーバモードとして以下の設定をして<OK>ボタンをクリックします。
        <OK>ボタンをクリックして「Windowsファイアウォールでブロックされています」メッセージが表示された場合は<アクセスを許可する>をクリックします。



        上記のIPの値はサーバ側のIPアドレスが自動表示された値です。

        (2)HVW10VML1b仮想マシン側デスクトップ

      • Windows 10 Home側でのVNCクライアント実行
        (1)KeBORDのkebord.exeを起動してクライアントモードとして以下の設定をして<OK>ボタンをクリックするとリモート画面が表示されます。



        (2)KeBORDでリモート接続したHVW10VML1b仮想マシン側デスクトップ




    4. 補足
      • 実Hyper-Vホストから自ホストにある仮想マシンへのPowerShell Direct操作
        実Hyper-Vホストから自ホストにある仮想マシンへのPowerShell Direct操作をする場合は「Enter-PSSession -ComputerName 自分自身」を実行しなくても最初から自分自身への固定セッションに入っています。
        そのため第1レベルの仮想マシンに対するPowerShell Direct操作では最初から「Enter-PSSession -VMName 第1レベルの仮想マシン名」や「Invoke-Command -VMName 第1レベルの仮想マシン名」のコマンドレットが使用できます。
        実Hyper-Vホストから自ホストにある第1レベルの仮想マシンへのPowerShell Direct操作例(実Hyper-VホストがWindows Server 2016 Technical Preview 3で第1レベルの仮想マシン名がHVW10VML1という名前の例です)

      • 並列PowerShell Direct操作
        1個の仮想Hyper-Vホスト(例えばHVW10VML1b)の中に同じレベルの仮想マシンが複数(例えばHVW10VML2とHVW10VML2b)が存在する場合、1個のPowerShell画面の中で「Invoke-Command -VMName」形式のコマンドレットを交互に使用すればVMセッションを切り替えて使用することができます。
        しかし2個のPowerShell画面を起動しておけば複数の仮想マシンへの並列PowerShell Direct操作ができるようになります。
        (1)1VMセッションの切り替え接続例
        (2)2個のPowerShell画面利用による並列PowerShell Direct操作例

      • HomeエディションへのPowerShell Directについて
        Windows 10 Home IPをゲストOSとする仮想マシンの構成ファイルのバージョンが6.2以上であればその仮想マシンに対してPowerShell Direct接続が可能となります。
        但しHomeエディションの場合は「Windows PowerShell用Hyper-Vモジュール」のインストールもできませんのでVMセッションに入ってもGet-VMxxx系のコマンドレットはインポートされないため使用できません。
        今回ここでサンプル紹介するNested Virtualization環境でWindows 10 Home IPをゲストOSとする仮想マシンに対してPowerShell Direct接続するマシン構成は以下の通りです。
        尚、接続先のHomeエディションにおけるAdministratorユーザの有効化は「net user Administrator /active:yes」で行っています。
        (Administratorのパスワードは「Administratorのアカウント変更」画面の[パスワードの作成]で設定しています)
        ホスト種別仮想マシン名ホスト名備考
        実Hyper-Vホスト
        -
        W10IPHVHOST
        OS = Windows 10 Pro IP
        第1レベルの仮想Hyper-Vホスト
        (仮想マシン)
        vmtestconf50
        (構成ファイルのバージョン:7.0)
        vmtestconf50
        OS = Windows 10 Pro IP
        第2レベルの仮想マシン
        (末端仮想マシン)
        HVSW10HomeConf62
        (構成ファイルのバージョン:6.2)
        HVSW10Home
        OS = Windows 10 Home IP

        • 「Enter-PSSession -VMName HVSW10HomeConf62 ...」による固定接続ケース
          以下のコマンドレットでPowerShell Directを使用します。
          > Enter-PSSession -ComputerName vmtestconf50 -Credential "vmtestconf50\Administrator"
          > Enter-PSSession -VMName HVSW10HomeConf62 -Credential "HVSW10Home\Administrator"



          ・実寸画像はこちらです。

        • 「Invoke-Command -VMName HVSW10HomeConf62 ...」による接続ケース
          以下のコマンドレットでPowerShell Directを使用します。
          > Enter-PSSession -ComputerName vmtestconf50 -Credential "vmtestconf50\Administrator"
          > Invoke-Command -VMName HVSW10HomeConf62 -ScriptBlock { systeminfo } -Credential "HVSW10Home\Administrator"





    ■ ネストされた仮想マシンに対する5nine Managerからの接続
    5NINE SOFTWARE社の5nine Manager for Hyper-V(以下5nine Manager)はHyper-Vサーバ、クライアントHyper-VのGUI管理ツールでWindows 10 Homeでも利用できます。
    5nine Managerの特徴は5nine Manager for Hyper-VでのHyper-V仮想マシンクローンの作成手順をご参照下さい。
    Hyper-Vマネジャが付属していないWindows 10 Homeに5nine Managerを導入すればHyper-Vマネジャを使用する感覚で仮想マシンを操作することができます。
    下記は第1レベルの仮想Hyper-VホストとしてのHVW10VML1b上で実行されているHVW10VML2b仮想マシンに5nine Managerから接続・操作している様子です。



    ・実寸画像はこちらです。