Configurer un serveur de virtualisation

Au sommaire:

  • 1-Qu'est-ce que KVM ?
  • 2-Prérequis
  • 3-Installation de QEMU/KVM
  • 4-Générer une paire de clés privée/publique
  • 5-Installation de Virt-Manager
  • 6-Créer une machine virtuelle à distance
  • 7-Avantages/inconvénients du NAT
  • 8-Créer un pont réseau (bridge)

1-Qu'est-ce que KVM ?

KVM est un module de virtualisation conçu par Avi Kivity de la société Qumranet en 2006. La société ayant été racheté par Red Hat en 2008, ces derniers ont intégrer KVM comme module du noyau Linux depuis la version 2.6.20.

À l'origine, KVM était un fork de QEMU avec comme objectif d'apporter l’accélération matérielle. QEMU ayant été intégré au code-source de KVM, les deux sont devenus interdépendant.

Outre les processeurs x86/x64, il est compatible avec les processeurs PPC 440, PPC 970, S/390, ARM (Cortex A15, AArch64) et MIPS32.

KVM comme module du noyau Linux permet à ce dernier d'être un hyperviseur de type 1, ce qui en fais un concurrent direct de Xen, ESXi et Hyper-V. Il est utilisé dans de nombreuses solutions comme :

  • Proxmox VE
  • RHEV/Ovirt
  • OpenStack
  • CloudStack
  • OpenNebula
  • Nutanix

Ainsi que chez GCP, AWS et les fournisseurs alternatifs en ce qui concerne le cloud. C'est un hyperviseur qui est largement au delà des 9000 comme dirait Végéta.

Voici quelques articles pour en savoir plus.

La définition d'une machine virtuelle, les différents type de virtualisation ainsi que les technologies d'émulation et de virtualisation utilisés par Proxmox VE.

Virtual machine, full virtualization, paravirtualization, HAV, QEMU, KVM, késako ?
Un peu de vulgarisation pour les rookies

Une traduction du chapitre 1 et une partie du chapitre 2 du livre "Mastering KVM Second Edition" (2020) des éditions Packt qui est une leçon d'histoire sur la virtualisation sous Linux.

Comprendre la virtualisation sous Linux
Leçon d’histoire de la virtualisation sous Linux

Et enfin, une traduction d'un post trés détaillé sur la différence de performance entre une machine virtuelle et du bare metal.

A quel point KVM est-il performant ?
Traduction d’un post sur les performances d’une machine virtuelle KVM face à du bare metal.

2-Prérequis

Pour ce tutoriel, vous allez apprendre à installer QEMU/KVM sur un serveur Ubuntu et à créer des machines virtuelles à distance via le protocole SSH à travers l'interface graphique VMM (Virtual Machine Manager).

Il vous faut :

  • Ubuntu Server 22.04 LTS installé en bare-metal ou sous forme de machine virtuelle pour installer QEMU/KVM.
  • Ubuntu 22.04 LTS installé sur un poste client ou une machine virtuelle pour exécuter VMM et ssh-askpass

Aidez-vous de ce tutoriel si vous comptez faire de la virtualisation imbriquée ou suivez simplement la partie "Installation d'Ubuntu Server 20.04 LTS" si vous effectuer une installation bare-metal.

Virtualiser Ubuntu Server 22.04 LTS sur Proxmox VE
Guide d’installation de Ubuntu Server 22.04 LTS sur Proxmox VE avec mes meilleurs réglages.

Pour l'installation de la version cliente, suivez le guide de la chaîne Adrien LinuxTricks (j(ai pas encore rédiger de tutoriel pour le moment).

3-Installation de QEMU/KVM

Sur votre serveur Ubuntu 22.04 LTS, vous allez installer les paquets suivants :

