Regenbogen

Wiki: Schlanke Basis VHDx Datei für Hyper-V erzeugen

Schlanke Basis VHDx Datei für Hyper-V erzeugen

Für unsere Schulungs- und Testumgebungen benötige ich immer wieder die gleichen Bausteine. Eine Basis-VHDx Datei mit Windows Server 2016 und eine Basis-VHDx Datei mit Windows 10, damit ich in Hyper-V schnell eine Schulungs- bzw. Testumgebung aufsetzen kann. 

Der normale Weg für viele ist: Einfach mit einer .iso-Datei den Server installieren, Scripte drauf, Software installieren UND Windows Update laufen lassen und auf den aktuellsten Stand patchen. Anschließend wird noch eine Unattend.xml reinkopiert und Sysprep gestartet, die VM heruntergefahren und auf die Seite gelegt für die spätere Verwendung.

Für mich hat die Sache nur einen Hacken. Die VHDx-Dateien werden durch den Aufruf von Windows Update massiv aufgebläht (von 15GB auf bis zu 30GB) und benötigen damit viel Platz und es dauert entsprechend länger beim kopieren auf die Zielsysteme (bei uns Schulungsnotebooks).

Daher habe ich mir eine andere Vorgehensweise überlegt, die das ganze Procedere und die Pflege der VHDx-Dateien vereinfacht.

 

Um eine schlanke virtuelle Maschine (VM) als Basis für Testumgebungen zu erstellen gehe ich normalerweise folgendermaßen vor:

Wir benötigen eine .iso Datei von Windows Server 2016 bzw. die install.wim, die sich auf der DVD befindet. In der install.wim sind die eigentlichen Installationen bzw. Installations-Images enthalten.

Die .iso-Datei kann per Doppelklick gemountet werden und tauch dann mit einem Laufwerksbuchstaben im Windows Explorer auf.
Als nächsten benötigen wir eine Powershell mit administrativen Rechten.

Mit dem Befehl: Get-WindowsImage -ImagePath g:\sources\install.wim ...kann man sich den Inhalt der Datei anzeigen lassen.

 

Es gibt ein tolles Powershell Script, dass einem die Erstellung der VHDx-Datei fast vollständig abnimmt und viele Parameter zur individuellen Konfiguration der späteren Installation mitbringt. Das Script heißt: Convert-Windowsimage.ps1 und kann in der Powershell Gallery unter https://gallery.technet.microsoft.com/scriptcenter/Convert-WindowsImageps1-0fe23a8f heruntergeladen werden.

Das Script muss als Funktion geladen werden und kann nicht direkt aufgerufen werden.

Achtung! Es gibt einen Bug ab windows 10 1709 bei dem eine Fehlermeldung generiert wird: "ERROR: Ausnahme beim Aufrufen von "Apply" mit 1 Argument(en):  "Das Verzeichnis oder die Datei kann nicht erstellt werden" bzw. auf englischen Systemen: ERROR : Exception calling "Apply" with "1" argument(s): "The directory or file cannot be created". Ich erledige diese Aufgaben meist ein einem Windows Server 2016 :-)

Mit: . .\Convert-WindowsImage.ps1 (sprich: Punkt Leerzeichen Punkt Backslash) wird das Script als Funktion geladen und kann anschließend als Befehl Convert-Windowsimage verwendet werden.

Ein Beispiel würde lauten:

Convert-WindowsImage -SourcePath "G:\sources\install.wim" -Edition "Windows Server 2016 Datacenter Evaluation (Desktopdarstellung)" -VHDPath F:\vhdx\SRV2016Eval.vhdx -SizeBytes 120GB -VHDFormat vhdx -VHDType Dynamic -VHDPartitionStyle GPT -ExpandOnNativeBoot:$false -UnattendPath "F:\scripte\Unattend.xml"

Dieser Befehl wird aber mit einer Fehlermeldung quittiert. Leider kann nicht die Bezeichnung verwendet werden, die wir mit dem Befehl Get-WindowsImage erhalten haben. Wir müssen die "interne" Bezeichnung verwenden. Netterweise "verrät" uns das Script die möglichen Werte, wenn wir den oben genannten Befehl OHNE den Parameter "-Edition" aufrufen. Es wird dann folgendes angezeigt:

ERROR : You must specify an Edition or SKU index, since the WIM has more than one image.
ERROR : Valid edition names are:
ERROR : ServerStandardEvalCore
ERROR : ServerStandardEval
ERROR : ServerDataCenterEvalCore
ERROR : ServerDataCenterEval
ERROR : ScriptHalted

Mit angepasstem -Edition Parameter klappt es:

