Présentation de Qemu et VirtualBox

Qemu tient son nom de la contraction de Quick EMUlator (émulateur rapide). C'est une machine virtuelle assez versatile qui sait faire tourner de nombreux systèmes invités (ceux qui seront virtualisés) sur de nombreux types de systèmes hôtes. Son autre avantage est qu'il est entièrement en licence libre GPL, on peut donc l'utiliser, le copier ou le distribuer sans restriction. D'ailleurs Qemu fait partie de Debian depuis un certain temps, c'est en général bon signe. Par contre, comme ne l'indique pas son nom, il n'est pas si rapide que ça sans l'accélération complète, laquelle est un peu capricieuse dans la version 0.8.2 de Debian Etch. Autre inconvénient pour ceux qui sont habitués aux belles interfaces : l'interface qemu-launcher, bien qu'exhaustive et fonctionnelle, n'est pas très ergonomique.

VirtualBox est une machine virtuelle très conviviale que certains disent plus rapide que le leader en la matière, VMWare. En pratique le ralentissement du système hôte lié à la virtualisation est en effet à peine perceptible. Munie d'une interface graphique facile à prendre en main, c'est donc un outil très séduisant. Le seul hic est qu'il n'est passé sous licence libre GPL que récemment, donc d'une part on ne trouve pas forcément de paquets compilés pour son Linux et d'autre part, certaines extensions de VirtualBox sont restées avec des licences plus contraignantes (= non libres). À la maison c'est parfait, dans un cadre professionnel, il faudra peut-être songer à un contrat avec Innotek, l'éditeur de VirtualBox.

Signalons pour ceux que le sujet intéresse qu'il existe de nombreuses autres machines virtuelles comme Xen, Bochs ou encore KVM. On trouvera sur la page Comparison of virtual machines une longue liste de machines virtuelles, tous systèmes confondus. Si seul le système hôte Linux vous intéresse (ce qui paraîtrait normal ;-) ), la page TechComparison du site virt.kernelnewbies.org liste celles qui tournent dans Linux avec divers critères d'appréciation comme la vitesse d'exécution par exemple.

La pratique

C'est extrêmement simple : une machine virtuelle fonctionne comme une machine réelle ! On met le CD d'installation du système dedans, on l'allume, on lance d'installation et quelques dizaines de minutes plus tard c'est réglé, le système invité tourne dans une petite fenêtre ! La principale différence est qu'il faut lui créer un fichier image qui va contenir les données du disque dur virtuel. Il faut pour cela définir sa taille sans se limiter inutilement car nos deux candidats gèrent des fichiers images dont la taille réelle dépend de ce qui est effectivement écrit sur le disque et non de sa taille annoncée. C'est un des avantages par rapport aux installations réelles de systèmes multi-boot : une machine virtuelle prend moins de place sur le disque dur, on peut donc en avoir plus. Par ailleurs il n'y a plus à gérer les partitions physiques occupées par chacune d'elles, c'est donc nettement plus simple.

Une fois le système installé, on peut sauvegarder un état complet de la machine (snapshot) pour y revenir plus tard, ce qui est notamment pratique lorsqu'on souhaite tester régulièrement l'installation de logiciels ou lorsqu'on à affaire à un système qui se dégrade tout seul dans le temps (suivez mon regard...). On peut en effet alors repartir à tout moment du disque dur tel qu'enregistré à un moment donné. Il est aussi possible de suspendre l'exécution et d'enregistrer la machine dans cet état, elle redémarre ainsi bien plus vite. Enfin pour compléter les avantages des machines virtuelles et donc stimuler les sceptiques, il faut ajouter que les machines virtuelles apportent aussi en matière de sécurité, d'optimisation de parc de serveurs, de déploiement et de test.

Qemu

C'est un paquet standard des distributions Debian et dérivées. On l'installe donc classiquement avec la commande :

$ sudo apt-get install qemu

