KVM QEMU mit Windows 11 unter Debian

reinhard@finalmedia.de Tue 26 Oct 2021 04:18:20 PM CEST Tue 23 Jan 2024 08:43:39 PM CET -> Update auch für Win11 23H2 x64_v2, ohne TPM, ohne UEFI, ohne Microsoft Account

# KVM Hypervisor mit Qemu und Windows 11 Gast mit verschlüsseltem Plattenimage auf einem Debian GNU Linux host, und dabei einen virtuellen Folders via RDP Session nutzen

Achtung: Das nachfolgende Tutorial bezieht sich auf die alte Win11_German_x64.iso (21H2) - nicht die aktuelle Win11_23H2_German_x64v2.iso (23H2). Zur neuen Win11_23H2_German_x64v2.iso siehe Nachtrag am Ende der Seite

Die alte Win11_German_x64.iso (21H2) bekommst du aber optional auch noch bei archive.org zum Download und kannst dann mit dem nachfolgenden Tutorial im Schritt 2 weiterarbeiten.

1. ISO Datei herunterladen

Zunächst musst du die Windows 11 Installations-CD als ISO-Datei von der offiziellen Microsoft Webseite herunterladen. Du findest diese hier: https://www.microsoft.com/de-de/software-download/windows11

Auf der Microsoft-Webseite sieht dies so aus:

Speichere die ISO-Datei als Win11_German_x64.iso.

2. qemu unter debian installieren

Auf deinem debian installierst du nun qemu als Hypervisor. Zudem werden die kleinen Pakete rdesktop und xvncviewer gebraucht. Dann laden wir das Kernel-Modul kvm, damit die Virtualisierung Hardwarebeschleunigung durch deine CPU erfährt.


apt-get update

# QEMU installieren
apt-get install qemu-system qemu-kvm

# RDP Client und VNC Viewer installieren
apt-get install rdesktop xtightvncviewer

# kvm modul laden
modprobe kvm

Wir werden nun im nachfolgenden Script ein neues, leeres verschlüsseltes LUKS Disk Image in der Datei "win11.luks.img" erstellen. Dabei erzeugen wir eine Zufalls-Passphrase für das verschlüsselte Image in der Datei "win11.luks.key". Beim Erzeugen der Passphrase vermeiden wir verwechselbare Zeichen wie Null, Oh, 1 und großes I etc.

Die Imagedatei wird als Sparse-File erstellt, belegt also nicht von Anfang an 32 GB Speicherplatz, sondern wächst mit. Allerdings wird der Speicherplatz alloziert! Das bedeutet, dass er fix belegt wir dafür. (Siehe du -h vs. ls -lh)

So, du brauchst nun nur noch dieses Script 1:1 ausführen:

#!/bin/sh

isofile="Win11_German_x64.iso"

keyfile="win11.luks.key"
imagefile="win11.luks.img"

imagesize="32G"

# luks keyfile erzeugen, wenn nicht existent
test ! -f "$keyfile" && \
umask 077 && tr -dc "0-9a-zA-Z" < /dev/urandom | \
tr -d "01IloO" | head -c 32 > "$keyfile"

# imagefile erzeugen, wenn noch nicht existent
test ! -f "$imagefile" && \
qemu-img create -f luks \
--object secret,id=sec0,file="$keyfile" \
-o key-secret=sec0 "$imagefile" "$imagesize"

# qemu im hintergrund starten
test -f "$imagefile" && \
qemu-system-x86_64 -enable-kvm \
-cdrom "$isofile" \
-cpu core2duo -smp cores=2 -m 2048 \
-object secret,id=sec0,file="$keyfile" \
-device ahci,id=sata \
-drive if=none,id=drive0,driver=luks,key-secret=sec0,file="$imagefile" \
-device ide-hd,bus=sata.0,drive=drive0 \
-sandbox on -k de -usb -device usb-tablet -monitor /dev/null \
-netdev user,id=n0,restrict=y,hostfwd=tcp::3389-:3389 \
-device rtl8139,netdev=n0 \
-vga qxl -vnc 127.0.0.1:4 -daemonize

Beachte: Wir starten QEMU mit einem restricted Network (restrict=y), damit das Windows11 als unser Gast nicht ins Internet oder zu anderen Hosts kommunizieren kann. Zudem verwenden wir -daemonize um es als Hintergrundprozess zu starten.

Nun mittels VNC Viewer an die QEMU Session zur Grafikausgabe andocken

xvncviewer :4

Wenn die VNC Session terminiert (Das passiert z.B. bei Auflösungs-Wechseln durch den Gast), kann man sie einfach nochmal aufbauen. Die Emulation läuft durch QEMU ja im Hintergrund weiter. Du kannst also jederzeit wieder mit xvncviewer :4 die Session aufbauen und auch einfach beenden.

Nun Die Windows Installation vollständig durchführen!

Wichtig: Windows11 setzt ja TPM 2.0 und Secure Boot voraus.. Haben wir hier aber derzeit nicht in der Emulation.

Daher wird dir im Installer nun diese Meldung angezeigt werden:

