QEMU/KVM mit dedizierter Grafikkarte

Aus DebianforumWiki
Wechseln zu: Navigation, Suche
Wikiweitere Dienste ‹ QEMU/KVM mit dedizierter Grafikkarte


Getestet.png Getestet: Dieser Hinweis soll dir dabei helfen, zu entscheiden, ob dieser Artikel auf deinem System funktionieren wird oder nicht. Solltest du feststellen, dass dieser Artikel bei einer ungetestet Version funktioniert, kannst du das gerne hier korrigieren oder im Forum anmerken.


Hinweis.png Hinweis: Dieser Artikel wurde mit folgenden Gast Betriebssystemen getestet:
  • Windows 7
  • Windows 10


Dieser Artikel erläutert, wie man eine zusätzliche Grafikkarte an eine QEMU/KVM VM (Virtuelle Maschine) weiter reichen kann. Dadurch kann die VM die dedizierte Grafikkarte (mit nur kleinen Performance Verlusten) direkt ansprechen und somit können Grafik intensive Anwendungen in der VM genutzt werden. Beispielsweise kann eine Windows VM für Gaming unter GNU/Linux genutzt werden.


QEMU Logo
KVM Logo

Einführung

QEMU/KVM

Bei QEMU handelt es sich um eine verbreitete Virtualisierungslösung, wie z.B. auch Virtualbox, XEN oder VMWare. Bei KVM handelt es sich um eine Kernel Erweiterung, die seit Version 2.6.20 fester Bestandteil des Linux Kernels ist. Dadurch können die Hardware Virtualisierungstechniken VT (Intel) oder AMD-V (AMD) genutzt werden, was bei x86/x64 Gastsystemen (auf einem x86/x64 Host) zu Leistungssteigerungen führt.

Voraussetzungen

Hardware Virtualisierungstechniken

Damit eine Grafikkarte an eine VM weitergereicht werden kann, muss die CPU und das Mainboard die folgenden Techniken unterstützen und diese müssen per UEFI/Bios aktiviert werden:

  • bei Intel: sowohl Vt-x als auch Vt-d (IOMMU)
  • bei AMD: AMD-V (kann auch SVM genannt werden) und AMD-Vi (IOMMU)

Gerade bei älterer Hardware sollte man sehr genau prüfen, ob sowohl die CPU, als auch das Mainboard/Chipsatz Vt-d unterstützen und ob dies per Bios aktivierbar ist. Eine Liste aller Intel CPUs die Vt-d unterstützen findet sich hier.

Bei Intel Xeon Prozessoren sollte zusätzlich beachtet werden, dass viele keinen integrierten Grafikchip besitzen, so das hier eine zweite dedizierte Grafikkarte nötig wird.

Hier wird IOMMU ausführlich beschrieben

Unvollständige Listen zur Vt-d/IOMMU Unterstützung finden sich hier und hier.

Grafikkarten und Monitore

Um eine Grafikkarte an eine VM weiterreichen zu können, muss das Host System mindestens über 2 Grafikkarten verfügen. Beispielsweise können hier die in vielen Intel und einigen AMD CPUs verbauten integrierten Grafiklösungen für den Host genutzt werden und eine zusätzliche dedizierte Grafikkarte an die VM weiter gereicht werden. Im Bios muss zusätzlich die für den Host gewünschte Grafiklösung als primäre Videoausgabe konfiguriert werden.

Die in manchen Notebooks verbauten Hybridvarianten wie Nvidia Optimus sind nicht geeignet.

Zusätzlich ist es sehr ratsam, dass man entweder 2 Monitore oder einen Monitor mit 2 Eingängen (die jeweils mit der Host- und der Guest- Grafikeinheit verbunden werden) hat. Ansonsten muss man bei jedem Wechsel zwischen VM und Host den Monitor an die andere Grafikeinheit umstecken.

Peripherie

Wenn nur die weitergereichte Grafikkarte innerhalb der VM genutzt wird, wird ein zweites Set an Tastatur und Maus benötigt. Alternativ kann hier auch ein USB KVM Switch genutzt werden, der die Peripherie per Tastendruck/Schalter zwischen der VM und dem Host umschaltet.

