Virtuelle Maschine vollständig mit PowerShell erstellen (am Beispiel von Azure Stack HCI)


    Tags: , ,

    Architektur von Nested Hyper-VWenn man mehrere gleiche VMs er­zeugen muss und diese stark von den Vor­gaben des Wizards im Hyper-V Manager ab­weichen, dann artet dies in viel Klick­arbeit aus. Alternativ bietet PowerShell für diesen Zweck Cmdlets, die virtu­elle Hard­ware wie Netzwerk­adapter oder VHDs hin­zu­fügen und konfi­gurieren können.

    Die Anforderung, mehrere gleiche VMs zu erstellen, ergibt sich zum Beispiel, wenn man virtuelle Instanzen von Windows Server zu einem Cluster zusammen­schließen möchte. Eine typische Anwendung dafür ist der Aufbau einer Lab-Umgebung. Die folgende Anleitung spielt das Vorgehen am Beispiel von Azure Stack HCI durch, das sich so auf einer einzelnen Maschine evaluieren lässt.

    Grundsätzlich könnte man in einem solchen Fall einfach eine VM manuell konfigurieren und dann klonen. Der Hyper-V Manager besitzt zwar keine explizite Funktion für diese Aufgabe, aber seit einiger Zeit ist das Windows Admin Center dazu in der Lage. Neue VMs, automatisch erzeugt durch Power­Shell, sind aber wahrscheinlich die sauberere Lösung.

    VM erzeugen und anpassen

    Im ersten Schritt kreiert man die virtuelle Maschine, wobei der Aufruf davon abhängt, ob die VHD dafür schon existiert. Trifft dies zu, dann teilt man New-VM den Pfad zum virtuellen Laufwerk über den Parameter VHDPath mit. Wir gehen hier davon aus, dass noch keine VHD existiert und wir diese erst nachträglich installieren:

    New-VM -Name ASHCI03 -NoVHD -Path "F:\Hyper-V\" -Generation 2

    Nachdem die VM angelegt ist, kann man diese mit Set-VM konfigurieren. Der folgende Aufruf legt die Zahl der vCPUs und das verfügbare vRAM fest. Außerdem deaktiviert er Snapshots, darunter auch die in Windows 10 üblichen automatischen Prüfpunkte. Da Azure Stack HCI die Nested Virtualization nutzt, verzichten wir auch auf Dynamic Memory:

    Set-VM -Name ASHCI03 -ProcessorCount 4 -StaticMemory `
    -MemoryStartupBytes 8GB -CheckpointType Disabled

    Nun steht die Konfiguration der vNICs an. Beim Erzeugen erhält die VM automatisch einen Netzadapter. Dessen Namen kann man mit

    $NicName = (Get-VMNetworkAdapter -VMName ASHCI03).Name

    in der Variablen $NicName speichern.

    Den vom System vorgegebenen Namen des Adapters benötigen wir, da wir alle NICs nach einer festen Konvention benennen. Mit diesem Befehl erhält er die neue Bezeichnung vNIC01:

    Rename-VMNetworkAdapter -Name $NicName -VMName ASHCI03 -NewName vNIC01

    Netzadapter erstellen und verbinden

    Microsofts Empfehlung für Azure Stack HCI sieht vier vNICs für die virtuelle Maschine vor. Die noch fehlenden drei lassen sich wie folgt erzeugen:

    2 .. 4 | foreach {Add-VMNetworkAdapter -VMName ASHCI03 -Name vNIC0$_}

    Diese sollten an vSwitch vom Typ External gebunden werden.

    Alle Schritte vom Anlegen und Anpassen der VM über das Hinzufügen der NICs bis zum Erstellen der VHDs

    Folgender Aufruf bindet alle vier vNICs an einen virtuellen Switch, der in unserem Beispiel Extern heißt:

    1 .. 4 | foreach {Connect-VMNetworkAdapter -Name vNIC0$_ `
    -SwitchName "Extern" -VMName ASHCI03}

    Nachdem in Azure Stack HCI der Hypervisor aktiviert werden soll, muss man für die Nested Virtualization das Spoofing der Mac-Adressen erlauben:

    1 .. 4 | foreach {Set-VMNetworkAdapter -VMName ASHCI03 -Name vNIC0$_ `
    -MacAddressSpoofing On}

    Bei dieser Gelegenheit kann man gleich eine weitere dafür nötige Voraussetzung schaffen, nämlich die Virtuali­sierungs­erweiterungen der CPU in der VM sichtbar zu machen:

    Set-VMProcessor -VMName ASHCI03 -ExposeVirtualizationExtensions $true

    Laufwerke anlegen und zuordnen

    Azure Stack HCI benötigt neben dem Datenträger für das System noch mindestens zwei weitere für die Storage Spaces Direct. Diese erstellt man mit dem Cmdlet New-VHD:

    1 .. 3 | foreach {New-VHD -Path `
    "F:\Hyper-V\ASHCI03\Virtual Hard Disks\ASHCI03-0$_.vhdx" -Dynamic -SizeBytes 20GB}

    Die drei VHDX bindet man dann mit diesem Befehl an die virtuelle Maschine:

    1 .. 3 | foreach {Add-VMHardDiskDrive -Path `
    "F:\Hyper-V\ASHCI03\Virtual Hard Disks\ASHCI03-0$_.vhdx" -VMName "ASHCI03"}

    Neue VHDs der virtuellen Maschine zuordnen, ISO in virtuelles DVD-Laufwerk einlegen und Nested Virtualization aktivieren

    Zum Schluss ordnet man der VM die Installationsmedien über ein virtuelles DVD-Laufwerk zu:

    Add-VMDvdDrive -VMName ASHCI02 -Path F:\AzureStackHCI_17784.1408_EN-US.iso

    Innenansicht in Azure Stack HCI auf die virtuellen Netzwerkadapter und Laufwerke

    Damit die VM dann auch vom DVD-Laufwerk bootet, stellt man die Boot-Reihenfolge entsprechend um:

    $dvd = Get-VMDvdDrive -VMName ASHCI03
    Set-VMFirmware ASHCI03 -FirstBootDevice $dvd

    Die neue VM ist nun startklar für die Installation des Betriebs­systems. Falls sich dann Hyper-V in Azure Stack HCI nicht aktivieren lässt, kann man das Feature offline in der VHDX aktivieren.

    Für eine effizientere Nutzung kann man die oben beschriebenen Anweisungen zu einer Funktion zusammenfassen, der man den Namen der neuen VM als Parameter übergibt.

    Aufruf der function generateVM zum Erstellen einen neuen virtuellen Maschine

    Bei Bedarf setzt man etwa für die verwendeten Pfade ebenfalls eine Variable ein, die man als weitere Argumente beim Aufruf angibt.

    Täglich Know-how für IT-Pros mit unserem Newsletter

    Wir ver­wenden Ihre Mail-Adresse nur für den Ver­sand der News­letter.
    Es erfolgt keine per­sonen­be­zogene Auswertung.

    Bild von Wolfgang Sommergut
    Wolfgang Sommergut hat lang­jährige Erfahrung als Fach­autor, Berater und Kon­ferenz­sprecher zu ver­schie­denen Themen der IT. Da­ne­ben war er als System­ad­mi­ni­stra­tor und Con­sultant tätig.
    // Kontakt: E-Mail, XING, LinkedIn //

    Ähnliche Beiträge

    Weitere Links