Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

Les deux révisions précédentes Révision précédente
Prochaine révision
Révision précédente
vfio [Le 04/05/2016, 02:16]
dexter74 [Etape 3: Activation des Modules]
vfio [Le 12/09/2022, 09:09] (Version actuelle)
82.65.161.11 typo
Ligne 1: Ligne 1:
-====== VFIO PASSTHROUGHT ​======+{{tag> Virtualisation qemu dexter74 vfio}} 
 +---- 
 +====== ​-=[ VFIO PASSTHROUGH ]======
 + 
 +Le VFIO ((Virtual Function Input/​Output)) PASSTHROUGH consiste à décharger le pilote d’un matériel – carte graphique, USB, souris… – pour l’assigner,​ par exemple, à une machine virtuelle. 
 + 
 +Cette technique suppose des pré-requis. Elle nécessite du matériel plus ou moins facile à réaliser. FIXMEIndiquer où il faut le fabriquer ?​ 
 + 
 +L’intérêt du //​passthrough//​ est notamment de pouvoir bénéficier de l’accélération 3D d’une carte graphique sur la machine virtuelle, ou encore d’une meilleure gestion d’une souris ou d’un clavier spécifique sur cette machine virtuelle. 
 + 
 +FIXME 
 +<​note>​ 
 +Article en cours de modification. 
 +</​note>​
  
- ===== I) Informations:​===== ​ 
  
-<note help>LE VFIO Passthrought consiste à décharger le pilote d'un matériel (Carte graphique , usb , souris ...) pour ensuite l'​assigner à une machine virtuel par exemple ! \\ 
-Il existe des pré-requis , du matériel plus ou moins facile à réaliser. En cas de soucis crée un topic </​note>​ 
  
-\\  
  
-====== II) Pré-Requis:​ ====== 
  
-<​note>​- La Fonction **IOMMU** du Bios. (Activer le 64 bits si vous avez dans le bios) \\  +===== Pré-requis ​=====
-- La Prise en compte du IOMMU par linux. \\ +
-- Un processeur ayant la prise en charge la virtualisation. \\  +
-- Deux Carte-graphique ou 1 Apu + Carte-graphique à côté) \\  +
-- 2 Entrée vidéo sur l'​écran (1 pour le linux (host) et 1 pour la Machine virtuel (Guest) \\ +
-- Connaitre son matériel . (Référence des 2 GPU serai bien par exemple)</​note>​ +
-\\ +
-**Voilà pour les Pré-requis**+
  
 +  * Avoir activé la fonction **IOMMU**((Input/​Output Memory Management Unit)) du BIOS – donc au niveau du matériel. Activer le mode « 64 bits » s’il est disponible dans le BIOS.
 +  * Avoir activé la prise en compte du IOMMU par Linux – donc au niveau du logiciel (le système d’exploitation hôte ici).
 +  * Avoir activé la prise en charge de la virtualisation par le processeur – cela suppose que le processeur intègre un mode de virtualisation.
 +  * Disposer de deux cartes graphiques, ou d’une paire formée d’une [[Wpfr>​Accelerated_processing_unit|Apu]] et d’une carte graphique.
 +  * Disposer de deux entrées vidéo sur l’écran :​ une pour le système Linux hôte (//Host//) et une pour la machine virtuelle invitée (//​Guest//​).
 +  * Disposer des caractéristiques techniques de son matériel. En l’occurrence,​ connaitre la référence des deux GPU disponibles.
  
-====== III) Obtentions ​des Informations Matériels ​ ======+===== Obtention ​des informations sur le matériel ​=====
    
-<note important>​**Avant tous il existe ​2 Type d'​adresse:** \\ +Il existe ​deux types d’adresse 
-- L'adresse de l'emplacement du matériel sur la carte-mère. \\ +  * l’adresse de lemplacement du matériel sur la carte mère ; 
-- L'adresse ​VendorID**:**DeviceID ​ou plus souvent ​appeler vendeur**:**périphérique ​. Celle-ci ​es composé en deux partie séparé ​par un **:** +  * 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 « ». 
-</note>+ 
 +==== Étape 1: Vérification de la prise en charge de IOMMU Virtualisation processeur ​ ====
  
 +<note important>​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</​note>​
  
-===== Etape 1: Vérification de la prise en charge de IOMMU / Virtualisation processeur ​ ===== 
-\\ 
-<note important>​**/​!\ En cas d'​erreur IOAPIC ou  IVRS table y'à un Fix à appliquer dans GRUB. /!\**  \\ 
-**Fix AMD:** OUI trouvé par moi \\ 
-** Fix Intel**: Non Trouvé car j'ai que des processeur AMD (dexter74)</​note>​ 
-\\ 
 ===  Prise en Charge de IOMMU=== ===  Prise en Charge de IOMMU===
