Aller au contenu

VM Linux sous Windows 10 avec vagrant et KVM

logo

Il y a quelques jours, je vous proposais un tutorial pour installer un VM de dev sur votre poste Windows en utilisant multipass de Canonical. Mais voilà du coup on se retrouve avec une distribution Ubuntu.

J’ai donc revu ma copie et je vous livre un nouveau tutoriel avec cette vagrant en provisionner sous windows avec une distribution Oracle Linux 8.

Comme pour la version avec Multipass cet environnement doit être simple à mettre en œuvre et surtout rapide. On y trouve tout ce qu’il faut pour développer des rôles ansible, de tester ses containers, d’installer des VM, …

  • ansible
  • kitchen avec serverpec
  • docker
  • kvm
  • vagrant

Pour la rapidité ça demeure acceptable, car pour faire fonctionner le plugin vagrant-libvirt j’ai dû recompiler des librairies.

Installation des produits nécessaires : hyperv, cifs et vagrant

Prérequis :

  • Windows 10 Entreprise, Professionnel ou Éducation
  • Processeur 64 bits avec traduction d’adresse de second niveau (SLAT).
  • Processeur prenant en charge les extensions de mode du moniteur de machine virtuelle (VT-c sur les processeurs Intel).
  • Au minimum 4 Go de mémoire.

Activation d’hyper-v et SMB/CIFS

Dans un premier temps il faut activer hyper-v et le partage SMB/CIFS sur votre poste Windows. Dans une fenêtre Powershell ouverte en tant qu’administrateur, taper les commandes suivantes

Terminal window
Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Hyper-V -All
Enable-WindowsOptionalFeature -Online -FeatureName SMB1Protocol

Installation de Vagrant

Vous pouvez télécharger la dernière version de Vagrant d’hashicorp sur la page vagrantup

Création de la première VM

Vagrant oblige de lancer ses commandes dans une fenêtre powershell avec les droits admin.

Terminal window
vagrant box add generic/oracle8
vagrant init generic/oracle8

Pour créer ma VM de dev je vais utiliser cette fois un shell script car le support de cloud-init dans vagrant est encore en test.

Éditer votre fichier Vagrantfile et ajouter ceci :

$script = <<-SCRIPT
echo I am provisioning...
dnf update -y
dnf install -y https://dl.fedoraproject.org/pub/epel/epel-release-latest-8.noarch.rpm
dnf config-manager --add-repo=https://download.docker.com/linux/centos/docker-ce.repo
dnf config-manager --enable ol8_codeready_builder
curl -sSL https://get.rvm.io | bash
source /etc/profile.d/rvm.sh
rvm reload
rvm requirements
rvm install ruby-2.7.2
rvm use 2.7.2 --default
systemctl disable firewalld.service
systemctl stop firewalld.service
dnf module install virt -y
dnf install virt-install virt-viewer libvirt qemu-kvm ruby-devel rsync gcc zlib-devel libvirt-devel curl git htop python3-pip python3-virtualenv cmake -y
systemctl start libvirtd.service
systemctl enable libvirtd.service
usermod -aG docker vagrant
usermod -aG libvirt vagrant
usermod -aG rvm vagrant
sudo pip3 install ansible==2.9.15 ansible-lint
dnf install -y https://releases.hashicorp.com/vagrant/2.2.14/vagrant_2.2.14_x86_64.rpm
dnf install docker-ce --nobest -y
systemctl start docker
systemctl enable docker
gem install test-kitchen kitchen-vagrant kitchen-ansible kitchen-docker kitchen-verifier-serverspec serverspec
cd /tmp/
dnf download --source krb5-libs
rpm2cpio krb5*.rpm| cpio -imdV
tar xf krb5*.gz
cd krb5*/src
LDFLAGS='-L/opt/vagrant/embedded/' ./configure
make
cp lib/libk5crypto.so.3 /opt/vagrant/embedded/lib64/
cd /tmp/;
dnf download --source libssh
rpm2cpio libssh*.rpm | cpio -imdV
tar xf libssh*.xz
mkdir build
cd build
cmake ../libssh-*/ -DOPENSSL_ROOT_DIR=/opt/vagrant/embedded/
make
sudo cp lib/libssh* /opt/vagrant/embedded/lib64/
SCRIPT
$script2 = <<-SCRIPT
CONFIGURE_ARGS="with-libvirt-include=/usr/include/libvirt with-libvirt-lib=/opt/vagrant/embedded/lib64/" vagrant plugin install vagrant-libvirt
echo '. /usr/local/rvm/scripts/rvm' >>/home/vagrant/.bashrc
SCRIPT
Vagrant.configure("2") do |config|
config.vm.box = "generic/oracle8"
config.vm.provider "hyperv" do |hv|
hv.enable_virtualization_extensions = true
hv.linked_clone = false
hv.cpus = "4"
hv.memory = "2048"
hv.vmname = "csl"
end
config.vm.synced_folder ".", "/vagrant", disabled: true
config.vm.define "csl" do |csl|
csl.vm.network "public_network"
csl.vm.hostname = "csl"
end
config.vm.provision "shell", inline: $script
config.vm.provision "shell", inline: $script2, privileged: false
end

