Contenu | Rechercher | Menus

VFIO PASSTHROUGHT

Le VFIO 1) PASSTHROUGH consiste à décharger le pilote d'un matériel (Carte graphique , usb , souris …) pour ensuite l'assigner à une machine virtuelle par exemple.
Cette technique demande des pré-requis, et nécessite du matériel plus ou moins facile à réaliser. FIXME mettre en place ou il faut le fabriquer?

FIXME: Intérêt concret?

Pré-Requis

  • Avoir activé la Fonction IOMMU du Bios. (Activer le 64 bits si vous avez dans le bios)
  • Avoir activé la Prise en compte du IOMMU par linux.
  • Le processeur doit prendre en charge la virtualisation.
  • Avoir deux Carte-graphiques ou 1 Apu et une Carte-graphique
  • Avoir 2 Entrées vidéo sur l'écran (1 pour le linux (host) et 1 pour la Machine virtuelle (Guest)
  • Connaitre son matériel . (Référence des 2 GPU serait bien par exemple)

Obtentions des Informations Matériels

Il existe 2 Types d'adresse :

  • L'adresse de l'emplacement du matériel sur la carte-mère.
  • L'adresse VendorID:DeviceID ou plus souvent appelée vendeur:périphérique . Celle-ci est composée de deux parties séparées par deux points :

Étape 1: Vérification de la prise en charge de IOMMU / Virtualisation processeur

En cas d'erreur IOAPIC ou IVRS table, il y a un Fix à appliquer dans GRUB.
Cette page ne propose pour le moment que celui pour les processeurs AMD.
En effet, au moment de l'écriture de cette page, son rédacteur dexter74 possède uniquement cette marque

Prise en Charge de IOMMU

Saisissez dans un terminal la commande suivante:

dmesg | grep "AMD-Vi\|Intel VT-d" 

Vous devriez obtenir

AMD-Vi: Found IOMMU at 0000:00:00.2 cap 0x40 

Qui indique que le module IOMMU a bien été trouvé

AMD-Vi: Interrupt remapping enabled

L'interruption de l'assignement du matériel est activée (Enable), sans ce paramètre on ne pourra pas faire le VFIO.

Prise en Charge de la Virtualisation

Saisissez dans un terminal la commande suivante:

lscpu | grep "Virtualisation" 

Devrait répondre

Virtualisation :      AMD-V

Tous les Pré-Requis sont donc bons.

Étape 2: Obtentions des informations

Vérifier que les cartes graphiques soient installées dans le bon ordre sur la carte-mère.

  • Port PCI Express 1: Carte graphique réservée au système d'exploitation Linux. (HOST)
  • Port PCI Express 2: Carte graphique pour le système d'exploitation invité . (GUEST / Windows)

Lister tout, en saisissant dans un terminal la commande suivante:

lspci -nnv | grep "VGA\|Audio\|Kernel driver in use: snd_hda_intel\|Kernel driver in use: nouveau\|Kernel driver in use: nouveaufb\|Kernel driver in use: radeon"

Nvidia inclus: FIXME: Autant ne proposer que cette ligne, non?

lspci -nnv | grep "VGA\|Audio\|Kernel driver in use: snd_hda_intel\|Kernel driver in use: nouveau\|Kernel driver in use: nvidia\|Kernel driver in use: nouveaufb\|Kernel driver in use: radeon"

:!: La Sortie HDMI à une seconde adresse VendorID:DeviceID :!:

