Leserartikel Virt-Manager GPU Passthrough Anleitung (Debian/Ubuntu)

Transistor 22

Lt. Commander
Registriert
März 2018
Beiträge
1.431
In diesem Artikel zeige ich, wie man auf einer Debian/Ubuntu basierten Linux Distribution mit hilfe der Qemu-KVM Virtualisierung und Virt-Manager eine Virtuelle Maschine mit einer eigenen GPU, die von dem Host System isoliert wird und in die VM durch gereicht wird (GPU Passthrough) erstellt.

Dies erfordert jedoch mindestens 2 GPUs (oder iGPU + GPU) und das VM Betriebsystem muss UEFI unterstützen. Wie man die GPU unter Debian/Ubuntu basierten Linux Distributionen innerhalb von 5 Minuten nur mit GUI isoliert (Für die folgenden Schritte unbedingt nötig), habe ich bereits in diesem Thread erklärt. Dieser Thread richtet sich an Virt-Manager Anfänger, es wir Schritt für Schritt möglichst einfach gezeigt.

Als erstes muss man Qemu-KVM, Virt-Manager und OVMF installieren, was mit folgendem Terminal Befehl möglich ist.
Alternativ können sie natürlich auch die Pakete über die Paketmanager GUI (z. B. Synaptic) ihres Vertrauens installieren.
Bash:
sudo apt install qemu-system qemu-kvm virt-manager ovmf
Dann startet man Virt-Manager über den Startmenü Eintrag "Virtuelle Maschinenverwaltung".
Um eine VM zu erstellen, Wählen sie das Bildschirmsymbol links oben aus.
VMErstellen.png

Dann öffnet sich folgender Dialog, in dem sie angeben, wie sie das Betriebsystem für ihre VM installieren.
Im normalfall laden sie einfach ein Iso ihres Betriebssystems herunter und wählen Lokales Installationsmedium.
LokalesInstallationsmedium.png

Im nächsten Fenster wählen sie, falls sie Lokales Installationsmedium ausgewählt haben, ihr Iso Installationsmedium aus. Sollte ihr Betriebsystem in der Auswahl unten nicht vefügbar sein, wählen sie einfach Generic Default.
In den nächsten beiden Fenster wählen sie die CPU Kerne und den RAM für die VM aus und erstellen einen Datenträger für die VM.
Später zeige ich ihnen auch noch wie sie die VM CPU Kerne vom Host isolieren, die VM CPU Performance optimieren und ein echtes Laufwerk oder einzelne Partitionen zur VM hinzufügen.
Danach sollte sich folgendes Fenster öffnen, in dem sie den Name der VM ändern und Konfiguration bearbeiten vor der Installation auswählen.
Als Netzwerk wählen sie entweder NAT oder Hostgerät Brücke aus, bei mir hat immer eines der Beiden Optionen Out of the Box funktioniert.
Falls dies bei ihnen nicht der Fall sein sollte, können sie der VM ein physischen Netzwerkadapter hinzufügen oder manuell ein Netzwerkadapter erstellen.

ManuelleKonfiguration&Netzwerk.png

Danach können sie die VM konfigurieren.
Wichtig ist, das sie als Firmware UEFI auswählen. Als Chipsatz würde ich den i440FX empfehlen.
UEFI.png

Dann gehen sie auf Boot Optionen und aktivieren das Startmenü, es Empfiehlt sich das OS Laufwerk als Bootoption an erster Stelle ausgewählt zu haben.
Startmenü.png

Dann entfernen sie Tablett, Anzeige Spice, Konsole, Video QXL und USB Redirector.
Sound stellen sie falls bei ihnen Verfügbar auf Host Passthrough, sollte es bei ihnen nicht verfügbar sein entfernen sie auch Sound ich6.
Als nächstes fügen sie mit Gerät Hinzufügen/PCI Host-Gerät ihre GPU und den GPU Audiocontroller zur VM hinzu.
Zusätzlich können sie noch einen USB Controller, eine Soundkarte/Onboard Sound, eine Nvme SSD, Netzwerkkarte/Onboard LAN hinzufügen, dafür benötigen sie jedoch meist den ACSO Kernel Patch, welchen sie evtl. schon über GPTools installiert haben oder manuell von hier herunterladen und installieren können.
Bitte beachten sie, das der ACSO Patch es ermöglicht, das vom Gast auf den Host zugegriffen werden kann.
Beachten sie, das diese Geräte dann während die VM läuft nicht für den Host verfügbar sind.
PCIeGeräteHinzufügen.png

