Citrix XenServer - PCI passthrough

Page 1 / 2

Le serveur de virtualisation XenServer de Citrix permet de passer un périphérique PCI à une machine virtuelle via une fonction qui s'appelle "PCI passthrough".
Cette fonctionnalité est présente dans le projet Xen dont le site officiel est "xenproject.org" et dont le wiki (la documentation) se trouve sur "wiki.xenproject.org" et "wiki.xen.org".
Vous trouverez donc toutes les informations nécessaires, sur le Wiki du projet Xen.

ATTENTION : bien que le PCI passthrough soit possible sous Citrix XenServer, il faut savoir que cette technique n'est pas officiellement supportée par Citrix. Ce qui veut dire que si vous souhaitez obtenir de l'aide de la part de Citrix (si vous avez payé pour obtenir leur support), vous devrez annuler vos modifications PCI passthrough avant de les contacter.

  1. Présentation
  2. Configuration requise
  3. Configuration utilisée dans ce tutoriel
  4. Compilation du noyau linux 3.4.9 pour Debian x64
  5. Passage du contrôleur USB 2 du serveur à la machine virtuelle Debian

1. Présentation

Pourquoi utiliser cette fonctionnalité ?

Pour utiliser des périphériques physiques branchés sur le serveur (clé USB, cartes PCI, ...).
Ainsi, la machine reste isolée du système (grâce à la virtualisation de la machine), mais elle aura directement accès au périphérique PCI passé à cette machine virtuelle. Si on réfléchit jusqu'au bout, on se rend compte que la machine virtuelle aura directement accès au périphérique PCI concerné et donc au matériel du serveur. Ce qui pose un problème de sécurité, car cette machine virtuelle aura un accès direct à la mémoire (DMA).

Notez que le passage d'une carte graphique à une machine virtuelle ne peut pas se faire via le PCI passthrough.
En effet, pour passer une carte graphique, vous devrez utiliser le VGA passthrough comme expliqué dans notre tutoriel : Citrix XenServer - VGA passthrough

Comment corriger cette faille de sécurité ?

C'est très simple, il suffit d'activer l'IOMMU (ou VT-D chez Intel) dans le BIOS de votre carte mère. Cette fonctionnalité permet de "remaper" les accès au matériel et à la mémoire pour limiter les accès au périphérique associé à la machine virtuelle.
Note : Dans le tutoriel, vous verrez que le contrôleur USB 2.0 physique aura l'ID "02:03.0" et dans la machine virtuelle, cet ID sera "00:00.0". IOMMU fera l'intermédiaire entre les 2.

Plain Text

Serveur physique           Debian VM
02:03.0              <=>   00:00.0

En résumé, la machine virtuelle pourra utiliser le périphérique PCI, mais elle n'aura pas accès au reste du matériel du serveur.
Note : IOMMU (Input–output memory management unit) s'occupe des entrées / sorties et MMU (Memory management unit) s'occupe des accès à la mémoire.

2. Configuration requise

IOMMU ou VT-d est obligatoire pour utiliser le "PCI passthrough" ?

Oui et non. Mais dans les 2 cas, il est recommandé d'activer cette fonction dans le BIOS de la carte mère du serveur pour bloquer les attaques par DMA (accès directs à la mémore).

  • IOMMU est facultatif, mais recommandé pour les machines virtuelles paravirtualisées (PV guests)
  • IOMMU est obligatoire pour les machines virtuelles de type HVM (hardware virtual machine). HVM est identique à la technologie "Hardware-assisted virtualization".
  • IOMMU est obligatoire pour le VGA passthrough. Pour utiliser le VGA passthrough, référez-vous à notre tutoriel : Citrix XenServer - VGA passthrough

A titre d'exemples : avec XenServer, Debian est paravirtualisé (PV guest) et Windows est une machine virtuelle de type "HVM".

IOMMU ou IOMMU mode (64 MB / Disabled) ?

IOMMU correspond à IOMMU.
Alors que IOMMU mode permet de rediriger les entrées/sorties 32 Bits vers des entrées/sorties 64 Bits.
Si le serveur et la machine virtuelle à laquelle vous voulez passer un périphérique PCI sont tous les 2 en 64 Bits, IOMMU mode est inutile et peut être désactivé (Disabled).
De plus, IOMMU mode prend 64 MB de RAM si il est activé.

Quelle version de Xen faut-il utiliser ?

Comme indiqué sur le site de Xen, PCI passthrough requiert aussi :

  • l'hyperviseur Xen 3.0 ou supérieur. Dans notre cas, nous utiliserons la version 6.5 de XenServer.
  • la machine virtuelle Dom0 de Xen doit contenir pilote "pciback".

Dans le cas d'une machine virtuelle paravirtualisée, elle doit posséder le pilote "Xen PCI frontend driver".

La configuration requise complète se trouve sur le wiki de Xen.

