====== Vagrant + KVM ======
Por defecto Vagrant usa Virtualbox como tecnología de virtualización.
Aquí se va a documentar cómo usar KVM (libvirt) como tecnología de virtualización.
===== Instalación =====
1. Instalar KVM
https://computingforgeeks.com/install-kvm-centos-rhel-ubuntu-debian-sles-arch/
1.1. Instalar paquetes
sudo apt -y install libvirt-daemon libosinfo-bin libguestfs-tools libvirt-daemon-system qemu-kvm virtinst bridge-utils virt-top
1.2. Habilitar módulo de kernel
sudo modprobe vhost_net
1.3. Comprobar
Listar:
sudo lsmod | grep vhost
Salida esperada similar a:
vhost_net 20480 0
tun 28672 1 vhost_net
vhost 45056 1 vhost_net
macvtap 24576 1 vhost_net
1.4. Cargar el módulo cada vez que se reinicie el servidor
echo "vhost_net" | sudo tee -a /etc/modules
2. Instalar vagrant
https://computingforgeeks.com/install-latest-vagrant-on-ubuntu-debian-kali-linux/
2.1. Obtener la última versión
https://www.vagrantup.com/downloads.html
2.2. Instalar paquetes
sudo apt-get install wget
2.3. Descargar
VER="2.2.7"
wget https://releases.hashicorp.com/vagrant/${VER}/vagrant_${VER}_x86_64.deb
sudo dpkg -i vagrant_${VER}_x86_64.deb
2.4. Comprobar
vagrant --version
Resultado esperado similar a:
Vagrant 2.2.7
3. Istalar plugin libvirt para Vagrant
https://github.com/vagrant-libvirt/vagrant-libvirt
https://computingforgeeks.com/using-vagrant-with-libvirt-on-linux/
3.1. Instalar paquete
sudo apt-get install libvirt-dev build-essential
3.2. Instalar plugin desde vagrant
vagrant plugin install vagrant-libvirt
Resultado esperado similar a:
Installing the 'vagrant-libvirt' plugin. This can take a few minutes...
Building native extensions. This could take a while...
Fetching: fog-libvirt-0.7.0.gem (100%)
Fetching: vagrant-libvirt-0.0.45.gem (100%)
Installed the plugin 'vagrant-libvirt (0.0.45)'!
3.3. Comprobar
vagrant plugin list
Salida esperada similar a:
vagrant-libvirt (0.0.45, global)
4. Pasos adicionales antes de levantar máquinas virtuales
4.1. Añadir el usuario (en este ejemplo 'usuario') al grupo libvirt
sudo usermod -a -G libvirt usuario
4.2. Instalar paquetes NFS
sudo apt-get install nfs-common nfs-kernel-server
===== Crear máquina virtual =====
1. Crear vagrant file
En este caso lo haremos manualmente, pero se podría crear con:
vagrant init debian/testing64
Crear el archivo:
vim Vagrantfile
Con el siguiente contenido:
Vagrant.configure("2") do |config|
config.vm.define :test_vm do |test_vm|
test_vm.vm.box = "debian/testing64"
end
end
2. Crear la máquina virtual
vagrant up --provider=libvirt
3. Comprobar
3.1. Buscar la máquina virtual con virsh
sudo virsh list
Salida esperada similar a:
Id Name State
--------------------------------------
1 jenkins-node_test_vm running
3.2. Conectarse
vagrant ssh
Debemos estar dentro de la máquina
4. Limpieza
4.1. Salir de la máquina virtual
exit
4.2. Eliminar la máquina virtual
vagrant destroy
Pulsar 'y' y tecla 'enter'
===== Desinstalar por completo KVM + libvirt + vagrant =====
sudo service libvirtd stop
ps ax | grep libv
sudo killall /usr/sbin/dnsmasq
sudo apt-get purge libvirt* kvm qemu*
sudo rm -fr /etc/libvirt/
rm -fr ~/.vagrant*
sudo rm -fr /var/lib/libvirt/
sudo rm -fr /etc/apparmor.d/libvirt/
sudo rm -fr /var/run/libvirt/
rm -fr ~/.config/libvirt
sudo rm -fr ~/.vagrant*
sudo rm -fr /tmp/.vagrant*
sudo rm -fr ~/.cache/libvirt
Uninstalling Vagrant
https://www.vagrantup.com/docs/installation/uninstallation.html
sudo rm -rf /opt/vagrant
sudo rm -f /usr/bin/vagrant
sudo ip link set virbr1 down
sudo brctl delbr virbr1
===== Cambiar rango IPs de libvirt =====
/etc/libvirt/qemu/networks/vagrant-libvirt.xml
before
vagrant-libvirt
f9dd4e87-b07e-4722-a8a4-bd2b7bcd8aa5
sudo virsh net-edit vagrant-libvirt
vagrant-libvirt
f9dd4e87-b07e-4722-a8a4-bd2b7bcd8aa5
sudo service libvirtd stop
sudo ifconfig virbr1 down
sudo ip link set virbr1 down
sudo brctl delbr virbr1
sudo service libvirtd start
Bridge was NOT created...
Solution: start the network
sudo virsh net-start vagrant-libvirt
If still issues, try to stop/start the libvirt network:
sudo virsh net-destroy vagrant-libvirt
sudo virsh net-start vagrant-libvirt
Then check editing it:
sudo virsh net-edit vagrant-libvirt
===== Errores =====
==== ERROR: Failed to build gem native extension. ====
Error completo:
Vagrant failed to properly resolve required dependencies. These
errors can commonly be caused by misconfigured plugin installations
or transient network issues. The reported error is:
ERROR: Failed to build gem native extension.
current directory: /home/usuario/.vagrant.d/gems/2.4.9/gems/ruby-libvirt-0.7.1/ext/libvirt
/opt/vagrant/embedded/bin/ruby -r ./siteconf20200323-36563-y7sayr.rb extconf.rb
*** 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
--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=/opt/vagrant/embedded/bin/$(RUBY_BASE_NAME)
--with-libvirt-include
--without-libvirt-include
--with-libvirt-lib
--without-libvirt-lib
--with-libvirt-config
--without-libvirt-config
--with-pkg-config
--without-pkg-config
extconf.rb:73:in `': libvirt library not found in default locations (RuntimeError)
To see why this extension failed to compile, please check the mkmf.log which can be found here:
/home/usuario/.vagrant.d/gems/2.4.9/extensions/x86_64-linux/2.4.0/ruby-libvirt-0.7.1/mkmf.log
extconf failed, exit code 1
Gem files will remain installed in /home/usuario/.vagrant.d/gems/2.4.9/gems/ruby-libvirt-0.7.1 for inspection.
Results logged to /home/usuario/.vagrant.d/gems/2.4.9/extensions/x86_64-linux/2.4.0/ruby-libvirt-0.7.1/gem_make.out
1. Obtner el error exacto. En este caso:
cat /home/usuario/.vagrant.d/gems/2.4.9/extensions/x86_64-linux/2.4.0/ruby-libvirt-0.7.1/mkmf.log
Salida esperada similar a:
"pkg-config --exists libvirt"
package configuration for libvirt is not found
2. Instalar paquete:
sudo apt-get install libvirt-dev
==== Error while connecting to libvirt: Error making a connection to libvirt URI qemu:///system?no_verify=1&keyfile=/home/usuario/.ssh/id_rsa: ====
Error completo:
Error while connecting to libvirt: Error making a connection to libvirt URI qemu:///system?no_verify=1&keyfile=/home/usuario/.ssh/id_rsa:
Call to virConnectOpen failed: authentication unavailable: no polkit agent available to authenticate action 'org.libvirt.unix.manage'
Solución:
Añadir el usuario al grupo 'libvirt'. En este ejemplo:
sudo usermod -a -G libvirt usuario
==== It appears your machine doesn't support NFS, or there is not an ====
Error completo:
It appears your machine doesn't support NFS, or there is not an
adapter to enable NFS on this machine for Vagrant. Please verify
that `nfsd` is installed on your machine, and try again. If you're
on Windows, NFS isn't supported. If the problem persists, please
contact Vagrant support.
Solución:
sudo apt-get install nfs-common nfs-kernel-server
==== Volume for domain is already created. Please run 'vagrant destroy' first. ====
Causa:
Existe un volumen de libvirt con el mismo nombre "default", probablemente porque no se ejecutó el "vagrant destroy" para hacer limpia con la VM
Solución:
Primero intentar:
vagrant destroy
Y re-intentar:
vagrant up
Si eso no funciona:
1. (Desde el docker host) Obtener el detalle de los volúmenes libvirt
sudo virsh vol-list default
Salida esperada similar a:
Name Path
------------------------------------------------------------------------------------------------------------------------------------------------
container__default.img /var/lib/libvirt/images/container__default.img
debian-VAGRANTSLASH-buster64_vagrant_box_image_10.3.0.img /var/lib/libvirt/images/debian-VAGRANTSLASH-buster64_vagrant_box_image_10.3.0.img
docker_default.img /var/lib/libvirt/images/docker_default.img
2. Suprimir el volumen.
**TODO**: dar más pistas de cómo determinar exactamente el volumen a eliminar
sudo virsh vol-delete container__default.img default
Salida esperada similar a:
Vol container__default.img deleted
3. Volver a probar:
vagrant up