Hyper-Vでテンプレートから仮想マシンを作成するPowerShellスクリプト

3 min read

はじめに

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. 実行セクション

実行セクションは、以下の手順で仮想マシンを作成します:

  1. 事前チェック

    • 同名の仮想マシンが存在しないことを確認
    • テンプレートファイルの存在確認
  2. ファイル準備

    • 仮想マシン用のフォルダ構造を作成
    • テンプレートVHDXファイルを新規フォルダにコピー
  3. 仮想マシン作成

    • 基本設定(名称、世代、メモリ、仮想スイッチなど)
    • 詳細設定
      • CPUコア数の設定
      • Generation 2の場合はセキュアブートの無効化
      • MACアドレススプーフィングの有効化
      • チェックポイントの無効化
      • ネスト仮想化の有効化
      • 動的メモリの無効化
      • ディスクサイズの拡張

使用方法

  1. スクリプトを任意の場所に保存します(例:Create-VM.ps1

  2. スクリプト冒頭の変数を環境に合わせて修正します:

    $VMName = "作成したい仮想マシン名"
    $TemplateFilePath = "テンプレートVHDXファイルのパス"
    $DestinationRootPath = "仮想マシンの配置先パス"
    $SwitchName = "使用する仮想スイッチ名"
  3. 管理者権限でPowerShellを起動し、スクリプトを実行します:

    powershell.exe -ExecutionPolicy Bypass .\Create-VM.ps1
  4. スクリプトの実行が完了すると、指定した設定で仮想マシンが作成されます。

おわりに

本スクリプトを使用することで、仮想マシンの作成を自動化し、一貫性のある環境を効率的に構築することができます。また、スクリプトはモジュール化されており、必要に応じて機能を追加・カスタマイズすることが可能です。

本スクリプトが、皆様の仮想環境管理の効率化に貢献できれば幸いです。