Alternativ kann auf die proprietäre kostenpflichtige Synergy Softwarelösung zurück gegriffen werden.

Eine weitere Variante ist es ein SPICE Fenster am Host geöffnet zu lassen, um zurück zum Host wechseln zu können. Die Steuerung war bei Versuchen aber sehr hakig und der Mauszeiger springt teilweise von der VM zum Host zurück, obwohl noch nicht der Bildrand erreicht ist. Diese Lösung ist daher nicht zu empfehlen.

UEFI Boot der Grafikkarte

Wenn der Host die integrierte Intel Grafik nutzt und eine dedizierte Grafikkarte an die VM als alleinige/primäre Grafikkarte weitergereicht werden soll, muss die dedizierte Grafikkarte den UEFI Boot Modus unterstützen. Zusätzlich muss die VM im UEFI Modus konfiguriert werden (siehe BIOS/UEFI Boot und OVMF). Ob die Grafikkarte dies unterstützt, kann hier geprüft werden. Wer gerne bastelt, kann teilweise auch die Firmware seiner Grafikkarte anpassen um UEFI zu unterstützen.

Hinweis.png Hinweis: Sollte die Grafikkarte den UEFI Modus nicht unterstützen, oder der BIOS Boot für die VM gewählt werden, muss der VM eine QXL Grafikkarte zugewiesen sein und als primäre Grafikkarte genutzt werden.

Virt-Manager weist der VM bei der Erstellung automatisch eine QXL Grafikkarte als primäre Ausgabe zu.


Linux Kernel

Wenn man VFIO (siehe entsprechenden Abschnitt unter Einrichtung) nutzen möchte, muss der Linux Kernel den Parameter CONFIG_VFIO_PCI_VGA aktiviert haben. Ab Debian Jessie ist dies standardmäßig der Fall. VFIO gewährleistet, dass die erweiterten Energiemodi der PCI Gerät genutzt werden können. Nachprüfen lässt sich dies mit dem Befehl

user@debian:~$ cat /boot/config-$(uname -r) | grep CONFIG_VFIO_PCI_VGA

CONFIG_VFIO_PCI_VGA=y bedeutet, dass der Parameter aktiv ist.

Andernfalls muss der Kernel mit aktiviertem Parameter selbst kompiliert werden.


Einrichtung

IOMMU im Host aktivieren

  • Zuerst muss bei einer Intel CPU sowohl Vt-x als auch Vt-d (IOMMU) und bei einer AMD CPU AMD-V (kann auch SVM genannt werden) und AMD-Vi (IOMMU) im Bios/UEFI aktiviert werden.
  • IOMMU muss per Bootparameter gestartet werden: Dazu muss als Root unter /etc/default/grub beim Eintrag GRUB_CMDLINE_LINUX_DEFAULT="..." folgendes hinzugefügt werden:
intel_iommu=on (für eine Intel CPU)
amd_iommu=on (für eine AMD CPU)

Beispiel:

GRUB_CMDLINE_LINUX_DEFAULT="quiet intel_iommu=on"
  • Anschließend muss Grub als Root upgedatet werden:
root@debian:~# update-grub
  • Nach einem Neustart kann man nun prüfen ob IOMMU aktiviert ist:
   bei Intel:
user@debian:~$ dmesg | grep "Virtualization Technology"
   oder bei AMD:
user@debian:~$ dmesg | grep AMD-Vi

Grafiktreiber blacklisten

Um die dedizierte Grafikkarte am Host freizugeben, muss deren Treiber auf eine blacklist gesetzt werden: Dazu erstellt man als Root folgende Datei /etc/modprobe.d/blacklist.conf und fügt je nach Grafikkarte einen der folgenden Punkte ein:

  • für eine Nvida Karte: blacklist nouveau
  • für eine AMD Karte: blacklist radeon oder blacklist amdgpu

Danach muss man als Root

root@debian:~# depmod -ae

ausführen um die Blacklist einzulesen und

root@debian:~# update-initramfs -u -k all

