Notes actuelles sur le passthrough VGA

Introduction
Quand on veut jouer tout en utilisant Linux au quotidien on est généralement réduit à 4 options, chacune avec son lot de problèmes:
- Utiliser un Dual-boot avec un Windows installé en parallèle
- Faire tourner des jeux sous Linux avec Wine
- Se limiter aux jeux tournant nativement
- Jouer sous Windows et utiliser une VM Linux
L'option 1 est une des plus utilisées car des plus simples, mais pose le risque de n'utiliser plus que Windows : p
L'option 2 fonctionne de mieux en mieux et très bien depuis quelques années, mais on trouve toujours des problèmes de compatibilité, et surtout la gestion d'environnement.
Enfin on peut faire tourner énormément de jeux nativement désormais (je vous invite a faire un tour sur LGDB), mais toujours pas beaucoup de jeux très grand publics.
Reste l'option 4 que beaucoup de gens sont tentés d'utiliser car très facile et sans besoin d'une install séparée.
Ces derniers jours j'ai exploré la possibilité de faire l'inverse: faire tourner une VM de jeu sous Windows (ou un autre *nix)...
Vu que la plus part des infos qu'on peut trouver sur internet sont éparpillées et parfois un peu viellotes, je laisse ces quelques notes pour quelqu'un cherchant a réaliser une config similaire...
Passthrough VGA
Le gros problème avec les VM, c'est que les performances graphiques sont généralement médiocres (on me dit dans l'oreillette que ca se fait sous VMware assez bien quand même aujourd'hui).
Une solution un peu nébuleuse dont on entends parfois parler est de "passer" le GPU à la VM: lui donner l'accès direct, sans avoir besoin de passer par le système de virtualisation avec tous ses problèmes de compatibilités.
C'est une solution que certaines personnes ont appliquées, et on peut trouver sur Internet des installations assez impressionnantes avec des configurations et matériel assez exceptionnels (n>10 coeurs, e>6 écrans, g>3 gpus...)
Heuresement c'est quelque chose de mieux en mieux supporté, et de plus en plus facile à faire chez soi !
Si vous avez déjà tenté de faire de la redirection USB ou PCI avec Libvirt, le principe est le même -- mais le fait de le faire pour un adaptateur VGA apporte tout un lot de problèmes.
Il est important de noter que lorsqu'on procède au passthrough, cette carte est "connectée" à la machine virtuelle: il faut donc disposer d'une deuxième carte graphique, ou une puce de graphiques intégrés pour afficher le système hôté.
Compatibilité Hardware, et Hyperviseurs
Côté CPU
Aujourd'hui les extensions de virtualisation sont bien supportées côté processeur.
Quasiment tout les processeurs actuels proposent ces technos (VT-x chez intel, AMD-v pour AMD)
Dans le cas du passthrough, il faut en plus le support de la redirection des entrées sorties, aussi appelé Directed I/O.
Chez Intel par exemple cette fonction, le VT-d, est supportée sur la plus part des processeurs milieu et haut de gamme non K
Côté Carte Graphique
Les choses se corsent un peu, car le support dépends des softs utilisées et parfois d'un modèle successif à un autre.
D'après les informations que j'ai pu rassembler, on dispose aujourd'hui des options suivantes:
- Utiliser une carte ATI Radeon sous Xen, qui sont généralement supportées (à vérifier par modèle)
- Utiliser une carte professionnelle nVidia Quadro sous Xen, ce qui est/était supporté officiellement par Citrix & nVidia
- Reconfigurer en Hardware certains modèles de GeForce GTX en un équivalent Quadro pour marcher sous Xen avec un fer à souder et une petite manip'
- Utiliser une carte ATI/GeForce grand public sous KVM, ce qui semble maintenant fonctionner pour beaucoup de modèles
Mon choix se tournait au départ vers l'hyperviseur Xen, mais ma carte étant une GTX 750Ti elle n'est pas supportée -- et ce modèle n'est pas "moddable" en Quadro.
Le support du passthrough VGA sous KVM semble assez nouveau mais on peut trouver sur internet des mentions à droite à gauche suggérant que beaucoup de cartes sont compatibles.
Côté Carte Mère
C'est la que réside aujourd'hui le plus grand problème :
Si les cartes sont censées supporter ce genre de manipulations (par IOMMU) depuis quelques années, le support est très souvent incomplet ou truffé de problèmes.
Pire encore, on peut parfois se retrouver avec une carte mère avec support, mais un Chipset sans.
Encore pire, dans le cas du passthrough VGA qui est particulier, on dépends du BIOS pour certaines manip' bas niveau, et beaucoup n'exposent pas les tables nécessaires.
Avec tout ça en tête et en cherchant dans la liste de support du wiki Xen et sur des forums, je me suis tourné vers une carte Asrock basé sur un chipset Z87 (Haswell) qui semble être bien supportée.
C'est effectivement le cas, mais de nombreuses cartes et chipset semblent encore manquer de support, donc prudence s'impose...
Système hôte
Si sous Xen toutes les cartes ne sont pas supportées, ce support est assez robuste et on trouve d'amples informations sur le Wiki Xen.
Lorsqu'on se tourne vers la façade KVM, les choses sont un peu plus compliquées:
- Le support du Passthrough VGA via VFIO n'est possible que depuis la version de kernel 3.9
- Des améliorations auraient été apportées avec les version 3.12 et 3.14
- Dans tous les cas, il faut un kernel avec VFIO et le support de l'IOMMU activés ce qui n'est pas le cas dans la plus part des distributions
Histoire de ne rien arranger, il s'avère qu'il y a un bug dans le driver graphique i915 du kernel, empêchant l'utilisation d'une puce graphique intégrée intel avec une carte nVidia.
Un patch existe (voir liens tout à la fin), mais il n'a pas été accepté dans le kernel car le driver de Xorg ne supporterait pas l'arbitration VGA correctement, ce qui désactiverait DRI d'ou grosse perte de performances...
Drivers et Qemu
Une première chose à faire, que ce soit pour Xen ou KVM, il faut désactiver les drivers de l'hôte utilisant la carte en l'assignant pour le passthrough.
Xen propose leur propre interface pour cacher la carte à l'hote (voir le Wiki), Linux supporte le driver pci-stub, et plus récemment on peut simplement les assigner au système VFIO.
Ensuite, si vous avez déjà bidouillé avec des VMs vous êtes surement habitué à Libvirt, et sa front-end, virt-manager.
Pas de bol, en cherchant un peu sur leur mailing-list, on apprends qu'il n'y a pour l'instant pas de support explicite pour des chipsets apportant un bus pci-express par souci de compatibilité future avec Qemu...
Il faut donc définir sa machine virtuelle directement avec Qemu. Encore, c'est assez bien expliqué sur un tuto trainant sur le forum d'Arch (voir le lien en bas de page).
Quelques notes sur Windows
Il m'a été impossible de faire fonctionner l'installation de Windows en utilisant le passthrough VGA (ou même sa mise à jour) -- le disque de boot est alors complétement vide pour une raison pas très claire... Une fois installé cependant, plus de problèmes.
Au niveau du son, j'avais au début prévu d'utiliser du passthrough USB pour connecter un casque USB -- malheuresement celà semble planter Qemu. L'autre option étant un périphérique virtuel. Le tutoriel sur le forum arch conseille d'utiliser ich9-intel-hda, mais l'emulation usb-audio donnait un bien meilleur résultat ici.
Conclusion
S'il y a pas mal de choix à faire en amont, et le support de beaucoup de ces outils est assez récent, ca fonctionne plutôt bien une fois mis en place !
Un gros problème est l'intéraction avec la machine virtuelle: la sortie vidéo étant faite sur la carte graphique, on n'a plus de VNC pour la souris/clavier.
Il faut donc rajouter un combo clavier/souris supplémentaire et en faire un passthrough à la machine virtuelle pour la controler...
J'en ai donc profité pour tester Synergy, qui permet de contrôler plusieurs machines par réseau, et ca marche plutôt bien.
Pour revenir sur la config que j'ai testé:
- Mobo: Asrock Z87 Extreme3 avec un Xeon E3-1275v3 (IGP 4600P)
- GPU: Geforce GTX 750Ti en installant les drivers proprio côté Guest
- Kernel 3.14.2 avec le patchset Gentoo et le patch i915 du forum Archlinux
- Qemu 2.0.0 Vanilla
- Seabios 1.7.8 Vanilla
- Boot avec intel_iommu=on et pci-stub.ids=... pour inhiber les drivers
- Guests testés: Lubuntu 14.04, Windows 8 et Windows 8.1
Bonne chance dans vos essais !
Liens et ressources
- Le guide du passthrough VGA avec KVM sur le forum d'Arch (infos sur Qemu et le patch i915)
- Liste du support IOMMU des cartes mères sur le wiki Xen
- Plus d'info sur le support IOMMU sur Wikipedia
- Guide du passthrough VGA avec Xen
- Infos générales sur le passthrough PCI avec Xen
- Infos sur les adaptateurs VGA compatibles avec Xen, et comment modder les GeForce en Quadros
- Des infos en vrac sur le fameux patch du driver i915