Stand der Technik: Nvidia-Grafikkarte an virtuelle Maschine durchreichen mit KVM vfio

  • Hallo,


    es gibt ja hier im Portal recht gute Tutorials zum Thema Virtualisierung mit Xen/Xenserver (wieder einmal ist hier viel Content von fnu zusammengetragen worden). Meist geht es beim Durchreichen von Hardware dann um DVB-S2-Karten (PCI-Passthrough). Dies läuft nach Berichten recht gut und halbwegs einfach, wenn man auf die VT-Eigenschaften der verwendeten Hardware achtet.


    Im Gegensatz dazu ist die Erfolgsquote beim Durchreichen von Grafikkarten an eine VM immer noch erheblich niedriger und der Frustfaktor dabei höher. Mit Xenserver arbeiten beispielsweise bisher entweder nur einige AMD-Karten oder Nvidia-Quadro-Karten zusammen oder Nvidia-Karten, die per Lötkolben so modifiziert worden sind, dass sie sich als Quadro-Karten ausgeben.


    Hier im Portal dokumentierte Versuche, eine GPU durchzureichen, waren dann bisher auch nicht mit Erfolgsmeldungen versehen:


    Ich habe momentan geeignete Testhardware daheim und wollte gern schauen, ob es einen Weg gibt, meine zum Spielen angeschaffte Nvidia Geforce GTX 660 an eine virtuelle Maschine zu binden. Das Mainboard ist das in meinem Haswell-Review verwendete Asrock B85M HDS ([Review] ASRock B85M-HDS & Intel Celeron G1820 (Haswell)). Die CPU ist ein Intel Core i5-4670, 4x 3.40GHz (Haswell). Alle Komponenten unterstützen VT-d/VT-x.


    Meine ersten Gehversuche habe ich am Wochenende mit Xenserver gemacht, und zwar mit der aktuellen Vorabversion von Xenserver Creedence (=Xenserver 6.5, Alpha 4). Es hat mich fasziniert, wie schnell und komfortabel ich damit eine Windows 8.1 Maschine anlegen konnte (und diese dann in ein Template verwandeln konnte). Nur leider habe ich bisher keine Möglichkeit entdeckt, meine Nvidia GTX 660 oder die Intel-Onboard-Grafik an eine Maschine zu binden. Wie oben gesagt, man braucht hier entweder bestimmte AMD-Karten oder oder spezielle Quadro-Karten von Nvidia oder fängt todesmutig an, auf der Nvidia-Karte herumzulöten.


    Bei meiner Recherche ist mir nun bewusst geworden, dass Nvidia mit Absicht das Ziel verfolgt, dass professionelle Virtualisierung nur mit ihren Profi-Karten (Quadro) machbar sein soll. Andersherum ist es natürlich im Profi-Bereich eine unschätzbare Hilfe, wenn man sich darauf verlassen kann, eine fest definierte Liste an funktionierenden Karten zu haben, wo man bedenkenlos einkaufen kann.


    Allerdings habe ich gestern Abend weiter recherchiert und bin auf interessante Alternativen gestoßen: Zwar würde ich gern weiterhin bei Xenserver bleiben, aber anscheinend gibt es via gepatchtem KVM/QEMU das gewünschte Killer-Feature geschenkt: Es gibt eine Archlinux-Anleitung, wie man mit KVM VGA-Passthrough via vfio-vga mit beliebigen Grafikkarten umsetzen kann.


    (Bei diesem Feature geht es aber wohl auch immer darum, vor dem Grafikkartentreiber zu verstecken, dass die Consumer-Grafikkarte einer virtuellen Maschine zugeordnet ist. Der Nvidia-Treiber unter Windows checkt wohl, ob das der Fall ist, und verweigert dann bei Consumer-GPUs die Zusammenarbeit (Error Code 43). Das ist also wohl immer ein Wettrennen zwischen Patches und Treiber-Updates.)


    Da die Anleitung schon aus dem Mai 2013 stammt, würde mich interessieren, ob diese Features schon von jemandem hier in der Praxis getestet worden ist bzw. wie leicht man dies auf aktuellen Linux-Distributionen einrichten kann (Ubuntu?) und ob man Xenserver Creedence nicht auch diese Features beibringen könnte.


    Es gibt Tutorials, Videos und Diskussionen zu verschiedenen Distributionen:
    Archlinux (die Mutter aller Diskussionen zu diesem Thema): https://bbs.archlinux.org/viewtopic.php?id=162768
    Fedora: Relativ aktuelles Tutorial.
    Debian: Wiki: https://wiki.debian.org/VGAPassthrough / Für Debian Jessie gibt's ein rockendes Youtube-Video: https://www.youtube.com/watch?v=pLByu1-ptzI
    Gentoo: Youtube-Video https://www.youtube.com/watch?v=37D2bRsthfI
    Ubuntu: Multiheaded NVIDIA Gaming using Ubuntu 14.04 + KVM / KVM VGA passthrough and USB device sharing


    Übergreifend: http://rafalcieslak.wordpress.…-vm-with-vga-passthrough/


    Hat jemand von Euch sowas schon am Laufen?


    Viele Grüße
    hepi

  • In dem verlinkten Ubuntu-Tutorial fehlt ein Hinweis darauf, dass man den nouveau-Treiber blacklisten muss, damit man die Nvidia-Karte komplett als "claimed by stub" bekommt. Ansonsten ist das Tutorial nicht übel.


    EDIT: Des weiteren ist zu beachten, dass die Autoren des Ubuntu-Tutorials von pugetsystem.com einen Xeon-Prozessor ohne integrierte Grafik nutzen. Mein Haswel-Core-i5 bringt ja eine integrierte Intel-Grafik mit (i915), was laut verschiedenster Foreneinträge problematisch ist, solange man nicht seinen Kernel patcht mit einem experimentellen, nicht akzeptierten Patch, der die Option i915.enable_hd_vgaarb nachrüstet, die man dann aktiv schalten muss. Anscheinend gibt es derzeit noch kein i915-dkms-Treiberpaket auf Launchpad, welches diesen Patch beinhaltet. Muss man wohl selber wieder aktiv werden...


    Gruß
    hepi

  • Kennst Du hier dieses Tutorial für KVm und Ubuntu 14.04? Das liest sich so einfach, dass ich es fast nicht glauben kann. Leider ist aktuell null Zeit zum Testen auf meinem Server.


    Edit: hast Du ja editiert. Ich nutze in meinem System nur die Nvidia und habe noch die Onboard vom Tyan. Sieht also so aus, als wenn ich gute Chancen habe.

    Proxmox VE, Tyan Xeon Server, OMV, MLD-Server 5.1
    MLD 5.1 64bit: Asus AT5iont-t, ION2, 4GB Ram, SSHD 2,5" 1Tb, HEX TFX 300W 82+, Cine S2 V6.2 , 38W max.
    Yavdr 0.5:
    Zotac D2550ITXS-A-E mit GT610 OB, TT S2-4100 PCI-e ,Joujye NU-0568I-B
    Yavdr 0.5:
    Sandy Bridge G840, Tests und Energieverbrauch , CoHaus CIR, Cine S2 V6.2
    MLD 5.1 Beebox N3150
    , DVBSky S960 und 1Tb WD Blue

  • Wenn Du eine zweite Platte zum Testen hast, würde sich auch Proxmox anbieten. Generelle Hinweise zum GPU Passthrough im entsprechenden Wiki. Weitere Infos und Erfahrungen sind auch im Proxmox Forum zu finden. Zumindest hättest Du hiermit eine gute Testumgebung als "Proof of Concept".

  • Die Proxmox-Wiki-Seite sagt ja, dass man einen Kernel > 3.16 braucht, wenn integrierte Intel-Grafik (bei mir der Fall) mit im Spiel ist (unklar bleibt, ob als durchgereichte Zweitkarte oder als primäre Karte):
    "intel IGD'S WONT WORK currently with proxmox kernel 3.10, try with debian kernel > 3.16."
    Größer 3.16 heißt: Eine experimentelle Version von 3.17, was Neueres gibt's ja gar nicht zum heutigen Tage. Am liebsten wäre mir ja, wenn dann im Wiki stünde, warum das so ist.
    Weil der VGA-Arbiter-Patch für i915, den ich im Posting #3 verlinkt habe, ja auch in Kernel 3.17 nicht mit drin ist.


    Ich werde erstmal weiter versuchen, das unter Ubuntu 14.04 zum Laufen zu kriegen, da kann ich auch den Kernel leicht tauschen (mit dem ersten 3.17er Mainline-Kernel hatte ich es schon versucht) . Habe momentan auch nicht soviel Zeit dafür, kann also noch dauern.


    EDIT: Und ein anderes Praxisproblem habe ich noch: Meine Geforce GTX 660 hat vier digitale Grafikausgänge (HDMI, DP, 2xDVI):
    [Blocked Image: http://www.pcgameshardware.de/screenshots/147x110/2012/09/msi_gtx660_tf3_oc_4.jpg]
    Woher weiß ich, an welchem Ausgang ein Signal kommen wird, wenn ich qemu starte? Ich habe bisher mehrere getestet, bisher kam immer nirgendwo ein Signal, wobei ich DP mangels Kabel/Adapter nicht getestet habe.


    Gruß
    hepi

  • Die Proxmox-Wiki-Seite sagt ja, dass man einen Kernel > 3.16 braucht, wenn integrierte Intel-Grafik (bei mir der Fall) mit im Spiel ist (unklar bleibt, ob als durchgereichte Zweitkarte oder als primäre Karte):


    Das bezieht sich auf das Durchreichen der Intel Gfx (Primärkarte). Wenn Du eine Nvidia Karte durchreichen willst, reicht der Proxmox Kernel 3.10 (hierin sind alle nötigen Patches enthalten).


    Woher weiß ich, an welchem Ausgang ein Signal kommen wird, wenn ich qemu starte?


    An welchem Ausgang liegt denn das Signal an, wenn Du die Karte im Host betreibst? Am gleichen Ausgang erhälst Du ein Bild, wenn Du die Karte durchgereicht hast.
    Du kannst Die karte ja nicht auf dem Host und dem Guest gleichzeitig verwenden. Du musst dann auf dem Host z.B. die Intel Grafik verwenden und die Nvidia Karte durchreichen.


  • Das bezieht sich auf das Durchreichen der Intel Gfx (Primärkarte). Wenn Du eine Nvidia Karte durchreichen willst, reicht der Proxmox Kernel 3.10 (hierin sind alle nötigen Patches enthalten).


    OK. Danke. Leider habe ich keine leere Festplatte rumliegen, reicht eine Partition aus?


    An welchem Ausgang liegt denn das Signal an, wenn Du die Karte im Host betreibst? Am gleichen Ausgang erhälst Du ein Bild, wenn Du die Karte durchgereicht hast.


    Das ist einer der beiden DVI-Ports. Die Aussage gefällt mir, ich hatte auf sowas gehofft. Dann würden bei mir evtl. nur die Boot-Parameter noch nicht komplett stimmen.

    Du kannst Die karte ja nicht auf dem Host und dem Guest gleichzeitig verwenden. Du musst dann auf dem Host z.B. die Intel Grafik verwenden und die Nvidia Karte durchreichen.


    Das ist mir klar. Bei der Lektüre von verschiedenen Diskussionen war die Rede davon, dass i915 im System problematisch ist und ein bis zwei Patches braucht. Leider ist oft nicht präzise formuliert, ob i915 als Host-Primär-Karte problemlos und ohne Patches läuft. Mein Verständnis war eher, dass man auch dann die Patches für i915 einbauen muss.
    Außerdem ist mir unklar, ob wegen DRI ein X-Server auf dem Host laufen darf, wenn qemu gestartet wird. Möglicherweise muss ich den X-Server mal beenden, bevor ich qemu starte.


    Gruß
    hepi

  • OK. Danke. Leider habe ich keine leere Festplatte rumliegen, reicht eine Partition aus?


    Die Standardinstallation von Proxmox belegt die vollständige Platte. Wenn Du nur eine Partition über hast, müsstest Du den Umweg über Debian gehen (Standard Debian Installation und dann das Proxmox Repo hinzufügen... genaueres steht auch im Wiki). Als reiner "Proof of Concept" in Deinem Fall vielleicht etwas zu umständlich.


  • Das bezieht sich auf das Durchreichen der Intel Gfx (Primärkarte). Wenn Du eine Nvidia Karte durchreichen willst, reicht der Proxmox Kernel 3.10 (hierin sind alle nötigen Patches enthalten).


    Ich verwende ein Debian Jessie mit der Intel GPU auf dem ich eine Nvidia Karte durchreiche und unter Windows 7 zum zocken benutze. Hab das ganze vor circa einem Jahr eingerichtet und an dieser Seite orientiert https://bbs.archlinux.org/viewtopic.php?id=162768


    Ich brauche aber definitiv den i915 vga arbiter fixes obwohl ich die NVIDIA Karte durchreiche sonst funktioniert es bei mir nicht. Momentan verwende ich den 3.15.10 mit dem i915 vga Patch. Hab es letztens mit dem 3.16 Kernel probiert aber da hat der i915 vga Patch bei mir nicht funktioniert.


    Gruß dile

  • dile : Danke für die Rückmeldung. Das deckt sich mit dem, was ich bisher gelesen habe: Bei i915 im System ist der VGA arbiter Patch manuell anzuwenden, weil es keine Pläne gibt, dass dieser in die offiziellen Kernelmodule einflließen soll.


    Es gibt aber noch ganz aktuell einen neuen Ansatz, den ich noch nicht ganz kapiere, der aber sehr interessant klingt:


    Man kann wohl evtl. die Probleme mit VGA umgehen, wenn man den Gästen ein UEFI-BIOS über eine OVMF-Firmware vorschreibt. Dafür muss das Gast-OS neu genug sein und die GPU auch.


    http://vfio.blogspot.de/2014/0…with-vga-arbitration.html
    http://vfio.blogspot.de/2014/0…signment-without-vga.html


    Dies wird jedenfalls im Archlinuc-Thread gerade heiß diskutiert:
    https://bbs.archlinux.org/viewtopic.php?id=162768&p=110


    Gruß
    hepi

  • Bei i915 im System ist der VGA arbiter Patch manuell anzuwenden, weil es keine Pläne gibt, dass dieser in die offiziellen Kernelmodule einflließen soll.


    Das Thema an sich ist ja schon komplex genug. Aber zur Vollständigkeit möchte ich anmerken, dass der VGA arbiter Patch in Kombination mit Intel als sekundär Grafik wohl nur gebraucht wird, wenn ein xserver auf dem Host läuft. So habe ich es zumindest verstanden. Dies würde auch erklären, warum das bei Proxmox ohne diesen Patch funktioniert.

  • vdr-freak : Danke für die Klarstellung mit dem X-Server.


    Eben bin ich beim Schmökern über folgende Postings gestolpert:
    https://bbs.archlinux.org/viewtopic.php?pid=1458245#p1458245
    https://bbs.archlinux.org/viewtopic.php?pid=1458552#p1458552


    Dort sagt der Experte Alex Williamson (aw), dass Nvidia mit dem Windows-Treiber 344.11 vom 19.09.2014 wieder neue Checks eingebaut hat, um das Durchreichen von Consumer-Karten zu verbieten. Das ist wahrscheinlich ein Problem. Hier müsste man mal darüber nachdenken, ob nicht eine AMD/ATI-Karte weniger Stress bedeutet.


    Alex Williamson wird übrigens im Oktober einen Vortrag halten in Düsseldorf über genau das Thema GPU-Durchreichen:
    http://vfio.blogspot.de/2014/09/kvm-forum-2014.html
    http://kvmforum2014.sched.org/…6defc9c52b89#.VCGwtBaGHKg


    Wäre ich in Düsseldorf, würde ich da hingehen....


    Viele Grüße
    hepi

  • Die Konferenz in Düsseldorf ist branchenüblich natürlich sauteuer, also bleibt eher die Hoffnung, dass der Vortrag auf Youtube oder zumindest die Slides veröffentlicht werden hinterher.
    Zu dem Vortrag von 2013 gibt es auch die Slides: http://www.linux-kvm.org/wiki/…m-forum-2013-VFIO-VGA.pdf
    http://www.linux-kvm.org/wiki/…/b/b4/2012-forum-VFIO.pdf
    Und bei Youtube gibt es auch was von 2011: https://www.youtube.com/watch?v=XN1EoHqsqzU


    Gruß
    hepi

  • Nach langer Zeit hatte ich gestern mal wieder etwas Zeit zum Rumspielen an diesem Thema.


    Mein Ziel ist es, unter Ubuntu über KVM meine Nvidia GeForce GTX 660 durchzureichen an eine virtuelle Maschine mit Windows 8.1. Auf meinem Mainboard sitzt zusätzlich eine in die CPU integrierte Intel-GPU (i915). Im regelmäßig aktualisierten Archlinux-Tutorial von nbhs wird erklärt, dass man einen gepatchten Kernel 3.18 braucht. Zwei Patches müssen angewendet werden: acs override patch + i915 vga arbiter fixes. (Warum? Gepatcht werden muss zumindest dann, wenn man eine i915 Grafik hat und/oder gleichzeitig den X-Server auf dem Host laufen lassen will. Hat man eine XEON-CPU ohne integrierte Grafik, kann das Patchen eventuell entfallen, zumindest der i915er-Patch.)


    Die dort direkt verlinkten Patches von der Kernel-Mailingliste sind allerdings schon älter und sie passen nicht mehr ohne Probleme auf den Kernel 3.18. Glücklicherweise hat nbhs in seinem verlinkten Kernel-Archiv linux-mainline-3.18.0.tar.gz zwei aktualisierte Patches mit drin, die sich einfach auf einen 3.18er-Kernel von Ubuntu anwenden lassen (gleiches gilt wahrscheinlich für einen experimentellen 3.18er-Debian-Kernel). Also bitte die Patches aus seinem linux-mainline-Archiv nehmen, die Dateien heißen dort:


    Code
    1. override_for_missing_acs_capabilities.patch
    2. i915_317.patch


    Somit konnte ich einen gepatchten 3.18er-Ubuntu-Vivid-Kernel auf unkomplizierte Weise bauen: Ich habe den Kernel-Sourcecode in Form eines Sourcepaketes (vom 12. Januar, also recht frisch) runtergeladen, die Patches angewendet und dann einfach lokal gebaut mit dpkg-buildpackage. Den Kernel habe ich von hier: http://packages.ubuntu.com/viv…ux-image-3.18.0-9-generic (Debian-Nutzer könnten mal hier schauen: https://packages.debian.org/source/experimental/linux)
    So kommt man zum extrahierten Sourcepaket:

    Code
    1. dget -xu http://archive.ubuntu.com/ubuntu/pool/main/l/linux/linux_3.18.0-9.10.dsc


    Obwohl der Kernel zu Vivid gehört, habe ich ihn auf einem frischen Ubuntu 14.10 Utopic installiert, das normal mit Kernel 3.16 kommt. Vivid brauche ich nicht unbedingt, weil qemu unter Utopic genauso neu zu sein scheint (v2.1). Die Kernelpakete ließen sich problemlos installieren und Ubuntu bootete ohne Auffälligkeiten.
    Weiter bin ich noch nicht. Fortsetzung folgt, jedoch wohl erst in ein paar Tagen.


    Gruß
    hepi

  • Zwischenergebnis nach Befolgen zweier Tutorials: Ich bin begeistert, ich habe qemu gestartet mit einem Windows8.1 ISO-Image und sehe tatsächlich den Startbildschirm der Windows-Installation über die Nvidia-GPU! Nur ist dort noch keine Tastatur/Maus zugeordnet und ich kann nix machen...
    Es geht tatsächlich... Ubuntu über die integrierte Intel-GPU und Windows über die Nvidia-GPU. Faszinierend!


    Gruß
    hepi

  • Cool!


    Hepi, wie aktuell ist denn der Nvidia Windows Treiber?


    Du schreibst von zwei TuTos, einmal " https://bbs.archlinux.org/viewtopic.php?id=162768&p=1 ", ist das zweite hier auch verlinkt?


    Von XEN habe Nase voll und möchte zu KVM wechseln.


    Ich hätte zwar lieber die Nvidia Karte unter Ubuntu und den Intel IGP unter Windows,


    dieser Weg ist wohl mit KVM "noch" nicht möglich.


    Kind regards


    SED

    VDR-Server: Ubuntu 16.04 mit TVH
    als SAT>IP, PLEX Media, und Asterisk Server - ASRock J1900M, DD Cine S2 V6.5 + 3 * DuoFlex S2, 8GB Ram, 8x6 TB HDDs + 8x6 TB Backup Server alle 24 Stunden via rsync, kein Raid
    VDR Clients: yaVDR 0.6.0, ASRock Q1900B, 2GB Ram, 16 GB USB-Stick, Zotac GeForce GT 730, keine Lüfter - alles mit Heatpipes gegen Starngkühlkörper

  • Hallo SED,


    Hepi, wie aktuell ist denn der Nvidia Windows Treiber?


    Ich antworte mal indirekt mit einem Link auf die FAQ von Alex Williamson, siehe dort Question 10: http://vfio.blogspot.de/2014/08/vfiovga-faq.html


    EDIT: Momentan nutze ich 340.52, der ist nun ein halbes Jahr alt.


    Du schreibst von zwei TuTos, einmal " https://bbs.archlinux.org/viewtopic.php?id=162768&p=1 ", ist das zweite hier auch verlinkt?


    Ja, das ist das Ubuntu-Tutorial von Pugetsystems. Dort sind aber einige Details wieder veraltet. Außerdem erklärt es nicht, wie man Netzwerk konfiguriert.


    Von XEN habe Nase voll und möchte zu KVM wechseln.


    Ich hätte zwar lieber die Nvidia Karte unter Ubuntu und den Intel IGP unter Windows,


    dieser Weg ist wohl mit KVM "noch" nicht möglich.


    Anscheinend ist das wirklich noch nicht möglich mit i915,
    Ich kenne KVM und XEN beide gleich wenig, bin nur gerade von dem GPU-Passthrough in KVM fasziniert.


    Viele Grüße
    hepi

  • Ich hätte zwar lieber die Nvidia Karte unter Ubuntu und den Intel IGP unter Windows


    Hallo nochmal SED: Du kannst ja sehr wohl eine virtuelle Linux-Maschine anlegen und diese mit der Nvidia-Karte verkuppeln.
    Auf eine weitere virtuelle Maschine mit Windows kannst Du dann per Terminal Server Client von der Linux-Maschine aus zugreifen.
    Und die interne GPU bleibt brach liegen, wenn der Host keinen aktiven X-Server hat, verbraucht die interne GPU wahrscheinlich auf weniger Strom.
    Natürlich kann man das auch einfacher haben, indem man Linux+Nvidia vom Host nutzen lässt.


    Übrigens soll es wohl auch nicht unmöglich sein, qemu mit apfelartigem zu nutzen, das wäre evtl. sogar eine Alternative für Hackintosh-Fans, wenn das mit GPU-Passthrough dort auch so gut funktioniert wie unter Windows.


    EDIT: Möglicherweise komme ich auch ohne gepatchten Kernel aus. Das nächste Mal, wenn ich Zeit für diese Experimente finde, probiere ich das hier aus: http://vfio.blogspot.de/2014/0…signment-without-vga.html


    Viele Grüße
    hepi