No description
Find a file
2026-09-06 16:14:32 +02:00
.gitignore add .gitignore und README 2026-09-06 16:14:32 +02:00
autounattend.xml first commit 2026-09-06 16:05:43 +02:00
bookmark.txt first commit 2026-09-06 16:05:43 +02:00
build-win11-testvm.sh first commit 2026-09-06 16:05:43 +02:00
README.md add .gitignore und README 2026-09-06 16:14:32 +02:00
start-testvm.sh first commit 2026-09-06 16:05:43 +02:00

Win11-VM-auto-build-and-start

Baut unter Linux/KVM eine schlanke Windows-11-IoT-Enterprise-LTSC-VM als Wegwerf-Testumgebung. Unbeaufsichtigte Installation, kein Microsoft-Konto, keine Telemetrie, kein Internetzugang für die VM, SSH-Zugang ab Werk.

Enthalten

Datei Zweck
build-win11-testvm.sh baut das Basis-Image, einmal pro Konfigurationsänderung
start-testvm.sh startet eine Wegwerf-Kopie und verbindet per SSH
autounattend.xml die Konfiguration für die unbeaufsichtigte Windows-Installation
bookmark.txt Link, der die autounattend.xml im Generator wieder öffnet

Voraussetzungen

sudo apt install qemu-kvm libvirt-daemon-system libvirt-clients virtinst \
                 virt-manager ovmf swtpm swtpm-tools xorriso wget
sudo usermod -aG libvirt,kvm $USER

Danach ab- und wieder anmelden.

Vorbereitung

Zwei Dateien von Hand in den Repo-Ordner legen:

  1. Windows 11 IoT Enterprise LTSC Evaluation vom Microsoft Evaluation Center. Englisch, x64. 90 Tage gültig, kein Product Key nötig.
  2. LibreOffice von libreoffice.org, Windows x86_64, als .msi.

Optional ein Unterordner payload/. Dessen Inhalt landet in der VM unter C:\payload.

virtio-win.iso und OpenSSH-Win64.msi lädt das Build-Skript selbst.

Benutzung

./build-win11-testvm.sh      # 15 bis 25 Minuten, einmalig
./start-testvm.sh            # Sekunden, beliebig oft
./start-testvm.sh test-02    # eigener Name

build-win11-testvm.sh räumt Reste früherer Läufe weg, baut die unattend.iso, legt das isolierte Netz an, installiert Windows und friert das Ergebnis als schreibgeschütztes Basis-Image ein.

start-testvm.sh legt ein qcow2-Overlay auf das Basis-Image, startet die VM, wartet auf die IP und öffnet die SSH-Sitzung. Wegwerfen:

virsh --connect qemu:///system destroy test-01
virsh --connect qemu:///system undefine test-01 --nvram
rm ~/vms/test-01.qcow2

Zugangsdaten

Benutzer test, Passwort test, lokales Administratorkonto. Für eine Wegwerf-VM im isolierten Netz ausreichend, sonst in der autounattend.xml ändern.

Netzwerk

Die VM hängt in einem libvirt-Netz win11-isoliert (192.168.180.0/24) ohne <forward>. Host und VM erreichen einander, die VM kommt nicht ins Internet. Damit zieht Windows keine Updates, was den Bau erheblich beschleunigt und Testläufe reproduzierbar hält.

Konfiguration ändern

Die autounattend.xml stammt vom Unattend-Generator von Christoph Schneegans. Zum Ändern den Link aus bookmark.txt öffnen oder die XML dort über "Import .xml file" hochladen, anpassen, herunterladen, ersetzen. Danach build-win11-testvm.sh erneut laufen lassen.

Die Skripte selbst haben ihre Einstellungen als Variablen im Kopf: RAM, CPUs, Plattengröße, Netzname, Download-URLs.

Bekannte Fallstricke

Platte auf SATA, nicht virtio. Windows Setup sieht eine virtio-Platte in der PE-Phase nicht ohne manuelles Treiberladen. Nach der Installation lässt sich der Bus umstellen, die Treiber sind dann im System.

--import statt --cdrom. --cdrom löst in virt-install eine zweistufige Installation aus. Mit --noautoconsole bleibt die VM dann nach dem ersten Reboot stehen.

Firewallregel mit -Profile Any. Die OpenSSH-MSI legt eine Regel an, die nur für private Netze gilt. Windows stuft neue Netze aber als öffentlich ein, und jedes Overlay bekommt eine neue MAC-Adresse, also ein neues Netz. Ohne die eigene Regel ist SSH in jeder Kopie blockiert.

Das Basis-Image darf nie gebootet werden. Overlays speichern nur die Unterschiede. Ändert sich das Basis-Image, sind alle Overlays korrupt. Deshalb steht es nach dem Bau auf chmod 444.

Versionen sind gepinnt. virtio-win und OpenSSH hängen an festen URLs. Bricht ein Download mit 404 ab, die URL im Skriptkopf anheben. Lautes Scheitern ist gewollt: ein stiller Versionswechsel mitten in einer Testreihe wäre schlimmer.