Guía Completa: Instalación y Configuración de Máquinas Virtuales en Debian con QEMU y KVM

Máquinas virtuales ejecutándose en un servidor Linux

La virtualización es una tecnología fundamental en el mundo moderno de la infraestructura IT. QEMU (Quick Emulator) es un emulador de hardware y virtualizador de código abierto que, combinado con KVM (Kernel-based Virtual Machine), te permite ejecutar máquinas virtuales con aceleración por hardware para obtener un rendimiento casi nativo.

En esta guía completa, aprenderás a instalar, configurar y gestionar máquinas virtuales en Debian utilizando QEMU y KVM, desde la configuración básica hasta técnicas avanzadas de administración.

¿Qué es QEMU y KVM?

QEMU (Quick Emulator)

  • Emulador completo de sistemas x86, ARM, SPARC y otras arquitecturas
  • Virtualizador cuando se combina con KVM para aceleración por hardware
  • Herramienta versátil para desarrollo, testing y producción

KVM (Kernel-based Virtual Machine)

  • Módulo del kernel Linux que proporciona aceleración por hardware
  • Rendimiento nativo para máquinas virtuales
  • Seguridad mejorada con aislamiento a nivel de kernel

Ventajas de QEMU + KVM:

  • Alto rendimiento con aceleración por hardware
  • Flexibilidad para múltiples arquitecturas
  • Código abierto y ampliamente soportado
  • Integración nativa con Linux
  • Escalabilidad para entornos enterprise

🔧 Preparativos Iniciales

Verificar Soporte de Virtualización

Antes de comenzar, es crucial verificar que tu hardware soporta virtualización:

# Verificar soporte de virtualización en CPU
egrep -c '(vmx|svm)' /proc/cpuinfo

# Si el resultado es > 0, tu CPU soporta virtualización
# vmx = Intel VT-x
# svm = AMD-V
# Verificar con más detalle
lscpu | grep Virtualization

# Verificar que los módulos KVM están disponibles
lsmod | grep kvm

Importante: Si no hay salida, necesitas habilitar la virtualización en la BIOS/UEFI:

  • Intel: Busca “Intel VT-x” o “Virtualization Technology”
  • AMD: Busca “AMD-V” o “SVM Mode”

Actualizar el Sistema

# Actualizar sistema completo
sudo apt update && sudo apt upgrade -y

# Instalar paquetes básicos necesarios
sudo apt install -y cpu-checker curl wget gnupg2

📦 Instalación de QEMU y KVM

Paso 1: Instalar Paquetes Principales

# Instalar QEMU, KVM y herramientas de gestión
sudo apt install -y \
    qemu-kvm \
    libvirt-daemon-system \
    libvirt-clients \
    bridge-utils \
    virt-manager \
    virt-viewer \
    qemu-utils \
    ovmf

Descripción de paquetes:

  • qemu-kvm: Virtualizador QEMU con soporte KVM
  • libvirt-daemon-system: Daemon de gestión de virtualización
  • libvirt-clients: Herramientas cliente para libvirt
  • bridge-utils: Utilidades para configurar bridges de red
  • virt-manager: Interfaz gráfica para gestión de VMs
  • virt-viewer: Cliente para acceder a consolas de VMs
  • qemu-utils: Utilidades adicionales de QEMU
  • ovmf: Firmware UEFI para VMs

Paso 2: Configurar Servicios

# Habilitar e iniciar servicios libvirt
sudo systemctl enable libvirtd
sudo systemctl start libvirtd

# Verificar estado del servicio
sudo systemctl status libvirtd

Paso 3: Configurar Permisos de Usuario

# Agregar usuario a grupos necesarios
sudo usermod -aG libvirt $USER
sudo usermod -aG kvm $USER

# Verificar membresía de grupos
groups $USER

# Aplicar cambios (requiere logout/login)
newgrp libvirt

✅ Verificación de la Instalación

Comprobar Aceleración por Hardware

# Verificar que KVM funciona correctamente
sudo kvm-ok

# Salida esperada:
# INFO: /dev/kvm exists
# KVM acceleration can be used
# Verificar módulos KVM cargados
lsmod | grep kvm

# Salida esperada (Intel):
# kvm_intel    245760  0
# kvm          737280  1 kvm_intel

# Salida esperada (AMD):
# kvm_amd      245760  0
# kvm          737280  1 kvm_amd

Verificar Redes Virtuales

# Listar redes virtuales
sudo virsh net-list --all

# Iniciar red por defecto si no está activa
sudo virsh net-start default
sudo virsh net-autostart default

🚀 Creación de Máquinas Virtuales

Método 1: Usando virt-manager (Interfaz Gráfica)

# Abrir gestor gráfico
virt-manager

Pasos en virt-manager:

  1. Clic en “Crear nueva máquina virtual”
  2. Seleccionar fuente de instalación (ISO, PXE, etc.)
  3. Configurar memoria RAM y CPUs
  4. Configurar almacenamiento
  5. Configurar red
  6. Revisar y finalizar