C'est une bonne idée d'installer aussi l'interface graphique et le module du noyau kqemu qui permet d'accélérer l'émulation :

$ sudo apt-get install qemuctl qemu-launcher kqemu-modules-2.6-686

On adaptera le nom du module au noyau Linux utilisé sur sa machine, 2.6-686 sur la mienne (cf. résultat de la commande uname -r). Pour utiliser l'accélération, il faudra alors charger le module :

$ sudo modprobe kqemu

Pour éviter d'avoir à faire cela à chaque lancement de Qemu, on peut charger le module au démarrage du système en ajoutant son nom au fichier /etc/modules en étant root :

# echo kqemu >> /etc/modules

On peut enfin créer notre première machine virtuelle. Là vous avez le choix entre l'interface graphique qemu-launcher et le mode ligne de commande. Comme il est bien plus facile d'écrire les lignes de commande dans un billet, nous opterons pour cette deuxième solution sachant que l'interface donne accès à toutes les options employées[1]. Tout d'abord il lui faut un disque dur, on peut lui donner 10 Go dans le fichier my-virt-syst.qcow par exemple :

$ qemu-img create -f qcow my-virt-syst.qcow 10G

Au premier démarrage, il faudra aussi fournir un fichier image du CD d'installation du système. Si vous ne l'avez pas déjà sur votre disque dur, vous pouvez le créer à partir du CD par cette commande :

$ dd if=/dev/cdrom of=installcd.iso

Il faudra éventuellement adapter /dev/cdrom à votre configuration si vous avez plusieurs lecteurs de CD. Il n'y a plus qu'à démarrer la machine sur cette image en spécifiant éventuellement la taille de mémoire RAM réservée à la machine virtuelle[2] :

$ qemu -kernel-kqemu -hda my-virt-syst.qcow -cdrom installcd.iso -boot d -m 256

L'option -kernel-kqemu permet d'obtenir le mode de virtualisation le plus rapide (« full virtualization mode ») mais n'est disponible que pour les systèmes invités 32 bits. Il est aussi recommandé de ne pas l'activer à l'installation de Windows®. Cela dit ça ne fonctionne pas non plus chez moi avec Debian Etch ou Lenny[3] sur la version 0.8.2 de Qemu proposée dans Debian Etch, ce qui est pour le moins étrange.

Une fois le système installé, on peut démarrer la machine sans le CD de cette manière :

$ qemu -kernel-kqemu -hda my-virt-syst.qcow -m 256

Dans le cas de Windows® XP, il a fallu que je désactive le réseau et que je formate en FAT32 pour que Qemu arrive au bout de de l'installation :

$ qemu -hda my-virt-syst.qcow -cdrom installcd.iso -boot d -m 256 -net none -localtime

L'option -localtime est recommandée pour les systèmes Windows® qui ne gèrent pas l'horloge de la machine en heure UTC (temps universel) au moins jusqu'à XP. On a alors un Windows® enfermé dans sa petite fenêtre comme le montre cette capture d'écran :

Windows® in Qemu

Windows® mis en boîte par Qemu ! (voir en grand)

NB: lisez les mérites dont se vante Windows® pendant l'installation, ça fait sourire ! ;-)

VirtualBox

Cette fois l'installation est un peu plus longue car il faudra compiler le module du noyau permettant d'exécuter les systèmes invités avec une très bonne performance. En plus les paquets VirtualBox ne sont pas dans Debian Etch car son code a été libéré peu avant sa publication. Il faut donc aller les chercher dans le dépôt Debian Backports qui propose quelques paquets de la prochaine version stable de Debian (Lenny) adaptés à la version actuelle (Etch). Comme expliqué dans le billet Dépôts supplémentaires pour Debian Etch, il faut pour cela éditer le fichier /etc/apt/sources/list :