-<note>**dmesg | grep "​AMD-Vi\|Intel VT-d"** \\ +Saisissez dans un [[:​terminal]] la [[:​commande_bash|commande]] suivante: 
-\\ +<code bash>dmesg | grep "​AMD-Vi\|Intel VT-d" </code>
-AMD-Vi:** Found IOMMU** at 0000:​00:​00.2 cap 0x40       ​**<​= IOMMU Trouvé** \\ +
-AMD-Vi: **Interrupt remapping enabled** ​                          ​**<​= L'​Interruption de l'​attribution du matériel es Activer (Enable)** \\ +
-\\ +
-L'​interruption de l'​assignement du matériel es activé (Enable) , sans ce paramètre on pourra pas faire le VFIO.</note>+
  
 +Vous devriez obtenir
 +<​code>​AMD-Vi:​ Found IOMMU at 0000:​00:​00.2 cap 0x40 </​code>​
 +Qui indique que le module IOMMU a bien été trouvé
  
-=== Prise en Charge de la Virtualisation ===  +<​code>​AMD-Vi:​ Interrupt remapping enabled</​code>​ 
-<note>**lscpu | grep "Virtualisation"** \\ +L'​interruption de l'​assignement du matériel est activée (Enable), sans ce paramètre on ne pourra pas faire le VFIO. 
-\\ + 
-Virtualisation :      AMD-V+=== Prise en Charge de la Virtualisation === 
 +Saisissez dans un [[:​terminal]] la [[:​commande_shell|commande]] suivante: 
 +<code bash>lscpu | grep "Virtualization" ​</​code>​ 
 + 
 +Devrait répondre 
 +<​code>​Virtualization :      AMD-V</​code>​ 
 + 
 +Tous les Pré-Requis sont donc bons. 
 + 
 +==== Étape 2: Obtentions des informations ​ ==== 
 + 
 +<note important>​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)
 </​note>​ </​note>​
  
-Tous les Pré-Requis son bon.+Lister tout, en saisissant dans un [[:​terminal]] la [[:​commande_shell|commande]] suivante:
  
-===== Etape 2Obtentions des informations ​ =====+<code bash>​lspci -nnv | grep "​VGA\|Audio\|Kernel driver in usesnd_hda_intel\|Kernel driver in use: nouveau\|Kernel driver in use: nouveaufb\|Kernel driver in use: radeon"</​code>​
  
-<note important>**Vérifier que vos carte-graphiques soit installer dans le bon ordre sur la carte-mère.** ​\\ +Nvidia inclus: FIXME: Autant ne proposer que cette ligne, non? 
-**Port PCI Express 1:** Carte-graphique réserver au système d'​exploitation Linux. (**__HOST__**) ​\\ +<code bash>lspci -nnv | grep "VGA\|Audio\|Kernel driver in usesnd_hda_intel\|Kernel driver in use: nouveau\|Kernel driver in usenvidia\|Kernel driver in use: nouveaufb\|Kernel driver in use: radeon"​</code>
-**Port PCI Express 2:** Carte-graphique pour le système d'​exploitation invité . (**__GUEST__** / Windows) ​\\</note>+
  
-<note help> +:!La Sortie HDMI à une seconde adresse VendorID:DeviceID ​:!:
- ​**Lister Tout:** \\ +
-  lspci -v | grep "​VGA\|Audio\|Kernel driver in usesnd_hda_intel\|Kernel driver in usenouveau\|Kernel driver in usenouveaufb\|Kernel driver in useradeon"​ +
- </​note>​  +
-  ​+
  
 ^   ​Slots ^ ​ Type ^ Désignation  ​ ^ VendorID:​DeviceID ​    ^ Kernel Driver  ​       ^ Notes  ​  | ^   ​Slots ^ ​ Type ^ Désignation  ​ ^ VendorID:​DeviceID ​    ^ Kernel Driver  ​       ^ Notes  ​  |
