はじめに

最近、検証用としてHyper-VでAlmaLinuxのVMを作ることが多い。 VMの状態が崩れたら、一から作り直しているが、Hyper-V マネージャーから作り直すのは面倒だ。 そのため、最近はPowerShellでHyper-Vを操作するようにしている。 PowerShellでVMを作成・削除する手順を備忘録として残しておく。

VM作成手順

前提

Hyper-Vは有効化しているとする。有効化の手順は、Microsoftのドキュメントを参考。

ホストのOSはWindows11。今回、ゲストOSはAlmaLinux 10.1にする。

isoのダウンロード

事前にAlmaLinux 10.1のisoイメージを公式からダウンロードしておく。 今回は最小限(minimal)を使う。

%USERPROFILE%\Downloads\に置くことにする。

AlmaLinuxダウンロード

VMの作成

変数設定

PowerShellを起動し、次のコマンドで作成したいVMの設定を行う。

# VMの名前(好きな名前でOK)
$vmName = "AlmaLinux10-1-sandbox"
# 作成したVMに関連するファイル(チェックポイント等)の保存先(好きなパスでOK)
$vmPath = "$env:USERPROFILE\Hyper-V\$vmName"
# VMの.vhdxファイルの保存先
$vhdPath = "$vmPath\$vmName.vhdx"
# ダウンロードしたAlmaLinux ISOの保存先
$isoPath = "$env:USERPROFILE\Downloads\AlmaLinux-10.1-x86_64-minimal.iso"
# 接続する仮想スイッチ名
$switchName = "Default Switch"
# 動的メモリを使用するかどうか
$dynamicMemoryEnabled = $true
# VM起動時に割り当てるメモリサイズ
$memoryStartupBytes = 4GB
# 最小メモリ
$minimumBytes = 2GB
# 最大メモリ
$maximumBytes = 8GB
# VMの仮想ストレージの最大サイズ
$vhdSizeBytes = 40GB
# VMに割り当てる仮想CPUコア数
$processorCount = 2
# 仮想マシンの世代
$generation = 2

VMを作成する

先ほど設定した変数を使って、VMを作成する。

New-VM `
  -Name $vmName `
  -Path $vmPath `
  -NewVHDPath $vhdPath `
  -SwitchName $switchName `
  -NewVHDSizeBytes $vhdSizeBytes `
  -Generation $generation

CPUコア数の設定

作成したVMに対して、CPUコア数を設定する。(今回の場合は2コア)

Set-VMProcessor -VMName $vmName -Count $processorCount

メモリの設定

作成したVMに対して、メモリを設定する。

Set-VMMemory `
  -VMName $vmName `
  -DynamicMemoryEnabled $dynamicMemoryEnabled `
  -StartupBytes $memoryStartupBytes `
  -MinimumBytes $minimumBytes `
  -MaximumBytes $maximumBytes

チェックポイントを無効にする

もし、チェックポイント機能が必要であれば、この設定はスキップする。

Set-VM -Name $vmName -CheckpointType Disabled

DVDドライブにAlmaLinux ISOを接続

VMの仮想DVDドライブにAlmaLinux ISOを入れる。

Add-VMDvdDrive -VMName $vmName -Path $isoPath

起動順をDVD優先にする

DVDを最初に起動するようにする。

$dvdDrive = Get-VMDvdDrive -VMName $vmName
Set-VMFirmware -VMName $vmName -FirstBootDevice $dvdDrive

Secure Bootを設定

Secure Bootを有効にする。

Set-VMFirmware -VMName $vmName -EnableSecureBoot On -SecureBootTemplate MicrosoftUEFICertificateAuthority

VMを起動

Start-VM -Name $vmName

VMに接続する

VMのコンソール画面が立ち上がる。

vmconnect.exe localhost $vmName

VM作成から接続までのスクリプト

以下はこれまでの手順をまとめたスクリプト。これをPowerShellで実行すれば、VM作成から接続まで可能。

$vmName = "AlmaLinux10-1-sandbox"
$vmPath = "$env:USERPROFILE\Hyper-V\$vmName"
$vhdPath = "$vmPath\$vmName.vhdx"
$isoPath = "$env:USERPROFILE\Downloads\AlmaLinux-10.1-x86_64-minimal.iso"
$switchName = "Default Switch"
$dynamicMemoryEnabled = $true
$memoryStartupBytes = 4GB
$minimumBytes = 2GB
$maximumBytes = 8GB
$vhdSizeBytes = 40GB
$processorCount = 2
$generation = 2

New-VM `
  -Name $vmName `
  -Path $vmPath `
  -NewVHDPath $vhdPath `
  -SwitchName $switchName `
  -NewVHDSizeBytes $vhdSizeBytes `
  -Generation $generation

Set-VMProcessor -VMName $vmName -Count $processorCount

Set-VMMemory `
  -VMName $vmName `
  -DynamicMemoryEnabled $dynamicMemoryEnabled `
  -StartupBytes $memoryStartupBytes `
  -MinimumBytes $minimumBytes `
  -MaximumBytes $maximumBytes

Set-VM -Name $vmName -CheckpointType Disabled

Add-VMDvdDrive -VMName $vmName -Path $isoPath

$dvdDrive = Get-VMDvdDrive -VMName $vmName
Set-VMFirmware -VMName $vmName -FirstBootDevice $dvdDrive

Set-VMFirmware -VMName $vmName -EnableSecureBoot On -SecureBootTemplate MicrosoftUEFICertificateAuthority

Start-VM -Name $vmName

vmconnect.exe localhost $vmName

VMの削除

VMをHyper-V マネージャーだったり、Remove-VMコマンドで削除したとしても、.vhdxファイルは削除されない。

この.vhdxはVMの仮想ディスクファイルで、サイズがとても大きい。

.vhdxを消さずにいると、コンピュータの容量が逼迫してしまうため、.vhdxファイルの削除も行うこと。

VMの削除スクリプト

Remove-VMでVMを削除した後、作成したVM関連ファイルをフォルダごと削除する。

# 作成したVMの名前
$vmName = "AlmaLinux10-1-sandbox"

# VM関連ファイルのパス
$vmPath = "$env:USERPROFILE\Hyper-V\$vmName"

# VMを停止する
$vm = Get-VM -Name $vmName -ErrorAction Stop
if ($vm.State -ne 'Off') {
  Stop-VM -Name $vmName -TurnOff -Force

  while ((Get-VM -Name $vmName).State -ne 'Off') {
    Start-Sleep -Seconds 1
  }
}

# VMを削除する
Remove-VM -Name $vmName -Force

# VM関連ファイルをフォルダごと削除する
if (Test-Path -LiteralPath $vmPath) {
  Remove-Item -LiteralPath $vmPath -Recurse -Force
}

おわりに

Vagrantなどの選択肢もあるが、今回はHyper-VをPowerShellから直接操作する構成としてまとめた。