$ sudo nano /etc/apt/sources/list
<ajouter les lignes suivantes>
# backports Debian Etch
deb http://www.backports.org/debian etch-backports main contrib non-free

Il faudra aussi ajouter la clef PGP du dépôt afin de valider l'authenticité des paquets téléchargés, par exemple avec la commande :

$ sudo apt-get install debian-backports-keyring

On peut maintenant mettre à jour la liste des paquets et installer ceux de VirtualBox :

$ sudo apt-get update
$ sudo apt-get install virtualbox-ose virtualbox-ose-source

La compilation du module est relativement simple avec le module-assistant. Comme il s'agit d'un outil graphique en mode console, une petite vidéo vaut mieux que de longs discours. En gros il faut suivre les étapes dans l'ordre où elle apparaissent ! On lance le module-assistant dans la console en tant que root après installation :

$ sudo apt-get install module-assistant
$ sudo module-assistant

Si vous ne voyez pas de vidéo ici, c'est que vous n'avez pas de lecteur Flash installé. Rendez-vous alors sur http://www.adobe.com/shockwave/download/download.cgi?P1_Prod_Version=ShockwaveFlash

Compilation facile du module grâce au module-assistant (voir en format OGG)

Le module-assistant se charge de tout : récupération des paquets nécessaires à la compilation, compilation du module et installation. À nouveau le module ne sera pas chargé par défaut, on le charge donc avec la commande suivante :

$ sudo modprobe vboxdrv

On pourra bien sûr inscrire son petit nom dans le fichier /etc/modules pour éviter d'avoir cela à faire après chaque démarrage de sa machine. Il reste encore un détail à régler : seuls les utilisateurs appartenant au groupe vboxusers ont le droit de lancer des machines virtuelles. Il faut donc vous y ajouter :

$ sudo adduser $(whoami) vboxusers

$(whoami) est remplacé par le résultat de la commande whoami qui donne votre nom d'utilisateur. Il ne reste alors plus qu'à lancer VirtualBox et se laisser guider par l'interface pour créer votre première machine virtuelle :

$ VirtualBox

On ne parlera pas plus de l'utilisation de VirtualBox dont l'interface est intuitive, le principe étant évidemment le même que pour Qemu. Celle-ci permet aussi d'accéder facilement à la suspension d'exécution d'une machine virtuelle ou encore à la réalisation de snapshots. Voilà qui devrait occuper votre bande passante utilement en téléchargeant des DVD de Linux, BSD, etc., pour les tester !

Et le réseau ?

Voilà un problème important : y a-t-il Internet dans les machines virtuelles ? Oui ! Par défaut les outils de virtualisation créent un réseau virtuel avec un serveur DHCP. Ainsi les machines virtuelles peuvent configurer automatiquement leur réseau au démarrage. L'outil de virtualisation va router le trafic de la machine virtuelle vers le réseau extérieur, selon un système de transposition d'adresses appelé NAT. Par contre la machine virtuelle est invisible depuis l'extérieur, exactement comme lorsque votre vraie machine est cachée derrière le routeur de votre box ADSL.

Aussi si vous souhaitez tester un serveur web par exemple dans une machine virtuelle, il est possible de transposer un port de la machine réelle vers un port de la machine virtuelle. Ce port sera donc visible aussi de l'extérieur si vous n'activez pas de filtrage par le pare-feu. Enfin signalons qu'il existe d'autres modes de gestion du réseau virtuel plus complexes notamment ceux basés sur des ponts ethernet (« ethernet bridge ») qui simulent un switch. Bref il y a largement de quoi s'occuper !

Notes

[1] l'autre avantage de l'interface est qu'on peut sauvegarder des configurations ce qui évite d'avoir à retrouver la ligne de commande qui lance une machine

[2] cette taille étant effectivement prise sur la mémoire de la machine hôte, il faudra rester raisonnable pour que votre vraie machine puisse continuer à tourner correctement

[3] « kernel panic! » dans la machine virtuelle