Windows Server 2016の機能の一つとして、入れ子の仮想化(Nested Hyper-V)が導入されています。本番システムで使うことは少ないかもしれませんが、諸事情で必要になった時のため、使い方を紹介します。
1. Nested Hyper-Vとは
Nested Hyper-Vは、Hyper-VゲストOSの中でさらにHyper-V仮想化機能を利用することです。Hyoer-Vでは仮想化のためにCPUの仮想化支援機能(Intel VTなど)が必須となっているため、Nested Hyper-V実現のためには仮想マシンにCPUの仮想化支援機能を認識させる必要があります。また、二重に仮想化しているため、実際に利用する際はどの階層の仮想化基盤を操作しているか意識しないと間違いやすいです。
Nested Hyoer-Vは検証環境、開発環境などでたくさんの仮想化基盤を用意したいときに便利です。私がNested Hyper-Vを利用することになった諸事情も、検証環境を1台のPCで賄うためでした。
2. Nested Hyper-Vを利用する前提条件
Nested Hyper-Vを動かすために必要な条件は以下の通りです。
- ホストOS、ゲストOSはどちらもWindows Server 2016以上、もしくはWindows 10 Anniversary Update以上
- CPUはインテル製であり、かつ仮想化支援機能(EPT、Intel VT-x)対応
- UEFIでIntel VTなどを有効にしている
AMD製CPU搭載のPCではサポートされていないことに注意してください。また、Intel VT-x機能がない安価なCPUも対象外なのでご注意を。
3. PowerShellスクリプトでNested Hyper-Vを設定
ホストOS上のHyper-V仮想マシンにNested Hyper-Vを利用可能にする設定を一度に実施できるPowerShellスクリプトがGithubにて公開されています。ここではScriptをダウンロードして実行することにします。
3-1. Nested Hyper-V設定Scriptの入手
設定ScriptはGithubのこちらのリンクで公開されている「Enable-NestedVm.ps1」です。中身をコピーするかダウンロードします。
3-2. Nested Hyper-Vの設定
事前に以下の条件を満たす仮想マシンを作成します。
- 電源OFF状態である
- Dynamic Memoryは無効にして、割り当てメモリを4GB以上にする
- 保存状態やスナップショットがない
次に、さきほど入手したScriptをPowerShellを開いたうえで実行します。実行の際質問が出ますので、すべて「Y」と入力します。
PS D:\> .\Enable-NestedVm.ps1 【VM名】
This script will set the following for 【VM名】 in order to enable nesting:
Virtualization extensions will be enabled
Optionally enable mac address spoofing
Input Y to accept or N to cancel:Y
Mac Address Spoofing isn't enabled (nested guests won't have network).
Would you like to enable MAC address spoofing? (Y/N)Y
これで、Nested Hyper-Vを使い、かつNested Hyper-Vホスト(1階層目の仮想マシン)のNetworkは物理Networkと同じセグメントになるようためのMAC Address Spoofing(MACアドレス偽装)の有効化も完了します。
あとは仮想マシン内でWindows Server 2016のインストールやHyper-V構築を通常の物理マシンに行うのと同じ手順で実施するだけとなります。
GUI上で設定状況がみられるわけではないので、実際に設定されたかわかりにくいですが、利用していると確かに仮想マシンの上でHyper-Vのセットアップができます。