Configurando KVM en Linux

Tengo en GitHub una guía escrita hace cuatro años sobre cómo instalar una máquina virtual Ubuntu Server bajo KVM y libvirt. Aparte de que está algo obsoleta, es incompleta, asume que ya tienes instalados los paquetes de sistema correspondientes. Y solamente habla de Ubuntu como anfitrión e invitado.

Voy a intentar corregir eso.

Instalando los paquetes necesarios

Partiendo de un sistema recién instalado, hacen falta los siguientes componentes y paquetes:

ComponenteDescripciónDebian y derivadosFedora y derivadosOpenSUSEArchlinux
Qemu/KVMNúcleo hipervisorqemu-kvmqemu-kvmqemu-kvmqemu-base
LibvirtInterfaz de usuario para KVMlibvirt-daemon-systemlibvirtlibvirtlibvirt
virt-installUtilidad de instalación de VMsvirtinstvirt-installvirt-installvirt-install
Qemu-imgHerramienta para crear y manipular imágenes de discoqemu-utilsqemu-imgqemu-imgqemu-img
Bridge UtilsHerramientas para configurar interfaces de redbridge-utilsno necesariono necesariono necesario
Virt-ViewerCliente gráfico para visualizar consola de VMsvirt-viewervirt-viewervirt-viewervirt-viewer
virt-managerInterfaz gráfica para gestionar VMsvirt-managervirt-managervirt-managervirt-manager

Solamente los cuatro primeros son obligatorios, pero “Bridge Utils” es necesario si queremos que las VM sean accesibles desde la red; sin ellos pueden conectar al exterior, pero el exterior no podrá conectar con ellas.

Post configuración

El servicio qemu:///session, que es el que utilizan los usuarios normales por defecto, crea todos los procesos con los privilegios del propio usuario, mientras que qemu:///system utiliza un usuario específico, libvirt-qemu que puede utilizar la red de manera efectiva.

Para habilitar que libvirt utilice la conexión correcta deberemos editar ${HOME}/.bash_profile (Fedora y derivados) o ${HOME}/.profile (otros) y añadir lo siguiente:

export LIBVIRT_DEFAULT_URI=qemu:///system

Además, debemos hacer a nuestro usuario miembro del grupo libvirt:

sudo usermod -aG libvirt ${USER}

Después tendremos que cerrar la sesión y volver a abrir una nueva.

Fedora, OpenSUSE, Archlinux y derivados

En sistemas Fedora, OpenSUSE, Archlinux y derivados, tendremos que habilitar y arrancar el servicio libvirtd:

systemctl enable --now libvirtd.service  # Con sudo si no somos root

Configurar la red para las máquinas virtuales

Hay dos opciones principales para configurar la red de las máquinas virtuales:

Configuración de Bridge

La configuración de Bridge implica cambiar la interfaz física del sistema anfitrión por una interfaz virtual de tipo Bridge. La configuración permanente depende de la distribución concreta.

En Debian y derivados, no es necesario reiniciar, pero es recomendable hacerlo.

Asumimos los siguientes valores:

DescripciónValor documento
Interfaz física<interfaz>
Bridge a crearbr0
IP del bridgea.b.c.d
Máscara de red / prefijo CIDR255.255.255.0 / 24
Gatewaya.b.c.1
DNS8.8.8.8

Configuración de Bridge en Ubuntu Server

Editaremos el fichero /etc/netplan/50-cloud-init.yml. En principio, tendrá un contenido similar a:

network:
  version: 2
  ethernets:
    <interfaz>:
      addresses:
        - a.b.c.d/24
      routes:
        - to: default
          via: a.b.c.1
      nameservers:
        addresses:
          - 8.8.8.8
        search:
          - local

Inhabilitaremos la configuración IP de la interfaz física y crearemos el puente br0 cambiando el fichero como sigue:

network:
  version: 2
  ethernets:
    <interfaz>:
      dhcp4: false
      dhcp6: false
  bridges:
    br0:
      interfaces:
        - <interfaz>
      parameters:
        stp: false
      addresses:   # De aquí para abajo, la configuración que tenía <interfaz>
        - a.b.c.d/24
      routes:
        - to: default
          via: a.b.c.1
      nameservers:
        addresses:
          - 8.8.8.8
        search:
          - local

Para activarlo, desde la consola, ejecutaremos netplan apply. Esto provoca un microcorte de red.