sudo apt install virtinst bridge-utils libvirt-daemon-system qemu-kvm -y
  • qemu-kvm : l'émulateur QEMU et le module de virtualisation KVM
  • virtinst : permet de créer et cloner les machines virtuelles
  • bridge-utils : permet de créer des ponts réseaux (bridge)
  • libvirt-daemon-system : créer un processus de tâche de fond (daemon) pour libvirt (libvirtd) et permettre de communiquer avec lui
  • libvirt-clients : une librairie et une API pour gérer les machines virtuelles par le CLI en utilisant la commande "virsh" (virtual shell). Il est déjà inclus dans "libvirt-daemon" mais il fallait que je vous en parle.

Vérifiez le statut de libvirtd

systemctl status libvirtd 

Ajoutez l'utilisateur au groupe "kvm"

sudo usermod -aG kvm qemu-kvm

Dans "/var/lib/libvirt" se trouve le dossier "images" qui contient les ISO que vous allez devoir utiliser pour créer vos macines virtuelles.

Avec la commande "chown", changez le groupe du dossier "images" en passant de "root" à "kvm".

sudo chown :kvm /var/lib/libvirt/images

Appliquez des droits en lecture/écriture au dossier pour tout les membres du groupe "kvm" (g pour group et rw pour read/write).

sudo chmod g+rw /var/lib/libvirt/images

Créez également un dossier ISO pour stocker vos images.

sudo mkdir /var/lib/libvirt/images/ISO

Appliquez les droits ":kvm" au dossier.

sudo chown :kvm /var/lib/libvirt/images/ISO

Enfin, appliquez des droits en lecture/écriture au dossier pour tout les membres du groupe "kvm" (g pour group et rw pour read/write) au dossier "ISO".

sudo chmod g+rw /var/lib/libvirt/images/ISO

Profitez-en pour copier une ISO.

4-Générer une paire de clés privée/publique

Pour générer une paire de clés privée/publique, tapez la commande "ssh-keygen" en indiquant le chemin par défaut et un passphrase.

Enfin, copiez la clé SSH du poste client vers le serveur de virtualisation avec la commande "ssh-copy-id".

Pour plus de sécurité, retournez sur le serveur et modifiez le fichier /etc/ssh/sshd_config puis changez la valeur de PasswordAuthentication" par "no" pour empêcher la connexion par mot de passe et autoriser uniquement la connexion par clé publique/privée.

Redémarrez le service pour que les modifications soient prise en compte.

sudo systemctl restart sshd

5-Installation de Virt-Manager

Toujours sur le poste client, installez le paquet "virt-manager" qui est l'interface graphique pour gérer vos machines virtuelles.

sudo apt install virt-manager

Lorsque ce sera terminé, lancez VMM (Virtual Machine Manager) et cliquez sur "Fichier/Ajouter une connexion" puis indiquez les informations suivantes :

  • Hyperviseur : QEMU/KVM
  • Cochez "se connecter à l'hôte distant via SSH"
  • Nom d'utilisateur : le vôtre
  • Nom de l'hôte : son nom d'hôte ou son adresse IP

Puis cliquez sur "Connecter".

Puis cliquez sur QEMU/KVM: IP_ADDRESS (celle de votre serveur).

Félicitation!!!! Vous pouvez dorénavant créer des machines virtuelles sur votre serveur de virtualisation directement à partir de VMM.

6-Créer une machine virtuelle à distance

Maintenant, faites un clique-droit sur le serveur distant

Nommez le dossier "ISO" et choisissez le dossier "/var/lib/libvirt/ISO" pour stocker vos images.

Allez dans "Fichiers/Nouvelle machine virtuelle" et choisissez "Média d'installation local".

Cliquez sur parcourir, choisissez votre image dans le pool "ISO" et indiquez le système d'exploitation.

Indiquez la taille de la mémoire vive et le nom de cores que vous souhaitez allouer.

Indiquez la taille du disque.

Donnez un nom à votre machine virtuelle et cliquez sur "Terminer".

C'est tout pour aujourd'hui. Nous verrons dans la partie 2 comment mettre en place un pont réseau (bridge) et créer des machines virtuelles avec la commande "virsh".

