{{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]] //