ausführen, um das Initramfs zu updaten.

Nach einem Neustart ist dann nur die primäre Grafikkarte aktiv.

Alternativ kann man die Guest Grafikkarte auch über einen Kernelparameter (/etc/grub/default unter GRUB_CMDLINE_LINUX_DEFAULT="...") blacklisten. (modprobe.blacklist=nouveau, modprobe.blacklist=radeon oder modprobe.blacklist=amdgpu)


Hinweis.png Hinweis: Der folgende Abschnitt ist mangels Erfahrung noch sehr knapp. Hilf mit den folgenden Abschnitt ausführlicher zu gestalten, wenn du hiermit schon selbst Erfahrung gesammelt hast.


Wenn man zwei AMD oder Nvida Karten hat und nur eine davon an die VM weitergeben möchte, während man die andere am Host nutzen möchte, kann das Blacklisting nicht über den Grafikkarten Treiber erfolgen.

Hier (englisch) wird unter Verwendung von VFIO beschrieben, wie einzelne Geräte (und Grafikkarten) am Host deaktiviert werden können.

Hier (englisch) werden Möglichkeiten aufgezeigt, für den Fall dass es sich bei der Host und der Guest Grafikkarte um das selbe Modell vom selben Hersteller handelt.

Hinweis.png Hinweis: Wenn der Grafikkarte bereits beim Boot der VFIO Treiber zugewiesen wird, kann das Blacklisting entfallen. Bitte testen.


VFIO

Um das erweiterte Power Management der Grafikkarte nutzen zu können, muss VFIO genutzt werden. Die Unterstützung für VFIO ist ab der Linux Kernel Version 4.1 in diesem integriert. Die veraltete Alternative pci-stub sollte nicht mehr verwendet werden.

root@debian:~# lspci -vnn

Hiermit kann man prüfen, welche PCI IDs die dedizierte Grafikkarte und deren integrierter Audiochip haben.

Nun muss man als Root eine Configdatei /etc/modprobe.d/vfio.conf erstellen und darin folgendes einfügen:

options vfio-pci ids=1002:6818,1002:aab0

