2009年12月28日月曜日

Hyper-V with PowerShell

Hyper-V Serverを導入しました。これは機能制限されたWindows Server 2008 Server Coreみたいなものです。Server Coreと同じくローカルではコマンドプロンプトでの管理しかありません。 基本的にはfirewallを必要な分解放して、リモートから管理するわけですが、ここはあえてひねくれて、Hyper-V Server単独でどこまでできるかを試してみました。 デフォルトでは有効になっていませんが、

dism /online /enable-feature /featurename:NetFx2-ServerCore /featurename:MicrosoftWindowsPowerShell
とすることでPowerShellが有効になります。 さてこのPowerShell + WMIを使ってHyper-Vは管理できます。 気合いで書いてみました。
# Switch作成 $vsm = gwmi -namespace root\virtualization Msvm_VirtualSwitchManagementService $vs = [wmi]$vsm.CreateSwitch("ExternalNetwork", "ExternalNetwork", 4096).CreatedVirtualSwitch $esp = [wmi]$vsm.CreateSwitchPort($vs, "ExternalNetwork_ExternalPort", "ExternalNetwork_ExternalPort").CreatedSwitchPort $isp = [wmi]$vsm.CreateSwitchPort($vs, "ExternalNetwork_InternalPort", "ExternalNetwork_InternalPort").CreatedSwitchPort $eep = gwmi -namespace root\virtualization Msvm_ExternalEthernetPort #NICが複数ある場合は注意 $vsm.SetupSwitch($esp, $isp, $eep, "ExternalNetwork", "ExternalNetwork") # VM作成、CPU、Memoryまで  $vsm = gwmi -namespace root\virtualization Msvm_VirtualSystemManagementService $gsd = (([wmiclass]"root\virtualization:Msvm_CirtualSystemGlobalSettingData").CreateInstance() $gsd .ElementName = "web" $vm = $vsm.DefineVirtualSystem($gsd.GetText([Management.TextFormat]::WmiDtd20)).DefinedSystem $sd = $vm.getRelated("Msvm_VirtualSystemSettingData") | select -first 1 $psd = $sd.getRelated("Msvm_ProcessorSettingData") $psd.VirtualQuantity = 2 $msd = $sd.getRelated("Msvm_MemorySettingData") $msd.Limit = $msd.Reservation = $msd.VirtualQuantity = 1024 $vsm.ModifyVirtualSystemResources($vm, (@($psd, $msd) |% {$_.GetText([Management.TextFormat]::WmiDtd20)})) # NIC追加 $vsm = gwmi -namespace root\virtualization Msvm_VirtualSwitchManagementService $guid = [Guid]::NewGuid().ToString() $sp = $vsm.CreateSwitchPort($vs, $guid, $guid).CreatedSwitchPort $ac = (gwmi -namespace root\virtualization Msvm_AllocationCapabilities -filter "ResourceType=10 and ResourceSubType='Microsoft Synthetic Ethernet Port'").__Path.Replace('\', '\\') # 10=EthernetAdapter $esd = [wmi](gwmi -namespace root\virtualization Msvm_SettingsDefineCapabilities -filter "GroupComponent='$ac' and ValueRange=0").PartComponent $esd.Connection = $sp.__Path $esd.ElementName = "Synthetic Ethernet Port" $esd.VirtualSystemIdentifiers = [Guid]::NewGuid().ToString("B") $vsm = gwmi -namespace root\virtualization Msvm_VirtualSystemManagementService $vsm.AddVirtualSystemResources($vm, $esd.GetText([Management.TextFormat]::WmiDtd20)) # Disk追加 $im = gwmi -namespace root\virtualization Msvm_ImageManagementService $dir = (gwmi -namespace root\virtualization Msvm_VirtualSystemManagementServiceSettingData).DefaultVirtualHardDiskPath $im.CreateDynamicVirtualHardDisk( (Join-Path $dir "test.vhd"), 127GB ) $ide = ($sd.getRelated("MSVM_ResourceAllocationSettingData")| where {$_.ResourceSubType -eq "Microsoft Emulated IDE Controller" -and $_.Address -eq 0}) $ac = (gwmi -namespace root\virtualization Msvm_AllocationCapabilities -filter "ResourceType=22 and ResourceSubType='Microsoft Synthetic Disk Drive'").__Path.Replace('\', '\\') # 22=Disk $dsd = [wmi](gwmi -namespace root\virtualization Msvm_SettingsDefineCapabilities -filter "GroupComponent='$ac' and ValueRange=0").PartComponent $dsd.Parent = $ide.__Path $dsd.Address = 0 $vsm = gwmi -namespace root\virtualization Msvm_VirtualSystemManagementService $drive = [wmi]($vsm.AddVirtualSystemResources($vm, $dsd.GetText([Management.TextFormat]::WmiDtd20)).NewResources | select -first 1) $ac = (gwmi -namespace root\virtualization Msvm_AllocationCapabilities -filter "ResourceType=21 and ResourceSubType='Microsoft Virtual Hard Disk'").__Path.Replace('\', '\\') # 21=StorageExtent $dsd = [wmi](gwmi -namespace root\virtualization Msvm_SettingsDefineCapabilities -filter "GroupComponent='$ac' and ValueRange=0").PartComponent $dsd.Connection = Join-Path $dir "test.vhd" $dsd.Parent = $drive.__Path $vsm.AddVirtualSystemResources($vm, $dsd.GetText([Management.TextFormat]::WmiDtd20)) # DVD追加 $ac = (gwmi -namespace root\virtualization Msvm_AllocationCapabilities -filter "ResourceType=16 and ResourceSubType='Microsoft Synthetic DVD Drive'").__Path.Replace('\', '\\') # 16=DVDDrive $dsd = [wmi](gwmi -namespace root\virtualization Msvm_SettingsDefineCapabilities -filter "GroupComponent='$ac' and ValueRange=0").PartComponent $dsd.Parent = $ide.__Path $dsd.Address = 1 $drive = [wmi]($vsm.AddVirtualSystemResources($vm, $dsd.GetText([Management.TextFormat]::WmiDtd20)).NewResources | select -first 1) $ac = (gwmi -namespace root\virtualization Msvm_AllocationCapabilities -filter "ResourceType=21 and ResourceSubType='Microsoft Virtual CD/DVD Disk'").__Path.Replace('\', '\\') # 21=StorageExtent $dsd = [wmi](gwmi -namespace root\virtualization Msvm_SettingsDefineCapabilities -filter "GroupComponent='$ac' and ValueRange=0").PartComponent $dsd.Connection = (gwmi Win32_CdromDrive -filter "Drive='D:'").DeviceID # D:ドライブ $dsd.Parent = $drive.__Path $vsm.AddVirtualSystemResources($vm, $dsd.GetText([Management.TextFormat]::WmiDtd20))
これぐらいでVMが作成できるはず。 ここまで書いてようやく気付きました。VMの画面が見れません。VMにOSがインストールできないわけです…。もちろんP2Vとかすればできますが…。 結局、長いものに巻かれろということで、私もリモート管理することにしました。 というわけで本当に動作確認できていません。