web-dev-qa-db-fra.com

Passage VGA avec QEMU et KVM - Rien à l'écran

Ces derniers jours, j'ai essayé de configurer une machine virtuelle Windows avec passerelle VGA, en utilisant ce guide comme référence principale: https://www.pugetsystems.com/labs/articles/Multiheaded-NVIDIA- Jeux-utilisant-Ubuntu-14-04-KVM-585 /

Mon ordinateur utilise un processeur Intel i7-4790 avec un processeur intel HD 4600 intégré (que j’utilise comme carte principale) et un périphérique NVIDIA GTX 960 que je souhaite transmettre.

J'ai installé les pilotes NVIDIA et j'ai réussi à lier la carte nvidia au contrôleur vfio-pci sans aucun problème, après avoir désactivé les graphiques hybrides dans les paramètres nvidia.

J'ai essayé de mettre les pilotes nvidia en liste noire et d'utiliser pci-stub pour "voler" le GPU, afin d'éviter toute erreur éventuelle, mais cela n'a pas fonctionné. J'ai donc déchargé manuellement les modules de nvidia après le démarrage du système d'exploitation. script (en mode console):

#!/bin/bash
Sudo service lightdm stop
Sudo rmmod nvidia_uvm
Sudo rmmod nvidia_drm
Sudo rmmod nvidia_modeset
Sudo rmmod nvidia
Sudo service lightdm start

J'ai vérifié que cela fonctionnait en retirant le périphérique (gpu) et en vérifiant que la carte était réclamée par vfio-pci au lieu des pilotes nvidia lors de la nouvelle analyse.

Après avoir configuré tous les pilotes, j’ai démarré le VM avec ce script:

#!/bin/bash

Sudo qemu-system-x86_64 -enable-kvm -M q35 -m 4096 -cpu Host,kvm=off \
-smp 4,sockets=1,cores=4,threads=1 \
-bios /usr/share/seabios/bios.bin -vga none \
-device ioh3420,bus=pcie.0,addr=1c.0,multifunction=on,port=1,chassis=1,id=root.1 \
-device vfio-pci,Host=01:00.0,bus=root.1,addr=00.0,x-vga=on \
-device virtio-scsi-pci,id=scsi \
-drive file=/home/xanty/windows1.img,id=disk,format=raw,cache=none,if=none -device scsi-hd,drive=disk \
-drive file=/home/xanty/Descargas/windows7pro.iso,id=isocd,cache=none,if=none -device scsi-cd,drive=isocd \
-boot menu=on

exit 0

Et j’ai finalement réussi à le faire fonctionner, et lors de la vérification des informations PCI sur le moniteur qemu (image ici) , tout semble aller bien, mais le deuxième moniteur que j’ai connecté au port DVI-I de ma carte nvidia n’a 'montre rien. Le moniteur ne semble pas recevoir de signal .

J'ai besoin d'aide pour comprendre comment résoudre ce problème ou au moins trouver une alternative viable à cette méthode.

Comme information supplémentaire, j'utilise Ubuntu Studio 16.04, mon premier moniteur est un moniteur Samsung branché sur le port Intel DVI-I, et mon deuxième moniteur est un BENQ avec un port VGA et un port DVI-I, et je l'ai branché. au port DVI-I de la GTX 960 (ce modèle n’a pas de port VGA)

J'apprécie vraiment toute aide que vous pouvez fournir.

EDIT 1:

Habituellement, avant d'essayer de lancer la machine virtuelle, et après avoir supprimé les modules nvidia, je retire le périphérique et le réanalyse:

echo > 1 /sys/bus/pci/devices/0000:01:00.0/remove
echo > 1 /sys/bus/pci/devices/0000:01:00.1/remove
echo > 1 /sys/bus/pci/rescan

Si je fais cela, la machine virtuelle semble fonctionner sans problèmes majeurs, mais quand je ne le fais pas, le moniteur qemu se fige lorsque j'essaie de le démarrer, et je ne peux pas le fermer ni arrêter le processus à moins que je "tue -9" il. C'est à cause de la ligne:

-device vfio-pci,Host=01:00.0,bus=root.1,addr=00.0,x-vga=on \

Si je supprime le paramètre "x-vga = on", il fonctionne toujours bien.

EDIT 2: Après quelques tests et recherches supplémentaires sur ce problème, j’ai découvert que le pilote vfio-pci ne permettait pas au GPU de démarrer kvm.

Après avoir lancé kvm, la commande "dmesg | grep -i vfio" renvoie les nouvelles lignes suivantes:

[ 1572.975051] vfio_ecap_init: 0000:01:00.0 hiding ecap 0x1e@0x258
[ 1572.975063] vfio_ecap_init: 0000:01:00.0 hiding ecap 0x19@0x900

Il devrait y avoir une autre ligne semblable à celle-ci:

[ 3182.192258] vfio-pci 0000:01:00.0: enabling device (0000 -> 0003)

Mais ça manque.

EDIT3: Je viens de passer à Ubuntu Studio 14.04, et j'ai finalement pu faire en sorte que pci-stub récupère le gpu avant les pilotes nvidia/nouveau. Je peux lier le gpu aux pilotes vfio-pci facilement et sans incident, et la sortie après le lancement de kvm ressemble à ceci:

[  130.988082] vfio-pci 0000:01:00.0: enabling device (0000 -> 0003)
[  130.988186] vfio_ecap_init: 0000:01:00.0 hiding ecap 0x1e@0x258
[  130.988196] vfio_ecap_init: 0000:01:00.0 hiding ecap 0x19@0x900

Mais après tout cela, , le moniteur ne reçoit toujours aucun signal . J'ai vraiment besoin d'aide. Il ne me reste plus qu'à essayer de rétrograder mon noyau de 4.2.0-27-lowlatency à 4.1.x et i ' Je suis inquiet que ça va bousiller mon OS.

3
Xanty

Résolu.

Après de nombreuses recherches, j'ai remarqué 2 problèmes principaux:

1- Il y avait un problème avec les pilotes de ma carte graphique intégrée i915 et j'ai découvert que je devais soit appliquer un correctif non officiel sur mon noyau, soit installer ma machine virtuelle en mode UEFI et simuler le démarrage d'un bios. Pour cela, j'ai dû installer ovmf.

apt-get install ovmf

2- Les pilotes Windows NVIDIA détectaient que je courais Windows sur KVM et bloquaient mon GPU.

En fin de compte, après avoir installé ovmf, j’ai suivi ce tutoriel sur la configuration avec virt-manager et ovmf: http://vfio.blogspot.com.es/2015/05/vfio-gpu-how -to-series-part-4-our-first.html

Il explique également comment modifier la configuration XML de la machine pour masquer kvm à partir des pilotes nvidia.

J'ai aussi découvert une fonctionnalité amusante:

Si je sélectionne une option de démarrage vga (serveur VNC) pour émuler la machine sur une fenêtre, une fois Windows démarré, il détecte la fenêtre en tant que deuxième moniteur physique , me permettant de capturer la souris et le clavier sans avoir besoin de passer par les contrôleurs USB.

3
Xanty