Falls sie keinen USB Controller, an dem sie die USB Geräte für die VM angesteckt haben, als PCI Gerät zur VM hinzugefügt haben, können sie diese über USB Hostgeräte hinzufügen.
Es ist nicht möglich einen USB Hub hinzuzufügen.
Beachten sie, das die ausgewählten USB Geräte während die VM läuft nicht für den Host Verfügbar sind.
Stellen sie sicher das sie mindestens eine Maus und Tastatur zur VM hinzugefügt haben.
Jetzt sollte eure Konfiguration ähnlich wie folgende aussehen.
FertigeKonfiguration.png

Jetzt können sie die Installation beginnen.
Wechseln sie nun auf den Monitor, der an der VM GPU angeschlossen ist.
Sie sollten jetzt den Bootvorgang der VM sehen und das Betriebsystem installieren und nutzen können.

Mögliche Probleme
Bash:
#!/bin/bash
shopt -s nullglob
for g in /sys/kernel/iommu_groups/*; do
    echo "IOMMU Group ${g##*/}:"
    for d in $g/devices/*; do
        echo -e "\t$(lspci -nns ${d##*/})"
    done;
done;

CPU Pinning

Das CPU Pinning weist dem VM Kern einen festen echten Kern zu, was zu Performanceverbesserungen führt.
Der CPU Aufbau wird mit dem Befehl lscpu -e angezeigt.
Um es zu aktivieren öffnet man die VM konfiguration über folgenden Befehl.
Bash:
sudo virsh edit VMName
Dort fügt man zwischen </vcpu> und <os> folgendes ein. Die Anzahl der gepinnten Kerne muss mit der Anzahl der Kerne der VM übereinstimmen.
Bash:
  <cputune>
    <vcpupin vcpu='Host CPU Kern Nummer(Startend mit 0)' cpuset='VM Kern Nummer'/>
    <vcpupin vcpu='1' cpuset='1'/>
    <vcpupin vcpu='2' cpuset='2'/>
    <vcpupin vcpu='3' cpuset='3'/>
    <vcpupin vcpu='4' cpuset='4'/>
    <vcpupin vcpu='5' cpuset='5'/>
  </cputune>

CPU Isolation

Bisher benutzt auch der Host PC die der VM zugeordneten Kerne, kann diese also auch Auslasten, möchte man jedoch nahezu Bare-metal CPU Performance in der VM, kann man die Kerne mit den Host Bootargumentent
Code:
isolcpus=0-5 nohz_full=0-5 rcu_nocbs=0-5
isolieren (In dem Beispiel werden die ersten 6 Kerne Isoliert), welche die Kerne exklusiv für VMs nutzbar macht.
Das Bootargument trägt man einfach in /etc/default/grub in die Zeile GRUB_CMDLINE_LINUX_DEFAULT="Bootargument" ein, wenn ihr PC den Grub 2 Bootloader nutzt. Dann müssen sie diesen nur noch mit
Bash:
sudo update-grub
updaten.
Beachten sie, das dieses Laufwerk/diese Partition wenn die VM läuft nicht im Hostsystem verfügbar ist.
Mit folgendem Befehl listen sie die Namen der verfügbaren Laufwerke auf.
Bash:
ls /dev/disk/by-id/
Notieren sie sich den Name des Laufwerks, welches sie zur VM hinzufügen möchten.
Öffnen sie die VM konfiguration mit folgendem Befehl.
Bash:
sudo virsh edit VMName
Fügen sie folgendes unter <devices> ein
Code:
    <disk type='block' device='disk'>
      <driver name='qemu' type='raw'/>
      <source dev='/dev/disk/by-id/Partionsoderlaufwerksname'/>
      <target dev='vdb' bus='virtio'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x0a' function='0x0'/>
    </disk>
 

Anhänge

  • Installationsmedium.png
    Installationsmedium.png
    27,4 KB · Aufrufe: 459
  • PCIeGeräteHinzufügen.png
    PCIeGeräteHinzufügen.png
    78,6 KB · Aufrufe: 477
Zuletzt bearbeitet:
  • Gefällt mir
Reaktionen: IceKillFX57, Drahminedum, Snudl und 19 andere
Nicht vergessen woher IOMMU im Bios zu aktivieren.
 
  • Gefällt mir
Reaktionen: konkretor, SVΞN und Transistor 22
Super. Anleitung.

Welche 2.GPU ist zu empfehlen. Aktuell habe ich eine Geforce RTX2070 Super im Einsatz.
Ziel Linux als Host und virt. Win10. Win10 brauche ich wegen einer speziellen Software - die gibt es nicht für Linux.
Unter Linux arbeite ich mit LibreOffice, Firefox, Thunderbird, qt5 und python.
Überlegung neue, preiswerte GPU für Linux Host und die Geforce 2070 Super für Win10 nehmen.
 
  • Gefällt mir
