Ich habe bei mir im Laptop eine zweite Festplatte, auf der ich das Windows installiert habe, das ich zwangsweise mit dem Gerät erworben habe. Irgendwie habe ich mir damals ein Installationsmedium für Windows 10 erstellt und aus dem bestehenden System den Registrierungsschlüssel ausgelesen. Die genauen Schritte sind mir leider nicht mehr gegenwärtig, aber mit entsprechender Suche im Netz sollten sich die Programme dazu finden lassen.

Da ich eine komplette Festplatte für das Windows verwende und diese als Ganzes bei Qemu einbinden kann, als sei es ein echtes System, richtet sich Windows auch vollständig mit seinem Bootloader ein, sodass man diesen auch unter Grub einbinden und damit das System direkt starten kann. Am Ende kann ich also Windows nativ oder aus Linux heraus über die Virtualisierung mit Qemu starten.

Da ich dem bestehenden Windowssystem nach einer nativen Installation nicht die Virtio-Treiber für Qemu hinzufügen konnte, habe ich daher das System über Qemu installiert, womit auch die elendig lange Dauer der Updates besser nutzen konnte.

Skript zum Starten von Qemu

Um das System mit Qemu zu starten, verwende ich immer folgendes Skript


#!/bin/sh

if test -n "$DISPLAY" && test "$TERM" != xterm
then
    exec xterm -name qemu-win -title "Qemu Windows" -e "$0" "$@"
fi

if test "$(id -u)" != 0
then
    exec sudo "$0" "$@"
fi

# On Windows Installation:
# https://fedoraproject.org/wiki/Windows_Virtio_Drivers#Direct_download
# wget https://fedorapeople.org/groups/virt/virtio-win/direct-downloads/latest-virtio/virtio-win.iso
#  -drive file=/home/joerg/kein_Backup/win10.img,format=raw,media=disk \
#  -drive file=/home/joerg/kein_Backup/virtio-win.iso,format=raw,media=cdrom \

# export PULSE_SERVER=unix:/run/user/$SUDO_UID/pulse/native
# export PULSE_COOKIE=/home/$SUDO_USER/.config/pulse/cookie
# export QEMU_AUDIO_DRV=pa

# cp /usr/share/OVMF/OVMF_VARS.fd /srv/qemu-win/

exec qemu-system-x86_64 \
  -name Windows -daemonize \
  -enable-kvm -cpu host,kvm=off -smp cores=2,threads=2 -m 4G \
  -device virtio-balloon \
  -serial none -parallel none \
  -bios /usr/share/qemu/OVMF.fd \
  -drive file=/usr/share/OVMF/OVMF_CODE.fd,format=raw,readonly,if=pflash \
  -drive file=/srv/qemu-win/OVMF_VARS.fd,format=raw,if=pflash \
  -drive file=/dev/disk/by-id/wwn-0x500a07510e8bb6b2,index=1,format=raw,media=disk,if=virtio \
  -nic user,id=net0,model=virtio-net-pci,hostname=zenbookwin,smb=/srv/qemu-win/shared-folder \
  -k de \
  -vga virtio -display gtk,gl=on \
  -usb -device usb-tablet \
  -device intel-hda -device hda-duplex \
  "$@"

Bei der Installation des Systems habe ich dann die beiden Zeilen

-drive file=/var/tmp/win10.img,format=raw,media=disk \
-drive file=/var/tmp/virtio-win.iso,format=raw,media=cdrom \

zu den Optionen von qemu hinzugefügt. Damit wird einerseits das Windwos-Installationsmedium eingebunden und zusätzlich eine CD von Redhat, auf der die Windows-Treiber für die Qemu-Virtualisierung enthalten sind.

Bei Qemu von der »UEFI Interactive Shell« ins Menü

Wenn das UEFI von Qemu beim Starten kein passendes Ziel findet, landet man in der UEFI Interactive Shell an einem Prompt:

UEFI-Prompt bei fehlendem Bootgerät

An dieser Stelle kann man einfach exit eingeben und landet dann in einem Menüsystem, über das man gewisse Parameter wie die Bildschirmauflösung festlegen kann, aber auch über den Boot Manager das gewünschte Gerät (CD-ROM, Festplatte u. s. w.) auswählen kann. All diese Parameter werden in der Datei /srv/qemu-win/OVMF_VARS.fd für den nächsten Boot gespeichert.