3. Configuration utilisée dans ce tutoriel

Dans ce tutoriel, nous allons utiliser le serveur de virtualisation "XenServer 6.5.0".
Note : les mises à jour ne sont pas installées, mais il est évidemment recommandé de les installer en production.

Le client "XenCenter 6.5".

Et une machine virtuelle Debian 7.0 en 64 Bits que nous venons d'installer.

Pour commencer par quelque chose de simple, nous allons utiliser le PCI passthrough pour brancher une clé USB sur une machine virtuelle Debian.

4. Compilation du noyau linux 3.4.9 pour Debian x64

Comme indiqué précédemment, Debian sera paravirtualisé (PV guest) par XenServer, donc "PCI passthought" requiert que Debian supporte le pilote "Xen PCI frontend driver".
Et comme indiqué sur le wiki du projet Xen, certains noyaux linux (kernels) posent problèmes avec le "passage" de contrôleurs USB à une machine virtuelle linux.
Donc, ils conseillent les noyaux 3.4.9 et 3.3.8. Et déconseillent les noyaux 3.5 and 3.5.2.

Dans ce tutoriel, nous allons télécharger, compiler et installer le noyau 3.4.9 de linux comme expliqué sur le wiki du projet Xen (voir le lien cité précédemment).

Pour commencer, démarrez la machine virtuelle "Debian 64 Bits" et connectez-vous en root dans la console de cette machine.

Créez un dossier "src/linux" dans votre répertoire personnel.

Bash

mkdir -p ~/src/linux
cd ~/src/linux 

Installez les paquets nécessaires à la suite du tutoriel.

  • wget
  • tar
  • bzip2
  • build-essential
  • libncurses-dev
  • kernel-package
  • fakeroot

Bash

aptitude install wget tar bzip2 build-essential libncurses-dev kernel-package fakeroot 

Pour accélérer la vitesse compilation du noyau, tapez ceci :

Bash

echo "CONCURRENCY_LEVEL=8" >> /etc/kernel-pkg.conf
exit

Reconnectez-vous en tant que root puis tapez ces commandes pour télécharger, décompresser et configurer le noyau.

Bash

wget http://www.kernel.org/pub/linux/kernel/v3.0/linux-3.4.9.tar.bz2
tar jxf linux-3.4.9.tar.bz2 && rm linux-3.4.9.tar.bz2
cd linux-3.4.9/
cp /boot/config-3.2.0-4-amd64 .config
make menuconfig 

Note : Il est possible que le fichier "config-3.2.0-4-amd64" ait un nom légèrement différent à cause de la version indiquée dans son nom.

Lorsque vous taperez la commande "make menuconfig", quelques lignes vont s'afficher en ligne de commandes puis ce menu s'affichera.
Dans ce menu, vérifiez que ces options sont activées :

  • Processor type and features -> Paravirtualized guest support -> Xen guest support
  • Bus options (PCI etc.) -> Xen PCI Frontend

Comme vous pouvez le voir, "Xen guest support" est intégré par défaut dans le noyau linux 3.4.9.

Et Xen PCI Frontend est disponible en module. Cela ne pose aucun problème.

Retournez au menu principal en appuyant plusieurs fois sur la touche "Esc" ou "Echap", puis descendez sur la ligne "Save an Alternate Configuration File" et appuyez sur Enter.
Note : il est possible que vous ayez l'option "<Save>" en bas de l'écran. Il s'agit de la même option.

Laissez le nom par défaut et appuyez sur Enter.

Puis, quittez le menu en allant sur <Exit> et en appuyant sur Enter.

Si vous êtes connecté en SSH sur la machine Debian (ce qui n'est pas notre cas), tapez la commande : screen

Ensuite, compilez le noyau linux en tapant ces commandes :
Note : Cela peut prendre plus d'une heure.

Bash

make-kpkg clean
fakeroot make-kpkg --initrd --revision=3.4.9.custom kernel_image

Une fois le noyau compilé, installez-le en tapant la commande :

Bash

cd ..
sudo dpkg -i linux-image-3.4.9_3.4.9.custom_amd64.deb

Note : Pour éviter de recompiler le noyau la prochaine fois, sauvegardez le fichier "linux-image-3.4.9_3.4.9.custom_amd64.deb" quelque part.

Une fois installé, la commande "update-grub" se lancera automatiquement. D'où les lignes "Generating grub.cfg" ainsi que les lignes qui suivent.

Pour terminer, redémarrer Debian en tapant la commande :

Bash

reboot

Reconnectez-vous en tant que root et tapez la commande :

Bash

uname -r

Si le noyau est bien installé, vous verrez la version 3.4.9 s'afficher.

Pour le moment, arrêtez la machine virtuelle et faites un snapshot de celle-ci pour pouvoir revenir en arrière en cas de problème.

Bash

shutdown -h now