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:
| Componente | Descripción | Debian y derivados | Fedora y derivados | OpenSUSE | Archlinux |
|---|---|---|---|---|---|
| Qemu/KVM | Núcleo hipervisor | qemu-kvm | qemu-kvm | qemu-kvm | qemu-base |
| Libvirt | Interfaz de usuario para KVM | libvirt-daemon-system | libvirt | libvirt | libvirt |
| virt-install | Utilidad de instalación de VMs | virtinst | virt-install | virt-install | virt-install |
| Qemu-img | Herramienta para crear y manipular imágenes de disco | qemu-utils | qemu-img | qemu-img | qemu-img |
| Bridge Utils | Herramientas para configurar interfaces de red | bridge-utils | no necesario | no necesario | no necesario |
| Virt-Viewer | Cliente gráfico para visualizar consola de VMs | virt-viewer | virt-viewer | virt-viewer | virt-viewer |
| virt-manager | Interfaz gráfica para gestionar VMs | virt-manager | virt-manager | virt-manager | virt-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:
- NAT: Las máquinas virtuales tendrán una IP de una red interna y saldrán al exterior a través del adaptador de red principal mediante NAT. Es la configuración por defecto en
libvirty no precisa de configuración adicional salvo en Debian. - Bridge: La máquina virtual tendrá una IP directamente asignada de la misma red que el host, lo que la hace accesible desde cualquier parte de la red y viceversa. Requiere configurar el adaptador de red principal como puente en
libvirt.
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ón | Valor documento |
|---|---|
| Interfaz física | <interfaz> |
| Bridge a crear | br0 |
| IP del bridge | a.b.c.d |
| Máscara de red / prefijo CIDR | 255.255.255.0 / 24 |
| Gateway | a.b.c.1 |
| DNS | 8.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