Après avoir mis en place un serveur de virtualisation et activer la prise en main à distance, nous allons voir ensemble comment créer un pont réseau dis "bridge".

7-Qu'est-ce que le NAT ?

Par défaut, les machines virtuelles utilisent leur propre réseau via le NAT avec comme réseau 192.168.122.0/24, ce qui veux dire quelles ne vont pas dépendre du serveur DNS de votre réseau local.

Le NAT (Network Address Translation) permet de faire de la traduction d'adresses réseau.

Vous l'utiliser tout les jours sans même le savoir en naviguant sur internet.

Les appareils d'un réseau local avec des adresses IP sont dites "privés" (192.168.x.x, 172.x.x.x, 10.x.x.x). C'est à dire qu'elles ne sont ni uniques et ni routables à l'échelle d'internet.

Pour que vos appareils puissent communiqués avec internet, c'est à travers l'adresse IP publique de votre modem/routeur qui elle est unique et routable.

Les avantages :

  • Augmente le nombre d'adresses IP disponibles dans un réseau privé (très utile en entreprise)
  • Protège les machines d'une attaque directe car elles sont inaccessibles de l'extérieur

Les inconvénients :

  • Gourmand en ressources (mémoire, processeur)
  • Incompatible avec certains protocoles (IPSec)
  • Dégradation des performances sur la VOIP

Le NAT peut suffire si vous créez une machine virtuelle sur un PC bureautique ou portable. Vous pouvez vous connecté en SSH à vos machines virtuelles directement sur la machine hôte mais seront inaccessibles sur le réseau local.

Si vous souhaitez rendre accessible vos machines virtuelles au reste du réseau, créer un pont réseau sera préférable et c'est ce qu'on va voir ensemble.

8-Créer un pont réseau (bridge)

Avant de commencer, il faut savoir que la majorité des cartes réseaux supportent les ponts mais pas les cartes réseaux sans fils donc vérifiez bien si vos cartes sont compatibles.

Sur votre serveur de virtualisation, modifiez le fichier "00-installer-config.yaml".

Note : si vous avez une machine virtuelle sous cloud-init, ce sera le fichier "50-cloud-init.yaml".

  • bridges : on indique qu'on ajoute un pont
  • br0 : on donne au pont le nom "bridge 0"
  • interfaces : indiquez le nom de l'interface physique (eth0 dans l'exemple)
  • dhcp4 : activez le avec l'option "true" (on souhaite que les machines virtuelles recoivent une adresse IP du serveur DNS local)
  • addresses : indiquez l'adresse IP de l'hôte physique

Note : il y a d'autres options à utiliser mais cela fera surement l'objet d'un prochain tutoriel sur Ubuntu.

bridges:
    br0:
        interfaces: [eth0]
        dhcp4: true
        addresses:
        - 192.168.0.124/24

Cela devrait donner ceci.

Note : si vous trouvez "gateway4" à la place de "routes" dans la configuration de la carte réseau, vous aurez le message "gateway4 has been deprecated use default routes instead" qui indique qu'il est désormais déprécié et qu'il faut utiliser "routes" à la place pour indiquer la passerelle.

Appliquez la configuration avec la commande suivante.

sudo netplan apply

Tapez ensuite la commande "ip r" et vous allez trouver le pont "br0" dans la liste.

Retournez sur VMM, faites un clique-droit sur votre machine virtuelle et cliquez sur "Open".

Puis cliquez sur le point d'exclamation, sur l'interface réseau (NIC) et modifiez deux options dans "Virtual Network Interface"

  • Network source : choisissez "Bridged device" au lieu du "NAT"
  • Device name : indiquez le pont "br0"

Félicitation!!!! Désormais vos machines virtuelles seront visibles sur le réseau local et se verront attribuer une adresse IP par le serveur DNS.

Sources :

Mastering Ubuntu Server - Fourth Edition | Packt
Your one-stop resource to learn, configure and use Ubuntu 22.04 for your day-to-day operations and deployments