Yes, I know, some of you are looking at this and thinking, that has to be simple. Or, “just use the GUI”.
Well, I can tell you. The new Generation 2 VM introduces some interesting thinking to the world of Hyper-V.
First of all, let me drop this idea: resource references / resource definitions / resource paths – or as Hyper-V calls it “FirmwarePath”
Okay lets look at what we have.
In Hyper-V 2012 I used:
PS C:\Users\Foo> Get-VMBios gen2r2
Get-VMBios : A parameter is invalid. Generation 2 virtual machines do not support the VMBios cmdlets. Use Get-VMFirmware and Set-VMFirmware instead.
Whoops. Not going to set that in the VM BIOS. And at least there is some good guidance in the error message though (I like that).
VMName SecureBoot PreferredNetworkBootProtocol BootOrderPS C:\Users\Foo> Get-VMFirmware gen2r2
------ ---------- ---------------------------- ---------
Gen2R2 Off IPv4 {File, Drive, Drive, Network}
Okay, easy enough. Before we just fed in a string and changed the order. But, before I do that, let me jsut avoid that error altogether and dig deeper.
PS C:\Users\Foo> $gen2r2 = Get-VMFirmware gen2r2
PS C:\Users\Foo> $gen2r2.BootOrder
VMName BootType Device Description FirmwarePath
------ -------- ------ ----------- ------------
Gen2R2 File Windows Boot Manager \HD(2,GPT14FD3F49-A5D7-4B1E-97EF-C...
Gen2R2 Drive Microsoft.HyperV.PowerShell.HardDiskDrive EFI SCSI Device \AcpiEx(VMBus,0,0)\VenHw(9B17E5A2-...
Gen2R2 Drive Microsoft.HyperV.PowerShell.DvdDrive EFI SCSI Device \AcpiEx(VMBus,0,0)\VenHw(9B17E5A2-...
Gen2R2 Network Microsoft.HyperV.PowerShell.VMNetworkAdapter EFI Network \AcpiEx(VMBus,0,0)\VenHw(9B17E5A2-...
Wait. Those are objects, device references. In the CIM world they are Resource References. Very interesting.
But, all I want is to set my VM to PXE boot.
And, I am going to do this the long hand way just for example – because the order has the be changed by feeding the objects in. I am assuming that bunches of you can sort that out in various ways and will gladly leave that in the comments. :-)
Lets capture the objects:
PS C:\Users\Foo> $genFile = $gen2r2.BootOrder[0]
PS C:\Users\Foo> $genNet = $gen2r2.BootOrder[3]
PS C:\Users\Foo> $genHD = $gen2r2.BootOrder[1]
PS C:\Users\Foo> $genDVD = $gen2r2.BootOrder[2]
Now, lets set those back, in the order I want them
PS C:\Users\Foo> Set-VMFirmware -VMName Gen2R2 -BootOrder $genNet,$genFile,$genHD,$genDVD
PS C:\Users\Foo> Get-VMFirmware gen2r2
VMName SecureBoot PreferredNetworkBootProtocol BootOrder
------ ---------- ---------------------------- ---------
Gen2R2 Off IPv4 {Network, File, Drive, Drive}
Let me see snazzy ways that you script this to change the boot order.
(BTW - VMM 2012 R2 does not let you do this)
3 comments:
Thanks for the post it was very useful.
I ended up using a slightly simpler method to set the BootOrder.
Get-VMDvdDrive
$MyDVD = Get-VMDvdDrive vm003
$MyHD = Get-VMHardDiskDrive vm003
$MyNIC = Get-VMNetworkAdapter vm003
Set-VMFirmware vm003 -BootOrder $MyDVD, $MyHD, $MyNIC
We managed to get this working after some runs.
In our case our VMs have two VHDX files attached (OS/Data) so File,Net,Drive,Drive,Drive
Depending on the initial order one needs to juggle the variables:
$gen2r2 = Get-VMFirmware NameOfVM
$gen2r2.BootOrder
$genFile = $gen2r2.BootOrder[0]
$genNet = $gen2r2.BootOrder[1]
$genHD0 = $gen2r2.BootOrder[2]
$genDVD = $gen2r2.BootOrder[3]
$genHD1 = $gen2r2.BootOrder[4]
Set-VMFirmware -VMName NameOfVM -BootOrder $genHD0,$genDVD,$genHD1,$genNet,$genFile
Get-VMFirmware NameOfVM
P.
Even easier:
$vmname = "nameofyourvm"
$NetAdapter = Get-VMNetworkAdapter -VMName $vmname
Set-VMFirmware -VMName $vmname -FirstBootDevice $NetAdapter
Yes, I could abbreviate it even further but this explains each step.
You could type out the name in line 1 or replace it with any number of methods to derive the name.
Then grab the network adapter, in this case assuming you run with just 1 adapter.
Lastly, set the network adapter as the first bootdevice.
Post a Comment