{{tag> Virtualisation qemu}}
----
====== VFIO PASSTHROUGHT ======
Le VFIO ((Virtual Function I/O)) 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 [[Wpfr>Accelerated_processing_unit|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-pc|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 [[:utilisateurs:dexter74]] possède uniquement cette marque
=== Prise en Charge de IOMMU===
Saisissez dans un [[:terminal]] la [[:commande_bash|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_shell|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_shell|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 ====
- Connaitre la marque de son processeur:
lscpu | grep name
- [[:tutoriel:comment_modifier_un_fichier|É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
- 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=
#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) =====
[[http://pastebin.com/1uxiBfx6|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: [[:utilisateurs:dexter74]] //