Eh oui rien que ça:

  • Pas besoin d’activer la fonctionnalité de virtualisation imbriquée, car elle est faite avec l’option enable_virtualization_extensions = true

  • Laisser bien le paramètre hv.linked_clone à false sinon vous ne pourrez pas packager votre box pour la distribuer.

  • On ne peut pas fixer l’adresse IP, mais vous verrez on peut récupérer la config ssh de vagrant facilement.

  • On a deux scripts

  • un premier qui s’exécute avec le compte root

  • un second avec le user vagrant pour installer en local le plugin vagrant-libvirt

  • fixer la version de ruby

Ce fichier permet de :

Maintenant lançons le provisionnement de la VM :

Terminal window
vagrant up

Patience … Cela dure quelques minutes le temps de tout installer et configurer.

Terminal window
vagrant ssh

Vous devriez obtenir une invite de commande vagrant@csl. Vérifions que kvm fonctionne :

Terminal window
sudo systemctl status libvirtd.service
Terminal window
[vagrant@csl ~]$ sudo systemctl status libvirtd
libvirtd.service - Virtualization daemon
Loaded: loaded (/usr/lib/systemd/system/libvirtd.service; enabled; vendor preset: enabled)
Active: active (running) since Thu 2021-01-14 12:03:20 UTC; 6s ago
Docs: man:libvirtd(8)
https://libvirt.org
Main PID: 97188 (libvirtd)
Tasks: 19 (limit: 32768)
Memory: 51.5M
CGroup: /system.slice/libvirtd.service
├─76006 /usr/sbin/dnsmasq --conf-file=/var/lib/libvirt/dnsmasq/default.conf --leasefile-ro --dhcp-script=/usr/libexec/libvirt_leaseshelper
├─76007 /usr/sbin/dnsmasq --conf-file=/var/lib/libvirt/dnsmasq/default.conf --leasefile-ro --dhcp-script=/usr/libexec/libvirt_leaseshelper
└─97188 /usr/sbin/libvirtd --timeout 120

Vous devriez obtenir active (running) :

Création de VM avec un fichier vagrantfile

Toujours dans votre VM dev tapez les commandes suivantes, au moment du choix d’hyperviseur prenez bien libvirt :

Terminal window
vagrant box add centos/7
vagrant init centos/7
vagrant up

Au bout de quelques minutes vous devriez pouvoir vous connecter à votre VM dans la VM:

Terminal window
vagrant ssh
yum update

Et voilà.

Accès à votre VM depuis visual code (installé sur Windows)

On va tout simplement utiliser l’extension Remote SSH. Installer la. Pour configurer l’accès il faut juste récupérer la config ssh de vagrant:

Terminal window
vagrant ssh-config

Je vous laisse lire ce tuto pour utiliser cette extension.