Bei 1002:6818,1002:aab0 handelt es sich hier beispielsweise um meine AMD Grafikarte und deren HDMI Audiochip. Dies sorgt dafür, das der Grafikkarte bereits beim Boot der VFIO Treiber zugewiesen wird. Bei anderen Geräten ist dies normalerweise nicht nötig und passiert automatisch beim Start der entsprechenden VM (bei der Grafikkarte kann .

Hinweis.png Hinweis: Wenn der Grafiktreiber geblacklistet wird, kann dies entfallen.


Dazu muss man als Root in der Datei /etc/initramfs-tools/modules folgendes anfügen:

vfio
vfio_iommu_type1
vfio_pci
vfio_virqfd

Dies sorgt dafür, das die entsprechenden Kernel Module bereits beim Booten geladen werden.

Anschließend muss das Initramfs geupdatet werden und neu gestartet werden.

root@debian:~# update-initramfs -u -k all

Paketinstallation

Um QEMU/KVM nutzen zu können müssen folgende Pakte installiert werden (zusammen mit deren empfohlenen Paketen): Debianpackage.png qemu Debianpackage.png qemu-kvm Debianpackage.png libvirt-clients Debianpackage.png libvirt-daemon-system

UM UEFI in der VM nutzen zu können wird zusätzlich Debianpackage.png ovmf benötigt.

Um eine GUI zur VM Verwaltung zu erhalten kann Debianpackage.png virt-manager installiert werden.

In dieser Anleitung wird auf Virt-Manager zur Einrichtung und Erstellung der VM zurückgegriffen.

Anpassen der Berechtigungsgruppen

Um die VMs mit normalen Benutzer Rechten erstellen und bearbeiten zu können, muss der entsprechende Benutzer Mitglied in folgenden Berechtigungsgruppen sein:

  • Für Debian Jessie-Backports, Stretch und neuere Debian Releases: libvirt und libvirt-qemu
  • Für Debian Jessie und älter: libvirt und kvm

Liste der Debian Releases


Benutzer1 kann als Root mit folgendem Befehl zu Gruppe1 hinzugefügt werden:

root@debian:~# usermod -a -G Gruppe1 Benutzer1

Damit die Berechtigungen aktiv werden, muss Benutzer1 sich aus und wieder neu einloggen.


VM Installation

Es wird empfohlen die Windows VM erst einmal ohne die dedizierte Grafikkarte zu installieren und diese dann erst nach erfolgreicher Installation an die VM weiter zu reichen.

Über Virt-Manager kann eine neue Windows VM erstellt werden. Bevor man Schritt 5 abschließt, sollte man den haken setzen, dass man die Konfiguration erst anpassen möchte, bevor die VM zum ersten mal gestartet wird.

Virtuelle Festplatte

Für die beste Performance empfiehlt es sich eine separate SSD für die VM zu verwenden und diese per LVM oder direkt weiterzugeben. Siehe hier. Sofern man einen separaten Festplattencontroller verbaut hat, kann dieser auch direkt durch gereicht werden und alle daran angeschlossenen Geräte sind automatisch der VM zugewiesen.

dedizierte Festplatte mit LVM

Um eine separate SSD mit der besten Performance zu nutzen muss man diese als LVM konfigurieren: Aus der SSD wird ein LVM PV (physical volume) erstellt und darin eine VG (volume group)

Diese VG kann dann als Storage Pool im Virt-Manager eingebunden werden

  • Schritt 1: Der Name kann frei gewählt werden und muss nicht der der VG sein; Der Type muss LVM sein
  • Schritt 2: Als Ziel/Target wird /dev/<Name der VG>; Die Quelle/Source kann leer bleiben und "build pool" darf in diesem Fall nicht angehakt werden, da das LVM bereits vorher konfiguriert wurde. (Alternativ kann die VG auch hierüber komplett angelegt werden)

In diesem Virt-Manager Storage Pool können dann die VM Volumes angelegt werden (1 Volume wird als 1 physische Platte in der VM angezeigt, es reicht also aus 1 Volume / VM zu zuweisen)


Pool Erstellung
Pool-creation1.jpg Pool-creation2.jpg
Fertiger Pool

Mit LVM lassen sich einfach Snapshots erzeugen, sofern in der Volume Group (VG) noch un-zugewiesener Speicher vorhanden ist.

dedizierte Festplatte

Eine Festplatte (HDD oder SSD) kann auch direkt an die Vm weitergereicht werden. Dazu gibt man direkt den Pfad /dev/sdx zum Laufwerk an.

qcow2 Image

Alternativ kann auch ein qcow2 Image auf einer SSD/HDD oder auf einem Netzlaufwerk erstellt werden und als virtuelle Festplatte für die VM genutzt werden. Mit qcow2 lassen sich einfach Snapshots der VM erstellen. Mit Virt-Manager wir automatisch ein Image vom Typ qcow2 erstellt, wenn man im Dialog ein Image-Laufwerk hinzufügt. Sofern der Pfad zum Standard Storage Pool nicht geändert wurde, liegen diese Images unter: /var/lib/libvirt/images/

Festplatten Einstellungen

Bei den Einstellungen der Festplatte sollte man für die beste Performance bei allen drei Varianten SCSI wählen. Hierzu muss noch ein SCSI Controller vom Typ "VirtIO SCSI" hinzugefügt werden.

Allerdings muss der Treiber während der Installation geladen werden, da dieser Controller sonst nicht von Windows unterstützt wird. Hierzu kann man einfach ein 2. DVD Laufwerk hinzufügen und dort die Treiber ISO mounten. (siehe Abschnitt Virtio Treiber) Für Windows 10 findet sich der passende Treiber dann beispielsweise unter <x>:\vioscsi\w10\amd64 auf der Treiber CD.


Festplatten Eigenschaften
Festplatte.jpg
SCSI-Controller
SCSI-Controller.jpg

TRIM

Sofern man eine SSD weiterreicht (direkt oder per LVM) oder das qcow2 Image auf einer SSD liegt, sollte TRIM aktiviert werden. Dazu führt man folgenden Befehl aus:

user@debian:~$ virsh --connect qemu:///system edit Name-der-VM

Dann sucht man Nach der Festplattenzeile und fügt hier discard='unmap' ein. Die entsprechenden Zeilen sehen dann beispielsweise so aus:

<disk type='block' device='disk'>
  <driver name='qemu' type='raw' cache='none' io='native' 'discard='unmap'/>
  ...

Netzwerk

Für die bestmögliche Netzwerk Performance kann beim Netzwerkkarten Typ auch "virtio" ausgewählt werden.

BIOS/UEFI Boot

Vor dem ersten Start muss unter dem Reiter Übersicht/Overview gewählt werden ob die VM im BIOS oder UEFI Modus betrieben werden soll.

Außerdem sollte der virtuelle Mainboard Chipsatz auf i440FX belassen werden. (sowohl im BIOS wie auch im UEFO Boot Modus)

Mit dem Q35 gab es beim Booten immer wieder Abstürze von Windows (spätestens beim Installieren des Grafikkartentreibers) , sobald die Grafikkarte an die VM weitergereicht wurde.

Windows Virtio Treiber

Die Virtio Treiber, wie der Virtio SCSI, der Virtio Treiber (Festplatte vom Typ Virtio, ohne zusätzlichen Controller) sowie weitere Treiber für die Windows VM finden sich bei Fedora als ISO: Virtio Treiber.

Grafikkarte (oder andere PCI/PCIe Geräte) an die VM weiter reichen

Nach erfolgreicher VM Installation, muss diese beendet werden. Danach kann im Virt-Manager über "Hardware hinzufügen/Add Hardware -> PCI/PCI Host device" die Grafikkarte, sowie deren Sounchip ausgewählt werden.

Jetzt kann man in die VM booten und den Grafikkartentreiber installieren. Bei Bedarf kann jetzt die QXL Videokarte in der VM entfernen werden (nur wenn die Audioausgabe nicht über SPICE erfolgt).

Wenn man einen zweiten USB Controller hat, kann es Sinn machen, diesen der VM zuzuweisen und dort die zusätzliche Peripherie für die VM (oder der zweite USB-KVM Port) anzuschließen.

PCIe Grafikkarte an VM durch reichen
Hinweis.png Hinweis: Um Probleme zu vermeiden, ist es wichtig, immer den in der Grafikkarte integrierten Soundchip mit durch zu reichen. Ebenso, ist es wichtig, dass die Grafikkarte von keinem Treiber (außer vfio-pci) genutzt wird (siehe Grafiktreiber blacklisten).


Nach Möglichkeit sollte man immer alle Geräte einer VFIO Gruppe an die VM weiterreichen. Mit folgendem Skript, kann man sich die Geräte in den VFIO Gruppen anzeigen lassen:

#!/bin/bash
shopt -s nullglob
for d in /sys/kernel/iommu_groups/*/devices/*; do 
    n=${d#*/iommu_groups/*}; n=${n%%/*}
    printf 'IOMMU Group %s ' "$n"
    lspci -nns "${d##*/}"