UEFI-Boot-Manager zur Auswahl des Bootgeräts

Registrierungsschlüssel über Qemu-Console eingeben

Wer den Registrierungsschlüssel für sein Windows in digitaler Form vorliegen hat, mag diesen vielleicht nicht über die Tastatur eintippen, sondern kann ihn auch über die Qemu-Console (Strg+Alt+2 oder serial0 im Menü Ansicht) mit sendkey eingeben. Jedes Zeichen muss ein eigener Sendkey-Befehl sein, wobei das Zeichen als Kleinbuchstabe eingegeben werden muss und ich musste noch Y und Z vertauschen. Aber das alles geht recht einfach mit dem (Stream-)Editor der Wahl:

sed 'y/zZyY/yyzz/; s/-//g; s/./sendkey \l&\n/g'

Virtio- und Qxl-Treiber laden

Auf dem Installationsmedium für Windows sind keine Treiber für die virtualisierten Geräte enthalten. Das Fedora-Projekt stellt aber entsprechende Treiber bereit, wie ich im Abschnitt Skript zum Starten von Qemu bereits erwähnte. Ich habe einfach bei der Installation von Windows über die Benutzerdefinierte Installation alle Treiber geladen, die sich in irgendwelchen Verzeichnissen win10/amd64 befanden. Wenn man dann vor allem den Treiber virtstor geladen hat, erkennt Windows die Festplatten und man kann dann die Festplatte nach belieben Einrichten und mit der gewohnten Installation fortfahren.

Damit bei der Grafik auch höhere Auflösungen als 1920x1080 unterstützt werden, müssen die Treiber für Qxl-dod installiert werden.

Windows unter Grub einrichten

Das hinzufügen des Boot-Eintrags für Windows bei Grub passiert automatisch mit der Installation des Debian-Pakets os-prober.

Hardware-Uhr als UTC einstellen

Windows geht immer davon aus, dass die Hardware-Uhr in lokaler Zeit ist. Aber man kann dies über die Registry auch umstellen:

reg add "HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\TimeZoneInformation" /v RealTimeIsUniversal /d 1 /t REG_DWORD /f

Mehr dazu gibt es im Arch-Wiki.

Austauschverzeichnis mit Linux

Wenn das Paket samba installiert ist, kann man mit der Option -net user,smb=/srv/qemu-win/shared-folder unter Linux einen Samba-Server starten, über den man mit Windows Daten in beide Richtungen austauschen kann. Unter Windows muss man für \\10.0.2.4\qemu ein Laufwerk einrichten.

Screenshots mit Qemu erstellen

Noch eine Kleinigkeit an dieser Stelle, da ich es für die Bilder in dem Artikel herausgefunden habe: Wenn man die Qemu-Console zur Hand hat, kann man dort mit dem Befehl screendump /tmp/bild.npm einen Screenshot erstellen.

Windows-Installtionsmedium erstellen

Für Windows habe ich keine fertigen Installationsmedien gefunden, aber man kann mit einem Programm von Microsoft sich selbst ein Installationsmedium erstellen (falls man ein laufendes Windows-System hat – Henne-Ei-Problem). Man kann sich entweder ein ISO-Image erstellen lassen oder man nutzt einen USB-Stick.

Diesen USB-Stick kann man mit qemu emulieren lassen, so dass man am Ende ein Installationsmedium bekommt, das man bequem bei einer neuen Installation einsetzen kann. Die Datei kann man mit truncate -s10G win10-neu.img erstellen und mit diesen Optionen für qemu als USB-Stick einbinden:

-drive file=/home/joerg/kein_Backup/win10-neu.img,if=none,id=stick \
-device usb-storage,drive=stick \

Als Tipp nebenbei: Mit dem Programm, das auf der Seite für den Windows-Installer angeboten wird, kann man auch ein Windows-System aktualisieren, sollte sich das Windows-Update-Programm mit dem Fehler 0x80240fff weigern, ein Update vorzunehmen.

Windows-Taste emulieren

Mein X-Window-Manager verwendet verschiedenen Tastenkombinationen der Windows-Taste, weshalb diese dann nicht an Qemu gelangen. Über die Qemu-Kommandozeile, kann man diese Tasten aber emulieren:

sendkey meta_l-x

Die linke Windows-Taste ist meta_l und die rechte ist meta_r.