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 wie bei einem echten System, richtet sich Windows auch vollständig mit seinem Bootloader ein, so dass man diesen auch unter Grub einbinden und damit das System auch 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=/var/tmp/win10.img,format=raw,media=disk \
#  -drive file=/var/tmp/virtio-win.iso,format=raw,media=cdrom \

# The following setting enables S3 (suspend to RAM). OVMF supports S3
# suspend/resume. Disable when using Q35
OPTS="$OPTS -global PIIX4_PM.disable_s3=0"

export PULSE_SERVER=unix:/run/user/$SUDO_UID/pulse/native
export PULSE_COOKIE=/home/$SUDO_USER/.config/pulse/cookie
export QEMU_AUDIO_DRV=pa QEMU_PA_SAMPLES=128
OPTS="$OPTS -soundhw ac97"

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

exec qemu-system-x86_64 -nodefaults $OPTS \
  -enable-kvm \
  -cpu host,kvm=off -smp 4 \
  -m 6G \
  --device virtio-balloon \
  -serial none -parallel none \
  -monitor stdio \
  -name Windows \
  -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/sdb,index=1,format=raw,media=disk,if=virtio \
  -net nic,model=virtio \
  -net user,hostname=zenbookwin,smb=/srv/qemu-win/shared-folder \
  -k de \
  -vga qxl \
  -usb -device usb-tablet \
  "$@"

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 wir 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 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 einem (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.