done;

Sound

Man kann das QXL Videogerät und Spice für die VM aktiviert lassen, da dann darüber die Soundausgabe der VM auf den Host geleitet wird. In den Bildschirmeinstellungen unter Windows kann der 2. Monitor (der an QXL hängt) aber abgeschaltet werden. Diese Lösung führt allerdings zu leichten Glitches in der Soundausgabe die von der VM kommt.

Alternativ kann man den Sound über den HDMI Ausgang der dedizierten Grafikkarte oder einen zusätzlichen Soundcontroller verwenden.

VM Erstellung mit virt-install

Die VM kann auch ohne Virt-Manager (GUI) in der Shell erstellt werden. Hierzu bietet sich der Befehl virt-install an.

Hinweis.png Hinweis: Bitte hilf mit diesen Abschnitt auszubauen, wenn du Erfahrung hiermit hast.


Weitere VM Infos, Anpassungen und Optimierungen

Windows Lizenzen

  • Für die VM wird ein separater Windows Aktivierungsschlüssel benötigt. Ob es zulässig wäre, den gleichen Schlüssel in einer Dual-Boot Umgebung und unter GNU/Linux in der VM zu nutzen, müsste rechtlich geklärt werden.
  • Natürlich kann auch Windows 10, wie seine Vorgänger, 30 Tage ohne Aktivierung zu Testzwecken genutzt werden.
  • Stand Februar 2018 können während der Installation von Windows 10 weiterhin Aktivierungsschlüssel/Keys für Windows 8/8.1 und Windows 7 (unbestätigt) genutzt werden. Nachträglich lassen sich diese nicht aktivieren (Telefonaktivierung könnte eventuell noch funktionieren).

