So funktioniert Intel GVT-g
Hallo allerseits! Intel bot eine hervorragende Lösung für das ewige Problem: "Ich habe einen Laptop unter Linux und muss Windows mit Hardwarebeschleunigung ausführen, aber ich habe keinen schweren Laptop mit zwei GPUs und Flüssigkeitskühlung." Mithilfe der Architektur ihrer GPUs oder etwas anderem haben sie es geschafft, Ihre integrierte Intel-GPU in zwei oder mehr GPUs aufzuteilen.
Leider ist dies keineswegs so einfach ... Die Dokumentation ist etwas veraltet und einige Dinge brechen ohne ersichtlichen Grund auf unverständliche Weise. Daher werde ich Ihnen in diesem Beitrag erklären, wie Sie eine hardwarebeschleunigte virtuelle Windows-Maschine mit coolen virtio- und Intel GVT-g-Schnelltreibern konfigurieren.
Dazu benötigen Sie eine mehr oder weniger moderne GPU ( Anmerkung des Übersetzers : Laut offizieller Dokumentation unterstützt GVT-g integrierte Grafikkarten, beginnend mit der fünften Generation von Intel Core und der vierten Generation von Xeon ).

Schritt 1: Konfigurieren Sie den Kernel
Stellen Sie sicher, dass Sie eine neue Kernelversion haben. Es scheint, dass die Optionen für GVT-g vor Version 4.8 enthalten waren, aber dann funktionierten sie definitiv schlechter, daher empfehle ich die Verwendung des neuesten verfügbaren Kernels. Wenn Sie originell genug sind, um Ihren Kernel zu erstellen, aktivieren Sie diese Optionen . Deaktivieren Sie auch das Entfernen nicht verwendeter ksyms, da diese Option einen Fehler verursacht .
Jetzt müssen Sie die Kernel-Befehlszeilenargumente korrigieren. Wichtige Optionen sind:
i915.enable_gvt=1 kvm.ignore_msrs=1 intel_iommu=on i915.enable_guc=0
enable_guc=0
Sie sicher, dass Sie enable_guc=0
mit etwas überschreiben, das das Laden von GuC ermöglicht, da dies zu einem deprimierenden Absturz des i915-Treibers führt. /sys/bus/pci/devices/0000:00:02.0/mdev_supported_types/
Sie beim Booten in Ihre Arbeitsumgebung und überprüfen Sie das Verzeichnis /sys/bus/pci/devices/0000:00:02.0/mdev_supported_types/
. Wenn es nicht existiert, funktioniert GVT-g nicht. Überprüfen Sie die Protokolle und / oder weinen Sie im Kissen.
Als Lösung für das Problem können Sie diese Module zu initramfs hinzufügen und den i915 von dort entfernen.
Für eine detailliertere Protokollierung können Sie die Variable drm.debug
auf einen bestimmten Wert setzen. drm.debug
Sie sie beispielsweise auf 0x02 setzen, werden Nachrichten von den Treibern drm.debug
.
Schritt 2: Erstellen Sie einen virtuellen Freund
In mdev_supported_types
finden Sie eine ganze Reihe von Verzeichnissen. Dieser Satz wird durch die Größe Ihres Grafikspeichers bestimmt. Jedes Unterverzeichnis entspricht einer Art virtueller GPU. Die darin enthaltene description
enthält Informationen zum Speicher und zu den von dieser virtuellen GPU unterstützten Auflösungen. Wenn beim Erstellen einer virtuellen GPU mit großem Speicher mithilfe der UUID-Ausgabe in der Datei /create
ein unverständlicher Fehler auftritt, haben Sie mehrere Möglichkeiten. Gehen Sie zuerst zum BIOS und fügen Sie nach Möglichkeit Videospeicher hinzu. Wenn dies nicht funktioniert, können Sie Ihre DM stoppen, zum Framebuffer wechseln, von dort aus die gewünschte vGPU erstellen und dann zu x11 zurückkehren. Leider führt diese Methode zu vielen Fehlern und erlaubt es nicht, 60 FPS auf meinem Laptop zu erreichen. Eine Alternative besteht darin, eine kleinere vGPU zu erstellen und ein spezielles Programm zu verwenden, um die Auflösung (CRU) zu erhöhen. Auf diese Weise gelang es mir, 60 FPS zu erreichen, und es gab viel weniger Fehler und Einfrierungen.
Sie können vGPU mit diesem Befehl erstellen:
$ echo ${vGPU_UUID} | sudo tee /sys/bus/pci/devices/0000:00:02.0/mdev_supported_types/${vGPU_TYPE}/create
Und löschen - das:
$ echo 1 | sudo tee /sys/bus/mdev/devices/${vGPU_UUID}/remove
Anmerkung des Übersetzers :
Sie können eine UUID für vGPU mit dem Befehl uuidgen
ohne Argumente generieren. Die Variable $ {vGPU_TYPE} bezeichnet einen der im Verzeichnis mdev_supported_types
aufgeführten Typen. Es ist auch erwähnenswert, dass vGPU bei jedem Neustart neu erstellt werden muss. Sie werden nicht zwischen den Betriebssystemstarts gespeichert.
Schritt 3: Cortana schreit dich an
Der nächste Schritt wird viel besser unterstützt und ist viel langsamer und schmerzhafter - die Installation von Windows 10. Verwenden Sie keine Torrents oder inoffiziellen Downloads oder die alte Version von Windows. Der richtige Link ist hier . Es lohnt sich auch, das Disk-Image mit virtio-Treibern herunterzuladen, die speziell dafür entwickelt wurden, die Gäste hier zu beschleunigen. Installieren Sie libvirt
und virt-manager
und führen Sie libvirtd
:
# systemctl start libvirtd
Führen Sie virt-manager
und stellen Sie sicher, dass Sie mit der libvirt
Systemsitzung verbunden sind, nicht mit der Benutzersitzung:

