Vous êtes sur la page 1sur 8

Virtualisation : KVM

Jeremy Briffaut

16 septembre 2022

1 Preparation
Les images, ISO, ... sont sur le nfs :
/mnt/nfs

1.1 Pre requis


Pour obtenir des performances correcte et pouvoir installer des OS non modifie
dans les machines virtuelle, le support des extensions de virtualisation du proces-
seur est indispensable. Il est possible de vérifier l’existence de cette extension sur
le processeur a l’aide de la commande suivante :
# egrep ’^flags.*(vmx|svm)’ /proc/cpuinfo >/dev/null && echo OK || echo KO

Si la commande retourne "OK", le processeur possède les extensions de virtua-


lisation.

1.2 Installation des paquets


Comme indiqué précédemment, nous utiliserons la LibVirt pour gérer des ma-
chines virtuelles KVM. Dans Debian, tout s’installe très simplement avec la com-
mande suivante :
# apt install qemu−kvm libvirt−clients libvirt−daemon−system bridge−utils
virtinst libvirt−daemon

Si les extensions de virtualisation sont bien gérées par le processeur, le script


d’init de kvm a du charger automatiquement les modules noyaux. Il est possible de
le vérifier avec la commande suivante :
# lsmod | grep kvm
kvm_intel 39776 1
kvm 127464 1 kvm_intel

1
Par défaut, libvirt ne se lance pas automatiquement. Pour ce faire, il suffit d’édi-
ter le fichier /etc/default/libvirtd et de modifier la variable suivante :
start_libvirtd="yes"

Le démon sera alors actif au démarrage ou après avoir exécuté la commande


suivante :
/etc/init.d/libvirtd restart

Vérifier que votre démon est correctement lancé avec la commande suivante :
virsh −c qemu:///system list

2 Gestion des images disques


2.1 Presentation
2.2 Creation d’une image disque
Création d’une image disque au format qcow2 de 20Go :
$ qemu−img create −f qcow2 disk.qcow2 20G

2.3 Création d’une image disque relative


Création d’une image disque en utilisant une autre image comme base. Cette
nouvelle image ne contiendra que les diff par rapport a l’image de base.
Utile par exemple si on dispose d’une image propre d’un OS et que l’on souhaite
décliner plusieurs machines a partir de cet OS.

$ qemu−img create −b disk.qcow2 −f qcow2 reldisk.qcow2

Il suffit ensuite d’utiliser reldisk.qcow2 dans les nouvelles VM.

2.4 Conversion d’images


ATTENTION : la suite néccesite que vmware soit installé, vous ne pourrait
donc pas le réaliser dans ce TD
Pour convertir une image vmware, il faut que l’image du disque soit dans un
seul fichier. Pour rassembler une image :
$ vmware−vdiskmanager −r CentOS5.vmdk −t 0 CentOS5−copy.vmdk

Conversion d’une image VMWare :


$ qemu−img convert −f vmdk vdisk.vmdk −O qcow2 vdisk.qcow2

2
Reduction de la taille d’une image qcow2 :
$ qemu−img convert vdisk.qcow2 −O qcow2 vdisk−clean.qcow2

3 Gestion du reseau
3.1 Bridge
Pour pouvoir bridger les machines virtuelles sur l’interface réseau réelle de la
machine hôte, il faut modifier la configuration réseau de ce dernier. La première
étape est d’ajouter une interface de type bridge qui pour être utilisée par les inter-
faces TUN/TAP associées a chaque VM.
Par exemple, pour créer un bridge sur l’interface réelle eth0, modifier /etc/net-
work/interfaces comme indique ci-dessous :
(remplacer eth0 par le nom de votre interface)
auto eth0
iface eth0 inet manual

auto br0
iface br0 inet static
address 172.10.3.XXX
network 172.10.3.0
netmask 255.255.255.0
broadcast 172.10.3.255
gateway 172.10.3.254
bridge_ports eth0
bridge_fd 9
bridge_hello 2
bridge_maxage 12
bridge_stp off

Désactivez NetworkManager et fixé la configuration DNS :


systemctl disable NetworkManager
rm /etc/resolv.conf
echo "nameserver 172.10.3.254" > /etc/resolv.conf

Puis redémarrer le réseau et vérifiez la configuration :


sudo su −
apt install bridge−utils
brctl addbr br0
reboot
ip a

Vérifier que tout fonctionne

3
ip a
ping free.fr

4 Création d’une image


Ajoutez votre utilisateur au groupe libvirt, puis utiliser cet utilisateur pour la
suite du TD :
adduser user libvirt
su − user

Pour être sur que les changements sont appliqués :


reboot

Créer une image ubuntu en utilisant l’iSO fournie sur le nfs :


virt−install −−connect qemu:///system −n vm10 −r 512 −−vcpus=2 −f disk.
qcow2 −s 12 −c /mnt/nfs/ISO/ubuntu−11.04−server−amd64.iso −−vnc −−
noautoconsole −−os−type linux −−accelerate −−network=bridge:br0 −−
hvm

Vérifier que votre image est bien créée :


virsh −c qemu:///system list

Passez maintenant sur votre ubuntu et installer virt-manager. Connectez vous


à votre machine pour continuer l’installation de votre ubuntu.