Datenaustausch per Samba/SMB

Zum Datenaustausch zwischen der (Windows) VM und dem Host kann das Samba/SMB Protokoll genutzt werden. Hierzu wird entweder ein Ordner/Pfad in der VM freigegeben und am Host per Samba CLient darauf zu gegriffen, oder am Host ein Pfad per Samba Server freigegeben und in der VM darauf zugegriffen.

LVM Volume der VM am Host mounten

Um die Partition der Vm am Host mounten zu können, wird das Paket Debianpackage.png kpartx benötigt. Dann kann als Root mit

root@debian:~# kpartx -av /dev/vg/lv

die einzelnen Partitionen nach /dev/mapper/ mappen. Die Partitionen erscheinen dann unter /dev/mapper/vg-lv1, /dev/mapper/vg-lv2, /dev/mapper/vg-lvx und können gemountet werden. Um de Verknüpfung/das Mapping zu entfernen:

root@debian:~# kpartx -dv /dev/vg/lv
Warnung.png Warnung: Die VM Partition sollte nie als RW am Host gemountet sein, während die VM läuft, da es sonst zu Datenverlusten kommen kann


Nvidia Grafikkarte unter Windows (Error Code 43)

Wenn man eine Nvidia Grafikkarte an eine VM weiter reicht und einen aktuellen Treiber nutzen möchte, meldet der Gerätemanager unter Windows den Error Code 43. Um dies zu verhindern muss Konfigurationsdatei der VM bearbeitet werden. Dazu führt man folgenden Befehl aus:

user@debian:~$ virsh --connect qemu:///system edit Name-der-VM

und entfernt folgende Abschnitte:

<hyperv>
  <relaxed state='on'/>
  <vapic state='on'/>
  <spinlocks state='on' retries='8191'/>

und

  <clock offset='localtime'>
    <timer name='hypervclock' present='yes'/>
  </clock>

Siehe auch hier

Bechmarks

Hier finden sich Benchmarks für den Vergleich einer normalen Windows Installation mit einer Windows Installation in einer QEMU/KVM Virtuellen Maschine mit durch gereichter dedizierter Grafikkarte. Bei beiden Versuchen wurden alle 4 CPU Kerne einer Intel i5-3470S CPU, die selbe SAMSUNG SSD 830, sowie die selbe Gigabyte HD7870 OC (AMD) Grafikkarte genutzt.


GPU lastiger Benchmark (3DMARK)

Dedizierte Windows 10 Pro Inst. Windows 10 Pro in QEMU/KVM VM
3DMARK Time Spy V1.0
3DMARK Time Spy V1.0
3DMARK Fire Strike V1.1
3DMARK Fire Strike V1.1
3DMARK Sky Diver V1.0
3DMARK Sky Diver V1.0
3DMARK Cloud Gate V1.1
3DMARK Cloud Gate V1.1

CPU lastiger Benchmark (Cinebench)

Dedizierte Windows 10 Pro Inst, Windows 10 Pro in QEMU/KVM VM
Cinebench R15.0
Cinebench R15.0

Festplatten Benchmark (CrystalDiskMark)

Dedizierte Windows 10 Pro Inst. Windows 10 Pro in QEMU/KVM VM
CrystalDiskMark 3.0.2
CrystalDiskMark 3.0.2

Quellenverzeichnis