とりま PowerShell で Hyper-V 仮想マシンを作成しておく

私は、仕事で Windows OS バージョン間の動作の違いを検証するときがあり、新しい端末が配布されるたびに公開されている OS の数だけ、とりあえず仮想マシンを作成しています。

検証が必要になったら OS の ISO ファイルから新規で OS をインストールする方法をとっており、仮想マシンづくりを最初にやっておくと、取り掛かるまでの心理的ハードルが下がると思っています。

いつもどこにスクリプトを保存したか忘れてしまい探すのに時間がかかるので、実際に実行している PowerShell スクリプトを備忘録として残しておきます。

## PowerShell スクリプト（全部）
```powershell
$osList = @(
    "Windows 2015 LTSB",
    "Windows 2016 LTSB",
    "Windows 2019 LTSC",
    "Windows 2021 LTSC",
    "Windows 10 21H2 19044",
    "Windows 10 22H2 19045",
    "Windows 11 21H2 22000",
    "Windows 11 22H2 22621",
    "Windows 11 23H2 22631",
    "Windows Server 2016 14393",
    "Windows Server 2019 17763",
    "Windows Server 2022 20348"
)
$path = "C:\Hyper-V\VHD\"
foreach($os in $osList){
    $padding = $os.Replace(' ', '_')
    $vhdPath = "$path$padding.vhdx"
    New-VM -Name $os -MemoryStartupBytes 4GB -Generation 2 -NewVHDPath $vhdPath -NewVHDSizeBytes 128GB
    Set-VM -Name $os -StaticMemory -ProcessorCount 4 -AutomaticCheckpointsEnabled $false
    Add-VMDvdDrive -VMName $os -controllerNumber 0
    Set-VMProcessor -VMName $os -ExposeVirtualizationExtensions $true
    Set-VMKeyProtector -VMName $os -NewLocalKeyProtector
    Enable-VMTPM -VMName $os
}
```
## 解説
### 1. OS のリストアップと仮想ディスクの保存先を指定
現在、サポートされている OS をリストアップして、仮想ディスクの保存先を指定しています。OS 名の末尾には、その OS のビルド番号を付けています。
```powershell
$osList = @(
    "Windows 2015 LTSB",
    "Windows 2016 LTSB",
    "Windows 2019 LTSC",
    "Windows 2021 LTSC",
    "Windows 10 21H2 19044",
    "Windows 10 22H2 19045",
    "Windows 11 21H2 22000",
    "Windows 11 22H2 22621",
    "Windows 11 22H2 22631",
    "Windows Server 2016 14393",
    "Windows Server 2019 17763",
    "Windows Server 2022 20348"
)
$path = "C:\Hyper-V\VHD\"
```

### 2. 仮想ディスクのファイル名を作成（任意）
ファイル名に空白があるのは気持ち悪い性格なので、スペース文字をアンダースコアに変更しています。
```powershell
$padding = $os.Replace(' ', '_')
$vhdPath = "$path$padding.vhdx"
```

### 3. 仮想マシンの作成
第２世代の Hyper-V 仮想マシンを CPU コア数を4個、物理メモリ 4GB、ディスク 128GB で作成します。Hyper-V 仮想マシンの自動チェックポイント作成機能は、OFF にしています。あとで ISOファイルから OS をインストールするため、DVD ドライブを追加しています。
```powershell
New-VM -Name $os -MemoryStartupBytes 4GB -Generation 2 -NewVHDPath $vhdPath -NewVHDSizeBytes 128GB
Set-VM -Name $os -StaticMemory -ProcessorCount 4 -AutomaticCheckpointsEnabled $false
Add-VMDvdDrive -VMName $os -controllerNumber 0
```

### 4. 仮想化機能を有効化
仮想マシン上で、WSL (Windows Subsystem for Linux) の実行や仮想マシン上でさらに仮想マシン (Nested VM) を起動できるように仮想化機能を有効化します。
```powershell
Set-VMProcessor -VMName $os -ExposeVirtualizationExtensions $true
```
https://learn.microsoft.com/en-us/virtualization/hyper-v-on-windows/user-guide/nested-virtualization

### 5. TPM を有効化
Windows 11 では、TPM が有効であることが求められるので、TPM を有効化しておきます。なお、Enable-VMTPM のみ実行するとエラーが発生するので、まず、Set-VMKeyProtector の実行が必要です。
```powershell
Set-VMKeyProtector -VMName $os -NewLocalKeyProtector
Enable-VMTPM -VMName $os
```
https://jpwinsup.github.io/blog/2022/12/22/Hyper-V/ConfigurationAndManagement/Setting-vTPM/

## Hyper-V マネージャー
PowerShell スクリプト実行後のスクリーンショット

![hyper-v.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3853334/26ce3a97-f24c-2198-1d4f-1ad993d90d0b.png)

## 参考URL
New-VM (Hyper-V) | Microsoft Learn
https://learn.microsoft.com/en-us/powershell/module/hyper-v/new-vm

Set-VM (Hyper-V) | Microsoft Learn
https://learn.microsoft.com/en-us/powershell/module/hyper-v/set-vm

Set-VMProcessor (Hyper-V) | Microsoft Learn
https://learn.microsoft.com/en-us/powershell/module/hyper-v/set-vmprocessor

Add-VMDvdDrive (Hyper-V) | Microsoft Learn
https://learn.microsoft.com/en-us/powershell/module/hyper-v/add-vmdvddrive

Set-VMKeyProtector (Hyper-V) | Microsoft Learn
https://learn.microsoft.com/en-us/powershell/module/hyper-v/set-vmkeyprotector

Enable-VMTPM (Hyper-V) | Microsoft Learn
https://learn.microsoft.com/en-us/powershell/module/hyper-v/enable-vmtpm