[TechEd 2010] T2-401 セッションで使用したスクリプト

本日の TechEd セッションへお越しいただいた方々、最後のセッションに Hyper-V を選んでいただきありがとうございました。デモが失敗したりとお見苦しいところをお見せしましたが、、Dynamic Memory がなかなか役に立つということが少しでも伝わっていれば幸いです。

Twitter でご要望をいただきましたので、デモでちらっとお見せした、VM 一括生成スクリプトを公開します。といっても、お見せするのが恥ずかしい程度に単純なものですが・・・

なお、下準備として、Windows をインストールし sysprep を実行した(sysprep /generalize /oobe /shutdown した) 仮想マシンの VHD が必要です。また、PSHyperv を使っています。

VM 作成スクリプト “create-vms.ps1”


# 仮想マシンを配置する基準ディレクトリ
$basedir = "V:\Hyper-V\VMs\TE2010"

# 親ディスク(sysprep済のOSイメージ)
$parentVHD = "V:\Hyper-V\VHDs\TE2010_BASE.vhd"

# 仮想マシン名(の先頭部分)
$vmname_base = "T2-401_"

# VP数
$cpucount = 2

# スタートアップメモリ (VirtualQuantity)
$startup_memory = 1024mb

# 予約メモリ (Reservation)
$min_memory = 512mb

# 最大メモリ (Limit)
$max_memory = 4096mb

for ($i=1; $i -lt 33; $i++) {
$vmname = "$vmname_base{0:D2}" -f [int]$i
$vmpath = "$basedir\$vmname"

    echo "vmname: [$vmname]"
echo "vmpath: [$vmpath]"

    # Create VM
$vm = new-vm -name $vmname -path $vmpath

    # enable dm
Set-VMMemory -vm $vm -minmemory $min_memory -memory $max_memory -startupmemory $startup_memory

    # VP数の設定
Set-VMCPUCount -vm $vm -cpucount $cpucount

    # 差分ディスクを作成してVMにくっつける
$vhdpath = "$vmpath\$vmname.vhd"
new-vhd -vhdpath $vhdpath -ParentVHDPath $parentVHD
add-vmdisk -vm $vm -ControllerID 0 -LUN 0 -path $vhdpath

    # DVD driveを装着
Add-VMDrive -vm $vm -ControllerID 1 -LUN 0 -OpticalDrive

    # NICを2枚ほど
Add-VMNIC -vm $vm -virtualswitch "仮想ネットワーク1"
Add-VMNIC -vm $vm -virtualswitch "仮想ネットワーク2"
}


また、上記スクリプト内では、    Set-VMMemory コマンドレットに –startupmemory 等の設定をしていますが、今の PSHyperv に含まれるコマンドレットは Dynamic Memory に非対応なので、私がちょっと改造したものを使っています。

これもまた手抜き改造なのですが、、、こんなのです。

"C:\Program Files\modules\HyperV\VMConfig.ps1" 中の Set-VMMemory 関数、赤字部分が変更点です。


Function Set-VMMemory
{# .ExternalHelp MAML-VMConfig.XML
[CmdletBinding(SupportsShouldProcess=$true)]
param(
[parameter(Mandatory = $true, ValueFromPipeLine = $true)]
$VM,
[parameter(Mandatory = $true)][Alias("MemoryInBytes")]
[long]$Memory,
[parameter(Mandatory = $true)][Alias("MinMemoryInBytes")]
[long]$MinMemory,
[parameter(Mandatory = $true)][Alias("StartupMemoryInBytes")]
[long]$StartupMemory,
$Server = ".", #May need to look for VM(s) on Multiple servers
$PSC,
[switch]$Force
)
process {
if ($psc -eq $null) {$psc = $pscmdlet} ; if (-not $PSBoundParameters.psc) {$PSBoundParameters.add("psc",$psc)}
if ($VM -is [String]) { $VM = Get-VM -Name $VM -Server $Server}
if ($VM.count -gt 1 ) {[Void]$PSBoundParameters.Remove("VM") ; $VM | ForEach-object {Set-VMMemory -VM $_ @PSBoundParameters}}
if ($vm.__CLASS -eq 'Msvm_ComputerSystem') {
if (-not ($memory % 2mb)) {$memory /= 1mb}
if (-not ($MinMemory % 2mb)) {$MinMemory /= 1mb}
if (-not ($StartupMemory % 2mb)) {$StartupMemory /= 1mb}
$SettingData = Get-VMMemory -VM $VM
$SettingData.DynamicMemoryEnabled = $True
$SettingData.Reservation = $MinMemory
$SettingData.VirtualQuantity = $StartupMemory
$SettingData.Limit = $Memory
Set-VMRASD -vm $vm -rasd $SettingData -psc $psc
}
}
}


よろしければお試しください。

__END__