Anmerkung des Übersetzers :
Damit virt-manager eine Verbindung zur Systemsitzung herstellen kann, können Sie es als root ausführen. Es ist jedoch besser, die Autorisierung zu konfigurieren, z. B. wie im Arch-Wiki vorgeschlagen .
Sobald Sie dies getan haben, können Sie mit dem Erstellen einer virtuellen Maschine beginnen. Wählen Sie im Einstellungsdialog den Download aus dem lokalen ISO-Image aus und suchen Sie das heruntergeladene Image. Wenn virt-manager
es nicht als Windows 10-Image erkennt, wählen Sie es manuell aus, da dies Windows beschleunigt, da virt-manager
in diesem Fall einige Virtualisierungsschnittstellen von Microsoft bereitstellt. Erstellen Sie ein Disk-Image oder eine LVM-Partition und konfigurieren Sie sie nach Bedarf. Die Setup-Oberfläche vor der Installation ist sehr eingeschränkt, daher starte ich normalerweise die Installation und stoppe sie sofort, um alles vollständig zu konfigurieren. Hier sind einige Einstellungen:


Anmerkung des Übersetzers :
Trotz des Beitrags zum Einrichten einer virtuellen Maschine auf einem Laptop entfällt aus irgendeinem Grund die Frage nach der Verteilung des Netzwerks mithilfe eines drahtlosen Adapters. Tatsache ist, dass die Standardnetzwerkeinstellungen in virt-manager nicht für ein drahtloses Netzwerk geeignet sind. In dieser Situation kann die Antwort auf diese Frage und Kommentare dazu hilfreich sein. Der Autor schlägt außerdem vor, das BIOS anstelle von UEFI zu verwenden, wahrscheinlich aufgrund der Tatsache, dass UEFI eine zusätzliche Konfiguration erfordert. Außerdem scheint Tianocore noch nicht mit GVT-g zu funktionieren, siehe Fehler 935 . In meinem Fall wurde die VM jedoch gestartet, aber Windows erkannte den Monitor, an den die integrierte Grafikkarte angeschlossen war, nicht.
Wenn Sie beim Löschen von Dateien der virtuellen Maschine einen schnellen Zugriff auf die Festplatte oder sogar die Fähigkeit der virtuellen Maschine benötigen, das Festplatten-Image zu komprimieren (TRIM-Prüfung, müssen Sie dazu das Image mit dem Befehl qemu-img create -f qcow2 -o preallocation=metadata,lazy_refcounts
, die vollständige Anweisung finden Sie hier ). Konfigurieren Sie das primäre Laufwerk für die Verwendung von SCSI. Sie benötigen Treiber für die virtuelle Maschine für Windows, um dieses Format zu verstehen. Schließen Sie daher die zuvor heruntergeladene virtio-Treiberdiskette für Windows 10 an. Standardmäßig wird eine IDE verwendet. Sie können die Installation jedoch um ein Vielfaches beschleunigen und weniger Legacy-Code verwenden, wenn Sie stattdessen verwenden für SCSI-DVDs. Windows unterstützt dies sofort. Sie können auch:
- Erzwingen Sie, dass USB USB 3.0 verwendet
- Fügen Sie die Kanäle spice, spice-webdav und qemu-ga hinzu, damit das Kopieren und Einfügen sowie die gemeinsame Nutzung von Dateien zwischen der VM und dem Host funktionieren
- Entfernen Sie nicht verwendete virtuelle Hardware
- Schalten Sie die emulierte Grafikkarte auf QXL und die Anzeige auf SPICE, ohne das Netzwerk zu hören (auch kein Loopback) ( Anmerkung des Übersetzers: Andernfalls stürzt die VM einfach ab ).
- Schalten Sie den Chip-Typ auf Q35 und stellen Sie ihn neben den BIOS-Einstellungen ein.
- Füttere den Hund
Sie können sich auch an die virsh edit
Ihres neuen Freundes virsh edit
. Wenn Sie es mit sudo -E
ausführen, werden Ihre Umgebungsvariablen, insbesondere EDITOR, zum Bearbeiten verwendet, und Sie verwenden die libvirt-Systemsitzung, nicht die Benutzersitzung. In dieser Datei können Sie beispielsweise eine Korrespondenz zwischen physischen und virtuellen Prozessoren zuweisen, wodurch die Prozessor-Caches konsistenter sind und sich der Scheduler nicht so seltsam verhält. Hier ist ein Beispiel-XML, das Sie dort ablegen können:
<vcpu placement='static'>6</vcpu> <cputune> <vcpupin vcpu='0' cpuset='1'/> <vcpupin vcpu='1' cpuset='2'/> <vcpupin vcpu='2' cpuset='3'/> <vcpupin vcpu='3' cpuset='5'/> <vcpupin vcpu='4' cpuset='6'/> <vcpupin vcpu='5' cpuset='7'/> </cputune> <features> <hyperv> <relaxed state='on'/> <vapic state='on'/> <spinlocks state='on' retries='8191'/> <runtime state='on'/> <synic state='on'/> <stimer state='on'/> </hyperv> </features> <cpu mode='host-passthrough' check='none'> <topology sockets='1' cores='3' threads='2'/> </cpu>
In diesem Snippet konfiguriere ich die VM so, dass sie einen Prozessor mit drei physischen Kernen sieht, von denen jeder zwei Hyperthreads hat. Ferner wird jeder Prozessor / Hyper-Thread an seinen eigenen Hyper-Thread angehängt, und diese Entsprechung ändert sich nicht. Windows Scheduler kennt Hyperthreads und kann sie korrekt verwenden, ohne sie als separate Prozessoren zu zählen. Ich aktiviere auch einige Hyper-V-Schnittstellen, die standardmäßig deaktiviert sind und möglicherweise keine Auswirkungen haben. Wenn Sie SPICE verwenden, können Sie die folgenden Zeilen hinzufügen, um die Komprimierung zu deaktivieren, da das externe Netzwerk immer noch nicht für den Zugriff auf die VM verwendet wird.
<graphics type='spice'> <listen type='none'/> <image compression='off'/> <jpeg compression='never'/> <zlib compression='never'/> <playback compression='off'/> <streaming mode='off'/> </graphics>
Jetzt können Sie die Startreihenfolge konfigurieren und die Installation von Windows starten. Wenn Sie ein virtio
oder SCSI-Laufwerk verwenden, wird Windows es nicht finden. Sie müssen den SCSI-Treiber von dem Laufwerk installieren, das Sie verbunden haben. Er befindet sich im virtscsi/amd64
. Alles sollte reibungslos verlaufen und Windows sollte in einem langsamen und miserablen, nicht beschleunigten Modus starten. Cortana wird Sie anschreien und Ihr Netzwerk wird nicht funktionieren. Brechen Sie alles auf dem Desktop durch. Starten Sie dort den Geräte-Manager, suchen Sie alle nicht identifizierten Geräte und aktualisieren Sie die Treiber für sie von der Festplatte, die Sie verbunden haben. Sie erhalten ein etwas schnelleres Windows.
Schritt 4: Der lustige Teil
Es gibt drei Möglichkeiten, die beschleunigte Anzeige virtueller VMs von Windows auf dem Bildschirm Ihres Computers anzuzeigen.
- VNC oder ein anderes RAS-Protokoll (normalerweise ist dies eine sehr schlechte Lösung). Bei dieser Option müssen Sie nur die vGPU anschließen und alle anderen Anzeigen und Grafikkarten deaktivieren. Stellen
display='off'
Einstellung display='off'
. Sie benötigen die igd-opregion
Option igd-opregion
nicht. - SPICE (Ich konnte keine 30 FPS oder mehr erreichen, aber die allgemeine Zwischenablage und die Dateiübertragung zwischen der VM und dem Host funktionieren).
- Integrierte QEMU-Schnittstelle in GTK + (gemeinsame Zwischenablage und Dateiübertragung funktionieren nicht, aber Sie können mit einem Patch 60 FPS erreichen).
Was auch immer Sie verwenden möchten, Sie müssen immer noch die zweite Option verwenden, um die Treiber für die GPU zu installieren. Die integrierten Treiber von Microsoft funktionieren zum Zeitpunkt des Schreibens nicht sehr gut mit GVT-g und sind häufig fehlerhaft. Bevor Sie die vGPU mit der VM verbinden, ist es ratsam, den neuesten Treiber von Intel herunterzuladen (anscheinend ändert Intel seinen Ansatz zur Verteilung von Treibern , sodass dieser Schritt in Zukunft möglicherweise anders oder gar nicht erforderlich ist). Stellen Sie nun sicher, dass Sie eine vGPU erstellt haben. Öffnen Sie virt-manager
und ersetzen Sie das gute schnelle QXL durch ein langsames Cirrus, um Konflikte zu vermeiden. Um vGPU mit der VM zu verbinden, müssen Sie virsh edit
öffnen und irgendwo das folgende Fragment hinzufügen:
<domain type='kvm' xmlns:qemu='http://libvirt.org/schemas/domain/qemu/1.0'> <hostdev mode='subsystem' type='mdev' managed='no' model='vfio-pci' display='on'>
<address uuid='fff6f017-3417-4ad3-b05e-17ae3e1a4615'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x09' function='0x0'/> <rom enabled='no'/> </hostdev> <graphics type='spice'> <listen type='none'/> <image compression='off'/> <jpeg compression='never'/> <zlib compression='never'/> <playback compression='off'/> <streaming mode='off'/> <gl enable='yes' rendernode='/dev/dri/by-path/pci-0000:00:02.0-render'/> <!-- , virt-manager , GL. , , auto. --> </graphics> <qemu:commandline> <qemu:arg value='-set'/> <qemu:arg value='device.hostdev0.x-igd-opregion=on'/> <!-- libvirt , --> </qemu:commandline> </domain>
Hinweis: Wenn ich ein XML-Snippet wie dieses bereitstelle, sollten Sie es nach Möglichkeit dem aktuellen hinzufügen, ohne etwas zu ersetzen.
Stellen Sie sicher, dass Sie eindeutige UUIDs für alle von Ihnen verwendeten vGPUs erstellt haben und dass die Steckplatznummern nicht mit den anderen PCI-Geräten in Konflikt stehen. Wenn die Steckplatznummer hinter der Cirrus-GPU liegt, stürzt die virtuelle Maschine ab. Jetzt können Sie die virtuelle Maschine starten. Sie müssen virt-viewer
installieren, um beide Anzeigen zu sehen! Mit dem Befehl können Sie eine Verbindung zu einer VM herstellen
$ sudo -E virt-viewer --attach
Eine der Anzeigen ist leer oder nicht initialisiert, die zweite ist eine vertraute, kleine, nicht beschleunigte Anzeige. Erweitern Sie es und installieren Sie nach der Eingabe den Treiber für die GPU. Wenn Sie Glück haben, wird alles sofort funktionieren. Andernfalls müssen Sie die VM über den Arbeitsbildschirm ausschalten und neu starten (nicht neu starten). Jetzt ist es Zeit, ein Terminal zu öffnen und dmesg -w
Inneren dmesg -w
. Dieser Befehl gibt Ihnen einige nützliche Informationen zu Problemen und zum allgemeinen Fortschritt bei der Verwendung von vGPU. Beispielsweise beschwert sich KVM beim Booten über blockierte MSRs. Bei der Initialisierung von vGPU sollten dann einige falsche Zugriffsmeldungen angezeigt werden. Wenn es zu viele gibt, stimmt etwas nicht.
Wenn das System startet, können Sie die Anzeigeeinstellungen öffnen und den nicht beschleunigten Bildschirm ausschalten. Ein leerer Bildschirm kann im virt-viewer
über das Menü Ansicht ausgeblendet werden. Im Prinzip können VMs bereits verwendet werden, aber es gibt einige Möglichkeiten, um eine höhere Auflösung und Geschwindigkeit zu erzielen.
Das CRU-Dienstprogramm ist sehr nützlich. Sie können damit Restart64.exe
, und selbst wenn Sie auf grafische Artefakte oder sogar auf einen fast vollständig schwarzen Bildschirm Restart64.exe
, wie sich für mich herausstellte, können Sie die mit dem Programm Restart64.exe
Datei Restart64.exe
, um das Windows-Grafiksubsystem neu zu starten. Persönlich verwende ich dieses Dienstprogramm, um eine höhere Auflösung auf einer bescheideneren vGPU zu verwenden.
Um hervorragende 60 FPS zu erzielen, müssen Sie auf den integrierten QEMU-Monitor in GTK + umschalten, ohne eine gemeinsame Zwischenablage mit dem Host und ähnlichen Brötchen zu unterstützen. Außerdem müssen Sie eine Zeile darin ändern und QEMU neu erstellen. Sie müssen Ihrem XML auch eine Reihe böser Befehlszeilenargumente hinzufügen. Entfernen Sie das SPICE-Display und die Cirrus-Grafikkarte und setzen Sie das display
Ihrer vGPU auf off
(libvirt unterstützt die Anzeige auf GTK + nicht und erlaubt kein Booten von display='on'
ohne Anzeige).
<qemu:commandline> <qemu:arg value='-set'/> <qemu:arg value='device.hostdev0.x-igd-opregion=on'/> <qemu:arg value='-set'/> <qemu:arg value='device.hostdev0.display=on'/> <qemu:arg value='-display'/> <qemu:arg value='gtk,gl=on'/> <qemu:env name='DISPLAY' value=':1'/> <qemu:env name='GDK_SCALE' value='1.0'/> </qemu:commandline>
Die Skalierung für HiDPI auf dem QEMU-Monitor funktioniert sehr schlecht, daher werden wir sie deaktivieren. Außerdem müssen Sie die Variable DISPLAY
auf die von Ihnen verwendete Anzeigenummer setzen. Verwenden Sie den folgenden Befehl, um dem Benutzer, der qemu ausführt, Zugriff auf den X-Server zu gewähren:
# xhost si:localuser:nobody
Wenn dies nicht funktioniert, versuchen Sie es mit xhost +
, stellen Sie jedoch sicher, dass Sie eine Firewall verwenden. Versuchen Sie es andernfalls mit einer sichereren Methode.
Mit solchen Tricks werden Sie aufgrund dieses dummen Fehlers in QEMU immer noch nicht über 30 FPS kommen, wenn Sie ihn nicht durch Ändern der Zeile patchen, wie im Kommentar-Link angegeben. Stellen Sie sicher, dass Sie QEMU nur für x86-64 erstellen, es sei denn, Sie möchten es auf einer anderen Plattform verwenden. Ich habe mein PKGBUILD angehängt, das die Zeile nicht ändert, sondern nur QEMU für x86_64 ohne Netzwerkspeicherunterstützung hier sammelt.
Wenn Sie sich unterwegs irgendwo verlaufen, können Sie mein aktuelles XML für libvirt sehen .
Nützliche Links
Offizieller GVT-g Tuning Guide
Dma-buf Benutzerhandbuch
Intel GVT-g Setup-Artikel im NixOS-Wiki
Arch Wiki Artikel über libvirt
Netzwerkeinrichtung in KVM auf der drahtlosen Schnittstelle
Intel GVT-g Website
PS: Vielen Dank an aNNiMON für die Hilfe beim Korrekturlesen des Übersetzungstextes und beim Korrigieren von Fehlern.