Slots Type Désignation VendorID:DeviceID Kernel Driver Notes
00:14.2 Audio device AMD/ATI Intel HDA 1002:4383 snd_hda_intel Carte-mère
01:00.0 VGA (GPU) GTX-260 10de:05e2 nouveau Linux (HOTE)
02:00.0 VGA (GPU R9-270x (Video) 1002:6810 radeon VFIO (GUEST)
02:00.1 Audio HDMI1 R9-270x (HDMI) 1002:aab0 snd_hda_intel VFIO (GUEST)
02:00.1 Audio HDMI2 R9-270x (HDMI) 1043:aab0 snd_hda_intel VFIO (GUEST)

Ici la carte graphique est branchée en HDMI et donc les signaux Vidéo / Son ont été séparés.
On ne pourra pas interdire le pilote " snd_hda_intel" car il est présent sur la carte son lié à la fois à la carte-mère et à la sortie son inclus dans le HDMI. (Sortie HDMI)

Étape 3: Activation des Modules

  1. Connaitre la marque de son processeur:
    lscpu | grep name
  2. Éditer avec les droits d'administration le fichier /etc/modules pour y supprimer le module kvm_XXX qui ne correspond pas à votre processeur.
    pci_stub
    vfio
    vfio_iommu_type1
    vfio_pci
    kvm
    kvm_amd 
    kvm_intel  <-- effacer cette ligne par exemple si vous avez un processeur AMD
  3. Mettre à jour le chargement des modules:
    sudo update-initramfs -u 

Étape 4: Redémarrage et vérification

Après avoir redémarrer votre machine, vérifier la bonne mise en place du vfio en saisissant dans un terminal:

lspci -v | grep "VGA\|Audio\|Kernel driver in use: snd_hda_intel\|Kernel driver in use: nouveau\|Kernel driver in use: nouveaufb\|Kernel driver in use: radeon\|Kernel driver in use: vfio-pci"

Vous devriez obtenir un tableau proche de:

Slots Type Désignation VendorID:DeviceID Kernel Driver Notes
00:14.2 Audio device AMD/ATI Intel HDA 1002:4383 snd_hda_intel Carte-mère
01:00.0 VGA (GPU) GTX-260 10de:05e2 nouveau Linux (HOTE)
02:00.0 VGA (GPU R9-270x (Video) 1002:6810 vfio-pci VFIO (GUEST)
02:00.1 Audio HDMI1 R9-270x (HDMI) 1002:aab0 vfio-pci VFIO (GUEST)
02:00.1 Audio HDMI2 R9-270x (HDMI) 1043:aab0 snd_hda_intel VFIO (GUEST)

Ici on peut voir que le "Kernel Driver" est "vfio-pci".

:!: Ignorer le "Kernel Modules :!:

VFIO

Slots Type Désignation VendorID:DeviceID Kernel Driver Notes
00:14.2 Audio device AMD/ATI Intel HDA 1002:4383 snd_hda_intel Carte-mère
01:00.0 VGA (GPU) GTX-260 10de:05e2 nouveau Linux (HOTE)
02:00.0 VGA (GPU R9-270x (Video) 1002:6810 vfio-pci VFIO (GUEST)
02:00.1 Audio HDMI1 R9-270x (HDMI) 1002:aab0 vfio-pci VFIO (GUEST)
02:00.1 Audio HDMI2 R9-270x (HDMI) 1043:aab0 Encoursderedaction VFIO (GUEST)

FIXME Mise en forme

#################### /etc/modprobe.d/vfio.conf ####################

 Exemple 
options vfio-pci ids=1002:6810,1002:aab0 ,1043:aab0
  #vfio-pci ids=<ADRESSE VendorID:DeviceID><Virgule><ADRESSE VendorID:DeviceID> 
  #Aucune Guillemet 
  #Exemple: 1002:6810 (R9-270x - GPU ) , 1002:aab0 (R9-270x - HDMI1) , 1043:aab0 (R9-270x - HDMI2)
  options vfio-pci ids=1002:6810,1002:aab0,1043:aab0

#################### /etc/vfio-pci.cfg ####################

Exemple
 DEVICES="0000:02:00.0 0000:02:00.1"
#Attention au Guillemet (Début et fin de toutes les adresse)
#Chaque début d'adresse commence par __**0000:**__ (Attention au : après les 0000)
#Un espace entre chaque adresse (sauf la première collé à la guillemet)
 

FIX IOMMU

AMD

dmesg | grep AMD-Vi
[0.251399] [Firmware Bug]: AMD-Vi: IOAPIC[9] not in IVRS table          <= SouthBridge Inconnus (Erreur 9) \\
[0.251403] [Firmware Bug]: AMD-Vi: IOAPIC[10] not in IVRS table         <= Northbridge Inconnus (Erreur 10) \\

L'erreur 9 correspond au SMBus et l'erreur 10 au IOMMU.

lspci | grep "SMBus\|IOMMU"
Slot Type Désignation Code Erreur Base Erreur Slot
00:00.2 IOMMU Advanced Micro Devices, Inc. [AMD/ATI] RD990 I/O Memory Management Unit 10 ivrs_ioapic [10]= 00:00.2
00:14.0 SMBus Advanced Micro Devices, Inc. [AMD/ATI] SBx00 SMBus Controller (rev 42) 9 ivrs_ioapic [9]= 00:14.0
ivrs_ioapic[9]=00:14.0 ivrs_ioapic[10]=00:00.2

Éditer /etc/default/grub (Modifier la ligne selon votre cas) pour remplacer la ligne

GRUB_CMDLINE_LINUX_DEFAULT="quiet splash" 

par

GRUB_CMDLINE_LINUX_DEFAULT="quiet splash ivrs_ioapic[9]=00:14.0 ivrs_ioapic[10]=00:00.2"

en adaptant selon le résultat obtenu précédemment

Ensuite faire un :

update-grub

Redémarrer

Intel

FIXME

Vérification Finale

dmesg | grep "Found IOMMU\|remapping\|vfio"
[    1.597597] AMD-Vi: Found IOMMU at 0000:00:00.2 cap 0x40
[    1.597598] AMD-Vi: Interrupt remapping enabled   
[    1.597712] AMD-Vi: Lazy IO/TLB flushing enabled

FIXME Manque quelques infos. En cours

Script VFIO avec Qemu (Samba & Synergy)

Script qemu (Samba / Synergy)

Fix Synergy: (Bouton Suivant / Précédent / touch alt+gr)

Éditer le fichier synergy.conf FIXME Chemin exact

  • Dans la section "screens" de la machine virtuelle ajouter en bas.
    altgr = alt
  • Dans la section "options" de la machine virtuelle ajouter en bas.
    mousebutton(6) = keystroke(WWWBack)
    mousebutton(7) = keystroke(WWWForward) 

Contributeurs: dexter74

1) Virtual Function I/O


Le contenu de ce wiki est sous licence : CC BY-SA v3.0