Windows mit Hardware-3D in der VM

Ein Forenbeitrag über Xen und 3D hat mich schon vor längerer Zeit dazu gebracht, mein „Wintendo“[1] in eine VM umzuziehen. Der Vorteil ist, dass man auf diese Weise Linux und Windows gleichzeitig starten kann – und innerhalb von Sekundenbruchteilen das Betriebssystem wechseln. Mit der richtigen Hardware kann das virtuelle Windows sogar auf die echte Systemkomponenten zugreifen und eignet sich damit, auch moderne 3D-Spiele zu starten.

Die Einrichtung ist eigentlich nicht weiter schwer. Man benötigt nur ein passendes Mainboard mit IOMMU-Unterstützung, zwei Grafikkarten (eine für jedes Betriebssystem) und eine Linux-Distribution, die mindestens Kernel 3.2 mit bringt. (Es geht natürlich auch mit anderen Distributionen, aber dann muss man selber Kernel backen.) Die Schritte[2] sind recht schnell durchgeführt:

  1. Xen über Paketmanager installieren
  2. Computer neu starten – mit Xen.
  3. Wenn das läuft, kann man in der „/etc/default/grub“, den Default auf Grub ändern und die „grub.cfg“ neu konfigurieren lassen.
  4. Der einfachste Möglichkeit, die Grafikhardware an eine VM abzugeben, ist via Kernelmodul. Das sollte mit jeder Distribution klappen, egal ob Xen nun direkt im Kernel enthalten ist oder später geladen wird. Das funktioniert am einfachsten per Skript. Hier das, welches ich benutze (Quelle: Xen-Wiki):

    BDF=0000:05:02.0
    # Unbind a PCI function from its driver as necessary
    [ ! -e /sys/bus/pci/devices/$BDF/driver/unbind ] || \
    echo -n $BDF > /sys/bus/pci/devices/$BDF/driver/unbind
    # Add a new slot to the PCI Backend's list
    echo -n $BDF > /sys/bus/pci/drivers/pciback/new_slot
    # Now that the backend is watching for the slot, bind to it
    echo -n $BDF > /sys/bus/pci/drivers/pciback/bind

  5. Skript und Kernelmodul kann man ganz „quick and dirty“ über die „/etc/rc.d/rc.local“ laden:

    xend start
    modprobe -i xen-pciback
    /etc/xen/unbind-pci.sh

  6. Zuletzt muss man nur noch das Config-File für die VM angelegt werden. Meines sieht so aus:

    name = "vm-win7-01"
    localtime=1
    import os, re
    arch = os.uname()[4]
    if re.search('64', arch):
    arch_libdir = 'lib64'
    else:
    arch_libdir = 'lib'
    kernel = "/usr/lib/xen/boot/hvmloader"
    builder ='hvm'
    memory = 4096
    vcpus = 2
    cpus = "2,3"
    pci_msitranslate=1
    # Should be at least 2KB per MB of domain memory, plus a few MB per vcpu.
    shadow_memory = 32
    acpi = 1
    apic = 1
    disk = ['file:/home/xen/domains/win7-01/hda.img,ioemu:hda,w',
    'file:/home/xen/disks/Windows_7_x64.iso,ioemu:hdc:cdrom,r'
    ]
    boot = 'c';
    device_model = '/usr/' + arch_libdir + '/xen/bin/qemu-dm'
    sdl=0
    vnc=1
    vncconsole=0
    vncpasswd=''
    serial='pty'
    gfx_passthru=0
    pci=['05:00.0','02:00.0,1','01:06.0']
    usb = 1

    Wenn das Image („hda.img“, eine leere Datei) vorhanden ist, lässt sich das Windows mit Hardwarebeschleunigung auch schon vom DVD-iso installieren. Fertig.

Ich habe Windows auch noch eine eigene Soundkarte und eine Netzwerkkarte spendiert. Sound, da ich keine Windows-Treiber für die emulierten Karten finden konnte und Netzwerk, damit sich beide Geräte nicht den Trafic wegnehmen. Das Resultat liefert eine ähnliche Performance wie Windows direkt auf der Hardware – die gefühlte Lesegeschwindigkeit von der Festplatte ist (wohl dank Imagefile, welches man im Ram precachen kann) etwas schneller, die Gesamtperformance aber etwas schlechter (sprich: kürzere Ladezeiten aber etwas weniger FPS). Insgesamt ist es eine erwähnenswerte Alternative zum klassischen Dualboot – allein weil man ohne Wartezeit umschalten kann.

  1. [1]Windows nur zum Zocken.
  2. [2]Alle angegebenen Dateinamen sind für Fedora gültig, das ich selbst benutze. Angaben für Ubuntu werde ich mit dem Release von „Precise Pangolin“ (12.04) ergänzen, da der momentan von Ubuntu genutzte Kernel noch Handarbeit erfordert.

Leave a comment

Schreibe einen Kommentar

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