Powershell commands to create Hyper-v 2012 VMs
In this post I wanted to point some interesting way to create VMs.
A VM can host several type of virtual disks
First there is two file format VHD and the new VHDX. VHD can be up to 2TB where VHDX can go up to 64TB. Also VHDX are more resilient to VM hard shutdown but are only supported by WS 2012 and so I think also Windows 8.
Then there is three types of disks :
- Fixed : The complete volume of the disk is created at the beginning. This kind of disk is more effective but will use the total allocated space.
- Dynamic : this type of virtual disk create a small disk that contain the data hosted. Then as long as you fullfill the disk in the VM the hosted file will grow
- Differencing : this type of disk is based on another disk called the parent disk. The child disk contain only the differences you made in the VM. Both disks (parent and child) could be Fixed or Dynamic disk but the format should be the same (VHD or VHDX). This kind of disk reduce disk space usage.
If you use the UI or the command line New-VM the default dynamic type will be used.If you want to use fixed or differencing size you’ll need to create the disk separatly.
Of course you can use the UI to create VHD and VM, it’s great to build a few VM but if you want to create several VM and always use the same configuration you really should write some Powershell Scripts.
Here are the Command to create all sort of disks :
Dynamic without source :
New-VHD -Path « C:\ClusterStorage\Volume1\BASE2012.VHDX » -Dynamic -SizeBytes 127GB -ComputerName hyperv01
Dynamic with source :
New-VHD -Path « C:\ClusterStorage\Volume1\VM001.VHDX » -ParentPath « C:\ClusterStorage\Volume1\BASE2012.VHDX » -Dynamic -SizeBytes 127GB -ComputerName hyperv01
Fixed without source :
New-VHD -Path « C:\ClusterStorage\Volume1\BASE2012.VHDX » -Fixed -SizeBytes 60GB -ComputerName hyperv01
Fixed with source :
New-VHD -Path « C:\ClusterStorage\Volume1\VM001.VHDX » -SourceDisk C:\ClusterStorage\Volume1\BASE2012.VHDX -Fixed -SizeBytes 60GB -ComputerName hyperv01
Differencing disk :
New-VHD -Path « C:\ClusterStorage\Volume1\VM001.VHDX » -ParentPath « C:\ClusterStorage\Volume1\BASE2012.VHDX » -Differencing -SizeBytes 127GB -ComputerName hyperv01
(The source is a base disk)
To create a new VM you can :
Create a VM and a new VHD (Dynamic) :
New-VM -Name VM01 -NewVHDPath « c:\ClusterStorage\Volume1\VM01.VHDX » -NewVHDSizeBytes 60GB -ComputerName Hyperv01
Create a VM with no disk :
New-VM -Name VM01 -noVHD -ComputerName Hyperv01
Create a VM and attach an existing VHD :
New-VM -Name VM01 -VHDPath « c:\ClusterStorage\Volume1\VM01.VHDX » -ComputerName Hyperv01
Ok so now that we have all the basics command let’s create a script to build 5 VM with fixed size disk (CreateVMFixedVhd) :
$vhdpath = « C:\ClusterStorage\Volume1\VHD\ »
$vmnetworkName = « External01″
$memorySize = 1GB
$VmtoCreate = 5
$DiskSize = 60GB
$HyperVhost = hyperv011..$VmtoCreate | % {
New-VHD -Path $vhdpath »VM$_.VHDX » -Fixed -SizeBytes $DiskSize -ComputerName $HyperVhost
New-VM -Name VM00$_ -VHDPath $vhdpath »VM$_.VHDX » -Memory $memorySize -SwitchName $vmnetworkName -ComputerName $HyperVhost
Start-VM VM00$_ -ComputerName $HyperVhost}
The problem with this method is that you’ll have to install all OS. Thus, we’ll need a source disk.To do so we will first create the base VM to create the base image :
New-VHD -Path « C:\ClusterStorage\Volume1\VHD\BASE2012.VHDX » -Fixed -SizeBytes 60GB -ComputerName hyperv01
New-VM -Name VMBase2012 -VHDPath « C:\ClusterStorage\Volume1\VHD\BASE2012.VHDX » -ComputerName Hyperv01
Set-VMDVDDrive -VMName VMBase2012 -Path C:\ClusterStorage\Volume1\ISO\Win2012_RTM.iso -CmputerName Hyperv01
Start-VM VMBase2012 -ComputerName Hyperv01
- Install the OS
- Install integration services and make any changes you want
- Sysprep it and shutdown
- c:\Windows\System32\sysprep\sysprep.exe /generalize /oobe /shutdown
- Remove the base2012 VM from Hyperv manager (Command : Remove-VM Base2012)
- This command delete the VM but not the VHD
Then we’ll be able to use this disk as a source for our new virtual machines.
Indeed, I choose to build several VM using Differencing disks.
$vhdpath = « C:\ClusterStorage\Volume1\VHD\ »
$vmnetworkName = « External01″
$memorySize = 1GB
$VmtoCreate = 5
$DiskSize = 80GB
$HypervHost = « hyperv01″
1..$VmtoCreate | % {
New-VHD -Path $vhdpath »VM00$_.VHDX » -ParentPath $vhdpath »BASE2012.VHDX » -Differencing -SizeBytes $DiskSize -ComputerName $HypervHost
New-VM -Name VM00$_ -VHDPath $vhdpath »VM00$_.VHDX » -Memory $memorySize -SwitchName $vmnetworkName -ComputerName $HypervHost
Start-VM VM00$_ -ComputerName $HypervHost
}
Then if you want to add this Virtual machines to your failover cluster
$VmtoAdd = 5
$ClusterName = « Cluster01″
1..$VmtoAdd | % {
Add-ClusterVirtualMachineRole -VirtualMachine VM00$_ -Name VM00$_ -Cluster $ClusterName
}
Enjoy
Source :
Commentaires récents