Ausführen einer Windows11-VM auf Apple Silicon Macs

Ausführen einer Windows11-VM auf Apple Silicon Macs

Mit dem Wechsel der CPU Architektur von Apple, auf ihren Computern hin zu Apple Silicon, hat sich auch der Weg, Windows zu virtualisieren verändert.
War dies auf den Intel Macs noch ohne Probleme mit einer Reihe unterschiedlicher Programme machbar (z.B. QEMU, Virtualbox, VMWare Fusion und Parallels), ist dies auf Apple Silicon CPUs, die auf der ARM-Architektur basieren nicht mehr so einfach möglich.

Seit einiger Zeit hat sich mit UTM eine OpenSource Lösung etabliert, welche initial ermöglichte, x86 Software auf iOS (also iPhone und iPad) auszuführen. Mit dem Wechsel hin zu Apple Silicon, lässt sich die Software nun auch sehr gut auf neueren Apple Computern verwenden.

Also Basis wird hier UTM in der Version 4.1.5 verwendet. Um eine gute Performanz zu erreichen, verwenden wir den Windows 11 Arm64 Build. Durch einen Translation-Layer in Windows, können wir aber dennoch auch x86 Software ausführen.
Die ARM Version von Windows 11 ist aktuell nicht frei verfügbar. Um ein Installationsimage zu beziehen, benötigen wir einen (kostenlosen) Microsoft Developer Account und müssen uns zusätzlich als Windows-Insider registrieren.

Anschließend können wir über diesen Link ein Image mit der aktuellen Windows11 ARM Variante beziehen.
Aktuell ist momentan die Version Windows 11 Client Arm64 Insider Preview(Beta Channel) - Build 25201.

Nach dem Entpacken erhalten wir die Datei Windows11_InsiderPreview_Client_ARM64_en-us_25201.VHDX.

Wir erstellen nun unsere VM. Wir wählen „Virtualisieren“, da unsere VM ebenfalls auf ARM laufen wird.

(Windows x86 lässt sich zwar ebenfalls installieren und starten, allerdings ist die Latenz bei der Emulation sehr deutlich spürbar.)

Wir wählen nun „Windows“.

Als Installations-Image wählen wir die heruntergeladene VHDX Datei aus und aktivieren ebenfalls „Install Drivers and SPICE Tools“. (SPICE ist eine optimiertes Protocol um hinterher Bildschirm- und Input-Daten zu verarbeiten).

Die Konfiguration vom RAM ist natürlich auch von der Ausstattung des Host-Systems abhängig. Die Anzahl der CPU Kerne habe ich auf „standard“ belassen.

Optional lassen sich auch shared folder konfigurieren, dies ist aber auch hinterher noch möglich. (Die VM muss für eine weitere Anpassung dann allerdings ausgeschaltet sein).

Nach einer Zusammenfassung können wir nun die ersten Schritte des Setups wie gewohnt durchlaufen:

Das Setup möchte ohne eine aktuelle Internetverbindung nicht weiter. Der Netzwerkadapter unserer Windows VM konnte aber aufgrund von fehlenden Treibern noch nicht erkennt werden.

Wir können dies aber umgehen, in dem wir das Setup mit der he out-of-box experience (OOBE) neu starten. Hierzu starten wir mit dem Drücken von Umschalt-Taste + F10 die Eingabeaufforderung:

Um den check der Internet Verbindung zu umgehen, geben wir nun den folgenden Befehlt ein:

OOBE\BYPASSNRO

Das Setup wird die VM nun neu starten.

Anschließend können wir die Überprüfung einfach überspringen:

Ein weiterer Vorteil ist, dass wir nun auch einen lokalen (Offline) User erstellen können:

Nachdem wir die Konfiguration abgeschlossen haben, landen wir in einem fertig installlierem Windows 11:

Über den Autorung der eingehängten virtIO Tools, können wir nun alle weiteren Treiber installieren.

Wir sollten nun auch einen Netzwerk-Adapter, sowie eine Virt GPU im Gerätemanager finden können (eventuell ist vorher ein Reboot notwendig).

Die Windows Updates sollten sich ebenfalls ohne Probleme installieren lassen:

Um weitere Updates via Windows Insider zu erhalten – die aktuellen Builds haben leider ein Ablauf-Datum – müssen wir uns mit unseren Microsoft Account, der mit Windows Insider registriert ist, anmelden:

Leider taucht hier dann aber auch ein Problem auf, allerdings scheint es so, als würde zumindest der aktuelle Release-Channel supported werden:

Das leidige Thema mit dem TPM Modul

