March 11 2017 – My book Learn Hyper-V in a Month of Lunches is Manning’s Deal of the day. Get 50% off using code dotd031117au at http://bit.ly/2niU715
Also see https://www.manning.com/dotd
March 11 2017 – My book Learn Hyper-V in a Month of Lunches is Manning’s Deal of the day. Get 50% off using code dotd031117au at http://bit.ly/2niU715
Also see https://www.manning.com/dotd
When you think of using Hyper-V most people think of virtualising their infrastructure – big servers running 10s, 100s or even 1000s of virtual machines.
There is another reason for using Hyper-V
You can use Hyper-V to create a VM so you can install an application that may conflict with you standard workstation – as an example you may need access to a component of an older version of Office for instance Infopath 2010 but you don’t want that application to conflict with your installation of the latest and greatest version of Office.
The Windows client operating system has the ability to install Hyper-V since Windows 8. So if you’re running Windows 8, Windows 8.1 or Windows 10 AND your machine is capable of supporting Hyper-V:
– Windows Enterprise, Professional or Educational
– 64-bit processor with SLAT
– CPU support for VM monitor mode extension
– Minimum of 4GB of memory
Install Hyper-V
Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Hyper-V –All
Create a virtual switch and create your VMs
See https://docs.microsoft.com/en-us/virtualization/hyper-v-on-windows/quick-start/enable-hyper-v and subsequent links
Better still get a copy of Learn Hyper-V in a Month of Lunches
https://www.manning.com/books/learn-hyper-v-in-a-month-of-lunches
Deal of the Day January 28: Half off my book Learn Hyper-V in a Month of Lunches. Use code dotd012817au at http://bit.ly/2jAIfWK
More information from DOTD’s page at https://www.manning.com/dotd
If you’re looking for something to treat yourself for Christmas then garb a copy of My new book – Learn Hyper-V in a Month of Lunches.
Better still tomorrow 18 December 2016 you can get the book for half price:
Deal of the Day December 18: Half off Learn Hyper-V in a Month of Lunches. Use code dotd121816au at http://bit.ly/2hOkhKb
I’ve been working with Andy Syrewicze on Learn Hyper-V in a Month of Lunches.
Its now available in Manning’s Early Access program (MEAP) https://www.manning.com/books/learn-hyper-v-in-a-month-of-lunches
Until 14 November 2016 you can get the MEAP for half price using code mlsyrewicze
My test/lab machine had been running Windows Server 2016 TP 5. With Server 2016 now RTM it was time for a rebuild. Unfortunately, 2016 RTM carried on from TP5 and decided not to work with my wireless card.
Decided to try using Hyper-V on Windows 10 – it recognises the wifi card and is happy to work with it.
After installing the Hyper-V feature I needed to create some Hyper-v virtual switches
PS> New-VMSwitch -SwitchType External -Name ‘LAN’ -NetAdapterName ‘LAN’
New-VMSwitch : Cannot validate argument on parameter ‘SwitchType’. The argument "External" does not belong to the set
"Internal,Private" specified by the ValidateSet attribute. Supply an argument that is in the set and then try the
command again.
At line:1 char:26
+ New-VMSwitch -SwitchType External -Name ‘LAN’ -NetAdapterName ‘LAN’
+ ~~~~~~~~
+ CategoryInfo : InvalidData: (:) [New-VMSwitch], ParameterBindingValidationException
+ FullyQualifiedErrorId : ParameterArgumentValidationError,Microsoft.HyperV.PowerShell.Commands.NewVMSwitch
But External is a valid switch type
PS> New-VMSwitch -SwitchType x
New-VMSwitch : Cannot bind parameter ‘SwitchType’. Cannot convert value "x" to type
"Microsoft.HyperV.PowerShell.VMSwitchType". Error: "Unable to match the identifier name x to a valid enumerator name.
Specify one of the following enumerator names and try again:
Private, Internal, External"
At line:1 char:26
+ New-VMSwitch -SwitchType x
+ ~
+ CategoryInfo : InvalidArgument: (:) [New-VMSwitch], ParameterBindingException
+ FullyQualifiedErrorId : CannotConvertArgumentNoMessage,Microsoft.HyperV.PowerShell.Commands.NewVMSwitch
Wonder how many of these issues I’m going to find!
My test lab is a set of virtual machines running on a Lenovo w1510 laptop. When I’ve finished working for the day I want to shut down the virtual machines and the laptop. I may have anywhere between 2 and 8 (or more) VMs running so scripting the shutdown helps a lot.
Machines can be shutdown independently so this is an action that is ideal for parallel execution through a workflow.
workflow stop-allvms {
$vms = Get-VM | where State -eq "Running"
foreach -parallel ($vm in $vms) {
Stop-Computer -PSComputerName $vm.Name -Force -Verbose
}
}
stop-allvms
Get the running VMs. use foreach –parallel to run stop-computer against each VM. Notice I’ve had to change the parameter on Stop-Computer from –ComputerName to –PSComputerName
Another little workflow that makes life easier. I looks like workflows aren’t going to be the game changer that we originally thought but they do add some interesting options.
I use WSUS in my lab to update machines – means I only have to download updates once. The issue is that I have to start the VMs so they can communicate with the WSUS server. WSUS will start to flag warnings if machines haven’t contacted the WSUS server for more than that length of time.
Putting that together I can use the UpdateServices (WSUS) module and the Hyper-V module to start machines that have been turn off more than 7 days.
$date = (Get-Date).AddDays(-7)
Get-WsusComputer -NameIncludes ‘W12R2’ |
where LastReportedStatusTime -lt $date |
foreach {
$psitem.FullDomainName
$name = ($psitem.FullDomainName -split "\.")[0]
$vm = Get-VM -Name $name -ComputerName server02
if ($vm.State -eq ‘Off’) {
Start-VM -Name $name -ComputerName server02
Start-Sleep -Seconds 30
}
}
Set a date 7 days in the past.
Use get-WsusComputer to pull the machine names. I filter on W12R2 (all my machine names contain an abbreviated OS type) and check the last status report time.
Any machines that haven’t reported – the VM data is retrieved and if the machine isn’t running it’s started. Machines take about 25-30 seconds to boot on my lab so a sleep of 30 seconds means I’m not starting them all at once.
A question came into the forum about getting information on the virtual disks associated with particular Hyper-V virtual machines. Is a bit of a digging exercise but this gets the results:
Get-VM |
foreach {
$VMname = $psitem.Name
Get-VMHardDiskDrive -VMName $VMname |
foreach {
Get-VHD -Path $_.Path |
select @{N=’VMname’; e={$VMName}}, Path, Size, FileSize
}
}
Get the set of VMs and for each of them get the VMHardDisks associated with the machine. For each VMHardDisk get the VHD – this is where you find the data you need.
The size and file size are in bytes – its a simple matter to create calculated fields that divide by 1GB or percentages if you require
I needed to look at my virtual machines & their disk sizes – with Windows 2012 R2 upgrade in the works I need to do a bit more tidy up
I found two cmdlets in the Hyper-V module:
get-vmharddiskdrive – can be related to the virtual machine but doesn’t give a size
get-vhd – expects a path to the VHD file
Luckily get-vmharddiskdrive outputs the path. This gives me a nice pipeline:
Get-VM |
Get-VMHardDiskDrive |
Get-VHD |
select Path, @{N=’Size’; E={[math]::Round(($_.FileSize / 1gb), 2) }} |
sort -Descending
Get the VMs pipe through get-vmharddiskdrive and get-vhd then select and sort and you’re done.
I always break my pipelines at a pipe symbol – it acts as a line continuation in the console and ISE so anything thing else is just extra unnecessary work