Nested Hyper-Vのかんたん設定PowerShellの内容解説

この記事は、「[クラウド時代のシステム管理](https://www.takanyan.net/enable-nestedvm/)の記事を転記したものです。
<a href="https://www.takanyan.net/easy-nested-hyper-v/" rel="noopener" target="_blank">前回のBlog記事</a>ではPowerShellのScriptを使ってかんたんにNested Hyper-Vを使うための設定方法について解説しました。今回は、設定に使ったPowerShellの内容について解説しながら、Nested Hyper-V設定の詳細を見ていきます。

<!--more-->

## 1. Nested Hyper-V設定PowerShellのダウンロード

解説対象PowerShell Scriptは<a href="https://github.com/MicrosoftDocs/Virtualization-Documentation/blob/master/hyperv-tools/Nested/Enable-NestedVm.ps1" rel="noopener" target="_blank">github上にあるEnable-NestedVm.ps1</a>です。以下、「〇〇行目」という記載はこのファイルの行番号を指すものとします。

## 2. Enable-NestedVm.ps1の実行内容解説

### 2-1. 1～16行目：引数チェックと定数の定義

最初の16行で引数としてVM名の文字列が定義されていない、もしくは空文字の場合、使用方法を出力します。空でない文字列が渡された場合は定数として4GBを定義します。

### 2-2. 17～51行目：管理者権限での実行

Nested Hyper-Vの設定にはAdministrator権限が必要なので、Script実行ユーザーに権限があるか確認します。Admonistrator権限で実行されている場合はWindowのタイトルバーに管理者権限である旨を記載し、権限がない場合、Administrator権限でのrunasを実行します。

### 2-3. 52～68行目：仮想マシン設定取得

Nested Hyper-Vを設定する対象仮想マシンについて、以下の情報を取得し、一つのオブジェクトとして定義します。

|項目|意味|
|---|---|
|ExposeVirtualizationExtensions|CPUの仮想化支援命令を仮想マシンに見せるかどうか|
|DynamicMemoryEnabled|Dynamic Memoryの設定が有効になっているかどうか|
|SnapshotEnabled|Snapshotを取得しているか|
|State|仮想マシンの電源状態がOn/Off/保存状態かどうか|
|MacAddressSpoofing|MACアドレス偽装を有効にしているかどうか|
|MemorySize|仮想マシンのメモリーサイズ|

### 2-4. 69～107行目：Nested仮想化に適した状態か確認

2-3.で取得した情報をもとに、Nested仮想化に適した状態であるかどうかをチェックします。すでに<code>ExposeVirtualizationExtensions</code>の設定が実施済みの場合は設定を再度行わず終了となります。

### 2-5. 108～117：Nested仮想化設定実行の確認

Y/Nで本当にNested仮想化設定を行うか入力します。

### 2-6. 118～131行目：Nested仮想化の必須設定投入

Nested仮想化の必須設定を行うため、すべてのSnapshotの削除（結合）、保存状態の削除、仮想マシンの電源OFFを実行し、その後に下記2項目の設定変更を行います。

|変更する項目|変更後の値|
|---|---|
|ExposeVirtualizationExtensions|True|
|DynamicMemoryEnabled|False|


### 2-7. 132～146行目：MACアドレス偽装を有効に設定

Nested仮想化された仮想マシンから外部に通信できるようにするため、MACアドレス偽装を有効に設定します。Nested Hyper-V内に閉じたネットワークしか利用しない場合は設定不要です。外部と直接（L2接続で）通信するためには必要な設定です。

### 2-8. 147～158行目：メモリーサイズを4GBに設定

推奨される最低メモリー容量は4GBであるため、仮想マシンのメモリーが4GB未満の場合は、4GBに設定することが可能です。


以上でEnable-NestedVm.ps1の内容の説明が完了しました。意外と丁寧に事前チェックをしており、許可を出した後はガツガツVMを停止して設定変更を行います。


)」の記事を転記したものです。

<a href="https://www.takanyan.net/easy-nested-hyper-v/" rel="noopener" target="_blank">前回のBlog記事</a>ではPowerShellのScriptを使ってかんたんにNested Hyper-Vを使うための設定方法について解説しました。今回は、設定に使ったPowerShellの内容について解説しながら、Nested Hyper-V設定の詳細を見ていきます。

<!--more-->

## 1. Nested Hyper-V設定PowerShellのダウンロード

解説対象PowerShell Scriptは<a href="https://github.com/MicrosoftDocs/Virtualization-Documentation/blob/master/hyperv-tools/Nested/Enable-NestedVm.ps1" rel="noopener" target="_blank">github上にあるEnable-NestedVm.ps1</a>です。以下、「〇〇行目」という記載はこのファイルの行番号を指すものとします。

## 2. Enable-NestedVm.ps1の実行内容解説

### 2-1. 1～16行目：引数チェックと定数の定義

最初の16行で引数としてVM名の文字列が定義されていない、もしくは空文字の場合、使用方法を出力します。空でない文字列が渡された場合は定数として4GBを定義します。

### 2-2. 17～51行目：管理者権限での実行

Nested Hyper-Vの設定にはAdministrator権限が必要なので、Script実行ユーザーに権限があるか確認します。Admonistrator権限で実行されている場合はWindowのタイトルバーに管理者権限である旨を記載し、権限がない場合、Administrator権限でのrunasを実行します。

### 2-3. 52～68行目：仮想マシン設定取得

Nested Hyper-Vを設定する対象仮想マシンについて、以下の情報を取得し、一つのオブジェクトとして定義します。

|項目|意味|
|---|---|
|ExposeVirtualizationExtensions|CPUの仮想化支援命令を仮想マシンに見せるかどうか|
|DynamicMemoryEnabled|Dynamic Memoryの設定が有効になっているかどうか|
|SnapshotEnabled|Snapshotを取得しているか|
|State|仮想マシンの電源状態がOn/Off/保存状態かどうか|
|MacAddressSpoofing|MACアドレス偽装を有効にしているかどうか|
|MemorySize|仮想マシンのメモリーサイズ|

### 2-4. 69～107行目：Nested仮想化に適した状態か確認

2-3.で取得した情報をもとに、Nested仮想化に適した状態であるかどうかをチェックします。すでに<code>ExposeVirtualizationExtensions</code>の設定が実施済みの場合は設定を再度行わず終了となります。

### 2-5. 108～117：Nested仮想化設定実行の確認

Y/Nで本当にNested仮想化設定を行うか入力します。

### 2-6. 118～131行目：Nested仮想化の必須設定投入

Nested仮想化の必須設定を行うため、すべてのSnapshotの削除（結合）、保存状態の削除、仮想マシンの電源OFFを実行し、その後に下記2項目の設定変更を行います。

|変更する項目|変更後の値|
|---|---|
|ExposeVirtualizationExtensions|True|
|DynamicMemoryEnabled|False|


### 2-7. 132～146行目：MACアドレス偽装を有効に設定

Nested仮想化された仮想マシンから外部に通信できるようにするため、MACアドレス偽装を有効に設定します。Nested Hyper-V内に閉じたネットワークしか利用しない場合は設定不要です。外部と直接（L2接続で）通信するためには必要な設定です。

### 2-8. 147～158行目：メモリーサイズを4GBに設定

推奨される最低メモリー容量は4GBであるため、仮想マシンのメモリーが4GB未満の場合は、4GBに設定することが可能です。


以上でEnable-NestedVm.ps1の内容の説明が完了しました。意外と丁寧に事前チェックをしており、許可を出した後はガツガツVMを停止して設定変更を行います。