Académique Documents
Professionnel Documents
Culture Documents
TP vodka
(Virtualization Operation Discovery on KVM Architecture)
Merci à Messieurs Luc Betry et Tovoherizo Rakotonavalona pour leur relecture attentive et
leurs observations.
Jacques Landru
Ingénieur d'Etudes - Institut Mines Télécom
IMT Lille Douai
Dept Informatique et Réseaux.
1 ) Contexte du TP
Ce TP virtualisation est bâti sur la plate-forme VIMINAL (VIrtual Model for Ip Network
Architecture Lab). L'objectif est de vous familiariser avec les éléments de base du
système de virtualisation KVM (Kernel based Virtual Machine) intégré au système
GNU/Linux.
Note : Pour les processeurs multi-coeurs, les informations sont affichées pour chacun des
coeurs.
Si l'attribut « flags » contient la sous chaîne « vmx », vous êtes en présence d'un
processeur Intel disposant des extensions HVM, si l'attribut « flags » contient la sous
chaine « svm » vous êtes en présence d'un processeur AMD disposant des extensions
HVM, sinon la machine hôte ne dispose pas de l'assistance matérielle à la virtualisation,
les performances des machines virtuelles seront alors faibles.
Afin de faciliter la détection vous pouvez filtrer l'affichage de la commande en la
redirigeant vers la commande « grep » à l'aide du « pipe unix » (caractère « | »)
• Dans le cas d'un processeur Intel
Si les extensions HVM sont présentes sur l'hôte, nous allons vérifier que le module noyau
d'accélération matérielle correspondant au processeur a bien été chargé lors de la
séquence de démarrage du système, à l'aide de la command lsmod | grep kvm.
L'affichage du nom du module (kvm_intel ou kvm_amd selon votre processeur) ainsi que
la taille qu'il occupe en mémoire, indique que le module est fonctionnel.
Si le module n'est pas présent, vous pouvez tenter de le charger manuellement à l'aide de
la commande suivante.
Sur une machine Intel, tapez la commande suivante :
L'absence de message d'erreur confirme le bon déroulement de l'opération que l'on peut
facilement vérifier en listant les modules du noyau au moyen de la commande lsmod.
Nota : Pour quitter l'affichage de la commande « man » appuyer sur la touche 'q'
Nous allons démarrer la machine virtuelle pourvue de 256 Mo de mémoire et d'un lecteur
CDrom qui pointera sur le fichier iso du liveCD. Le fichier iso du liveCD Slitaz est localisé
dans le répertoire /usr/local/share/viminal/filesystems. La commande
suivante « qemu-system-x86_64 -enable-kvm -m 256 -vga std -cdrom
/usr/local/share/viminal/filesystems/slitaz-2.0.iso -boot d»
démarre une machine virtuelle de 256 Mo de ram (paramètre -m) muni d'un écran vga
standard (-vga std) d'un lecteur de CDrom contenant le CD Slitaz-2.0 (option -cdrom).
Le démarrage (boot) de la machine se fera sur le lecteur de CD (option -boot d).
Nota : Si vous ne disposez pas des extensions HVM et que vous avez la patience d'attendre le
démarrage complet de la machine virtuelle, vous devez ajouter l'option -no-kvm à vos
commandes kvm, pour que la machine virtuelle Slitaz puisse démarrer avec succès.
Nota : Le démarrage de la distribution Slitaz vous permet de sélectionner la résolution de
l'écran de votre machine virtuelle. Veillez à sélectionner une résolution inférieure à celle de
votre machine hôte. En sélectionnant une résolution de 800x600 vous garderez un contrôle plus
aisé de votre machine virtuelle.
Nota : Lorsque vous cliquez dans l'écran de la machine virtuelle vos périphériques d'entrée
« clavier / souris » sont captés et restent confinés à l'écran de la machine virtuelle. L'appui
simultané sur les touches « Ctrl » « Alt » et « G » (comme indiqué en haut de la fenêtre sltaz),
vous permettra de les libérer pour reprendre le contrôle du bureau de votre machine hôte
(machine réelle).
Affichez maintenant les caractéristiques de la machine virtuelle. Option « Menu → system
Tools → System Information » (ou cliquez sur l'icone d'un écran barré d'un point
d'exclamation en bas à droite du bureau Slitaz).
Observez les caractéristiques CPU, mémoire, Cdrom, Réseau de votre machine virtuelle.
Lancez les différents « benchmarks » (CPU Zlib, CPU Fibonacci, CPU MD5, CPU SHA1,
CPU Blowfish, FPU Raytracing) afin de comparer la puissance de votre machine virtuelle
par rapport à d'anciennes architectures matérielles.
Stoppez maintenant cette première machine virtuelle (Option « Menu → Logout →
Shutdown computer »).
Nous allons créer un disque virtuel de 300 Méga-octets en nous allouant un fichier nommé
vm-disk.img de la taille correspondante à l'aide de la commande « dd if=/dev/zero
of=/tmp/rootfs-store/vm-disk.img seek=300 count=1 bs=1M » Le
paramètre « if » indique que l'on crée un fichier rempli de zéro binaire, le paramètre
« of » indique le nom du fichier à créer. Les paramètres suivants « seek=300 count=1
bs=1M » indiquent la taille du fichier à créer.
Nota : Si vous ne disposez pas des extensions HVM et que vous avez la patience d'attendre le
démarrage complet de la machine virtuelle, vous devez ajouter l'option -no-kvm à vos
commandes kvm, pour que la machine virtuelle Slitaz puisse démarrer avec succès.
Nota : Le démarrage de la distribution Slitaz vous permet de sélectionner la résolution de
l'écran de votre machine virtuelle. Veillez à sélectionner une résolution inférieure à celle de
votre machine hôte. En sélectionnant une résolution de 800x600 vous garderez un contrôle plus
aisée de votre machine virtuelle.
Nota : Lorsque vous cliquez dans l'écran de la machine virtuelle vos périphériques d'entrée
« clavier / souris » sont captés et restent confinés à l'écran de la machine virtuelle. L'appui
simultané sur les touches « Ctrl » « Alt » et « G » (comme indiqué en haut de la fenêtre sltaz),
vous permettra de les libérer pour reprendre le contrôle du bureau de votre machine hôte
(machine réelle).
Dès que la machine est complètement démarrée, affichez les caractéristiques de la
machine virtuelle. Option « Menu → system Tools → System Information » (ou cliquez sur
l'icone d'un écran barré d'un point d'exclamation en bas à droite du bureau Slitaz) et
constatez la présence du disque (Devices → Storage → IDE disks → QEMU Harddisk).
Dans la machine virtuelle, ouvrez un terminal de commande en mode super utilisateur
(« root »). Enchainez les menus « menu → utilities → Xterm Terminal », ou cliquez sur
l'icone symbolisant un terminal en bas à gauche du bureau Slitaz. Passez en privilège
super utilisateur à l'aide de la commande « su - ». A la demande de mot de passe tapez
« root ». Le prompt de commande devient « # » ce qui indique que vous avez maintenant
les privilèges du super utilisateur au sein de la machine virtuelle.
Comme pour toute installation de distribution GNU/Linux sur un support disque, il nous
faut préparer le disque en le partitionnant. Le disque hda que nous avons associé à la
machine virtuelle est pour le moment un disque brut. La commande « fdisk -l
/dev/hda » qui tente de nous afficher le partitionnement du disque, nous indique que le
disque hda ne contient pas de table des partitions.
tux@slitaz:~$ su -
password :
root@slitaz~# fdisk -l /dev/hda
.
.
.
Disk /dev/hda doesn't contain a valid partition table
Nous allons donc partitionner le disque pour qu'il puisse accueillir l'installation de la
distribution. Par simplicité et facilité, dans le cadre de ce TP, nous ne créerons qu'une
seule partition(pas de partition de swap, pas de partition /boot, /home, /tmp, /var, …).
A l'aide de la commande fdisk, créez une partition primaire qui occupe la totalité du disque
avec l'attribut « bootable ».
root@slitaz~# slitaz-installer
Logger vous sous l'utilisateur « tux » (mot de passe « tux »), observez les caractéristiques
CPU, mémoire, Cdrom, réseau de votre machine virtuelle.
Stoppez maintenant cette première machine virtuelle (Option « Menu → Logout →
Shutdown computer »).
Le fichier vm-disk.img contient un système de fichiers complet. Dans les environnements
de type Unix, il est couramment appelé système de fichiers racine ou « rootfs ». C'est ce
terme que nous utiliserons dans la suite de ce TP.
lequel sont stockées les surcharges apportées au système de fichiers de référence. Ces
fichiers de débordement ne contenant que les différences avec le rootfs, sont dénommés
fichiers COW (abréviation de Copy On Write). Ils sont liés au fichier rootfs commun et sont
de taille modeste. L'utilisation des fichiers COW permet donc de personnaliser un
ensemble de machines virtuelles, partageant par ailleurs une base système commune. Le
clonage d'un système de base de référence devient une opération très facile. Les
machines virtuelles VM1 et VM2 de la Figure 1 disposent ainsi de leur propre système de
fichiers ne contenant que les différences avec le système de fichiers de référence qu'est le
rootfs.
« Vachement bien » les fichiers COW : Ce système COW introduit une certaine souplesse
de gestion. Le premier avantage de ce système COW est l'optimisation de taille. L'unique
et volumineux rootfs est partagé pour un ensemble de machines virtuelles clonées. La
différentiation de ces VM est déportée dans de petits fichiers. Les environnements de
virtualisation libres XEN et KVM/QEMU peuvent exploiter les fichiers COW. QEMU a
même amélioré le format en créant les formats QCOW et QCOW2 qui peuvent être
chiffrés et compressés. Toutefois, il convient de noter que les fichiers COW sont liés au
fichier de référence par un ensemble de pointeurs internes. Ceux ci référencent les blocs
de données modifiés par rapport au rootfs de référence. Ce lien fort entre le fichier COW
et le rootfs de référence interdit toute modification de ce dernier. En effet en cas
d'altération du système de fichiers de référence, l'ensemble des fichiers COW qui lui sont
liés deviennent incohérents et inutilisables. La mise à jour du kernel ou de la distribution,
l'application de patches de sécurité, doit alors être effectuée sur chacun des clones. A
partir de ce moment la lignée de clones va commencer à diverger. (Des techniques
d'unification permettent de s'affranchir de ce lien fort de dépendance. Leur mise en oeuvre
dépasse le cadre de ce TP. L'une d'elle, dénommée GUSTAV, publiée aux congrès
JRES2009 est accessible à l'URL suivante https://2009.jres.org/planning, une copie de
l'article est également disponible sur ce liveCD /usr/local/share/viminal/vodka/instruction-
sheets/docs/jres2009-article-14.pdf).
Nous allons maintenant cloner notre machine virtuelle à l'aide de la technique COW
(Copy On Write).
La commande « qemu-img » permet de créer et manipuler les fichiers image (rootfs) des
machines virtuelles. Tapez la commande sans paramètre pour en afficher la syntaxe.
Consulter également les pages manuel de cette commande.
Nota : Pour quitter l'affichage de la commande « man » appuyer sur la touche 'q'
Nous allons créer deux clones ayant comme rootfs de référence le fichier vm-disk.img
créé à l'étape précédente. La commande « qemu-img create -f qcow2 -o
backing_file=/tmp/rootfs-store/vm-disk.img /tmp/rootfs-store/vm01-
disk.qcow2 » crée un premier rootfs cloné. L'option « -f » permet de spécifier le format
du fichier, qcow2 dans notre cas. L'option « -o backing_file=/tmp/rootfs-store/
vm-disk.img » indique que le fichier créé est un fichier de débordement (Copy On Write)
pointant sur le fichier de référence indiqué par le paramètre backing_file.
Nous pouvons maintenant démarrer les deux clones pointant sur le même fichier de
référence. Celui ci est accédé en lecture seule par les deux clones. Toutes les opérations
d'écriture sont déportées dans les fichiers de débordement (Copy On Write).
Démarrage du premier clone :
Chaque clone à maintenant sa propre vision du rootfs de référence. Sur la machine slitaz-
vm01 créer un fichier de 10 Mo sur le répértoire /tmp. Ouvrez un terminal de commande
et lancez la commande suivante « dd if=/dev/null of=/tmp/my-10mo-file
seek=10 count=1 bs=1M ».
Sur la machine hôte, observez maintenant la taille des fichiers qcow2 correspondant au
Le rootfs de référence n'a subi aucune modification, alors que les deux fichiers qcow2
évoluent en fonction des changements d'état des clones.
Stoppez les deux machines virtuelles clonées (Option « Menu → Logout → Shutdown
computer »).
La commande « qemu-img info » permet d'avoir le détails de la configuration d'un
rootfs. Lancez les commandes suivantes et observez les caractéristiques des différents
rootfs.
Il existe deux modes de connexion des VM au réseau. Ils sont utilisés, à quelques
variantes près, par la plupart des systèmes de virtualisation.
• Le mode translaté (NAT) : Dans ce mode (mode par défaut, dit « user », dans
l'environnement QEMU-KVM,) la machine virtuelle est prise en charge par
l'environnement de virtualisation qui se présente comme un firewall dédié qui
contrôle l'ensemble du trafic de la VM. Ce firewall fournit les fonctions de serveur
DHCP, de relai DNS et de routeur intégrant la translation NAT/PT avec la
connexion de la machine hôte. La machine virtuelle est confinée dans l'espace de
contrôle du processus de virtualisation. Ce confinement est tel, que plusieurs clones
peuvent avoir les mêmes adresses MAC et IP sans que cela ne crée de
perturbation. Dans le cas de QEMU, l'adresse MAC par défaut à la valeur
Observez les configurations réseau sur chacun des clones à l'aide de la commande
« ifconfig »
tux@slitaz-vm01:~$ ifconfig
tux@slitaz-vm02:~$ ifconfig
Constatez que les configurations réseau sont bien identiques. Ce qui va à l'encontre des
règles techniques usuelles. Sur un réseau physique, deux machines distinctes ne peuvent
avoir la même adresse physique (adresse MAC), ni la même adresse logique de niveau
réseau (adresse IP) sans être en conflit pour l'accès au réseau. La duplication d'adresse
est une situation d'erreur bloquante. Dans notre cas de virtualisation à connexion en mode
translaté, chacune des deux machines virtuelles est confinée dans l'espace de contrôle de
son processus de virtualisation. Celui ci, à la manière d'un firewall dédié, assure la
translation d'adresse (NAT : Network Address Translation) de la VM sur l'interface réseau
de l'hôte (la machine physique hébergeant la machne virtuelle). Plusieurs VM de
configuration identique peuvent donc cohabiter sans conflit en se partageant la
connectivité de l'hôte.
Ce mode translaté (NAT) est facile à mettre en oeuvre, car il est nativement intégré au
processus de virtualisation. Il permet aux machines virtuelles d'accéder au réseau en
utilisant les mêmes autorisations/restrictions que l'hôte. Il offre l'avantage d'isoler
strictement dans un bac à sable chaque machine virtuelle. Par contre la connectivité est
partielle. En effet les machines virtuelles ne sont pas accessibles depuis l'extérieur du bac
à sable. Seuls les flux sortants sont possibles. Les VM ne sont pas visibles des autres
machines du réseau physique. Elles ne sont pas intégrées au réseau de l'entreprise sur
lequel est connectée la machine qui les héberge (l'hôte). Dans le cas de notre TP, les
deux clones slitaz-vm01 et slitaz-vm02 ne peuvent donc pas se « pinguer » mutuellement.
Cette connectivité limitée ("sortante" uniquement), ne convient pas aux serveurs
virtualisés ou au VM nécessitant une connectivité complète, pour lesquels on se tournera
sur le mode connectivité "ponté".
Avant de passer à l'étape suivante, stoppez les deux machines virtuelles slitaz-vm01 et
slitaz-vm02, (Option « Menu → Logout → Shutdown computer »).
Nota : Dans le cadre de ce TP, la carte ethernet (eth0) de la machine hôte, n'est pas connectée
au commutateur virtuel br0, afin de ne pas perturber le réseau du laboratoire. Vos machines
virtuelles ne sont donc pas connectées au réseau du laboratoire. Comme les machines
virtuelles de chacune des positions de travail ont toutes les mêmes adresses MAC, elles ne
peuvent (doivent) pas résider sur le même domaine de diffusion (VLAN du laboratoire).
Nous devons également créer une interface Ethernet virtuelle (tun/tap) pour chacune des
machines virtuelles. Ces interfaces seront associées aux machines virtuelles lors du
démarrage des VM.
Nous pouvons maintenant démarrer les machines virtuelles en leur associant une carte
ethernet (paramètre « -net nic ») associée à son interface tap respective (paramètre
« -net tap ».
Nota : Attention à bien fournir une adresse MAC unique à chaque carte ethernet.
Une fois que les machines ont démarré, pour chacune d'elle configurez les paramètres
réseau : Ouvrez un terminal de commande, passez en mode super-utilisateur (root) au
moyen de la commande « su - ». Sauvegardez le fichier de configuration réseau
d'origine en le renommant avec l'extension « .orig ». Puis à l'aide de l'éditeur « leafpad »
créez le nouveau fichier de configuration réseau en respectant strictement la syntaxe
indiquée ci dessous.
tux@slitaz:~$ su -
password :
root@slitaz~# mv /etc/network.conf /etc/network.conf.orig
root@slitaz~# leafpad /etc/network.conf
.
.
.
INTERFACE="eth0"
STATIC="yes"
IP="192.168.1.101"
NETMASK="255.255.255.0"
GATEWAY=""
Ne tenez pas compte du message d'avertissement relatif à la commande route, car nous
n'avons pas de passerelle par défaut dans le cadre de ce TP.
Vérifiez la configuration en affichant l'adresse de l'interface eth0
root@slitaz~# ifconfig -a
tux@slitaz:~$ su -
password :
root@slitaz~# mv /etc/network.conf /etc/network.conf.orig
root@slitaz~# leafpad /etc/network.conf
.
.
.
INTERFACE="eth0"
STATIC="yes"
IP="192.168.1.102"
NETMASK="255.255.255.0"
GATEWAY=""
Ne tenez pas compte du message d'avertissement relatif à la commande route, car nous
n'avons pas de passerelle par défaut dans le cadre de ce TP.
Vérifiez la configuration en affichant l'adresse de l'interface eth0
root@slitaz~# ifconfig -a
Le succès du ce ping confirme que vos deux machines virtuelles sont bien connectées sur
le même réseau au travers du bridge « br0 ».
Pinguez slitaz-vm01 depuis le host viminal
• sur l'hôte viminal :
Le succès de ces deux derniers ping confirme la connectivité entre votre machine hôte
(viminal) et les deux machines virtuelles au travers du bridge « br0 ».
Avant de passer à l'étape suivante, stoppez les deux machines virtuelles slitaz-vm01 et
slitaz-vm02, (Option « Menu → Logout → Shutdown computer »).
L'outil virt-install est chargé de cette opération. Il comprend de nombreux paramètres, qui
sont décrit dans la page manuel (« man virt-install »). Nous allons créer une
instance de VM correspondant au clone slitaz-vm01 de l'étape précédente à l'aide de la
commande « sudo virt-install -–name=slitaz-vm01 -–ram=256
–-disk=/tmp/rootfs-store/vm01-disk.qcow2,device=disk,format=qcow2
–-vnc –keymap=fr –-video=vga -–network=bridge=br0 -–accelerate --
import ». Cette commande va créer le fichier de description xml, puis lancer la machine
pour procéder à l'installation du système. Comme nous avons déjà installé l'OS nous
spécifions l'option –import, qui démarrera directement la machine sur son disque.
Nota : « virt-install » nécessite les privilèges du super-utilisateur pour créer
dynamiquement l'interface « tap » pour la machine virtuelle. Aussi nous le lançons avec la
command « sudo ».
La description de la machine virtuelle sous forme de fichier xml est créée (fichier
/etc/libvirt/qemu/slitaz-vm01.xml) et la machine est démarrée.
L'écran de la machine s'affiche et vous pouvez interagir directement dessus. (l'appui
simultané sur les touches « ctrl-alt » vous permet de libérer les périphériques d'entrée
(clavier / souris).
Un fois la machine complètement démarrée, stoppez là (Option « Menu → Logout →
Shutdown computer ») avant de passer à la suite.
Affichez le contenu du fichier /etc/libvirt/qemu/slitaz-vm01.xml à l'aide de la
commande « sudo less », le fichier, ayant été créé avec les droits super-utilisateur,
n'est lisible que par ce dernier.
Nota : Pour quitter l'affichage de la commande « less », appuyer sur la touche 'q'.
Observez comment le différentes caractéristiques de la machine, que vous avez
spécifiées dans la commande « virt-install », ont été transposées dans le format
xml. Notez également que virt-install génère, pour chaque machine créée, une
adresse MAC ethernet aléatoire afin de minimiser les risques de collision d'adresse
MAC.
virsh #
virsh # help
Pour libvirt chaque machine virtuelle est un domaine, dont les caractéristiques sont
stockées dans les fichiers xml de description. Pour activer une machine virtuelle lancer la
commande « create <nom-du-fichier.xml> »
La commande « list » vous permet d'afficher l'état des machines virtuelles tournant sur
l'hôte.
virsh # list
Id Name State
----------------------------------
2 slitaz-vm01 running
Nota : Lancez la commande en arrière plan en suffixant la commande par un « & », afin de
récupérer le prompt de commande de votre shell.
L'écran de la machine s'affiche et vous pouvez interagir directement dessus. (l'appui
simultané sur les touches « ctrl-alt » vous permet de libérer les périphériques d'entrée
(clavier / souris).
A l'aide de la commande « ps » observez les paramètres de la commande qemu-
system-x86_64 que libvirt a généré pour lancer la machine virtuelle. Comparez aux
paramètres de la commande qemu-system-x86_64 que nous avons utilisé dans la
première partie de ce TP.
La description de la machine virtuelle sous forme de fichier xml est créée (fichier
/etc/libvirt/qemu/slitaz-vm02.xml) et la machine est démarrée.
L'écran de la machine s'affiche et vous pouvez interagir directement dessus. (l'appui
simultané sur les touches « ctrl-alt » vous permet de libérer les périphériques d'entrée
(clavier / souris).
Un fois la machine complètement démarrée, stoppez là (Option « Menu → Logout →
Shutdown computer ») avant de passer à la suite.
viminal@livecd:~$ virt-manager
A l'aide de l'interface virt-manager créer un machine slitaz-vm03 qui pointera sur le fichier
qcow2 que vous venez de créer.
Attention les configurations par défaut générées par virt-manager lors de la création d'une
machine virtuelle ne sont pas reconnues par le système slitaz, il va falloir personnaliser la
machine créée pour que le système slitaz puisse démarrer.
• sélectionnez le choix < import existing disk image >, puis cliquer sur le bouton
suivant < forward > ;
• sélectionnez un fichier existant : choix < browse... > du champ intitulé « Provide the
existing storage path » ;
• affectez « 256 »Mégaoctets de mémoire à votre VM (au lieu des 1024 initialement
affectés par défaut). Puis passez à l'étape suivante (bouton < forward > );