Seit Windows 11 schreibt Microsoft vor, dass ein supportetes System zwangsläufig ein sogenanntes Trusted Platform Module (TPM) enthalt muss um weiterhin Updates zu erhalten. UTM bietet das aktuell noch nicht out-of-the-box, allerdings gibt es ein paar Wege, um zumindest das Modul selbst der VM schon einmal zur Verfügung zu stellen.

Hierzu müssen zuerst einen TPM Service installieren und danach die QEMU Config der VM einmalig mauell anpassen (QEMU ist das Tool auf dem UTM basiert).

Als Tool um ein TPM der VM zur Verfügung zu stellen verwenden wir „SWTPM – den Software TPM Emulator“.
Dieses Programm ist ebenfalls OpenSource und wird stetig weiter entwickelt. Das Projekt ist bei Github gehostet.

Unter MacOS können wir SWTPM sehr einfach per Homebrew installieren:

brew install swtpm

Ich habe mir für jede VM ein Bash Script erstellt, welches mir einen Socket für das Software TPM zur Verfügung stellt.
Das sieht z.B. so aus:

#!/bin/bash

echo "starting TPM"

mkdir -p $HOME/Library/Containers/com.utmapp.QEMUHelper/Data/Documents/mytpm0

swtpm socket --tpm2 \
    --tpmstate dir=$HOME/Library/Containers/com.utmapp.QEMUHelper/Data/Documents/mytpm0 \
    --ctrl type=unixio,path=$HOME/Library/Containers/com.utmapp.QEMUHelper/Data/Documents/mytpm0/swtpm-sock \
    --log file=$HOME/tpm.log,level=5

echo "done"

Unter /Users/philipp/Library/Containers/com.utmapp.QEMUHelper/Data/Documents/mytpm0/swtpm-sock haben wir nun einen UNIX Socket, den unsere VM als TPM verwenden kann.

Bleibt die Anpassung unserer VM. Den genauen Ort unserer VM können wir über das Context-Menü von UTM herausfinden:

Wir sollten nun UTM sicherheitshalber beenden.

MacOS typisch handelt es sich hier um ein Application-Packet (eigentlich nur ein glorified Folder). Abermals über das Context-Menü könnn wir uns den Paketinhalt enzeigen lassen:

Wir möchten jetzt die Datei config.plist bearbeiten:

Wir suchen nun nach:

<key>AdditionalArguments</key>
<array />

Und ersetzen das mit:

<key>AdditionalArguments</key>
<array>
    <string>-chardev</string>
    <string>socket,id=chrtpm,path=/Users/philipp/Library/Containers/com.utmapp.QEMUHelper/Data/Documents/mytpm0/swtpm-sock</string>
    <string>-tpmdev</string>
    <string>emulator,id=tpm0,chardev=chrtpm</string>
    <string>-device</string>
    <string>tpm-tis-device,tpmdev=tpm0</string>
</array>

Den Pfad zum Socket bitte jeweils passend ändern.

Nachdem wir UTM wieder gestartet haben, sollten wir in der VM Config die folgenden zusätzlichen Einträge finden:

Nachdem wir unsere Windows VM gestartet haben, können wir im Gerätemanager zumindest ein TPM (sogar Version 2.0) auffinden:

Zuletzt die Frage was es bringt, eine Windows ARM VM zu betreiben. Ich war z.B. in der Lage eine alte Version von Excel von 2003 ohne Probleme auszuführen. Dies war in einem Projekt für einen Kunden, welcher u.a. noch ein Alt-System mit Access 2003 betreibt, notwendig.

Fazit

UTM bietet eine einfache und frei verfügbare Möglichkeit, Windows Anwendungen auf neuen Macs mit Apple Silicon CPUs auszuführen.

Die kommerziellen Anbieter haben mittlerweile nachgezogen:

Je nach Anwendungsfall rentiert sich eine Investions aufgrund des einfacheren Setups und der (möglicherweise besseren) Performanz sogar.
Für einen kurzen Test zwischendurch oder das Sichern von Daten von einem alten Windows Programm hat mir UTM aber bislang ausgereicht.

Der einzige Wermutstropfen ist allerdings der Bezug einer passenden Windows Version. Windows 10 als ARM Version war seit jeher nur für OEM Kunden und als Development Preview gedacht. Mit Windows 11 lässt sich eine aktuelle Version zumindest über einen Windows Insider Account beziehen.
Bleibt die Hoffnung, dass sich die Situation, mit dem neuen Kurs von Microsoft sich mehr auf ARM einzulassen, zum besseren ändern wird.

Philipp Haußleiter

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert