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

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.

7 réponses à Virtualisation avec KVM sous CentOS

  1. bearinus dit :

    Bonjour et merci beaucoup pour ce blog! vraiment très utile et bien écrit. je suis un jeune Centosien depuis quelques mois (venant d’OS X), et ce n’est pas toujours facile de s’y retrouver.

    Je voulais écrire ce message en privé, mais je ne trouve pas d’adresse mail sur le site.

    Je viens d’OS x, et je travaille dans la postproduction de film.

    Nous avons choisi de passer sous Centos parce que

    – le logiciel libre m’a toujours intéréssé et j’ai toujours gardé un oeil sur ce que qui s’y passait, mais j’ai toujours eu la flemme de me retrousser les manches (mais ça c’était avant)
    – la politique d’apple envers les pro est devenu complétement ingérable.
    – Da vinci resolve de Blackmagic devient un logiciel complet que l’on utilise pour tout en video aujourd’hui.
    – Blackmagic recommande CentOS comme distribution linux, même si pas mal de petits malins le font tourner sous debian sur leurs forums.

    seulement voila, dans un monde idéal, tout le monde travaille sur le meme logiciel et ils eurent beaucoup d’enfants…

    trouble fête… le trio des vieilles rombières de début d’alphabet, Adobe, Apple, Avid n’est pas près de lacher le morceau logiciel. Et nos partenaires externes sont toujours sur leurs logiciels..

    Jusqu’a maintenant on a donc un double boot, avec l’infernal windows… qui fait tourner Adobe, Avid… et un vestige d’apple sous forme d’un portable aux abois.

    je me rend compte aujourd’hui qu’avec KVM, on peut faire de la VM en utilisant les ressources du GPU… chose qui ne l’était pas il y a encore peu, et pour moi une VM était principalement pour installer un server peu gourmand en ressources graphiques.

    tout un monde semble possible… mais je ne saisi pas encore les rouages de l’installation.

    Si l’auteur de ce blog, voulait s’y pencher, ce serait un énorme plaisir d’échanger !

    Sinon, mise a part ça, encore merci pour tout ces articles, notamment celui sur SELinux, centos sur un macbook pro, etc… et si j’avais une recommandation c’est de regarder du coté de Docker (si ce n’est pas déjà fait). je m’y suis mis en même temps que Centos il y a une petite année pour installer un serveur Nextcloud, (quand je vous dis que la flemme c’est fini!) Docker c’est une philosophie particulière que j’ai mis un bon moment a comprendre mais qui ouvre encore un monde de possibilités assez incroyable!

    bonne journée a vous !

  2. TALAC dit :

    Bonjour

    Merci pour l’article super cool.
    Je virtualise sous vmware et la je veux essayé KVM( je me débats un peu en CENTOS).
    je suis sûr que ce tuto va m’y aidé.

    Merci, Merci.

  3. Thierry Boibary dit :

    bonjour,
    j’essaye d’installer KVM sous Centdos et je suis votre doc.
    j’arrive à la section : création d’un bridge
    je fais ifconfig sur ma machine hôte et j’obtiens :

    [root@dell-centos ~]# ifconfig
    lo: flags=73 mtu 65536
    inet 127.0.0.1 netmask 255.0.0.0
    inet6 ::1 prefixlen 128 scopeid 0x10
    loop txqueuelen 1000 (Boucle locale)
    RX packets 4 bytes 206 (206.0 B)
    RX errors 0 dropped 0 overruns 0 frame 0
    TX packets 4 bytes 206 (206.0 B)
    TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0

    p5p1: flags=4163 mtu 1500
    inet6 fe80::8f7b:4102:99d0:d6a1 prefixlen 64 scopeid 0x20
    ether 8c:ec:4b:04:38:df txqueuelen 1000 (Ethernet)
    RX packets 94 bytes 32148 (31.3 KiB)
    RX errors 0 dropped 0 overruns 0 frame 0
    TX packets 261 bytes 47022 (45.9 KiB)
    TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0

    virbr0: flags=4099 mtu 1500
    inet 192.168.122.1 netmask 255.255.255.0 broadcast 192.168.122.255
    ether 52:54:00:41:06:9c txqueuelen 1000 (Ethernet)
    RX packets 0 bytes 0 (0.0 B)
    RX errors 0 dropped 0 overruns 0 frame 0
    TX packets 0 bytes 0 (0.0 B)
    TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0

    wlp2s0: flags=4163 mtu 1500
    inet 192.168.1.45 netmask 255.255.255.0 broadcast 192.168.1.255
    inet6 fe80::7903:4eb7:9b54:c76b prefixlen 64 scopeid 0x20
    ether b0:52:16:12:5b:a3 txqueuelen 1000 (Ethernet)
    RX packets 26500 bytes 22659460 (21.6 MiB)
    RX errors 0 dropped 0 overruns 0 frame 0
    TX packets 25931 bytes 7237252 (6.9 MiB)
    TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0

    mon bridge virbr0 existe déjà.!!!
    j’ai installé KVM sur une machine Centos7
    cette machine est connectée à un switch lui meme connecté à une machine pfSense
    je n’ai qu’une interface ethernet sur cette machine hôte

    je ne comprends pas pourquoi le bridge et déjà configuré
    je ne cpùends pas quand vous parlez de 2 interfaces
    merci de m’éclairer

    • kikinovak dit :

      J’imagine que cela tient au fait que vous l’avez manifestement installé sur un ordinateur portable, avec NetworkManager qui gère tout ça “automagiquement”. Dans ce cas, utilisez simplement votre bridge existant, c’est tout.

  4. Boibary dit :

    bonjour,
    ma machine VM Centos7 sur KVM fonctionne mais j’ai besoin d’une explication
    ma VM est installée sur une machine host Centos7 qui posséde une carte wifi et une carte ethernet connectée à un server pfSense. les 2 fonctionnent tres bien mais sur ma VM je n’ai qu’une connexion ethernet et le wifi de la machine host n’est pas pris en charge. Pourquoi?
    merci

  5. bonjour,
    ma machine VM Centos7 sur KVM fonctionne mais j’ai besoin d’une explication
    ma VM est installée sur une machine host Centos7 qui posséde une carte wifi et une carte ethernet connectée à un server pfSense. les 2 fonctionnent tres bien mais sur ma VM je n’ai qu’une connexion ethernet et le wifi de la machine host n’est pas pris en charge. Pourquoi?
    merci

Laisser un commentaire

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

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.