Reaktionen: IstDasDingAn?
  • Gefällt mir
Reaktionen: Transistor 22
foofoobar schrieb:
Nicht vergessen woher IOMMU im Bios zu aktivieren.
Das ist alles im Thread zur Isolation der GPU.
@pseudopseudonym
Für den Reset Bug Gibt es viele Grafikkartenabhängige Patches, deshalb hab ich die noch nicht alle verlinkt. Es ist nicht der Agenda Patch.
@Don_2020
Eigentlich ist es relativ egal welche GPU man für das Hostsystem verwendet, sie sollte die gewünschte Auflösung anzeigen können und die gewünschten Anschlüsse zur Verfügung stellen können und die benötigten Codecs unterstützen. Ich würde diese RX 550 http://geizhals.de/2273478 für 64€ empfehlen, die unterstützt alle modernen Codecs, alternativ was gebrauchtes. Falls deine CPU eine iGPU hat sollte die jedoch auch genügen.
 
Zuletzt bearbeitet:
Transistor 22 schrieb:
Für den Reset Bug Gibt es viele Grafikkartenabhängige Patches, deshalb hab ich die noch nicht alle verlinkt. Es ist nicht der Agenda Patch.
Gut zu wissen, dass es überhaupt nen Patch gibt.
Mein letztes Highlight war das Upgrade auf 2004, als nachm Neustart die GPU nicht ging und Windows das Upgrade komplett zurückgenommen und blockiert hat.
Ergänzung ()

@foofoobar
Bei mir (leider) notwendig, um das aufgelöteter Zeug vom Mainboard teilweise durchzureichen.
 
Sehr schöner Leseratikel @Transistor 22, der mit deinem Einverständnis auf die Startseite wandert.

Danke @burnout150 für den Hinweis.

Liebe Grüße,
Sven
 
  • Gefällt mir
Reaktionen: Fuchiii, tony_mont4n4, cruse und 2 andere
pseudopseudonym schrieb:
@foofoobar
Bei mir (leider) notwendig, um das aufgelöteter Zeug vom Mainboard teilweise durchzureichen.

Jupp, aber der User sollte über die Konsequenzen aufgeklärt werden.
Ergänzung ()

@Transistor 22
Transistor 22 schrieb:
Das ist alles im Thread zur Isolation der GPU.

Ok, allerdings sollte auch da der Hinweis hin das man IOMMU abschalten sollte wenn man es nicht benötigt. Ein Trojaner kann sich mit IOMMU Hilfe fast perfekt verstecken.
 
  • Gefällt mir
Reaktionen: Transistor 22
SV3N schrieb:
Sehr schöner Leseratikel @Transistor 22, der mit deinem Einverständnis auf die Startseite wandert.

Danke @burnout150 für den Hinweis.

Liebe Grüße,
Sven
Natürlich wäre ich damit Einverstanden das das auf die Startseite wandert.
Bis dahin werde ich das ganze noch etwas ordentlicher machen.
foofoobar schrieb:
Jupp, aber der User sollte über die Konsequenzen aufgeklärt werden.
Ergänzung ()

@Transistor 22


Ok, allerdings sollte auch da der Hinweis hin das man IOMMU abschalten sollte wenn man es nicht benötigt. Ein Trojaner kann sich mit IOMMU Hilfe fast perfekt verstecken.
Ich habe es so verstanden nur das überschreiben des Access Control Services unsicher ist, habe ich das falsch verstanden? Hinweise habe ich hinzugefügt. In zukünftigen GPTools Versionen wird diese Warnung bei Installation des ACSO Kernels enthalten sein.

In Zukunft werde ich versuchen, in GPTools wenn möglich eine Option zum aktivieren von CPU Pinning, CPU Isolierung und zum hinzufügen von Partitionen und Laufwerken hinzufügen.
 
  • Gefällt mir
Reaktionen: SVΞN
Transistor 22 schrieb:
Ich habe es so verstanden nur das überschreiben des Access Control Services unsicher ist, habe ich das falsch verstanden? Hinweise habe ich hinzugefügt. In zukünftigen GPTools Versionen wird diese Warnung bei Installation des ACSO Kernels enthalten sein

Das an den Gast exportierte Device wird dadurch nicht mehr richtig vom Host isoliert, d.h. der Gast kann unter Umständen den Host kompromittieren. Es hat einen Grund warum das nicht upstream ist.

Und Joanna Rutkowska hat IMHO einen Prototyp gebaut welcher ein laufendes Windows in eine VM verschiebt damit man den Trojaner schön in dem neuen Hypervisior laufen lassen kann damit der Gast davon nichts mitbekommt, daher IOMMU im Bios abschalten wenn man es nicht braucht.
 
