{{tag>kvm libvirt}} ====== 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. ===== Installation de libvirt ===== 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. ===== Modifiez la Configuration de Libvirt pour Accorder les Permissions ===== 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 ===== Créer une machine virtuelle ===== 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 # ===== Connexion à une machine virtuelle ===== 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. ===== Création d'une template pour le clone ===== 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 [...] ===== Créer de nouvelles machines avec virt-clone ===== 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:~$ ===== Communication entre les machines ===== 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:~$ ===== Mettre des machines virtuelles dans le LAN du router physique ===== ==== Configurer l'hôte ==== 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 ==== Configurer les guests ==== 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.
Nous pouvons simplement rajouter une connexion au bridge avec l'élément ''interface'' supplémentaire suivant : 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: 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. ===== Où aller à partir de là ===== 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_install|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. ((Mastering KVM Virtualization, Humble Devassy Chirammal, Prasad Mukhedkar, Anil Vettathu, Packt Publishing, 2016.))