VM Linux sous Windows 10 avec vagrant et KVM
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
Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Hyper-V -AllEnable-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.
vagrant box add generic/oracle8vagrant 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 = <<-SCRIPTecho I am provisioning...dnf update -y
dnf install -y https://dl.fedoraproject.org/pub/epel/epel-release-latest-8.noarch.rpmdnf config-manager --add-repo=https://download.docker.com/linux/centos/docker-ce.repodnf config-manager --enable ol8_codeready_buildercurl -sSL https://get.rvm.io | bashsource /etc/profile.d/rvm.shrvm reloadrvm requirementsrvm install ruby-2.7.2rvm use 2.7.2 --default
systemctl disable firewalld.servicesystemctl stop firewalld.service
dnf module install virt -ydnf install virt-install virt-viewer libvirt qemu-kvm ruby-devel rsync gcc zlib-devel libvirt-devel curl git htop python3-pip python3-virtualenv cmake -ysystemctl start libvirtd.servicesystemctl enable libvirtd.serviceusermod -aG docker vagrantusermod -aG libvirt vagrantusermod -aG rvm vagrantsudo pip3 install ansible==2.9.15 ansible-lintdnf install -y https://releases.hashicorp.com/vagrant/2.2.14/vagrant_2.2.14_x86_64.rpm
dnf install docker-ce --nobest -ysystemctl start dockersystemctl enable dockergem install test-kitchen kitchen-vagrant kitchen-ansible kitchen-docker kitchen-verifier-serverspec serverspec
cd /tmp/dnf download --source krb5-libsrpm2cpio krb5*.rpm| cpio -imdVtar xf krb5*.gzcd krb5*/srcLDFLAGS='-L/opt/vagrant/embedded/' ./configuremakecp lib/libk5crypto.so.3 /opt/vagrant/embedded/lib64/
cd /tmp/;dnf download --source libsshrpm2cpio libssh*.rpm | cpio -imdVtar xf libssh*.xzmkdir buildcd buildcmake ../libssh-*/ -DOPENSSL_ROOT_DIR=/opt/vagrant/embedded/makesudo cp lib/libssh* /opt/vagrant/embedded/lib64/SCRIPT
$script2 = <<-SCRIPTCONFIGURE_ARGS="with-libvirt-include=/usr/include/libvirt with-libvirt-lib=/opt/vagrant/embedded/lib64/" vagrant plugin install vagrant-libvirtecho '. /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: falseend
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 :
vagrant up
Patience … Cela dure quelques minutes le temps de tout installer et configurer.
vagrant ssh
Vous devriez obtenir une invite de commande vagrant@csl. Vérifions que kvm fonctionne :
sudo systemctl status libvirtd.service
[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 :
vagrant box add centos/7vagrant init centos/7vagrant up
Au bout de quelques minutes vous devriez pouvoir vous connecter à votre VM dans la VM:
vagrant sshyum 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:
vagrant ssh-config
Je vous laisse lire ce tuto ↗ pour utiliser cette extension.