Zuletzt bearbeitet:
  • Gefällt mir
Reaktionen: Transistor 22
Bedeutet das ganze hier, das wenn ich zwei GPU's im System habe, und das ganze unter Linux läuft. Ich mir eine VM mit Windows 10 erstelle, das ich dann einfach die Haupt GPU durchreiche und dann in der VM genau so gut zocken kann wie unter einem nativen Windows?
 
Sehr schön, auf solch einen Artikel habe ich gewartet. :)

Ich habe letztens irgendwo gelesen (finde den Artikel nicht mehr...) dass man mit etwas mehr Arbeit auch nur eine einzige GPU für Host- und Gastsystem nutzen könnte. Stimmt das denn? Wenn ja, wie viel mehr Aufwand ist das?
 
Netter Artikel! Was mir fehlt: Ein Benchmarkvergleich zwischen VM und Native (Beides Windows). Außerdem immer blöd eine zweite GPU rein zu stecken :( Bei mir würde das für Temperaturprobleme sorgen und bleibt somit erstmal ein Wunsch. (Oder geht das auch mit einer Externen GPU für den Host? Das wäre witzig ^^)
 
  • Gefällt mir
Reaktionen: tony_mont4n4
@cosamed das ist ein möglicher Anwendungsfall ja. Die GPU Performance ist dann quasi identisch zu einem nicht virtualisierten Windows.
 
  • Gefällt mir
Reaktionen: cosamed und Transistor 22
ChrisM schrieb:
Ich habe letztens irgendwo gelesen (finde den Artikel nicht mehr...) dass man mit etwas mehr Arbeit auch nur eine einzige GPU für Host- und Gastsystem nutzen könnte. Stimmt das denn? Wenn ja, wie viel mehr Aufwand ist das?

Linux läuft auch headless.
 
  • Gefällt mir
Reaktionen: ChrisM und Transistor 22
Ja das ist klar, aber wie schaltet man auf die GPU zurück? Kann man das triggern? SingleGPU + Durchschleifen wäre für mich der Moment wo ich sofort auf Linux umsteigen werde :D
 
cosamed schrieb:
Bedeutet das ganze hier, das wenn ich zwei GPU's im System habe, und das ganze unter Linux läuft. Ich mir eine VM mit Windows 10 erstelle, das ich dann einfach die Haupt GPU durchreiche und dann in der VM genau so gut zocken kann wie unter einem nativen Windows?
Genau. Das kann gerade für Leute die beides gleichzeitig nutzen wollen oder für Leute die ihren PC zum Zocken nicht neu starten wollen vorteilhaft sein. Außerdem lassen sich damit sehr einfach neue Betriebssysteme ohne angst Partitionen ausversehen zu löschen testen.
Salamimander schrieb:
Ja das ist klar, aber wie schaltet man auf die GPU zurück? Kann man das triggern? SingleGPU + Durchschleifen wäre für mich der Moment wo ich sofort auf Linux umsteigen werde :D
Das geht, aber leider nur mit Nvidia GPUs. Ein Skript dafür ist in GPTools aber leider nicht implementiert.
 
Ne NVidia GPU habe ich ja 🤷🏻‍♂️
 
Von TheGeekFreaks gibts dazu auch ein sehr ausführliches Video bzw. LiveStream-Mitschnitt, wie das ganze auch unter UnRaid funktioniert. Da geht sogar der "Remote Desktop" über einer 10GBit-Verbindung OHNE FrameDrop und nahezu ohne Tearing etc. im Game vom Host zum Client.

Bin nach ein paar Tests bei mir zu Hause gerade am HW zusammenstellen, um im WoZi am 32" nur noch den lautlosen ThinClient am laufen zu haben (der aber auch ne 10GBit-Verbindung braucht, der Rest (Host) steht dann im Keller.
Der Host selber bekommt als Grafikkarten dann 2xNVIDIA und 1xAMD OnChip mit ner 12/16Kerner AMD-CPU.
Ist halt genial, wenn man per "SW-Switch" zwischen Zocken, Video-Rendern und Arbeiten umschalten kann....
Absolut genial finde ich an UnRaid, dass ich dort echte HDDs mit ner Windows-Installation drauf quasi "on-the-fly" einbinden und damit arbeiten kann - passiert bei mir privat öfters als "ehrenamtlicher Datenretter" :D ...
Ok, UnRaid kostet als OS Geld, aber das ist es mir wirklich wert, denn was ich bereits bis dato alles investiert habe, um die Geräuschkulisse zu mindern, übersteigt bei weitem die Kosten für die UnRaid-Lizenz...
 
Zurück
Oben