Método 2: Línea de Comandos con virt-install

# Crear VM desde ISO
sudo virt-install \
    --name debian-vm \
    --ram 2048 \
    --disk path=/var/lib/libvirt/images/debian-vm.qcow2,size=20 \
    --vcpus 2 \
    --os-type linux \
    --os-variant debian11 \
    --network bridge=virbr0 \
    --graphics vnc,listen=0.0.0.0 \
    --console pty,target_type=serial \
    --location 'http://deb.debian.org/debian/dists/bullseye/main/installer-amd64/' \
    --extra-args 'console=ttyS0,115200n8 serial'

Parámetros explicados:

  • --name: Nombre de la VM
  • --ram: Memoria RAM en MB
  • --disk: Ruta y tamaño del disco virtual
  • --vcpus: Número de CPUs virtuales
  • --os-variant: Optimizaciones específicas del OS
  • --network: Configuración de red
  • --graphics: Tipo de interfaz gráfica

Método 3: QEMU Directo (Avanzado)

# Crear imagen de disco
qemu-img create -f qcow2 /var/lib/libvirt/images/mi-vm.qcow2 20G

# Ejecutar VM con QEMU
sudo qemu-system-x86_64 \
    -enable-kvm \
    -m 2048 \
    -cpu host \
    -smp 2 \
    -drive file=/var/lib/libvirt/images/mi-vm.qcow2,format=qcow2 \
    -cdrom /path/to/debian.iso \
    -boot d \
    -netdev bridge,br=virbr0,id=net0 \
    -device virtio-net,netdev=net0 \
    -vnc :1

🎛️ Gestión de Máquinas Virtuales

Comandos Básicos con virsh

# Listar todas las VMs
sudo virsh list --all

# Iniciar VM
sudo virsh start nombre-vm

# Detener VM (shutdown normal)
sudo virsh shutdown nombre-vm

# Forzar apagado de VM
sudo virsh destroy nombre-vm

# Eliminar VM (mantiene disco)
sudo virsh undefine nombre-vm

# Eliminar VM y disco
sudo virsh undefine nombre-vm --remove-all-storage

Gestión de Recursos

# Modificar memoria RAM (VM apagada)
sudo virsh setmaxmem nombre-vm 4096000 --config
sudo virsh setmem nombre-vm 4096000 --config

# Modificar CPUs (VM apagada)
sudo virsh setvcpus nombre-vm 4 --config

# Ver información de VM
sudo virsh dominfo nombre-vm

# Ver configuración XML
sudo virsh dumpxml nombre-vm

Acceso a Consola

# Acceder a consola de VM
sudo virsh console nombre-vm

# Salir de consola: Ctrl + ]

# Conectar via VNC (si está configurado)
virt-viewer nombre-vm

🌐 Configuración de Red Avanzada

Crear Bridge Personalizado

# Crear archivo de configuración de red
sudo tee /etc/libvirt/qemu/networks/custom-bridge.xml << 'EOF'
<network>
  <name>custom-bridge</name>
  <forward mode='nat'/>
  <bridge name='virbr1' stp='on' delay='0'/>
  <ip address='192.168.100.1' netmask='255.255.255.0'>
    <dhcp>
      <range start='192.168.100.2' end='192.168.100.254'/>
    </dhcp>
  </ip>
</network>
EOF

# Definir y activar la red
sudo virsh net-define /etc/libvirt/qemu/networks/custom-bridge.xml
sudo virsh net-start custom-bridge
sudo virsh net-autostart custom-bridge

Configurar Bridge con Interfaz Física

# Crear bridge para acceso directo a red física
sudo tee /etc/netplan/01-bridge.yaml << 'EOF'
network:
  version: 2
  ethernets:
    enp0s3:
      dhcp4: false
  bridges:
    br0:
      interfaces: [enp0s3]
      dhcp4: true
      parameters:
        stp: true
        forward-delay: 4
EOF

# Aplicar configuración
sudo netplan apply

💾 Gestión de Almacenamiento

Crear y Gestionar Discos Virtuales

# Crear disco qcow2
qemu-img create -f qcow2 /var/lib/libvirt/images/data-disk.qcow2 50G

# Redimensionar disco (VM apagada)
qemu-img resize /var/lib/libvirt/images/mi-vm.qcow2 +10G

# Ver información de disco
qemu-img info /var/lib/libvirt/images/mi-vm.qcow2

# Convertir formatos de disco
qemu-img convert -f qcow2 -O raw mi-vm.qcow2 mi-vm.raw

Snapshots de VMs

# Crear snapshot
sudo virsh snapshot-create-as nombre-vm snapshot1 "Descripción del snapshot"

# Listar snapshots
sudo virsh snapshot-list nombre-vm

# Restaurar snapshot
sudo virsh snapshot-revert nombre-vm snapshot1

# Eliminar snapshot
sudo virsh snapshot-delete nombre-vm snapshot1

Pools de Almacenamiento