Configuración de Bridge en Debian

Editaremos el fichero /etc/network/interfaces. Tendrá un aspecto similar a este:

# This file describes the network interfaces available on your system
# and how to activate them. For more information, see interfaces(5).

source /etc/network/interfaces.d/*

# The loopback network interface
auto lo
iface lo inet loopback

# The primary network interface
allow-hotplug <interfaz>
iface <interfaz> inet static
  address a.b.c.d
  network a.b.c.0
  netmask 255.255.255.0
  gateway a.b.c.1
  dns-nameservers 8.8.8.8

Para crear el bridge, cambiaremos el modo de configuración de la interfaz física de static a manual y crearemos una nueva interfaz br0 de tipo bridge:

# This file describes the network interfaces available on your system
# and how to activate them. For more information, see interfaces(5).

source /etc/network/interfaces.d/*

# The loopback network interface
auto lo
iface lo inet loopback

# The primary network interface
allow-hotplug <interfaz>
iface <interfaz> inet manual

allow-hotplug br0
iface br0 inet static
  bridge_ports <interfaz>
  bridge_stp off
  address a.b.c.d   # De aquí para abajo, lo mismo que en la interfaz física anterior.
  network a.b.c.0
  netmask 255.255.255.0
  gateway a.b.c.1
  dns-nameservers 8.8.8.8

Para aplicar la configuración, ejecutaremos systemctl restart networking.service o reiniciando el sistema.

Configuración de Bridge en Fedora y derivados y OpenSUSE

A diferencia de Ubuntu y Debian, aquí no se edita un fichero. En su lugar, ejecutaremos comandos de nmcli como root. Además, es necesario reiniciar para que los cambios surtan efecto de manera correcta.

# Creamos la nueva conexión de tipo bridge
nmcli connection add type bridge ifname br0 con-name br0 bridge.stp off
# Configuramos la dirección IPv4
nmcli connection modify br0 ipv4.addresses a.b.c.d/24 ipv4.method manual ipv4.gateway a.b.c.1
# Configuramos el DNS, se pueden especificar varios separados por comas
nmcli connection modify br0 ipv4.dns 8.8.8.8 ipv4.dns-search local
# Borramos la conexión, esto cortará el acceso a la red:
# - OpenSUSE: el nombre de la conexión será "Wired connection 1" o similar.
# - Otros: el nombre de la conexión será el de la interfaz.
nmcli connection show # Comprobamos el nombre de la conexión ethernet.
nmcli connection delete "<conexión>"
# Configuramos la interfaz en el bridge
nmcli connection add type bridge-slave autoconnect yes ifname "<interfaz>" con-name "<interfaz>" master br0
# Reiniciamos
systemctl reboot

Configuración de Bridge en Archlinux con systemd-networkd

Si utilizamos NetworkManager, el procedimiento será el de Fedora/OpenSUSE.

Para configurar un bridge en Archlinux con systemd-networkd, primero debemos crear un archivo de configuración de dispositivo para el bridge y otro para la interfaz Ethernet que se unirá al bridge. Luego crearemos el archivo de configuración de red para el bridge.

Pero primero debemos eliminar el fichero de configuración de la interfaz:

rm "$(networkctl status <interfaz> --json short | jq -r .LinkFile)"

Luego, creamos el archivo de configuración para el bridge, /etc/systemd/network/10-br0.netdev:

[NetDev]
Name=br0
Kind=bridge

Y el archivo de configuración para la interfaz Ethernet que se unirá al bridge, /etc/systemd/network/20-uplink.network:

[Match]
Name=<interfaz>

[Network]
Bridge=br0

Por último, configuramos la red del bridge, /etc/systemd/network/30-br0.network:

[Match]
Name=br0

[Network]
Address=a.b.c.d/24
Gateway=a.b.c.1
DNS=8.8.8.8 # Podemos añadir más líneas DNS=

Finalmente, reiniciamos systemd-networkd.service, lo que provocará un corte de red:

systemctl restart systemd-networkd.service

Creación de máquinas virtuales en modo texto

Para crear máquinas virtuales en modo texto, utilizaremos virt-install y configuraremos el sistema operativo para que utilice consola serie (emulada). La línea de comandos necesaria depende de la distribución que deseemos instalar y el tipo de red a configurar, pero no de la distribución del sistema anfitrión.

Las instrucciones específicas de cada sistema huésped están en progreso.


Anterior Siguiente