libvirt
permet de créer et de gérer des machines virtuelles sous
Linux.https://wiki.elosys.net/doku.php?id=system_administration:automation:virtualiser_avec_kvm&do=
Dans cette page nous allons voir comment créer des machines virtuelles, comment les cloner et comment les mettre sur le réseau LAN pour qu'elles soient accessibles comme une machine physique.
L'installation de libvirt sur debian nécessite l'installation des paquets suivants :
sudo apt-get install \ qemu-kvm \ libvirt-clients \ libvirt-clientsqemu-utils \ libvirt-daemon-system \ virt-manager \ qemu-system \ --os-variant \ #Pour connaître les systèmes d'exploitation disponibles, utilise la commande : --os-variant list
L'utilisateur souhaitant utiliser les commandes de libvirt doit
appartenir au group kvm
.
sudo adduser $USER kvm sudo adduser $USER libvirt
Libvirt fournit deux types d'accès. Le défaut appelée session
n'offre qu'un accès limité aux ressources réseau du système.
La commande suivante nous connecte à un accès privilégié.
export LIBVIRT_DEFAULT_URI="qemu:///system"
L'ajout de la commande précédent à la fin du fichier ~/.bashrc
activera cet accès par défaut.
Vous devez éditer le fichier /etc/libvirt/qemu.conf
,décommentez et modifiez les lignes relatives aux groupes et utilisateurs
user = "libvirt-qemu" group = "kvm"
Vous pouvez également ajouter votre utilisateur au groupe libvirt-qemu si ce n'est pas déjà fait :
sudo usermod -aG libvirt-qemu $USER
Assurez-vous que les permissions sur les fichiers ISO sont correctes puis Redémarrez les Services libvirtd
sudo chown root:kvm /tmp/debian-11.2.0-amd64-netinst.iso sudo chmod 644 /tmp/debian-11.2.0-amd64-netinst.iso
Avec la commande suivante nous créons une machine virtuelle de 512Mo de RAM avec un disque dur virtuel de 8G à partir d'un CD netinst de la distribution debian.
# Télécharger le CD d'installation s'il n'est pas disponible [ ! -f /tmp/debian-11.2.0-amd64-netinst.iso ] \ && wget https://cdimage.debian.org/debian-cd/current/amd64/iso-cd/debian-11.2.0-amd64-netinst.iso \ -O /tmp/debian-11.2.0-amd64-netinst.iso iso=/tmp/debian-11.2.0-amd64-netinst.iso # Lancer l'installation du système d'exploitation # sur une machine virtuelle de 512 Mo de RAM nommée deby virt-install \ --virt-type kvm \ --name=deby \ --disk size=8 \ --ram=512 \ --vcpus=1 \ --graphics vnc \ --console pty,target_type=serial \ --cdrom $iso
À la fin de l'installation, la commande virsh list –all
nous
indique la présence de la machine et son état.
# virsh list --all Id Name State ---------------------------------------------------- - deby shut off #
Pour démarrer la machine deby
on appellera simplement :
# virsh start deby Domain deby started # virsh list --all Id Name State ---------------------------------------------------- 1 deby running #
Les machines créées avec libvirt sont connectées à un réseau virtuel.
Le réseau virtuel crée par libvirt porte le nom default
.
Le réseau virtuel de libvirt se charge de l'attribution des IP aux machines virtuelles qui s'y connectent.
Le réseau virtuel de libvirt se charge également de la résolution des noms des machines (On en verra une démonstration dans Communication entre les machines).
Le réseau default
de libvirt attribue aux machines des IP comprises
dans l'espace 192.168.122.0/24
On peut connaître l'adresse IP attribuée à la machine deby
avec la
commande :
# virsh net-dhcp-leases default Expiry Time MAC address Protocol IP address Hostname Client ID or DUID ------------------------------------------------------------------------------------------------------------------- 2018-12-21 15:34:30 52:54:00:55:bf:73 ipv4 192.168.122.91/24 deby - # ssh admin@192.168.122.91 [...] admin@deby:~$
On peut éteindre une machine virtuelle avec :
# virsh shutdown deby Domain deby is being shutdown # virsh list --all Id Name State ---------------------------------------------------- - deby shut off #
Remarques:
deby
soit éteinte pour réaliser les opérations dans la prochaine partie de ce document.
Il n'est pas nécessaire d'installer un système d'exploitation à chaque
fois qu'on souhaite créer une machine virtuelle. La commande
virt-clone
nous permet de copier une machine.
Nous allons utiliser deby
comme un modèle (template) à cloner.
Pour créer une template à partir de deby
, on va
deby
en deby-template
avec la commande virt-clone
(lire le man virt-clone)# virt-clone --original deby --name deby-template --file /var/lib/libvirt/images/deby-template.qcow2 Allocation de « deby-template.qcow2 » | 8.0 GB 00:00:40 Le clone « deby-template » est créé avec succès.
deby-template
avec la commande virt-sysprep
(lire le man virt-sysprep)# virt-sysprep -d deby-template --firstboot-command 'dpkg-reconfigure openssh-server' [ 0,0] Examining the guest ... [...] [ 12,4] Performing "bash-history" ... [...] [ 13,0] Performing "ssh-hostkeys" ... [ 13,1] Performing "ssh-userdir" ... [...] [ 13,3] Installing firstboot command: dpkg-reconfigure openssh-server [...]
Une fois la template préparée, nous pouvons créer de nouvelles machines virtuelles sans passer par la procédure d'installation du système d'exploitation.
La commande suivante crée une nouvelle machine virtuelle nommée
dev-two
à partir de deby-template
.
# virt-clone -o deby-template -n dev-two -f /var/lib/libvirt/images/dev-two.qcow2 Allocation de « dev-two.qcow2 » | 8.0 GB 00:00:39 Le clone « dev-two » est créé avec succès. # virsh list --all Id Name State ---------------------------------------------------- - deby shut off - deby-template shut off - dev-two shut off
Nous pouvons modifier le hostname de la machine dev-two
sans avoir à
la démarrer avec la commande suivante.
# virt-customize -d dev-two --hostname dev-two [ 0,0] Examining the guest ... [ 14,9] Setting a random seed [ 15,0] Setting the hostname: dev-two [ 18,3] Finishing off #
Démarrer et se connecter à dev-two
doit vous être familier maintenant.
# virsh start dev-two Domain dev-two started # virsh list --all Id Name State ---------------------------------------------------- 3 dev-two running - deby shut off - deby-template shut off # virsh net-dhcp-leases default Expiry Time MAC address Protocol IP address Hostname Client ID or DUID ------------------------------------------------------------------------------------------------------------------- 2018-12-21 15:37:30 52:54:00:c8:56:53 ipv4 192.168.122.88/24 dev-two - # ssh admin@192.168.122.88 [...] admin@dev-two:~$
Comme indiqué dans Connexion à une machine virtuelle, le réseau auquel se connectent les machines virtuelles se charge de la résolution des noms.
Pour le tester, nous allons démarrer la machine deby
et depuis cette
machine se connecter à la machine dev-two
en n'indiquant que le nom
d'hôte.
# virsh start deby Domain deby started # virsh list --all Id Name State ---------------------------------------------------- 3 dev-two running 2 deby running - deby-template shut off # virsh net-dhcp-leases default Expiry Time MAC address Protocol IP address Hostname Client ID or DUID ------------------------------------------------------------------------------------------------------------------- 2018-12-21 15:37:30 52:54:00:c8:56:53 ipv4 192.168.122.88/24 dev-two - 2018-12-21 15:38:30 52:54:00:55:bf:73 ipv4 192.168.122.91/24 deby - # ssh admin@192.168.122.91 [...] admin@deby:~$ ssh dev-two [...] admin@dev-two:~$
Les machines virtuelles ne sont pas accessibles depuis le LAN du router physique dans la configuration vue jusque-là.
Pour les incorporer dans le réseau de portée 192.168.1.0/24
il faut
passer par un bridge connecté à l'interface réseau physique de la
machine hôte.
La création du bridge sur la machine hôte peut se faire avec la
commande brctl
(installer le paquet bridge-utils
si cette commande
n'est pas disponible sur le système)
# brctl addbr br0 # création d'un bridge nommé br0
Pour joindre l'interface réseau physique de l'hôte au bridge br0
qu'on vient de créer, le plus simple est de modifier le fichier
/etc/network/interfaces
selon le modèle suivant.
Ici, l'interface physique de la machine hôte porte le nom enp2s0
, à
modifier selon votre situation.
ne pas essayer de bridger sur une interface wifi, ça ne marche pas.
voir https://wiki.debian.org/BridgeNetworkConnections#Bridging_with_a_wireless_NIC
########################### # /etc/network/interfaces # ########################### iface enp2s0 inet manual auto br0 iface br0 inet static address 192.168.1.128 # <--- adresse IP de votre choix broadcast 192.168.1.255 netmask 255.255.255.0 gateway 192.168.1.1 bridge_ports enp2s0 # <--- l'interface physique rattachée au bridge bridge_stp off bridge_fd 0 bridge_maxwait 0 dns-nameservers 8.8.8.8 # <--- plusieur seveurs DNS séparés par des espaces
Un redémarrage de la machine hôte est souvent nécessaire pour que cette configuration soit prise en compte.
La définition des machines virtuelles se fait à l'aide d'un fichier au format XML.
Pour modifier la configuration d'une machine, dev-two
par exemple,
on utilise la commande suivante :
# virsh edit dev-two
Cette commande ouvre avec éditeur de texte par défaut sur le fichier XML servant à la définition de la machine.
La partie qui nous intéresse est celle relative à la connexion au réseau :
Ci-dessous, l'élément interface
indique la connexion de la machine
au réseau default
que nous avons utilisé jusque-là et qui donne à
notre machine une adresse comprise dans l'espace 192.168.122.0/24.
<interface type='network'> <mac address='52:54:00:c8:56:53'/> <source network='default'/> <model type='virtio'/> <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/> </interface>
Nous pouvons simplement rajouter une connexion au bridge avec
l'élément interface
supplémentaire suivant :
<interface type='bridge'> <source bridge='br0'/> </interface>
En lançant la machine virtuelle dev-two
, nous retrouvons une
nouvelle interface réseau en plus de celle attachée au réseau virtuel
default
.
admin@dev-two:~$ ip a s ...... 2: ens9: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000 link/ether 52:54:00:b5:19:f4 brd ff:ff:ff:ff:ff:ff .....
La nouvelle interface réseau à l'intérieur de la machine virtuelle
peut être activée en ligne de commande ou bien à l'aide du fichier
/etc/network/interfaces
root@dev-two:~# ip a add 192.168.1.182/24 dev ens9
Pour résoudre le problème de connectivité après avoir ajouté l'interface réseau, suivez ces étapes :
1.Modifiez le fichier /etc/resolv.conf
et ajoutez des serveurs DNS :
nameserver 8.8.8.8 nameserver 8.8.4.4
2.Redémarrez le service réseau pour appliquer les modifications :
sudo systemctl restart networking
La machine est désormais sur le LAN de portée 192.168.1.0/24 accessible à partir de n'importe quelle station sur ce réseau.
La facilité de création et de déploiement de machines permet d'envisager plusieurs scénarios d'exploitation :
La lecture des manuels des nombreuses commandes offertes par libvirt
donne un aperçu du spectre des possibilités d'action.
La lecture de 'Mastering KVM Virtualization'donne également un aperçu de l'exploitation de la virtualisation dans des fermes de serveurs grâce à des solutions open source éprouvées comme Openstack et Ovirt. 1)