"Windows 11 kann auf diesem PC nicht ausgeführt werden."
"Dieser PC erfüllt nicht die Mindestanforderungen zum Installieren dieser Windows-Version."

Wir schalten daher diese Prüfung ab, um Windows 11 auch ohne TPM installieren zu können.

Daher einfach die Tastenkombination Shift-F10 drücken, um eine Kommandozeile zu öffnen.

Darin dann regedit.exe ausführen. Dann hierhin navigieren: Computer\HKEY_LOCAL_MACHINE\SYSTEM\Setup\Pid

Dann einen Ordner höher Computer\HKEY_LOCAL_MACHINE\SYSTEM\Setup

einen neuen Ordner-Schlüssel namens LabConfig anlegen und darin drei neue DWORD-32 Schlüssel anlegen namens:

Deren Werte alle auf 1 setzen, also 0x00000001.

Dann regedit schließen. Im Installer Dialog einfach links oben den Pfeil "zurück" klicken

Dann wieder auf Weiter und es tut!

Wird dir der Link "Ich habe kein Internet" nicht angezeigt? Ja? Gratulation. Eine neue Microsoft Gängelei im neueren Windows Setup. Hier ist Abhilfe zu finden, um den Onlinezwang und die Zwangsregistration zu umgehen.

Danach in die frische Installation booten, und in die Systemsteuerung "Einstellung" wechseln

In der Systemsteuerung RDP aktivieren, sowie für den Benutzer freigeben.

Dabei den Schalter auf "Ein" umstellen und mit dem Pfeil nach unten den Dialog erweitern.

Entferne(!) dort das Häkchen bei "Computer müssen für Verbindungen die Authentifizierung auf Netzwerkebene verwenden".

Den Sicherheitsdialog musst Du dabei mit "Trotzdem fortsetzen" bestätigen.

Das wars schon. Wenn du nun unter Linux rdesktop zum Verbindungsaufbau benutzt..


rdesktop -k de -g 800x600 -x -z 127.0.0.1:3389

... siehst du die Loginmaske:

Die VNC Session kann nun geschlossen werden, stattdessen die RDP Session verwenden und den gewünschten Shared-Folder mit durchgeben. Wir legen erst mal Demodaten auf deinem debian an:


# in homedir wechseln
cd ~

# dort den ordner transfer erstellen
mkdir transfer

# demodaten darin anlegen
date > transfer/demo.txt
echo erbsen >> transfer/demo.txt


nun einfach immer wie folgt die RDP-Session aufbauen, wenn du dein neues Win10 nutzen willst. Die Auflösung kannst du dabei hier übergeben. Wir wählen 800x600 Pixel und deutsche Tastatur, sowie eben den shared Folder transfer. Beim Sitzungsaufbau kannst du beliebige weitere Shared Folder mit über die RDP Session durchreichen.


# RDP Session aufbauen und den Ordner Transfer als Shared Folder einhängen
rdesktop -r disk:data=./transfer/ -k de -g 800x600 -x -z 127.0.0.1:3389

Damit kannst du nun unter Windows über den RDP Share "data" auf den Shared Folder zugreifen.

Wenn du nicht jedes Mal dein Kennwort beim RDP Aufbau eingeben willst, kannst du auch einfach das hier nutzen:


rdesktop -u Benutzername -p HierPasswort -r disk:data=./transfer/ -k de -g 800x600 -x -z 127.0.0.1:3389 -r sound:local:alsa

Siehe dir dazu auch das Manual von rdesktop an. Du kannst das Windows Account Passwort z.B. auch verschlüsselt speichern und dann via stdin reinpipen. Dieses Verfahren ist zu empfehlen, da man Kennwörter nicht als Parameter übergeben sollte, da diese in der prozessliste sichtbar sind.


gpg -d < mein_kennwortfile | rdesktop -u Benutzername -p - -r disk:data=./transfer/ -k de -g 800x600 -x -z 127.0.0.1:3389 -r sound:local:alsa

Eine Alternative zu rdesktop ist xfreerdp, das auch 3D Beschleunigung unterstützt. Sowohl das leichtgewichtige rdesktop, als auch das schwerere xfreerdp bieten dir zudem die Möglichkeit des Copy&Paste zwischen deinem Gast und deinem Host via Zwischenablage. Das ist auch sehr praktisch: Siehe im Manual zu rdesktop -r clipboard:off wenn du das abschalten willst.

Ergänzend: RDP bietet dir auch die Möglichkeit, Druckerport, Sound oder Kartenleser mit durchzureichen.

Wenn du noch weitere Features möchtest, auch Videobeschleunigung und den neusten heißen Scheiß, dann kannst du statt rdesktop auch xfreerdp verwenden:


apt-get install freerdp2-x11

xfreerdp /v:127.0.0.1 /u:BENUTZERNAME /p:PASSWORT /w:800 /h:600 /drive:data,./transfer /sound:sys:alsa +fonts

Dieser RDP Client ist damit deutlich schneller, jedoch auch schwergewichtiger. Auch das Durchreichen beliebiger USB Geräte ist möglich.

Update/Nachtrag - Januar 2024

Das alte Howto funktioniert leider nicht mehr mit dem aktuellen Win11_23H2_German_x64v2.iso !

