Tags: Hyper-V, PowerShell
Wie andere Hypervisor emuliert auch Hyper-V das BIOS in virtuellen Maschinen, und bei VMs der Generation 2 die UEFI-Firmware. Microsoft gewährt dabei nur Zugang zu wenigen Einstellungen, eine der wichtigsten ist jene zur Boot-Reihenfolge der Datenträger. PowerShell kann die BIOS- und UEFI-Konfiguration einfach auslesen und verändern.
Um die Einstellungen der Firmware zu ermitteln, bietet PowerShell zwei verschiedene Cmdlets für BIOS und UEFI. Für Ersteres ist Get-VMBios zuständig für Zweiteres Get-VMFirmware. Beiden kann man einfach die Namen einer oder mehrerer VMs übergeben (getrennt durch Kommata), um die gesamte Konfiguration angezeigt zu bekommen:
Get-VMFirmware -VMName VM1, VM2
Bei dieser Art des Aufrufs muss allerdings klar sein, dass es die angegebenen VMs tatsächlich der richtigen Generation angehören.
VMs nach Generation filtern
Wählt man die VMs nicht manuell aus, sondern ermittelt sie über Get-VM, dann kann man sie über die Eigenschaft Generation filtern und den Cmdlets Get-VMBios bzw. Get-VMFirmware nur die VMs übergeben, mit denen sie zurechtkommen:
Get-VM | Where Generation -eq 2| Get-VMFirmware
Dieser Aufruf würde die UEFI-Einstellungen aller lokalen VMs ausgeben, wenn diese von der Generation 2 sind. Nach dem gleichen Muster könnte man VMs der Generation 1 auswählen und an Get-VMBios übergeben.
Boot-Reihenfolge anzeigen und ändern
Die am häufigsten benötigte Information aus der Firmware dürfte die Boot-Reihenfolge sein. Die beiden genannten Cmdlets benutzen für diese Eigenschaft verschiedene Namen, bei UEFI ist das BootOrder und bei BIOS StartupOrder. Um sich diese Einstellung anzeigen zu lassen, könnte man einen solchen Befehl verwenden:
Get-VM | Where {$_.Generation -eq 2 -and $_.Name -like "WS2012*"} | Get-VMFirmware | Select VMName, BootOrder
Dieses Beispiel wählt alle VMs der Generation 2 aus, deren Name mit WS2012 beginnt und zeigt neben der Bezeichnung die Boot-Reihenfolge an. Ähnliche Aufrufe könnte man für andere Firmware-Einstellungen wie NumLockEnabled (BIOS) oder SecureBoot (UEFI) tätigen.
Man muss sich keineswegs mit dem Anzeigen von Firmware-Einstellungen begnügen, vielmehr kann man diese recht einfach ändern. Dafür gibt die Cmdlets Set-VMBios und Set-VMFirmware, die sich wieder die Arbeit zwischen BIOS und UEFI teilen.
Möchte man die Boot-Reihenfolge ändern, dann gilt es zu bedenken, dass diese als Array ein- und ausgegeben wird.
Get-VM | Where Generation -eq 1 | Get-VMBios
zeigt für StartupOrder einen Wert nach folgendem Muster an:
{CD, IDE, LegacyNetworkAdapter, Floppy}
Möchte man hier statt CD lieber IDE als erstes Boot-Laufwerk festlegen, dann kann man dies so tun:
Get-VM | Where Generation -eq 1 | Set-VMBios -StartupOrder @("IDE","CD","LegacyNetworkAdapter","Floppy")
Zu bedenken ist bei dieser Anweisung, dass sie eine PowerShell mit administrativen Rechten benötigt und sich nur auf VMs anwenden lässt, die nicht ausgeführt werden.
Täglich Know-how für IT-Pros mit unserem Newsletter
Verwandte Beiträge
- Hyper-V Switch mit PowerShell erstellen, verwalten und löschen
- Virtuelle Maschine vollständig mit PowerShell erstellen (am Beispiel von Azure Stack HCI)
- PowerShell-Remoting, Hyper-V Manager: Fehler wegen Netzwerkverbindungstyp "Öffentlich"
- Hyper-V-Host mit PowerShell (remote) konfigurieren, vSwitch hinzufügen
- Module für Active Directory, Hyper-V, WMI laden in PowerShell Core 6
Weitere Links