Machines KVM pour Vagrant sur Archlinux
19 sept. 2018
- Catégories
- DevOps & SRE
- Tags
- Arch Linux
- KVM
- Linux
- Virtualisation
- VM
- Vagrant
Ne ratez pas nos articles sur l'open source, le big data et les systèmes distribués, fréquence faible d’un email tous les deux mois.
Vagrant supporte différents providers pour gérer la virtualisation. Dans un environnement Linux, il est possible d’améliorer considérablement les performances des VMs en utilisant le provider libvirt et l’hyperviseur KVM.
Ce tutoriel permet de configurer un environnement Archlinux pour pouvoir utiliser libvirt comme provider Vagrant et de tester le succès de l’installation à l’aide d’un Vagrantfile basique. Si vous utilisez une autre distribution Linux que Archlinux, vous pouvez probablement suivre la même procédure.
libvirt est la bibliothèque utilisée pour gérer les machines virtuelles. Elle peut fonctionner avec de nombreux hyperviseurs, dont VirtualBox, VMWare Workstation, QEMU… Elle fait le lien entre le noyau, responsable de l’allocation des ressources (CPU, RAM, réseau…), et l’hyperviseur de la machine virtuelle. Elle fournit également l’API pour contrôler les états des machines virtuelles (démarrage, arrêt…). L’une des forces de Vagrant lors de l’utilisation de libvirt est qu’il démarre les machines en parallèle, accélérant ainsi le processus de démarrage.
QEMU est un outil d’émulation et de virtualisation. Il peut fonctionner seul ou utiliser l’optimisation avancée apportée par KVM. KVM (Kernel-based Virtual Machine) est un module du kernel Linux qui exploite la virtualisation matérielle, c’est-à-dire les fonctions spéciales du processeur conçues spécifiquement pour la virtualisation (par exemple Intel VT).
KVM vs Virtualbox
Pour avoir une idée des performances de Vagrant avec libvirt et KVM, comparons les avec VirtualBox au moment du démarrage. Nous avons créé un cluster de 5 machines virtuelles en utilisant à la fois QEMU/KVM et VirtualBox (lien vers le fichier Vagrantfile), voici les résultats :
Provider | VirtualBox | QEMU/KVM |
---|---|---|
vagrant up time | 3 min | 42 sec |
Les machines virtuelles sont également plus rapides lors de l’exécution grâce à KVM.
Prérequis
Vagrant doit être installé et fonctionnel sur votre environnement. Le guide d’installation est disponible dans la documentation officielle. Il est conseillé de ne pas utiliser de gestionnaire de paquets pour installer Vagrant (le paquet n’est pas à jour).
Installation des paquets nécessaires
libvirt a besoin de plusieurs paquets pour fonctionner avec Vagrant. Utilisez votre gestionnaire de paquet (ex : pacman) pour installer les paquets suivants : qemu
, ebtables
, dnsmasq
, bridge-utils
, virt-manager
, libvirt
.
sudo pacman -S qemu ebtables dnsmasq bridge-utils virt-manager libvirt
ebtables
est utilisé pour configurer les règles de pare-feu pour les trames Ethernet. dnsmasq
est un serveur DNS et DHCP requis par Vagrant lors de l’utilisation de libvirt. bridge-utils
est utilisé pour créer et gérer des connexions bridged (les briges permettent de relier plusieurs machines dans un même réseau global). Enfin, virt-manager
nous permettra de gérer les machines virtuelles via une interface graphique.
Démarrage du service libvirt
sudo systemctl start libvirtd
sudo systemctl enable libvirtd
Installation des plugins Vagrant
vagrant plugin install vagrant-mutate
vagrant plugin install vagrant-libvirt
vagagrant-mute
permet à Vagrant de convertir les boxes d’un hyperviseur à un autre (par exemple, d’une box Virtualbox à une box QEMU).
vagrant-libvirt
permet à Vagrant d’utiliser la bibliothèque libvirt.
Création d’un pool de disque pour la VM de test
Un pool de stockage est une quantité de stockage qui sera utilisée pour le volume des VMs. libvirt prend en charge plusieurs types de pool de stockage (pool de répertoires, pool de systèmes de fichiers, pool NFS, etc.). Vous pouvez voir plus de détails sur le site web de libvirt. La création de pools de stockage personnalisés pour vos machines virtuelles vous permet d’isoler les machines virtuelles et d’utiliser différents types de stockage.
Pour tester l’installation, nous allons créer un pool de répertoires (il utilise un répertoire de votre système de fichiers) pour héberger une VM de test. Vous pouvez suivre la même procédure pour créer d’autres pools de stockage.
Lancez virt-manager
et effectuez les actions suivantes :
- Ajouter la connexion QEMU/KVM :
- “Fichier”
- “Ajouter une connexion” :
- Hyperviseur : “QEMU/KVM”
- “Connexion automatique” activée
- “Connecter”
- Créer le pool de disque :
- Double-cliquez sur “QEMU/KVM”
- Onglet “Stockage”
- ”+ (Ajouter un pool)” en bas à gauche
- Étape 1 :
- Nom : “test-libvirt”
- Type : “dir : Répertoire des fichiers système”
- Étape 2 : par défaut
- “Terminer”
- Étape 1 :
- ”+ (Ajouter un pool)” en bas à gauche
Installation de la Vagrant box libvirt
La VM de test utilise l’OS CentOS 7. Il faut d’abord créer la Vagrant box centos/7
:
vagrant box add centos/7 --provider libvirt
Lancement de la VM de test
Copiez le Vagrantfile de test et lancez la VM :
git clone https://gist.github.com/9d2e81703701b8d2dbb3d8647d6b73e8.git libvirt-test
cd libvirt-test
vagrant up
Essayez de vous connecter en SSH sur la VM avec :
vagrant ssh test_machine
Si vous n’y arrivez pas c’est que l’installation a échoué… Si cela arrive n’hésitez pas à commenter ce poste en décrivant votre problème !
Conclusion
Nous avons configuré une alternative à la solution Virtualbox souvent utilisée. Comme vous pouvez le voir, c’est un peu complexe, avec plusieurs composants devant fonctionner correctement (QEMU, KVM, libvirt, plugins vagrant …). Cependant, l’utilisation de KVM via QEMU devrait vraiment améliorer les performances de vos machines virtuelles. Nous avons également un temps de démarrage plus rapide grâce au plugin libvirt qui effectue des lancements parallèles. Sur ce, bonne virtualisation !
Erreurs connues
Erreur :
Call to virDomainCreateWithFlags failed: internal error: Failed to load module '/usr/lib/libvirt/storage-file/libvirt_storage_file_gluster.so': libgfapi.so.0: Ne peut ouvrir le fichier d'objet partagé: Aucun fichier ou dossier de ce type
Solution : Pour régler le problème, installez qemu-block-gluster et redémarrez votre ordinateur :
yaourt -S qemu-block-gluster
Erreur :
A l’installation du plugin vagrant-libvirt
:
Bundler, the underlying system Vagrant uses to install plugins,
reported an error. The error is shown below. These errors are usually
caused by misconfigured plugin installations or transient network
issues. The error from Bundler is:
ERROR: Failed to build gem native extension.
current directory: ~/.vagrant.d/gems/2.5.1/gems/nokogiri-1.8.3/ext/nokogiri
/usr/bin/ruby -r ./siteconf20180702-5091-8tys0j.rb extconf.rb
checking if the C compiler accepts ... yes
Building nokogiri using system libraries.
pkg-config could not be used to find libxml-2.0
Please install either pkg-config or the pkg-config gem per
gem install pkg-config -v "~> 1.1"
pkg-config could not be used to find libxslt
Please install either pkg-config or the pkg-config gem per
gem install pkg-config -v "~> 1.1"
pkg-config could not be used to find libexslt
Please install either pkg-config or the pkg-config gem per
gem install pkg-config -v "~> 1.1"
ERROR: cannot discover where libxml2 is located on your system. please make sure pkg-config is installed.
* extconf.rb failed *
Could not create Makefile due to some reason, probably lack of necessary
libraries and/or headers. Check the mkmf.log file for more details. You may
need configuration options.
Provided configuration options:
--with-opt-dir
--without-opt-dir
--with-opt-include
--without-opt-include=${opt-dir}/include
--with-opt-lib
--without-opt-lib=${opt-dir}/lib
--with-make-prog
--without-make-prog
--srcdir=.
--curdir
--ruby=/usr/bin/$(RUBY_BASE_NAME)
--help
--clean
--use-system-libraries=true
--with-zlib-dir
--without-zlib-dir
--with-zlib-include
--without-zlib-include=${zlib-dir}/include
--with-zlib-lib
--without-zlib-lib=${zlib-dir}/lib
--with-xml2-dir
--without-xml2-dir
--with-xml2-include
--without-xml2-include=${xml2-dir}/include
--with-xml2-lib
--without-xml2-lib=${xml2-dir}/lib
--with-libxml-2.0-config
--without-libxml-2.0-config
--with-pkg-config
--without-pkg-config
--with-xslt-dir
--without-xslt-dir
--with-xslt-include
--without-xslt-include=${xslt-dir}/include
--with-xslt-lib
--without-xslt-lib=${xslt-dir}/lib
--with-libxslt-config
--without-libxslt-config
--with-exslt-dir
--without-exslt-dir
--with-exslt-include
--without-exslt-include=${exslt-dir}/include
--with-exslt-lib
--without-exslt-lib=${exslt-dir}/lib
--with-libexslt-config
--without-libexslt-config
To see why this extension failed to compile, please check the mkmf.log which can be found here:
~/.vagrant.d/gems/2.5.1/extensions/x86_64-linux/2.5.0/nokogiri-1.8.3/mkmf.log
extconf failed, exit code 1
Gem files will remain installed in ~/.vagrant.d/gems/2.5.1/gems/nokogiri-1.8.3 for inspection.
Results logged to ~/.vagrant.d/gems/2.5.1/extensions/x86_64-linux/2.5.0/nokogiri-1.8.3/gem_make.out
Solution : Installer le plugin pkg-config :
vagrant plugin install pkg-config