Convert-WindowsImage -SourcePath "G:\sources\install.wim" -Edition ServerDataCenterEval -VHDPath F:\vhdx\SRV2016Eval.vhdx -SizeBytes 120GB -VHDFormat vhdx -VHDType Dynamic -VHDPartitionStyle GPT -ExpandOnNativeBoot:$false -UnattendPath "F:\scripte\Unattend.xml"

Alternativ kann bei dem Parameter "-Edition" auch der Index verwendet werden. Hier in meinem Beispiel die "4".

Bei erfolgreichem Abschluss erhalten wir eine bootfähige VHDX-Datei, die direkt als Hyper-V VM gebootet werden kann. Die Größe beträgt ca. 9,4GB.

Windows Defender deinstallieren:

Da in Schulungs- und Testumgebungen häufig mehrere Server-VMs auf normalen Notebooks bzw. Rechnern laufen, die nicht die Leistung eines professionellen Servers haben, entferne bzw. deinstalliere ich das Feature Windows Defender, also den eingebauten Virenscanner von Windows Server 2016. Das geht ebenfalls recht einfach mit einem Powershell Befehl:

Anzeigen lassen:

Get-WindowsFeature -Vhd "D:\vhdx\SRV2016Eval.vhdx" -Name *defender*

Ergebnis:
Display Name Name Install State
------------ ---- -------------
[X] Windows Defender-Features Windows-Defender-Fea... Installed
[X] Windows Defender Windows-Defender Installed
[X] GUI für Windows Defender Windows-Defender-Gui Installed

Windows Defender entfernen:

Remove-WindowsFeature -Vhd "D:\vhdx\SRV2016Eval.vhdx" -Name Windows-Defender-Features

Hinweis: Analog können die Binärdateien für diverse Rollen und Features hinzugefügt werden, z.B. das Windows Backup mit:
Install-WindowsFeature -Vhd "D:\vhdx\SRV2016Eval.vhdx" -Name Windows-Server-Backup

usw....

Windows Updates zum Image hinzufügen

Da die VHDx-Datei direkt von der DVD erstellt wurde hat diese Installation den Patchlevel Windows Server 2016 RTM und muss aktualisiert werden. Ich glaube jeder hat schon einmal frustriert vor dem Bildschirm gesessen und stundenlang auf die Fertigstellung der Windows Updates gewartet. Das wollen wir uns ersparen.

Ich lade die aktuellen "Cummulative Updates" für die Server und Workstations direkt bei Microsoft unter http://www.catalog.update.microsoft.com/Home.aspx herunter und füge sie der VHDx-Datei hinzu.

Bild: catalog-update-microsoft.PNG einfügen

WICHTIG: Abhängigkeiten beachten!

Wenn eine frische Installation von Windows Server 2016 online per Windows Update aktualisiert wird, wird z.B. erst das Cummulative Update 2018-05 heruntergeladen, dann wird erst das Cummulative Update 2018-12 heruntergeladen und installiert. Das dauert eine halbe Ewigkeit. Der Grund ist folgender: Im Update 2018-05 ist ein spezieller Update für den Windows Installer bzw. für Windows Update selbst, der IMMER zuerst installiert werden muss bevor ein neueres Update eingespielt werden kann.

Ein direkte Einspielen der 2018-12er Updates wird mit der tollen Fehlermeldung quitiert: ...diese Update ist nicht für dieses System geeignet. Das bringt einen nicht wirklich weiter. erst wenn man bei Microsoft nach den Abhängigkeiten schaut bekommt man diese Information.

Die Lösung ist einfach: Als erstes wird das "eigenständige" Update 2018-05 SSU-Update für Windows Server 2016 für x64-basierte Systeme (KB4132216) eingespielt (nur 11MB groß), danach kann das 2018-12 Cumulative Update for Windows Server 2016 for x64-based Systems (KB4483229) hinzugefügt werden.

Vorgehensweise:

Mounten der VHDx-Datei per Doppelklick

Add-WindowsPackage -PackagePath "D:\MSUpdates\2018-05 SSU-Update für Windows Server 2016 für x64-basierte Systeme (KB4132216).msu" -Path K:\

Add-WindowsPackage -PackagePath "D:\MSUpdates\2018-12 Cumulative Update for Windows Server 2016 for x64-based Systems (KB4483229).msu" -Path K:\

Anschließend kann die Datei prima als Basis-VHDx für diverse virtuelle Maschinen verwendet werden. Sollten später neue Cummulative Updates eingespielt werden, wird eben das aktuelle auf die gleiche Art und Weise hinzugefügt.

Die Größe der VHDx-Datei ist durch das hinzufügen der Update auf 13,9GB angewachsen. Bei meinen letzten Tests mit Windows Update stieg die Größe der VHDx-Datei auf fast 30GB. Klar man muss dazu sagen, dass die Auslagerungsdatei einer gestarteten VM natürlich enthalten ist, was bei der nicht gestarteten VHDx-Datei wegfällt.