system_administration:automation:virtualiser_avec_kvm

Virtualiser un système d'exploitation sous Linux

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:

  • Il est nécessaire que la machine 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

  • Copier 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.
  • Nettoyer 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. FIXME

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 :

  • Mise en place et tests d'installation par réseau (PXE)
  • Mise en place et tests de playbooks Ansible et d'autres outils d'orchestration

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)


1)
Mastering KVM Virtualization, Humble Devassy Chirammal, Prasad Mukhedkar, Anil Vettathu, Packt Publishing, 2016.
  • system_administration/automation/virtualiser_avec_kvm.txt
  • Last modified: 2024/09/16 22:15
  • by fafa