4
5 LibVirt
5.1 Mise en place
La documentation de libVirt est disponible à cette URL :
— http://libvirt.org/devguide.html
Copiez le répertoire contenant les exemples est /mnt/nfs/EXO/exo-libvirt Pour
compiler vos exemples, vous devez installer :
apt−get install gcc libvirt−dev

Vous pouvez ensuite compiler les exemples à l’aide du script :


compile.sh

5.2 Exemples
Voici la liste des exemples fournis et ce qu’ils font (les noms en gras sont a
étudier et tester particulièrement) :
— ex1.c : Utilisation de vitConnectOpen pour ouvrir une connexion vers un
hyperviseur
— ex2.c : Utilisation de vitConnectOpenReadOnly pour ouvrir une connexion
en RO vers un hyperviseur
— ex3.c : Utilisation de vitConnectOpenAuth pour ouvrir une connexion vers
un hyperviseur avec authentification (les modification à apporter sont dans
l’entête du fichier C)
— ex4.c : Utilisation de vitConnectOpenAuth pour ouvrir une connexion vers
un hyperviseur avec authentification avec gestion des paramètres d’authen-
tification via le mécanisme de callback.
— ex5.c : Fermeture de connexion avec utilisation de virConnectRef pour gé-
rer l’ouverture multiple (application multi-threader)
— ex8.c : Utilisation de virConnectGetCapabilities pour obtenir les capacités
d’un hôte
— ex9.c : Utilisation de virCOnnectHostname pour obtenir le nom de votre
hôte
— ex10.c : Utilisation de virConnectGetMaxVcpus pour afficher le nombre
maximum de VCPU
— ex11.c : Utilisation de virNodeGetFreeMemory pour afficher la mémoire
libre disponible
— ex12.c : Utilisation de virNodeGetInfo pour afficher les informations hard-
ware de l’hôte
— ex13.c : Affichage de la mémoire disponible par zone NUMA (pas possible
ici)
— ex14.c : Affichage du type d’hyperviseur utilisé
— ex15.c : Affichage de la version de l’hyperviseur

5
— ex16.c : Affichage de la version de la libVirt
— ex17.c : Affichage de l’URI utilisé
— ex18.c : Vérification que la connexion est crypté
— ex19.c : Vérification que la connexion est sécurisé
— ex20.c : Affichage du modèle de sécurité utilisé
— ex21.c : Utilisation de virSetErrorFunc pour définir une nouvelle fonction
de gestion des erreurs
— ex28.c : Exemple complet avec toutes les fonctions précédentes

5.3 Exercices
Exercice 1 : créer un programme permettant d’ouvrir un hyperviseur distant
(qemu+ssh)
Exercice 2 : Ajouter l’affichage du hostname sur lequel vous êtes connecté, le
nombre de CPU disponible et la mémoire disponible sur l’hôte
Exercice 3 : Afficher la liste des VMs actives et inactives et les informations
sur chaque VM
Connection successful :)
Hostname:debian.ensi−bourges.fr.
Connection is encrypted: 0
Maximum support virtual CPUs: 16
Memory size: 8187536kb
Active domain IDs:
id : 5, nom : vm10
state : 1
maxMem : 524288
memory : 524288
nrVirtCpu : 2
cpuTime : 9362460000000
Inactive domain names:

Exercice 5 : Ajouter le code pour arrêter puis redémarrer une VM


Connection successful :)
Hostname:debian.ensi−bourges.fr.
Connection is encrypted: 0
Maximum support virtual CPUs: 16
Memory size: 8187536kb
>>> Liste des domaines
Active domain IDs:
ID : 7 NOM : vm10
state : 1
maxMem : 524288
memory : 524288
nrVirtCpu : 2
cpuTime : 2330000000
Inactive domain names:

6
>>> Arret de vm10
Active domain IDs:
Inactive domain names:
vm10
>>> Demarage de vm10
Active domain IDs:
ID : 8 NOM : vm10
state : 1
maxMem : 524288
memory : 524288
nrVirtCpu : 2
cpuTime : 30000000
Inactive domain names:

Exercice 6 : Ajouter le code pour arrêter puis suspendre/recharger une VM


(indice : sauvegarder l’état dans /var/lib/libvirt/qemu/save)
Connection successful :)
Hostname:debian.ensi−bourges.fr.
Connection is encrypted: 0
Maximum support virtual CPUs: 16
Memory size: 8187536kb
>>> Liste des domaines
Active domain IDs:
ID : 21 NOM : vm10
state : 1
maxMem : 524288
memory : 524288
nrVirtCpu : 2
cpuTime : 1300000000
Inactive domain names:
>>> Arret de vm10
Active domain IDs:
Inactive domain names:
vm10
>>> Demarage de vm10
Active domain IDs:
ID : 22 NOM : vm10
state : 1
maxMem : 524288
memory : 524288
nrVirtCpu : 2
cpuTime : 30000000
Inactive domain names:
>>> Suspendre vm10
Active domain IDs:
Inactive domain names:
vm10
>>> Resume vm10
Active domain IDs:

7
ID : 23 NOM : vm10
state : 1
maxMem : 524288
memory : 524288
nrVirtCpu : 2
cpuTime : 350000000
Inactive domain names:

Exercice 7 : Ajouter une fonction pour migrer une machine de votre domaine
vers le domaine du voisin

Vous aimerez peut-être aussi