はじめに
Hyper-V上で仮想マシンを作成する際、GUIを使用した手動設定は時間がかかり、また設定項目の漏れが発生するリスクがあります。 本記事では、テンプレートVHDXファイルを基に仮想マシンを自動作成するPowerShellスクリプトを紹介します。このスクリプトを使用することで、一貫性のある仮想マシン環境を構築することができます。
スクリプト内容
# ==============================
# 1. 各種変数設定
# ==============================
# VM 名称
$VMName = "test-vm"
# テンプレート VHDX のパス
$TemplateFilePath = "D:\Hyper-V\ubuntu22.04-template\Virtual Hard Disks\ubuntu22.04-template.vhdx"
# VM の配置先ルートフォルダ
$DestinationRootPath = "D:\Hyper-V"
# 仮想スイッチ名
$SwitchName = "Bridge"
# Generation
$Generation = 2
# 起動メモリ(例: 2GB)
$MemoryStartupBytes = 8GB
# CPUコア数(仮想プロセッサ数)
$CPUCount = 12
# ディスクサイズ(GB)
$DiskSize = 40GB
# ==============================
# 2. 実行内容
# ==============================
try {
# --- 2-1. 事前チェック ---
# 既存VMチェック
if (Get-VM -Name $VMName -ErrorAction SilentlyContinue) {
throw "VM '$VMName' は既に存在します"
}
# テンプレートファイル存在チェック
if (-not (Test-Path $TemplateFilePath)) {
throw "テンプレートファイルが見つかりません: $TemplateFilePath"
}
# --- 2-2. 新規フォルダ作成 & テンプレートファイルコピー ---
$VMFolderPath = Join-Path $DestinationRootPath $VMName
$VHDFolderPath = Join-Path $VMFolderPath "Virtual Hard Disks"
Write-Host "■ 新規フォルダを作成します: $VHDFolderPath"
New-Item -ItemType Directory -Path $VHDFolderPath -Force | Out-Null
# コピー先の VHDX パス
$NewVhdxPath = Join-Path $VHDFolderPath "$VMName.vhdx"
Write-Host "■ テンプレートファイルをコピーします:"
Write-Host " 元: $TemplateFilePath"
Write-Host " 先: $NewVhdxPath"
Copy-Item -Path $TemplateFilePath -Destination $NewVhdxPath -Force
# --- 2-3. 仮想マシンを作成 ---
Write-Host "■ 新しい仮想マシンを作成します: $VMName"
$VM = New-VM `
-Name $VMName `
-Generation $Generation `
-MemoryStartupBytes $MemoryStartupBytes `
-VHDPath $NewVhdxPath `
-SwitchName $SwitchName `
-Path $DestinationRootPath `
-ErrorAction Stop
# --- 2-4. 詳細設定 ---
# CPU コア数の設定
Write-Host "■ CPUコア数を $CPUCount に設定します"
$VM | Set-VMProcessor -Count $CPUCount
# セキュアブート無効化 (Gen2 のみ)
if ($Generation -eq 2) {
Write-Host "■ セキュアブートを無効化します (Generation 2)"
$VM | Set-VMFirmware -EnableSecureBoot Off
}
# MACアドレススプーフィング有効化
Write-Host "■ MACアドレススプーフィングを有効化します"
$VM | Get-VMNetworkAdapter | Set-VMNetworkAdapter -MacAddressSpoofing On
# チェックポイント無効化
Write-Host "■ チェックポイントを無効化します"
$VM | Set-VM -CheckpointType Disabled
# ネスト仮想マシン有効化
Write-Host "■ ネスト仮想マシンを有効化します"
$VM | Set-VMProcessor -ExposeVirtualizationExtensions $true
# 動的メモリ設定(任意: 必要に応じてコメント解除)
Write-Host "■ 動的メモリを無効化します"
$VM | Set-VMMemory -DynamicMemoryEnabled $false
Write-Host "`n■ 作業完了: [$VMName] が正常に作成されました"
Write-Host " パス: $VMFolderPath"
# ディスク拡張
Write-Host "■ ディスクを拡張します"
Resize-VHD -Path $NewVhdxPath -SizeBytes ($DiskSize)
}
catch {
Write-Host "`nエラーが発生しました:" -ForegroundColor Red
Write-Host $_.Exception.Message -ForegroundColor Red
exit 1
}
スクリプトの解説
スクリプトは大きく分けて2つのセクションで構成されています。
1. 変数設定セクション
スクリプトの冒頭で、以下の主要な設定項目を変数として定義します:
$VMName: 作成する仮想マシンの名称$TemplateFilePath: テンプレートとして使用するVHDXファイルのパス$DestinationRootPath: 仮想マシンの配置先ルートフォルダ$SwitchName: 使用する仮想スイッチの名称$Generation: 仮想マシンの世代(Generation 1または2)$MemoryStartupBytes: 起動時のメモリ容量$CPUCount: 割り当てるCPUコア数$DiskSize: ディスクサイズ
2. 実行セクション
実行セクションは、以下の手順で仮想マシンを作成します:
-
事前チェック
- 同名の仮想マシンが存在しないことを確認
- テンプレートファイルの存在確認
-
ファイル準備
- 仮想マシン用のフォルダ構造を作成
- テンプレートVHDXファイルを新規フォルダにコピー
-
仮想マシン作成
- 基本設定(名称、世代、メモリ、仮想スイッチなど)
- 詳細設定
- CPUコア数の設定
- Generation 2の場合はセキュアブートの無効化
- MACアドレススプーフィングの有効化
- チェックポイントの無効化
- ネスト仮想化の有効化
- 動的メモリの無効化
- ディスクサイズの拡張
使用方法
-
スクリプトを任意の場所に保存します(例:
Create-VM.ps1) -
スクリプト冒頭の変数を環境に合わせて修正します:
$VMName = "作成したい仮想マシン名" $TemplateFilePath = "テンプレートVHDXファイルのパス" $DestinationRootPath = "仮想マシンの配置先パス" $SwitchName = "使用する仮想スイッチ名" -
管理者権限でPowerShellを起動し、スクリプトを実行します:
powershell.exe -ExecutionPolicy Bypass .\Create-VM.ps1 -
スクリプトの実行が完了すると、指定した設定で仮想マシンが作成されます。
おわりに
本スクリプトを使用することで、仮想マシンの作成を自動化し、一貫性のある環境を効率的に構築することができます。また、スクリプトはモジュール化されており、必要に応じて機能を追加・カスタマイズすることが可能です。
本スクリプトが、皆様の仮想環境管理の効率化に貢献できれば幸いです。