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 |
PS ... > Get-ExecutionPolicy ※実行ポリシーの確認 Unrestrictedになっていなければ「Set-ExecutionPolicy Unrestricted」を実行 PS ... > cd c:\temp PS C:\temp > .\Enable-NestedVM.ps1 -VmName "VML1" 以下の表示となります。 This script will set the following for VML1 in order to enable nesting: Virtualization extensions will be enabled ... Input Y to accept or N to cancel:Y応答 警告: Nested virtualization is an unsupported preview feature. Hypervisors other than the Hyper-V hypervisor running in a guest virtual machine are likely to fail. Furthermore, some Hyper-V features are incompatible with nested virtualization, such as dynamic memory, checkpoints, and save/restore. Mac Adderess Spoofing isn't enabled, nested guests won't have network! Would you like to enable? (Y/N)Y応答PS C:\temp > Write-Host (Get-VMProcessor -VM (Get-VM -Name "VML1")).ExposeVirtualizationExtensions →「True」と表示されることを確認します。 |
PS C:\temp > Invoke-Command -VMName "VML1" -ScriptBlock { Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Hyper-V -All ; Restart-Computer } ※資格情報の入力を求められたらAdministratorの資格情報を指定します。 ※別仮想マシンでの実行例(「コンピュータHVW10IPL1を再起動できませんでした」と表示されていますが実際には問題なく再起動されています) (HVW10IPL1はこの例での仮想マシンHVW10VML1のOSのコンピュータ名です) |
ホスト種別 | 仮想マシン名 | ホスト名 | 備考 |
---|---|---|---|
実Hyper-Vホスト | OS = Windows 10 IP | ||
第1レベルの仮想Hyper-Vホスト (仮想マシン) | OS = Windows 10 IP | ||
第2レベルの仮想Hyper-Vホスト (仮想マシン) | OS = Windows 10 IP | ||
末端仮想マシン | OS = Windows 10 IP |
winrm quickconfig ※ またはwinrm qc |
winrm quickconfig ※ またはwinrm qc |
winrm set winrm/config/client @{TrustedHosts="実Hyper-Vホスト名,仮想Hyper-Vホスト名1,仮想Hyper-Vホスト名2,..."} ※ TrustedHostsリストの上書き用コマンドの例です |
ホスト種別 | 仮想マシン名 | ホスト名 | 備考 |
---|---|---|---|
実Hyper-Vホスト | OS = Windows 10 IP | ||
第1レベルの仮想Hyper-Vホスト (仮想マシン) | OS = Windows 10 IP | ||
末端仮想マシン | : : | : : | OS = Windows Server 2016 Technical Preview 3 :(以下省略) : : |
winrm set winrm/config/client @{TrustedHosts="HVSW10IP"} ※ TrustedHostsリストの上書き用コマンドの例です |
基本的な考えは第Nレベルの仮想マシンのPowerShell Directセッションに入る場合は、第N-1レベルの仮想マシン(仮想Hyper-Vホストとして機能している仮想マシン)のPowerShellセッションに入ってから第Nレベルの仮想マシンのPowerShell Directセッションに入るということです。 |
Enter-PSSEssion -ComputerName 実Hyper-Vホスト名 ... Enter-PSSEssion -VMName 第1レベルの仮想マシン名 ... |
Enter-PSSEssion -ComputerName 第1レベルの仮想Hyper-Vホスト名 ... Enter-PSSEssion -VMName 第2レベルの仮想マシン名 ... |
ホスト種別 | 仮想マシン名 | ホスト名 | 備考 |
---|---|---|---|
実Hyper-Vホスト | OS = Windows 10 IP | ||
第1レベルの仮想Hyper-Vホスト (仮想マシン) | OS = Windows 10 IP | ||
第2レベルの仮想Hyper-Vホスト (仮想マシン) | OS = Windows 10 IP | ||
末端仮想マシン | OS = Windows 10 IP |
winrm quickconfig ※ またはwinrm qc |
winrm set winrm/config/client @{TrustedHosts="Enter-PSSEssion -ComputerNameでリモート接続するホスト名"} ※ TrustedHostsリストの上書き用コマンドの例です |
> Enter-PSSession -ComputerName HVW10VML1b -Credential "HVW10VML1b\Administrator" →「資格情報の要求」ダイアログが表示されますので接続先のHVW10VML1bホストのAdministratorユーザのパスワードを入力して<OK>をクリックします。 資格情報がHVW10VML1bで承認されると以下のPowerShellプロンプト表示に変わります。 [HVW10VML1b]: PS C:\Users\Administrator\Documents> |
> Enter-PSSession -VMName HVW10VML2 -Credential "HVW10VML2\Administrator" →「資格情報の要求」ダイアログが表示されますのでHVW10VML2ホストのAdministratorユーザのパスワードを入力して<OK>をクリックします。 資格情報がHVW10VML2で承認されると以下のPowerShellプロンプト表示に変わります。 [HVW10VML1b]: [HVW10VML2]: PS C:\Users\Administrator\Documents> |
> Exit-PSSession Exit-PSSessionの実行によって以下のPowerShellプロンプト表示に変わります。 [HVW10VML1b]: PS C:\Users\Administrator\Documents> |
> Exit-PSSession |
> Invoke-Command -VMName HVW10VML2 -ScriptBlock { Get-VM | Where-Object {$_.State -eq 'Running' }} -Credential "HVW10VML2\Administrator" →「資格情報の要求」ダイアログが表示されますのでHVW10VML2ホストのAdministratorユーザのパスワードを入力して<OK>をクリックします。 |
ホスト種別 | 仮想マシン名 | ホスト名 | 備考 |
---|---|---|---|
実Hyper-Vホスト | OS = Windows 10 Pro IP | ||
第1レベルの仮想Hyper-Vホスト (仮想マシン) | (構成ファイルのバージョン:7.0) | OS = Windows 10 Pro IP | |
第2レベルの仮想マシン (末端仮想マシン) | (構成ファイルのバージョン:6.2) | OS = Windows 10 Home IP |
> Enter-PSSession -ComputerName vmtestconf50 -Credential "vmtestconf50\Administrator" > Enter-PSSession -VMName HVSW10HomeConf62 -Credential "HVSW10Home\Administrator" |
> Enter-PSSession -ComputerName vmtestconf50 -Credential "vmtestconf50\Administrator" > Invoke-Command -VMName HVSW10HomeConf62 -ScriptBlock { systeminfo } -Credential "HVSW10Home\Administrator" |