Virtualisation avec KVM sous CentOS

Virtualisation KVMJ’ai parfois besoin de construire des paquets pour différentes distributions Linux, avec des versions et des architectures qui peuvent également varier. Les solutions multiboot ne sont pas ce qu’il y a de plus simple à mettre en oeuvre, sans oublier le manque de flexibilité. J’ai également testé la virtualisation avec VirtualBox, qui pose d’autres contraintes. La meilleure solution consiste ici à mettre en place une série de machines virtuelles avec Qemu/KVM et LibVirt.

Dans cet article, je décris la mise en place d’un hôte KVM (également appelé hyperviseur) dans mon réseau local et d’une série de machines virtuelles installées sur cet hôte. Nous allons éviter de nous compliquer la vie avec les myriades d’options en ligne de commande de Qemu. Au lieu de cela, nous allons profiter des fonctionnalités de LibVirt et de Virt-Manager, qui nous faciliteront considérablement la tâche.

Il serait aisé d’écrire un ou même plusieurs gros livres sur le sujet de la virtualisation avec KVM, ce qui a d’ailleurs été fait. Ce tutoriel est conçu avant tout pour une prise en main de KVM par la pratique.

Prérequis

La virtualisation doit être activée dans le BIOS. Sur mon serveur HP, l’option correspondante est bien cachée dans le sous-menu Security > System Security > Virtualization Technology du BIOS. Dans certains cas, l’option peut même se trouver dans le sous-menu Power. Dans un cas comme dans l’autre, il faudra choisir Enable.

Pour que Qemu/KVM ait des performances acceptables, il faut vérifier que notre processeur soit compatible avec les extensions de virtualisation. Sous Linux, il est facile de vérifier cela avec la commande suivante.

$ egrep '^flags.*(vmx|svm)' /proc/cpuinfo >/dev/null && echo OK
OK

Le serveur peut donc supporter la virtualisation hardware.

Attention tout de même, ça ne marche pas sur une Dedibox SC de chez Online. Le processeur VIA affiche des capacités KVM sans en être capable dans la pratique. Cette anomalie fâcheuse m’a coûté un après-midi entier à m’arracher les cheveux face à une série de plantages inexplicables.

Pour éviter d’avoir à saisir des mots de passe à répétition, il est fortement recommandé de configurer l’authentification par clé SSH depuis le poste client vers le serveur KVM.

$ ssh-copy-id -i .ssh/id_rsa.pub root@nestor.microlinux.lan

Installation côté serveur

CentOS fournit certes un groupe de paquets Virtualization, mais je préfère voyager léger, et je n’installe que le minimum syndical sur le serveur.

# yum install qemu-kvm libvirt

Un redémarrage n’est pas vraiment nécessaire, mais je le fais quand-même pour voir si le module kvm est chargé automatiquement.

# lsmod | grep kvm
kvm_amd                64937  0 
kvm                   554609  1 kvm_amd
irqbypass              13503  1 kvm

Bien évidemment, rien n’empêche de charger le module manuellement.

# modprobe kvm

Lancement initial

Activer et démarrer libvirtd et afficher l’état du démon.

# systemctl enable libvirtd
# systemctl start libvirtd
# systemctl status libvirtd

Le journal affiche une erreur quant à l’interface réseau utilisée. Sans trop rentrer dans les détails, nous devons remédier à cela en créant un pont.

Création d’un bridge

Dans la configuration par défaut, mon serveur dispose de deux interfaces réseau.

  • enp2s0 côté Internet
  • enp3s0 côté réseau local

Pour créer un pont (ou bridge), je vais d’abord éditer /etc/sysconfig/network-scripts/ifcfg-enp3s0.

DEVICE=enp3s0
TYPE=Ethernet
ONBOOT=yes
BRIDGE=virbr0

Ce bridge recevra la configuration de l’ancienne interface enp3s0. Pour ce faire, il faudra créer un fichier /etc/sysconfig/network-scripts/ifcfg-virbr0 et l’éditer comme ceci.

DEVICE=virbr0
TYPE=Bridge
ONBOOT=yes
BOOTPROTO=static
IPADDR=192.168.2.1
NETMASK=255.255.255.0

Étant donné que l’interface réseau côté LAN s’appelle désormais virbr0 et non plus enp3s0, il faudra modifier la configuration du serveur en conséquence, en l’occurrence le pare-feu et la configuration de Dnsmasq.

J’ai supprimé le pare-feu à la sauce Red Hat firewalld, que j’ai remplacé par un simple script iptables. Ce script sera donc modifié comme ceci.

#!/bin/sh
#
# firewall.sh

