/hyperv_create.ps1

raw link view readme
1 #
2 # copyright (c) 2014-2016 david betz
3 # used to setup labs via pxeboot or iso, recreate vms based on existing vhds, or create vms with differencing disks
4 #
5 function hyperv_create { param($name, $os = $null, $iso = $null, $diskLocation = $null, $diskSize = 128GB, $gen = 2, $memory = 2GB, $maxMemory = 2GB, $processorCount = 8, $addPrivateNetwork = $False, $auxDiskCount = 0, $auxDiskSize = 0, $networkBoot = $false)
6 $diskRootDefault = 'V:\_VM'
7 $templateFolder = 'V:\_VMTEMPLATE'
8 $programDataFolder = 'V:\_VM\__PROGRAMDATA'
9 $vhdxSystemPath = "$diskRootDefault\$name.vhdx"
10 if ($os) {
11 $baseDiskPath = "$templateFolder\$os.vhdx"
12 }
13 $switchName = 'External Virtual Switch'
14 $privateSwitchName = 'Private Virtual Switch'
15
16 if($maxMemory -gt $memory) {
17 $memory = $maxMemory
18 }
19
20 if((Test-Path $vhdxSystemPath)) {
21 Write-Host "Disk already exists. Aborting. `n`t$vhdxSystemPath"
22 }
23 else {
24 if(!$diskLocation -and $os) {
25 Write-Host "Creating VHD $vhdxSystemPath"
26 New-VHD -SizeBytes $diskSize -Path $vhdxSystemPath -Differencing -ParentPath $baseDiskPath > $null
27 }
28 elseif($iso -or $networkBoot) {
29 $vhdxSystemPath = ("{0}`\{1}.vhdx" -f $diskRootDefault, $name)
30 if((Test-Path $vhdxSystemPath)) {
31 Write-Host "!!ALREADY EXISTS: $vhdxSystemPath"
32 return
33 }
34 Write-Host "Creating VHD $vhdxSystemPath"
35 New-VHD -Path $vhdxSystemPath -Dynamic -Size 127GB > $null
36 }
37 else {
38 $vhdxSystemPath = $diskLocation
39 }
40
41 Write-Host "Creating VM $name"
42 $vm = New-VM -Name $name -Generation $gen -Memory $memory -VHDPath $vhdxSystemPath -SwitchName $switchName > $null
43 Set-VMMemory -VMName $name -MaximumBytes $maxMemory
44
45 Write-Host "Setting VM $name proc count to $processorCount"
46 Set-VMProcessor -VMName $name -Count $processorCount > $null
47
48 Write-Host "Setting VM $name checkpoint type to Standard"
49 Set-VM -VMName $name -CheckpointType Standard -AutomaticStartAction Nothing -AutomaticStopAction ShutDown -SmartPagingFilePath $programDataFolder -SnapshotFileLocation $programDataFolder
50
51 if($gen -eq 2) {
52 Set-VMFirmware -VMName $name -EnableSecureBoot Off
53 }
54
55 if($iso) {
56 Write-Host "Adding boot ISO"
57 $dvd = Add-VMDvdDrive -VMName $name -Path $iso > $null
58 Set-VMFirmware -VMName $name-FirstBootDevice $dvd
59 if($gen -eq 1) {
60 Set-VMBios -VMName $name -StartupOrder @("CD", "LegacyNetworkAdapter", "Floppy", "IDE")
61 }
62 else {
63 Set-VMFirmware -VMName $name -FirstBootDevice $dvd
64 }
65 }
66 elseif($networkBoot) {
67 if($gen -eq 1) {
68 Add-VMNetworkAdapter -IsLegacy $true -VMName $name
69 Set-VMBios -VMName $name -StartupOrder @("LegacyNetworkAdapter", "Floppy", "CD", "IDE")
70 }
71 else {
72 Set-VMFirmware -VMName $name -FirstBootDevice (Get-VMNetworkAdapter -VMName $name | select -first 1)
73 }
74 }
75
76 if($addPrivateNetwork) {
77 Add-VMNetworkAdapter -VMName $name -SwitchName $privateSwitchName
78 }
79
80 if($auxDiskCount -gt 0) {
81 function addAuxDisk { param([Int32]$id)
82 $vhdxPath = ("{0}`\{1}-Disk{2}.vhdx" -f $diskRootDefault, $name, $id.ToString("D2"))
83 #+ increasing sizes makes it easier to identify drives inside VM
84 if($auxDiskSize -gt 0) {
85 $size = $auxDiskSize * 1024*1024*1024
86 }
87 else {
88 $size = ((70 + ($id*10)) * 1024*1024*1024)
89 }
90 Write-Host ("Adding disk {0} of size {1}" -f $vhdxPath, $size)
91 New-VHD -path $vhdxPath -Dynamic -Size $size > $null
92 Add-VMHardDiskDrive -VMName $name -ControllerType SCSI -Path $vhdxPath > $null
93 }
94 1..$auxDiskCount | % {
95 addAuxDisk -id $_
96 }
97 }
98 }
99 }
100
101 #+ PXE example
102 # hyperv_create 'PXE Client 01' -gen 1 -memory 2GB -auxDiskCount 0 -networkBoot $true
103
104 #+ iso example
105 # $winsrv2012iso = 'H:\ISO\Volume\SW_DVD5_Windows_Svr_Std_and_DataCtr_2012_R2_64Bit_English_Core_MLF_X19-05182.ISO'
106 # hyperv_create 'Windows Server 2012 Core' -iso $winsrv2012iso -gen 2 -memory 2GB -maxMemory 4GB -auxDiskCount 0
107
108 #+ differencing disk (for existing image) example
109 # hyperv_create 'CentOS 6 (Lab 01)' -os 'CentOS 6 (Gen 1)' -gen 1 -memory 2GB -maxMemory 4GB -auxDiskCount 2 -auxDiskSize 80
110 # hyperv_create 'AD Server 01' -os 'Windows Server 2012 R2' -gen 2 -memory 4GB -maxMemory 4GB -auxDiskCount 0 -auxDiskSize 80
111
112
113
114