# Crear pool de almacenamiento
sudo virsh pool-define-as \
    --name mypool \
    --type dir \
    --target /var/lib/libvirt/images/mypool

# Construir y activar pool
sudo virsh pool-build mypool
sudo virsh pool-start mypool
sudo virsh pool-autostart mypool

# Listar pools
sudo virsh pool-list --all

🔍 Monitoreo y Performance

Monitorear Recursos de VMs

# Estadísticas en tiempo real
sudo virsh top

# Información de CPU
sudo virsh vcpuinfo nombre-vm

# Estadísticas de red
sudo virsh domifstat nombre-vm vnet0

# Estadísticas de disco
sudo virsh domblkstat nombre-vm vda

Configurar Límites de Recursos

# Limitar CPU (% del host)
sudo virsh schedinfo nombre-vm --set cpu_shares=512

# Limitar memoria
sudo virsh memtune nombre-vm --hard-limit 2048000

# Limitar I/O de disco
sudo virsh blkiotune nombre-vm --device-weights /dev/vda,500

🚨 Troubleshooting Común

Problemas de Rendimiento

# Verificar que KVM esté habilitado
cat /proc/cpuinfo | grep vmx  # Intel
cat /proc/cpuinfo | grep svm  # AMD

# Verificar módulos cargados
lsmod | grep kvm

# Verificar permisos de /dev/kvm
ls -la /dev/kvm

Problemas de Red

# Verificar bridges
brctl show

# Verificar iptables (pueden bloquear tráfico)
sudo iptables -L

# Reiniciar red virtual
sudo virsh net-destroy default
sudo virsh net-start default

Problemas de Espacio

# Verificar espacio en pools
sudo virsh pool-info default

# Limpiar snapshots antiguos
sudo virsh snapshot-list nombre-vm
sudo virsh snapshot-delete nombre-vm snapshot-antiguo

# Compactar discos qcow2
qemu-img convert -O qcow2 old.qcow2 new.qcow2

Logs y Debugging

# Ver logs de libvirt
sudo journalctl -u libvirtd

# Logs específicos de VM
sudo tail -f /var/log/libvirt/qemu/nombre-vm.log

# Debug de QEMU
sudo virsh qemu-monitor-command nombre-vm --hmp 'info status'

⚡ Optimizaciones de Rendimiento

Configurar CPU Topology

# Optimizar para workloads específicos
sudo virsh edit nombre-vm

# Agregar en XML:
# <cpu mode='host-passthrough'>
#   <topology sockets='1' cores='2' threads='2'/>
# </cpu>

Optimizar I/O de Disco

# Usar drivers virtio para mejor rendimiento
# En virt-install agregar:
--disk path=/path/to/disk.qcow2,bus=virtio,cache=none,io=native

Configurar NUMA

# Para VMs con muchos recursos
# Agregar en XML de VM:
# <numatune>
#   <memory mode='strict' nodeset='0'/>
# </numatune>

🎯 Mejores Prácticas

Seguridad

  1. Usar AppArmor/SELinux para confinamiento adicional
  2. Configurar firewalls apropiados para VMs
  3. Actualizar regularmente QEMU y libvirt
  4. Usar redes aisladas para entornos sensibles
  5. Implementar backup regular de VMs

Rendimiento

  1. Usar formato qcow2 para eficiencia de espacio
  2. Habilitar cache=none para I/O intensivo
  3. Configurar hugepages para VMs de alto rendimiento
  4. Usar drivers virtio para red y disco
  5. Monitorear recursos regularmente

Mantenimiento

# Script de backup automatizado
#!/bin/bash
VM_NAME="mi-vm"
BACKUP_DIR="/backup/vms"
DATE=$(date +%Y%m%d)

# Crear snapshot
virsh snapshot-create-as $VM_NAME backup-$DATE

# Copiar disco
cp /var/lib/libvirt/images/$VM_NAME.qcow2 $BACKUP_DIR/$VM_NAME-$DATE.qcow2

# Limpiar snapshots antiguos
find $BACKUP_DIR -name "$VM_NAME-*.qcow2" -mtime +7 -delete

Conclusión

QEMU con KVM proporciona una plataforma de virtualización robusta y de alto rendimiento para Debian. Con esta guía, tienes todas las herramientas necesarias para:

  • Instalar y configurar un entorno de virtualización completo
  • Crear y gestionar máquinas virtuales eficientemente
  • Optimizar rendimiento para diferentes workloads
  • Resolver problemas comunes de virtualización
  • Implementar mejores prácticas de seguridad y mantenimiento

Casos de uso ideales:

  • Entornos de desarrollo y testing
  • Laboratorios de aprendizaje
  • Consolidación de servidores
  • Aislamiento de aplicaciones
  • Infraestructura cloud privada

La virtualización con QEMU/KVM es fundamental en la infraestructura moderna, proporcionando flexibilidad, eficiencia y aislamiento para una amplia gama de aplicaciones empresariales y de desarrollo.

¡Experimenta con diferentes configuraciones y descubre el poder de la virtualización en Linux! 🚀