À l'heure actuelle, il existe deux grandes approches de la virtualisation.
Une première méthode, appelée paravirtualisation, suppose que le noyau du système d'exploitation invité soit légèrement modifié pour être exécuté sous forme virtualisée. L'objectif de cette technique est d'offrir un accès quasi identique aux ressources matérielles (mémoire et entrées/sorties) entre système hôte et système invité. Si cet objectif est atteint, les performances du système virtualisé sont vraiment très proches de celles du matériel sur lequel il est exécuté. Le principal obstacle au développement ce cette technique réside justement dans la modification du noyau du système invité. Si le système à virtualiser ne dispose pas de fonctions dédiées à la paravirtualisation dans son noyau, cette technique est inutilisable et la seule solution de virtualisation consiste à utiliser une émulation complète du matériel.
La seconde méthode, appelée virtualisation complète, permet d'exécuter le système d'exploitation invité de manière native sans modification. Avec cette technique, la virtualisation n'a aucun impact sur l'exécution du noyau du système virtualisé. En revanche, la virtualisation complète sacrifie les performances au prix de la compatibilité. En effet, il est plus difficile d'obtenir de bonnes performances lorsque le système invité ne participe pas au processus de virtualisation et doit traverser une ou plusieurs couches d'émulation avant d'accéder aux ressources matérielles.
Côté matériel, les développements récents sur les processeurs ont tendance à diminuer les écarts de performances entre paravirtualisation et virtualisation complète. Qu'il s'agisse d'Intel™ (VT : Intel® Virtualization Technology) ou d'AMD™ (AMD-V : Industry Leading Virtualization Platform Efficiency) les derniers processeurs disposent de fonctions matérielles pour la virtualisation.
Avec le noyau Linux, l'objectif de la solution Kernel Based Virtual Machine ou KVM est d'ajouter des capacités de virtualisation à un noyau standard. Il est ainsi possible de tirer parti de toutes les fonctions de réglage fin déjà intégrées au noyau et de bénéficier des nouveaux avantages apportés par les environnements virtualisés.
Avec le modèle KVM, chaque machine virtuelle est un processus standard du noyau Linux géré par l'ordonnanceur (scheduler). Un processus normal de système GNU/Linux peut être exécuté selon deux modes : noyau (kernelspace) ou utilisateur (userspace). Le modèle KVM ajoute un troisième mode : le mode invité qui possède ses propres modes noyau et utilisateur.
Le modèle de virtualisation KVM comprend deux composants.
-
Un pilote de périphérique pour gérer le matériel virtualisé. Les fonctions de ce pilote sont disponibles via le fichier spécial d'interface de type caractère
/dev/kvm.Cette partie noyau (kernelspace) de la solution est présentée à la Section 4.2, « Sélection des options du noyau Linux ».
-
Un logiciel utilisateur pour émuler le matériel d'un PC. Cette partie utilisateur (userspace) est une version légèrement modifiée des outils QEMU. Elle est présentée plus en détails à la Section 6.1, « Outils nécessaires avec KVM ».
Côté paravirtualisation, ce sont les fonctions virtio publiées dans la version 2.6.25 du noyau Linux qui permettent d'utiliser des canaux de communication dédiés entre instances de machines virtuelles et système hôte. Depuis la sortie de la version stable baptisée Lenny de la distribution Debian GNU/Linux, ces fonctions sont disponibles dans les paquets de noyau. Aucune manipulation n'est donc nécessaire pour bénéficier de la paravirtualisation avec une instance de système Debian GNU/Linux.
De plus, ces bibliothèques sont utilisables indifféremment avec un système hôte dont le processeur possède des extensions matérielles exploitées avec l'application utilisateur KVM ou avec un système hôte qui n'en possède pas et sur lequel on exploite l'application utilisateur QEMU.
Pendant longtemps, j'ai utilisé les outils VMware™. Cette solution, séduisante au premier abord, pose un certain nombre de problèmes dans le temps. Tout d'abord, ces outils propriétaires sont «désynchronisés» par rapport aux développements du noyau Linux. Régulièrement, je me suis retrouvé dans l'incapacité d'utiliser les instances de machines virtuelles pendant une ou deux semaines. Il est nécessaire de repasser par des compilations après application de correctifs (patches) intermédiaires. Ensuite, les solutions libres et synchrones avec les évolutions de l'ensemble de la chaîne GNU/Linux se sont développées et ont gagné en maturité.
Même si ce type de choix est toujours discutable, j'ai jeté mon dévolu sur le couple QEMU/KVM.
- KVM, Kernel-based Virtual Machine
-
Kernel Based Virtual Machine est devenue rapidement la solution de virtualisation de référence pour Linux. Elle est basée sur les architectures Intel™ baptisées Intel VT™ ou les architectures AMD™ baptisées AMD-V™. Ces deux familles de processeurs possèdent les extensions matérielles de virtualisation. Un module du noyau Linux fournit le cœur de virtualisation et un module spécifique dépendant du processeur (kvm-intel.ko ou kvm-amd.ko) active les fonctions matérielles.
- QEMU
-
QEMU open source machine emulator est un émulateur machine générique. Il peut exécuter des instances de systèmes d'exploitation (OSes) et des programmes faits pour une architecture processeur particulière (carte mère ARM par exemple) sur une machine hôte d'architecture différente (votre propre PC par exemple). En utilisant la traduction dynamique, QEMU donne de bonnes performances.
QEMU est la solution de virtualisation à utiliser si le processeur de système hôte ne possède pas d'extension matérielle spécifique à la virtualisation.
Les développements de ces deux outils distincts progressent en parallèle et ils utilisent le même jeu d'options de configuration.
La présentation de ces 2 outils complémentaires introduit la
distinction entre les processeurs possédant les extensions de
virtualisation ou non. Pour identifier les caractéristiques des
processeurs avec un système hôte GNU/Linux, on utilise les
informations fournies dans l'arborescence /proc. Si le seul système d'exploitation installé
sur la machine hôte est de type Windows, il est toujours possible
de lancer la machine en utilisant un live
CD de type KNOPPIX pour
effectuer la même opération.
Suivant le résultat de la commande suivante, on sait si le processeur peut utiliser la solution KVM ou non.
$ egrep '(vmx|svm)' /proc/cpuinfo
Si la commande ne donne aucun résultat, le processeur ne possède pas d'extension de virtualisation et seule la solution QEMU est utilisable.
Si le résultat donne une ou plusieurs lignes (suivant le nombre
de cœurs du processeur) débutant par flags, la solution KVM est utilisable avec les outils
QEMU.