Ligne 67: Ligne 79:
 |  01:00.0 | VGA (GPU) | GTX-260  ​ | 10de:​05e2 | nouveau  ​       | Linux (HOTE)  ​  | |  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.0 | VGA (GPU | R9-270x (Video)  ​ | 1002:​6810 | radeon  ​       | VFIO (GUEST) |
-|  02:00.1 | Audio device | R9-270x (HDMI)  ​ | 1002:​aab0 | snd_hda_intel | 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|
-**Ma Carte-graphique es branché en HDMI et donc le signale Vidéo/ Son on été séparer** \\ +
-On pourra pas interdire le pilote ** " ​snd_hda_intel" ** car il es présent sur la carte-son lié à la fois à la carte-mère et à la sortie son inclus dans le HDMI. (Sortie HDMI\\+
  
 +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: <​code>​
 +lscpu | grep name</​code>​
 +  - [[:​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.<​file>​pci_stub
 +vfio
 +vfio_iommu_type1
 +vfio_pci
 +kvm
 +kvm_amd
 +kvm_intel ​ <-- effacer cette ligne par exemple si vous avez un processeur AMD
 +</​file>​
 +  - Mettre à jour le chargement des modules: <​code>​sudo update-initramfs -u </​code>  ​
  
-===== Etape 3Activation des Modules ​ =====+==== Étape 4Redémarrage et vérification ​====
  
 +Après avoir redémarré votre machine, vérifiez la bonne mise en place du vfio en saisissant dans un [[:​terminal]]:​
 +<code bash>
 +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"​
 +</​code>​
 +Vous devriez obtenirun 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**"​.
  
-**#Modules**  ​\\ +:!: Ignorer le "**Kernel __Modules__** :!: 
-  ​pci_stub \\ + 
-  vfio \\ +===== VFIO ===== 
-  ​vfio_iommu_type1 ​\\ + 
-  ​vfio_pci ​\\ +^   ​Slots ^ ​ Type ^ Désignation  ​ ^ VendorID:​DeviceID ​    ^ Kernel Driver  ​       ^ Notes  ​  | 
-  kvm \+|  00:14.2 | Audio device | AMD/ATI Intel HDA | 1002:​4383 | snd_hda_intel | Carte-mère  ​  | 
-  ​kvm_amd ​ +|  01:00.0 | VGA (GPU) | GTX-260  ​ | 10de:​05e2 | nouveau  ​       | Linux (HOTE)  ​  | 
-  ​kvm_intel +|  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) | 
 + 
 +FIXMEMise en forme 
 +<note help>###################​# **/​etc/​modprobe.d/​vfio.conf** ####################​ 
 +   ​Exemple  
 +<​file>​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 
 +</​file>​ 
 +</​note>​ 
 + 
 +<note help>####################​ **/​etc/​vfio-pci.cfg** ####################​ 
 +  ​Exemple 
 + <​file>​ 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) 
 + </​file>​ 
 +</​note>​ 
 + 
 +===== FIX IOMMU ===== 
 + 
 +==== AMD ==== 
 +<code bash >dmesg | grep AMD-Vi</​code>​ 
 +<​code>​ 
 +[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) \\ 
 +</​code>​ 
 +L'​erreur 9 correspond au SMBus et l'​erreur 10 au IOMMU. 
 + 
 +<code bash>​lspci | grep "SMBus\|IOMMU"</​code>​ 
 + 
 +^ 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 ​   | 
 + 
 +<​code>​ivrs_ioapic[9]=00:​14.0 ivrs_ioapic[10]=00:​00.2</​code>​ 
 + 
 +**Éditer /​etc/​default/​grub** (Modifier la ligne selon votre cas) pour remplacer la ligne 
 +<​file>​GRUB_CMDLINE_LINUX_DEFAULT="​quiet splash"​ </​file>​ 
 +par 
 +<​file>​GRUB_CMDLINE_LINUX_DEFAULT="​quiet splash ivrs_ioapic[9]=00:​14.0 ivrs_ioapic[10]=00:​00.2"</​file>​ 
 +en adaptant selon le résultat obtenu précédemment 
 + 
 +Ensuite faire un : 
 + <​code>​update-grub</​code>​ 
 +Redémarrer 
 + 
 +==== Intel ==== 
 +FIXME
   ​   ​
 +===== Vérification Finale =====
 +<code bash>​dmesg | grep "Found IOMMU\|remapping\|vfio"</​code>​
 +<​code>​
 +[    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
 +</​code> ​   ​
 +
 +FIXMEManque quelques infos. En cours
 +
 +===== Script VFIO avec Qemu (Samba & Synergy) =====
 +
 +[[https://​pastebin.com/​1uxiBfx6|Script qemu (Samba / Synergy)]]
 +
 +Fix Synergy: (Bouton Suivant / Précédent / touch alt+gr)
 +
 +Éditer le fichier **synergy.conf** FIXMEChemin exact
 +  * Dans la section "​screens"​ de la machine virtuelle ajouter en bas.<​file>​altgr = alt</​file>​
 +  * Dans la section "​options"​ de la machine virtuelle ajouter en bas.<​file>​
 +mousebutton(6) = keystroke(WWWBack)
 +mousebutton(7) = keystroke(WWWForward) </​file>​
 +
 +----
 +//​Contributeurs:​ [[:​utilisateurs:​dexter74]] //
  • vfio.1462320962.txt.gz
  • Dernière modification: Le 04/05/2016, 02:16
  • par dexter74