# Commandes
IPT=/usr/sbin/iptables
MOD=/usr/sbin/modprobe
SYS=/usr/sbin/sysctl
SERVICE=/usr/sbin/service

# Internet
IFACE_INET=enp2s0

# Réseau local
IFACE_LAN=virbr0
IFACE_LAN_IP=192.168.2.0/24

Je procède de même avec Dnsmasq et je renomme l’interface côté réseau local.

# /etc/dnsmasq.conf
domain-needed
bogus-priv
interface=virbr0
dhcp-range=192.168.2.100,192.168.2.200,24h

À partir de là, je peux redémarrer le serveur.

Régler un problème avec rpcbind

Le redémarrage se solde par l’erreur suivante.

# systemctl --failed
  UNIT           LOAD   ACTIVE SUB    DESCRIPTION
● rpcbind.socket loaded failed failed RPCbind Server Activation 
  Socket

Après une recherche Google, le problème s’avère être lié à la désactivation de l’IPv6 sur mon serveur. La solution consiste ici à forcer la reconstruction du disque mémoire initial.

# dracut -f

Au prochain redémarrage, le problème semble être résolu.

# systemctl status
● nestor
    State: running

Préparer les images ISO

Sur le serveur, on utilisera principalement des fichiers ISO pour installer les machines virtuelles. Dans la configuration par défaut, ces images sont censées être rangées dans le répertoire /var/lib/libvirt/images. On pourra les attribuer à l’utilisateur système qemu et au groupe système du même nom.

# ls -lh /var/lib/libvirt/images/
total 18G
-rw-r--r--. 1 qemu qemu 2,3G 11 mai 11:32 slackware-14.0.iso
-rw-r--r--. 1 qemu qemu 3,6G 11 mai 11:34 slackware-14.1.iso
-rw-r--r--. 1 qemu qemu 2,7G 11 mai 11:34 slackware-14.2.iso
-rw-r--r--. 1 qemu qemu 2,3G 11 mai 11:35 slackware64-14.0.iso
-rw-r--r--. 1 qemu qemu 3,7G 11 mai 11:36 slackware64-14.1.iso
-rw-r--r--. 1 qemu qemu 2,6G 11 mai 11:37 slackware64-14.2.iso

Installation côté client

Le serveur ne dispose pas d’interface graphique, et nous allons éviter de nous compliquer la vie en gérant les machines virtuelles en ligne de commande. Au lieu de cela, nous allons confortablement piloter Qemu/KVM en mode graphique depuis un poste client tournant sous CentOS 7 et muni de l’environnement de bureau KDE. Virt-Manager constitue sans doute l’interface la plus confortable.

# yum install virt-manager openssh-askpass ksshaskpass

Fermer et relancer la session KDE pour permettre l’intégration de Virt-Manager avec KWallet.

Créer une machine virtuelle

Démarrer le gestionnaire de machines virtuelles.

Configurer une connexion à l’hyperviseur via Fichier > Ajouter une connexion. Dans mon réseau, la connexion s’établit depuis ma station de travail.

La connexion à l’hyperviseur est établie.

Un clic droit sur l’hôte permet de créer une nouvelle machine virtuelle.

Pour installer notre machine virtuelle, nous utiliserons un fichier ISO rangé sur le serveur.

Nous choisissons l’image ISO dans la liste des fichiers disponibles.

Slackware Linux ne figure pas dans la liste des systèmes d’exploitation. Je garde donc la dénomination Generic.

Je définis la quantité de RAM et le nombre de processeurs pour ma machine virtuelle.

Je procède de même pour l’espace disque disponible.

La fenêtre subséquente me permet de choisir un nom pour ma machine virtuelle. Je prends soin de cocher Personnaliser la configuration avant l’installation pour peaufiner quelques détails importants. Le pont virbr0 constituera l’interface réseau partagée entre l’hôte et la machine virtuelle.

La vue d’ensemble sur la configuration de la machine virtuelle s’affiche.

Je spécifie le périphérique virtio pour la carte réseau. J’ai également la possibilité de personnaliser l’adresse MAC de la carte réseau.

Je remplace la carte vidéo QXL définie par défaut par un modèle VGA.

Une astuce consiste ici à ajouter une tablette graphique à la machine virtuelle, ce qui évite les mouvements de souris saccadés et aléatoires si jamais on utilise une interface graphique.

Il ne reste plus qu’à cliquer sur Commencer l’installation en haut à gauche de la fenêtre.

Si l’on utilise KVM en mode plein écran, la combinaison de touches [Ctrl]+[Alt] permet de récupérer le focus de la souris.

Ce contenu a été publié dans CentOS, Documentation Microlinux, avec comme mot(s)-clé(s) , , . Vous pouvez le mettre en favoris avec ce permalien.

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *