logo vagrant kvm

Vagrant crea y ejecuta máquinas virtuales, apoyándose en proveedores de virtualización como Virtualbox, KVM, Docker, VMWare y otros 30 más. Siempre tenderá a arrancar la VM con Virtualbox a menos que le digamos explícitamente un proveedor específico. En esta guía explico cómo he montado Vagrant con el proveedor Libvirt KVM en Linux.


Instalación de KVM

Como no tenía KVM instlado seguí estos pasos en mi Desktop Linux (debian 11 - bullseye) para instalar KVM.

Soporte de virtualización en el Hardware

Primero compruebo que mi equipo soporta virtualización en el hardware. Busco “vmx” (Intel-VT) o “svm” (AMD-V) en la salida del comando:

luis@jupiter:~$ egrep --color -i "svm|vmx" /proc/cpuinfo
Busco 'vmx' (Intel-VT) o 'svm' (AMD-V)

En algunos modelos de CPU, el soporte de VT puede estar deshabilitado en la BIOS. Compruébalo para habilitarlo…

Otro método es usar el comando:

luis@jupiter:~$ lscpu | grep -i Virtualiz
Virtualización: VT-x


Instalación de KVM y las dependencias

Instalo KVM y todas las dependencias necesarias para configurar un entorno de virtualización.

luis@jupiter:~$ sudo apt install qemu qemu-kvm libvirt-clients libvirt-daemon-system virtinst bridge-utils


  • qemu - Un emulador y virtualizador de máquinas genérico,
  • qemu-kvm - Metapaquete de QEMU para soporte de KVM (es decir, virtualización completa de QEMU en hardware x86),
  • libvirt-clients - programas para la biblioteca libvirt,
  • libvirt-daemon-system - archivos de configuración del demonio de Libvirt,
  • virtinst - programas para crear y clonar máquinas virtuales,
  • bridge-utils - utilidades para configurar el Bridge Ethernet en Linux.

Arranco el servicio

Una vez instalado KVM arranco el servicio libvirtd:

$ sudo systemctl enable libvirtd
$ sudo systemctl start libvirtd

Añado mi usuario como parte del grupo libvirt

sudo adduser $LOGNAME libvirt

Verifico que está todo funcionando

$ systemctl status libvirtd
Compruebo los servicios

Instalo Virt-Manager y lo arranco. Aunque es el software indicado para gestionar VMs, en este apunte lo uso como monitor, me va a venir bien para ver cómo Vagrant las crea, arranca, para y destruye.

luis@jupiter:~$ sudo apt install virt-manager
Arranco el Gestor de VMs


¡Ya tenemos una instalación operativa donde podemos empezar a crear y manipular máquinas virtuales, con Vagrant!


Instalación de Vagrant.

Instalo vagrant y el plugin vagrant-libvirt.

luis@jupiter:~$ sudo apt update
luis@jupiter:~$ sudo apt upgrade -y
:
luis@jupiter:~$ sudo apt-get install vagrant-libvirt

Creo mi primera VM

Siempre en un directorio dedicado creo el fichero Vagrantfile y levanto mi primera VM, en este ejemplo un simple Vanilla Debian box.

Nota: Aquí tienes la lista de boxes (equipos) que puedes instalarte. Te recomiendo leer esta guía
luis@jupiter:~$ mkdir miproyecto
luis@jupiter:~$ cd miproyecto/
luis@jupiter:~/miproyecto$ vagrant init debian/buster64
A `Vagrantfile` has been placed in this directory. You are now
ready to `vagrant up` your first virtual environment! Please read
the comments in the Vagrantfile as well as documentation on
`vagrantup.com` for more information on using Vagrant.

luis@jupiter:~/miproyecto$ vagrant up --provider=libvirt
Desde el gestor vemos la VM

Pruebo a conectarme con la VM

luis@jupiter:~/miproyecto$ vagrant ssh
Linux buster 4.19.0-16-amd64 #1 SMP Debian 4.19.181-1 (2021-03-19) x86_64

The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.

Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
-bash: warning: setlocale: LC_ALL: cannot change locale (es_ES.UTF-8)
vagrant@buster:~$


Networking

Por defecto las máquinas virtuales con Vagrant se crean una red privada y usan DHCP. Yo prefiero usar IP fija para mi laboratorio, pero eso va por gustos y caso de uso. Estas son las configuraciones que suelo manejar:

Networking privado + IP fija, fichero Vagrantfile:

    # Networking Privado, con IP fija para que sea más fácil hacer SSH desde el Host.
    config.vm.network :private_network,
                      :ip => "10.20.30.40",
                      :libvirt__domain_name => "coder.local"

Networking público + IP fija, fichero Vagrantfile:

    # Networking Público, con IP fija 
    config.vm.network "public_network",
                      :dev => "br0",
                      :mode => "bridge",
                      :type => "bridge",
                      :ip => "192.168.1.100"

Ojo!… si vas a usar la versión de IP pública tienes que prearar el Host (tu servidor linux). Es necesario configurar la interfaz Ethernet con un bridge y recomiendo hacer una configuración manual (no usar NetworkManager o similar). Aquí tienes un ejemplo de lo que he hecho en Linux con Debian 11:

root@jupiter:~# cat /etc/network/interfaces.d/br0
#
# Configuración IP estática en interfaz principal Ethernet.
# Uso Vagrant con IP's públicas, necesito crear un Bridge
#
# Tras modificar este fichero: service networking restart
#
auto br0
iface br0 inet static
	address 192.168.1.200
	broadcast 192.168.1.255
	netmask 255.255.255.0
	gateway 192.168.1.1

	# Instalé también el paquete "resolvconf" para no tener que
	# editar el fichero /etc/resolv.conf sino que se ponga
	# la IP del DNS server desde aquí.
	dns-nameservers 192.168.1.253

	# Añado mi interfaz física al Bridge. Las interfaces que
	# configure con Vagrant en modo pública con IP fija se añadirán
	# serán añadidas a este bridge.
	#
	bridge_ports enp0s25
	bridge_stp off       # Deshabilito Spanning Tree Protocol
	bridge_waitport 0    # No espero antes de habilitar el puerto
	bridge_fd 0          # No meter ningún retardo en el forwarding
  • Instalo resolvconf y rearranco el servicio de networking
# apt install resolvconf
# service networking restart  (quizá necesites hacer reboot)


Caso de uso

En este repositorio en GitHub tienes un maquina virtual para desarrollo de software preparada con Vagrant. Además podrás encontrar en el apunte “Servicios Systemd de usuario” cómo ejecutar procesos de usuario durante el arranque del sistema, para arrancar esta máquina virtual con Vagrant durante el boot.