Zum einen ist das Minimum nun 4GB RAM, zum anderen UEFI und TPM Zwang vorhanden.

Mit obiger config bleibt sonst nur endlos der Windows Boot Screen ersichtlich.

Wir haben nun zwei Möglichkeiten... a) entweder wir folgen Microsoft und nutzen auf QEMU auch ein TPM oder wir verweigern uns diesem Zwang und wählen b) um dennoch die aktuelle ISO zu nutzen, ohne UEFI, ohne TPM, ohne Microsoft Account. Beide Variante stelle ich vor:

A) TPM Variante mit neuer ISO

Du musst das separate Tool installieren, um ein TPM zu emulieren. Das bindet dann an ein socket file oder tcp socket als eigentständiger server. Dann kannst du qemu kvm so parametrisieren, dass es sich mit dem TPM Emulator verbindet. Wir installieren also zunächst die Tools für den TPM emulator
apt-get intall swtpm-tools
und können in einer separaten shell im gleichen verzeichnis diesen testweise starten

swtpm socket --ctrl type=tcp,port=2322,bindaddr=127.0.0.1 \
--server type=tcp,port=2321,bindaddr=127.0.0.1 --tpm2

unser qemu aufruf unterscheided sich dann ebenso in obigem script



isofile="Win11_23H2_German_x64v2.iso"

# uefi bios hier her kopieren und readonly setzen
test ! -f ovmd.fd && cp /usr/share/ovmf/OVMF.fd ovmf.fd && chmod 400 ovmf.fd

test -f "$imagefile" && \
qemu-system-x86_64 -enable-kvm \
-cdrom "$isofile" \
-smp cores=2 -m 4096 \
-object secret,id=sec0,file="$keyfile" \
-device ahci,id=sata \
-drive if=none,id=drive0,driver=luks,key-secret=sec0,file="$imagefile" \
-device ide-hd,bus=sata.0,drive=drive0 \
-sandbox on -k de -usb -device usb-tablet -monitor /dev/null \
-netdev user,id=n0,restrict=y,hostfwd=tcp::3389-:3389 \
-device rtl8139,netdev=n0 \
-vga qxl -vnc 127.0.0.1:4 \
-machine pc-q35-7.2 \
-bios ovmf.fd -cpu kvm64 \
-chardev socket,id=chrtpm,host=127.0.0.1,port=2321 \
-tpmdev emulator,id=tpm0,chardev=chrtpm \
-device tpm-tis,tpmdev=tpm0 

Achtung -> Variante mit TPM ist ungetestet!

B) Alternativer Ansatz und Tipp: Wenn du TPM und EFI Verweigerer bist (aus nachvollziehbaren Gründen) und noch eine andere alte Windows Installation irgendwo vorhältst, kannst du Rufus nutzen, um eine angepasste ISO Datei aktuellster Version zu erstellen, die auch ohne TPM und ohne EFI funktioniert. Weitere Infos dazu findest du unter https://rufus.ie/de/.

Du kannst dann mit Rufus dann das aktuelle ISO herunterladen und mit MBR und BIOS Support auf einen USB-Stick schreiben, z.B. einen virtuellen USB Stick, ebenso in kvm. Dann bootest du von diesem als Setup. Damit kannst du auch die aktuellste ISO zur Installation verwenden (getestet).

Gängelei 2.0

Neue hinterlistige Gängelei: In der aktuellesten Version möchte einen Microsoft auch bei der Installation dazu nötigen, bereits zwingend eine Internetverbindung zu verwenden. Der Bypass Button ist also nicht mehr verfügbar und der "Weiter"-Button ausgegraut, bis man eine Internetverbindung angegeben hat.

Um auch diese Gängelei zu umgehen, muss man dann erneut ein Terminal öffnen, also Shift+F10 drücken.

In der Eingabeaufforderung ist dann einfach der nachfolgende Befehl einzueingeben (ohne Leerzeichen, aber mit Backslash):

OOBE\BYPASSNRO

Der Befehl fügt letztlich nur den Registry Schlüssel "BypassNRO" mit dem Reg32 DWORD Wert "1" in der Registry unter HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\OOBE\ ein, terminiert den Installer und man durchläuft den Schritt der Sprachkonfiguration dann erneut, allerdings diesmal ohne den Zwangs zur Onlineverbindung, da nun wieder der Text-Link "Ich habe kein Internet" angezeigt wird, und man damit den ausgegrauten Weiter Button umgehen kann. Danach gibts dann auch wieder einen weiteren Gängel-Gängel Dialog, der einen darauf hinweist, dass Windows 11 ohne Internet und Datenabschnorchel-Funktion weniger "Nutzererlebnis" hat. Man darf ihn wenigstens skippen um danach noch mehr Datenschutzdialoge zu verneinen, bevor es weitergeht.

Nach all dieser Mühe hat man dann auch ein funktionales, aktuelles Windows 11 23H2 in einem QEMU KVM64 alter Architektur (i440FX) und mit SeaBIOS ohne UEFI, ohne TPM, und auch auf einem kleinen 32GB HDD Image und mit nur 2GB RAM am Start: