J’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
- Installation côté serveur
- Lancement initial
- Création d’un bridge
- Régler un problème avec rpcbind
- Préparer les images ISO
- Installation côté client
- Créer une machine virtuelle
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é Internetenp3s0
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.
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 !
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.
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
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.
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
Je ne peux pas vous dire. Je n’ai jamais vu de serveur avec une carte wifi.