Instalación de KVM/QEMU en Linux: Guía Completa
Introducción
KVM (Máquina Virtual Basada en Kernel) y QEMU (Emulador Rápido) forman la base de la virtualización moderna en Linux, impulsando desde entornos de desarrollo personales hasta infraestructura empresarial en la nube. Juntos, proporcionan virtualización asistida por hardware que ofrece un rendimiento cercano al nativo con una sobrecarga mínima.
Esta guía completa te guiará a través de la instalación y configuración completa de KVM/QEMU en Linux, cubriendo todo desde la verificación de hardware hasta la optimización avanzada. Ya sea que estés configurando un laboratorio personal, construyendo un entorno de desarrollo o desplegando infraestructura de virtualización en producción, esta guía proporciona las instrucciones detalladas y mejores prácticas que necesitas.
KVM es un módulo del kernel de Linux que transforma tu sistema Linux en un hipervisor tipo 1, mientras que QEMU proporciona capacidades de emulación de dispositivos y gestión. Combinado con libvirt para la gestión y virt-manager para una interfaz gráfica, esta pila ofrece una solución de virtualización de código abierto potente que rivaliza con alternativas comerciales.
Al final de esta guía, tendrás un entorno de virtualización KVM/QEMU completamente funcional con rendimiento optimizado, redes adecuadas, gestión de almacenamiento y las herramientas necesarias para crear y administrar máquinas virtuales de manera eficiente.
Entendiendo KVM y QEMU
¿Qué es KVM?
KVM (Máquina Virtual Basada en Kernel) es una infraestructura de virtualización integrada en el kernel de Linux. Convierte Linux en un hipervisor Tipo-1 (bare-metal) aprovechando las extensiones de virtualización de hardware disponibles en los procesadores modernos (Intel VT-x o AMD-V).
Características clave de KVM:
- Integrado en el kernel de Linux desde la versión 2.6.20
- Requiere soporte de virtualización de CPU (Intel VT-x o AMD-V)
- Proporciona rendimiento cercano al nativo a través de aceleración por hardware
- Cada VM se ejecuta como un proceso regular de Linux
- Aislamiento completo entre máquinas virtuales
- Soporta virtualización de memoria y E/S
¿Qué es QEMU?
QEMU (Emulador Rápido) es un emulador de máquina genérico y virtualizador que proporciona:
- Emulación de dispositivos de hardware (CPU, disco, red, gráficos)
- Componente de espacio de usuario para KVM
- Soporte para múltiples arquitecturas
- Gestión de dispositivos y manejo de E/S
Cómo KVM y QEMU trabajan juntos:
VM Invitada → QEMU (emulación de dispositivos) → KVM (módulo del kernel) → Hardware Físico
QEMU proporciona las herramientas de espacio de usuario mientras que KVM maneja la virtualización real en el espacio del kernel, ofreciendo un rendimiento óptimo.
Vista General de la Arquitectura
┌─────────────────────────────────────────┐
│ Máquina Virtual (SO Invitado) │
├─────────────────────────────────────────┤
│ CPU Virtual │ RAM Virtual │ E/S Virtual│
├─────────────────────────────────────────┤
│ Proceso QEMU │
│ (Emulación y Gestión de Dispositivos) │
├─────────────────────────────────────────┤
│ Módulo del Kernel KVM │
│ (Virtualización por Hardware) │
├─────────────────────────────────────────┤
│ Kernel de Linux │
├─────────────────────────────────────────┤
│ Hardware Físico (CPU/RAM/E/S) │
└─────────────────────────────────────────┘
Prerrequisitos y Requisitos de Hardware
Requisitos de CPU
Tu CPU debe soportar extensiones de virtualización por hardware:
Para procesadores Intel:
- Intel VT-x (Tecnología de Virtualización Intel)
- Disponible en la mayoría de CPUs Intel desde 2006 en adelante
- Nombres de modelo: Core i3/i5/i7/i9, Xeon
Para procesadores AMD:
- AMD-V (Virtualización AMD)
- Disponible en la mayoría de CPUs AMD desde 2006 en adelante
- Nombres de modelo: Ryzen, EPYC, Opteron (con sufijo "V")
Verificar Soporte de Virtualización de CPU
# Verificar si la CPU soporta virtualización
egrep -c '(vmx|svm)' /proc/cpuinfo
# Interpretación de la salida:
# 0 = Sin soporte de virtualización (o deshabilitado en BIOS)
# >0 = Número de núcleos con soporte de virtualización
# Información detallada
lscpu | grep Virtualization
# Salida para Intel: Virtualization: VT-x
# Salida para AMD: Virtualization: AMD-V
Si el comando devuelve 0, necesitas:
- Verificar que tu CPU soporta virtualización (consulta las especificaciones del fabricante)
- Habilitar la virtualización en la configuración de BIOS/UEFI (generalmente bajo "Advanced" o "CPU Configuration")
Habilitar Virtualización en BIOS/UEFI
Si la virtualización está deshabilitada:
# Reinicia y entra en BIOS/UEFI (generalmente DEL, F2, F10 o F12 durante el arranque)
# Busca estas configuraciones:
# Intel: "Intel Virtualization Technology", "Intel VT-x", "Virtualization Extensions"
# AMD: "AMD-V", "SVM Mode", "Secure Virtual Machine"
# Habilita la configuración y guarda los cambios
Requisitos del Sistema
Requisitos mínimos:
- CPU: Procesador de 64 bits con soporte de virtualización
- RAM: 4GB (el SO anfitrión necesita 2GB mínimo, el resto para VMs)
- Almacenamiento: 20GB de espacio libre
- Kernel de Linux: 2.6.20 o más reciente
Recomendado para producción:
- CPU: Procesador multinúcleo (4+ núcleos)
- RAM: 16GB+ (permite múltiples VMs)
- Almacenamiento: SSD con 100GB+ de espacio libre
- Red: Ethernet Gigabit
Verificar Soporte KVM del Kernel
# Verificar si los módulos KVM están disponibles
ls -l /dev/kvm
# Salida esperada:
# crw-rw----+ 1 root kvm 10, 232 Jan 11 10:00 /dev/kvm
# Si /dev/kvm no existe, verifica si los módulos están disponibles
modinfo kvm
modinfo kvm_intel # Para Intel
modinfo kvm_amd # Para AMD
Instalación en Ubuntu/Debian
Paso 1: Actualizar el Sistema
# Actualizar listas de paquetes
sudo apt update
# Actualizar paquetes existentes
sudo apt upgrade -y
Paso 2: Instalar KVM y Paquetes Relacionados
# Instalar KVM, QEMU y herramientas esenciales
sudo apt install -y qemu-kvm libvirt-daemon-system libvirt-clients bridge-utils
# Instalar herramientas de gestión
sudo apt install -y virt-manager virt-viewer virtinst
# Instalar utilidades adicionales
sudo apt install -y libguestfs-tools libosinfo-bin
Explicación de paquetes:
qemu-kvm: Binarios de QEMU con soporte KVMlibvirt-daemon-system: Daemon de Libvirt para gestión de VMslibvirt-clients: Herramientas de línea de comandos (virsh)bridge-utils: Utilidades de configuración de puente de redvirt-manager: Interfaz gráfica de gestión de VMvirt-viewer: Visor de consola de VMvirtinst: Herramientas de instalación de VM (virt-install)libguestfs-tools: Herramientas del sistema de archivos invitado (virt-customize, virt-sysprep)libosinfo-bin: Base de datos de información del SO
Paso 3: Verificar la Instalación
# Verificar si los módulos KVM están cargados
lsmod | grep kvm
# Salida esperada para Intel:
# kvm_intel 311296 0
# kvm 872448 1 kvm_intel
# Salida esperada para AMD:
# kvm_amd 131072 0
# kvm 872448 1 kvm_amd
# Verificar que libvirt está ejecutándose
sudo systemctl status libvirtd
# Habilitar libvirt para iniciar en el arranque
sudo systemctl enable libvirtd
Paso 4: Añadir Usuario a los Grupos Requeridos
# Añadir tu usuario a los grupos libvirt y kvm
sudo usermod -aG libvirt $USER
sudo usermod -aG kvm $USER
# Verificar membresía de grupo
groups $USER
# Cerrar sesión y volver a iniciar sesión para que los cambios surtan efecto
# O usa: newgrp libvirt
Paso 5: Verificar Capacidades de Virtualización
# Verificar capacidades de virtualización
virt-host-validate
# La salida esperada debe mostrar todo PASS:
# QEMU: Checking for hardware virtualization : PASS
# QEMU: Checking if device /dev/kvm exists : PASS
# QEMU: Checking if device /dev/kvm is accessible : PASS
# QEMU: Checking if device /dev/vhost-net exists : PASS
# QEMU: Checking if device /dev/net/tun exists : PASS
# LXC: Checking for Linux >= 2.6.26 : PASS
Instalación en CentOS/RHEL/Rocky Linux
Paso 1: Actualizar el Sistema
# Actualizar paquetes del sistema
sudo dnf update -y
# O para CentOS 7
sudo yum update -y
Paso 2: Instalar KVM y Paquetes Relacionados
# Instalar grupo de virtualización (recomendado)
sudo dnf groupinstall "Virtualization Host" -y
# O instalar paquetes individuales
sudo dnf install -y qemu-kvm libvirt virt-install virt-manager virt-viewer
# Instalar herramientas adicionales
sudo dnf install -y libguestfs-tools libvirt-client
Para CentOS 7:
# Instalar paquetes de virtualización
sudo yum install -y qemu-kvm libvirt libvirt-python libguestfs-tools virt-install
# Instalar herramientas de gestión
sudo yum install -y virt-manager virt-viewer
Paso 3: Iniciar y Habilitar el Servicio Libvirt
# Iniciar servicio libvirtd
sudo systemctl start libvirtd
# Habilitar libvirtd para iniciar en el arranque
sudo systemctl enable libvirtd
# Verificar estado del servicio
sudo systemctl status libvirtd
Paso 4: Configurar el Firewall
# Permitir servicios de libvirt a través del firewall
sudo firewall-cmd --permanent --add-service=libvirt
sudo firewall-cmd --reload
# Para acceso VNC (si es necesario)
sudo firewall-cmd --permanent --add-port=5900-5999/tcp
sudo firewall-cmd --reload
Paso 5: Añadir Usuario a Grupos
# Añadir usuario al grupo libvirt
sudo usermod -aG libvirt $USER
# Verificar
groups $USER
# Reiniciar o cerrar/iniciar sesión para que los cambios surtan efecto
Paso 6: Verificar la Instalación
# Verificar módulo KVM
lsmod | grep kvm
# Validar configuración de virtualización
virt-host-validate
Instalación en Arch Linux
Paso 1: Actualizar el Sistema
# Actualizar sistema
sudo pacman -Syu
Paso 2: Instalar Paquetes KVM
# Instalar KVM y QEMU
sudo pacman -S qemu-full virt-manager virt-viewer libvirt bridge-utils dnsmasq
# Instalar herramientas adicionales
sudo pacman -S ebtables iptables-nft
Paso 3: Habilitar el Servicio Libvirt
# Iniciar y habilitar libvirtd
sudo systemctl enable libvirtd.service
sudo systemctl start libvirtd.service
# Habilitar red predeterminada
sudo virsh net-autostart default
sudo virsh net-start default
Paso 4: Configurar Permisos de Usuario
# Añadir usuario al grupo libvirt
sudo usermod -aG libvirt $USER
# Editar configuración de libvirt (opcional)
sudo nvim /etc/libvirt/libvirtd.conf
# Descomentar estas líneas:
# unix_sock_group = "libvirt"
# unix_sock_rw_perms = "0770"
Paso 5: Reiniciar Libvirt
# Reiniciar servicio libvirt
sudo systemctl restart libvirtd.service
# Verificar
sudo systemctl status libvirtd.service
Configuración Post-Instalación
Configurar Red Predeterminada
# Verificar estado de la red predeterminada
sudo virsh net-list --all
# Si la red predeterminada está inactiva, iniciarla
sudo virsh net-start default
# Configurarla para inicio automático
sudo virsh net-autostart default
# Ver configuración de red
sudo virsh net-dumpxml default
Configuración XML de red predeterminada:
<network>
<name>default</name>
<bridge name='virbr0'/>
<forward mode='nat'/>
<ip address='192.168.122.1' netmask='255.255.255.0'>
<dhcp>
<range start='192.168.122.2' end='192.168.122.254'/>
</dhcp>
</ip>
</network>
Configurar Pools de Almacenamiento
# Listar pools de almacenamiento
sudo virsh pool-list --all
# Ubicación del pool predeterminado
ls -la /var/lib/libvirt/images/
# Crear pool de almacenamiento personalizado
sudo virsh pool-define-as mypool dir --target /data/vms
# Construir e iniciar el pool
sudo virsh pool-build mypool
sudo virsh pool-start mypool
sudo virsh pool-autostart mypool
# Verificar
sudo virsh pool-info mypool
Optimizar Configuración de Rendimiento de KVM
# Habilitar virtualización anidada (Intel)
sudo modprobe -r kvm_intel
sudo modprobe kvm_intel nested=1
# Hacerlo persistente
echo "options kvm_intel nested=1" | sudo tee /etc/modprobe.d/kvm-intel.conf
# Verificar virtualización anidada
cat /sys/module/kvm_intel/parameters/nested
# Debe mostrar: Y
# Para AMD
echo "options kvm_amd nested=1" | sudo tee /etc/modprobe.d/kvm-amd.conf
cat /sys/module/kvm_amd/parameters/nested
Configurar Governor de CPU para Rendimiento
# Verificar governor actual
cat /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor
# Establecer modo de rendimiento
echo performance | sudo tee /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor
# Hacer permanente (servicio systemd)
sudo cat << 'EOF' > /etc/systemd/system/cpu-performance.service
[Unit]
Description=Set CPU governor to performance
[Service]
Type=oneshot
ExecStart=/bin/bash -c 'echo performance | tee /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor'
[Install]
WantedBy=multi-user.target
EOF
sudo systemctl enable cpu-performance.service
sudo systemctl start cpu-performance.service
Habilitar Páginas Grandes para Mejor Rendimiento de Memoria
# Verificar configuración actual de páginas grandes
cat /proc/meminfo | grep Huge
# Calcular páginas grandes necesarias (2GB para VMs con 8GB total)
# Cada página grande es de 2MB, por lo que 2GB = 1024 páginas
# Configurar páginas grandes
echo 1024 | sudo tee /proc/sys/vm/nr_hugepages
# Hacer permanente
echo "vm.nr_hugepages=1024" | sudo tee -a /etc/sysctl.conf
sudo sysctl -p
# Verificar
cat /proc/meminfo | grep HugePages_Total
Configurar IOMMU para Paso a Través de PCI
# Habilitar IOMMU en GRUB (Intel)
sudo vim /etc/default/grub
# Añadir a GRUB_CMDLINE_LINUX:
# Para Intel: intel_iommu=on iommu=pt
# Para AMD: amd_iommu=on iommu=pt
# Ejemplo:
GRUB_CMDLINE_LINUX="intel_iommu=on iommu=pt"
# Actualizar GRUB
sudo update-grub # Debian/Ubuntu
sudo grub2-mkconfig -o /boot/grub2/grub.cfg # RHEL/CentOS
# Reiniciar
sudo reboot
# Después del reinicio, verificar IOMMU
dmesg | grep -i iommu
Crear tu Primera Máquina Virtual
Método 1: Usando virt-install (Línea de Comandos)
# Descargar ISO de Ubuntu (ejemplo)
cd /var/lib/libvirt/images/
sudo wget https://releases.ubuntu.com/22.04/ubuntu-22.04-live-server-amd64.iso
# Crear VM con virt-install
sudo virt-install \
--name ubuntu-vm \
--ram 2048 \
--vcpus 2 \
--disk path=/var/lib/libvirt/images/ubuntu-vm.qcow2,size=20 \
--os-variant ubuntu22.04 \
--network network=default \
--graphics vnc,listen=0.0.0.0 \
--console pty,target_type=serial \
--cdrom /var/lib/libvirt/images/ubuntu-22.04-live-server-amd64.iso
# Parámetros explicados:
# --name: Nombre de la VM
# --ram: Memoria en MB
# --vcpus: Número de CPUs virtuales
# --disk: Configuración de disco (tamaño en GB)
# --os-variant: Tipo de SO (lista disponible: osinfo-query os)
# --network: Configuración de red
# --graphics: Tipo de pantalla
# --cdrom: Ruta del archivo ISO
Método 2: Usando virt-manager (GUI)
# Lanzar virt-manager
virt-manager
# Pasos en la GUI:
# 1. Clic en "Create a new virtual machine"
# 2. Seleccionar "Local install media (ISO image or CDROM)"
# 3. Navegar y seleccionar tu archivo ISO
# 4. Elegir configuración de memoria y CPU
# 5. Crear imagen de disco (predeterminado: formato qcow2)
# 6. Nombrar tu VM y finalizar
# 7. La VM se iniciará automáticamente
Verificar Creación de VM
# Listar todas las VMs
sudo virsh list --all
# Mostrar información de la VM
sudo virsh dominfo ubuntu-vm
# Verificar estado de la VM
sudo virsh domstate ubuntu-vm
Configuración Avanzada
Configurar Controladores Virtio para Mejor Rendimiento
Virtio proporciona controladores paravirtualizados para mejor rendimiento:
# Crear VM con controladores virtio
sudo virt-install \
--name ubuntu-virtio \
--ram 4096 \
--vcpus 4 \
--disk path=/var/lib/libvirt/images/ubuntu-virtio.qcow2,size=30,bus=virtio \
--network network=default,model=virtio \
--os-variant ubuntu22.04 \
--graphics spice \
--video qxl \
--cdrom /var/lib/libvirt/images/ubuntu-22.04-live-server-amd64.iso
# Cambios clave:
# bus=virtio: Usar virtio para disco (mejor rendimiento)
# model=virtio: Usar virtio para red (mejor rendimiento)
# graphics spice: Mejor rendimiento gráfico
# video qxl: Controlador de video QXL
Configurar Fijación de CPU
# Verificar topología de CPU del host
lscpu
# Fijar CPUs de VM a CPUs específicas del host
sudo virsh vcpupin ubuntu-vm 0 0
sudo virsh vcpupin ubuntu-vm 1 1
# Verificar fijación
sudo virsh vcpupin ubuntu-vm --live
# Hacerlo persistente (editar XML de VM)
sudo virsh edit ubuntu-vm
# Añadir en la sección <vcpu>:
# <vcpu placement='static' cpuset='0-3'>4</vcpu>
# <cputune>
# <vcpupin vcpu='0' cpuset='0'/>
# <vcpupin vcpu='1' cpuset='1'/>
# <vcpupin vcpu='2' cpuset='2'/>
# <vcpupin vcpu='3' cpuset='3'/>
# </cputune>
Configurar Topología NUMA
# Verificar diseño NUMA del host
numactl --hardware
# Crear VM con conciencia NUMA
sudo virsh edit ubuntu-vm
# Añadir configuración NUMA:
# <cpu mode='host-passthrough'>
# <topology sockets='1' cores='2' threads='2'/>
# <numa>
# <cell id='0' cpus='0-1' memory='2097152' unit='KiB'/>
# <cell id='1' cpus='2-3' memory='2097152' unit='KiB'/>
# </numa>
# </cpu>
Habilitar KSM (Kernel Same-page Merging)
# KSM reduce el uso de memoria compartiendo páginas idénticas
# Habilitar KSM
echo 1 | sudo tee /sys/kernel/mm/ksm/run
# Configurar parámetros de escaneo
echo 100 | sudo tee /sys/kernel/mm/ksm/pages_to_scan
echo 20 | sudo tee /sys/kernel/mm/ksm/sleep_millisecs
# Hacer persistente
echo "w /sys/kernel/mm/ksm/run - - - - 1" | sudo tee /etc/tmpfiles.d/ksm.conf
echo "w /sys/kernel/mm/ksm/pages_to_scan - - - - 100" | sudo tee -a /etc/tmpfiles.d/ksm.conf
# Verificar estadísticas de KSM
cat /sys/kernel/mm/ksm/pages_sharing
cat /sys/kernel/mm/ksm/pages_shared
Configuración de Red
Crear Red Puente
# Instalar utilidades de puente (si no están instaladas)
sudo apt install bridge-utils
# Crear configuración de puente
sudo cat << 'EOF' > /etc/netplan/01-netcfg.yaml
network:
version: 2
ethernets:
ens18:
dhcp4: no
bridges:
br0:
interfaces: [ens18]
dhcp4: yes
EOF
# Aplicar configuración
sudo netplan apply
# Verificar puente
ip addr show br0
brctl show
Crear Red Puente de Libvirt
# Crear XML de red puente
cat << 'EOF' > bridge-net.xml
<network>
<name>br0</name>
<forward mode='bridge'/>
<bridge name='br0'/>
</network>
EOF
# Definir e iniciar red
sudo virsh net-define bridge-net.xml
sudo virsh net-start br0
sudo virsh net-autostart br0
# Verificar
sudo virsh net-list --all
Crear Red Aislada
# Crear red aislada para VMs
cat << 'EOF' > isolated-net.xml
<network>
<name>isolated</name>
<ip address='10.10.10.1' netmask='255.255.255.0'>
<dhcp>
<range start='10.10.10.2' end='10.10.10.254'/>
</dhcp>
</ip>
</network>
EOF
# Definir e iniciar
sudo virsh net-define isolated-net.xml
sudo virsh net-start isolated
sudo virsh net-autostart isolated
Ajuste de Rendimiento
Optimización de E/S de Disco
# Usar virtio-scsi para mejor rendimiento
sudo virt-install \
--disk path=/var/lib/libvirt/images/vm.qcow2,bus=scsi,cache=none,io=native
# O editar VM existente
sudo virsh edit vm-name
# Cambiar configuración de disco:
# <disk type='file' device='disk'>
# <driver name='qemu' type='qcow2' cache='none' io='native'/>
# <source file='/var/lib/libvirt/images/vm.qcow2'/>
# <target dev='sda' bus='scsi'/>
# </disk>
Optimización del Planificador de E/S
# Verificar planificador actual
cat /sys/block/sda/queue/scheduler
# Establecer a none para NVMe (mejor para SSDs)
echo none | sudo tee /sys/block/nvme0n1/queue/scheduler
# Establecer a mq-deadline para SSDs SATA
echo mq-deadline | sudo tee /sys/block/sda/queue/scheduler
# Hacer persistente
cat << 'EOF' | sudo tee /etc/udev/rules.d/60-scheduler.rules
# Establecer planificador para NVMe
ACTION=="add|change", KERNEL=="nvme[0-9]n[0-9]", ATTR{queue/scheduler}="none"
# Establecer planificador para SSDs
ACTION=="add|change", KERNEL=="sd[a-z]", ATTR{queue/rotational}=="0", ATTR{queue/scheduler}="mq-deadline"
EOF
Ajuste de Rendimiento de Red
# Habilitar virtio-net multi-queue
sudo virsh edit vm-name
# Modificar interfaz de red:
# <interface type='network'>
# <source network='default'/>
# <model type='virtio'/>
# <driver name='vhost' queues='4'/>
# </interface>
# Dentro de la VM invitada
sudo ethtool -L eth0 combined 4
Monitoreo y Gestión
Monitorear Rendimiento de VM
# Uso de recursos de VM
sudo virt-top
# Estadísticas detalladas de VM
sudo virsh domstats ubuntu-vm
# Estadísticas de CPU
sudo virsh cpu-stats ubuntu-vm
# Estadísticas de memoria
sudo virsh dommemstat ubuntu-vm
# Estadísticas de dispositivo de bloques
sudo virsh domblkstat ubuntu-vm vda
# Estadísticas de red
sudo virsh domifstat ubuntu-vm vnet0
Gestión del Ciclo de Vida de VM
# Iniciar VM
sudo virsh start ubuntu-vm
# Apagar VM correctamente
sudo virsh shutdown ubuntu-vm
# Forzar apagado
sudo virsh destroy ubuntu-vm
# Reiniciar VM
sudo virsh reboot ubuntu-vm
# Suspender VM
sudo virsh suspend ubuntu-vm
# Reanudar VM
sudo virsh resume ubuntu-vm
# Iniciar automáticamente VM en arranque del host
sudo virsh autostart ubuntu-vm
# Deshabilitar inicio automático
sudo virsh autostart --disable ubuntu-vm
Gestión de Instantáneas
# Crear instantánea
sudo virsh snapshot-create-as ubuntu-vm \
--name "snapshot1" \
--description "Clean installation"
# Listar instantáneas
sudo virsh snapshot-list ubuntu-vm
# Revertir a instantánea
sudo virsh snapshot-revert ubuntu-vm snapshot1
# Eliminar instantánea
sudo virsh snapshot-delete ubuntu-vm snapshot1
Respaldo y Clonación
Clonar Máquina Virtual
# Clonar VM (mientras está apagada)
sudo virt-clone \
--original ubuntu-vm \
--name ubuntu-vm-clone \
--file /var/lib/libvirt/images/ubuntu-vm-clone.qcow2
# Verificar clon
sudo virsh list --all
Respaldar Disco de VM
# Respaldar imagen de disco de VM
sudo cp /var/lib/libvirt/images/ubuntu-vm.qcow2 \
/backup/ubuntu-vm-$(date +%Y%m%d).qcow2
# Comprimir respaldo
sudo qemu-img convert -O qcow2 -c \
/var/lib/libvirt/images/ubuntu-vm.qcow2 \
/backup/ubuntu-vm-$(date +%Y%m%d).qcow2
# Respaldar configuración de VM
sudo virsh dumpxml ubuntu-vm > /backup/ubuntu-vm.xml
Exportar e Importar VMs
# Exportar VM
sudo virsh dumpxml ubuntu-vm > ubuntu-vm.xml
sudo cp /var/lib/libvirt/images/ubuntu-vm.qcow2 /export/
# Importar VM en otro host
sudo cp /export/ubuntu-vm.qcow2 /var/lib/libvirt/images/
sudo virsh define ubuntu-vm.xml
sudo virsh start ubuntu-vm
Solución de Problemas
Problemas Comunes y Soluciones
Problema: El módulo KVM no se carga
# Verificar si la virtualización está habilitada
egrep -c '(vmx|svm)' /proc/cpuinfo
# Si es 0, habilitar en BIOS
# Verificar conflictos
dmesg | grep kvm
lsmod | grep kvm
# Recargar módulo
sudo modprobe -r kvm_intel # o kvm_amd
sudo modprobe kvm_intel
Problema: Permiso denegado al acceder a /dev/kvm
# Verificar permisos
ls -l /dev/kvm
# Añadir usuario al grupo kvm
sudo usermod -aG kvm $USER
# Reiniciar sesión
newgrp kvm
Problema: La red predeterminada no se inicia
# Verificar estado de red
sudo virsh net-list --all
# Iniciar red
sudo virsh net-start default
# Verificar errores
sudo journalctl -u libvirtd
# Recrear red predeterminada
sudo virsh net-destroy default
sudo virsh net-undefine default
# Redefinir
cat << 'EOF' > default-net.xml
<network>
<name>default</name>
<bridge name='virbr0'/>
<forward mode='nat'/>
<ip address='192.168.122.1' netmask='255.255.255.0'>
<dhcp>
<range start='192.168.122.2' end='192.168.122.254'/>
</dhcp>
</ip>
</network>
EOF
sudo virsh net-define default-net.xml
sudo virsh net-start default
sudo virsh net-autostart default
Problema: Rendimiento pobre de VM
# Habilitar controladores virtio
sudo virsh edit vm-name
# Cambiar bus='ide' a bus='virtio'
# Cambiar model='e1000' a model='virtio'
# Habilitar paso a través de CPU del host
# Añadir: <cpu mode='host-passthrough'/>
# Asignar más recursos
sudo virsh setmem vm-name 4G --config
sudo virsh setvcpus vm-name 4 --config
# Verificar planificador de E/S
cat /sys/block/sda/queue/scheduler
Problema: No se puede conectar a la consola de VM
# Verificar si la VM está ejecutándose
sudo virsh list
# Intentar consola serial
sudo virsh console vm-name
# Verificar configuración VNC
sudo virsh vncdisplay vm-name
# Conectar con virt-viewer
virt-viewer vm-name
Mejores Prácticas de Seguridad
Asegurar Acceso a Libvirt
# Configurar autenticación de libvirt
sudo vim /etc/libvirt/libvirtd.conf
# Descomentar y establecer:
# unix_sock_group = "libvirt"
# unix_sock_ro_perms = "0770"
# unix_sock_rw_perms = "0770"
# auth_unix_ro = "none"
# auth_unix_rw = "none"
# Reiniciar libvirtd
sudo systemctl restart libvirtd
Habilitar SELinux/AppArmor para VMs
# Ubuntu/Debian (AppArmor)
sudo apt install apparmor-utils
sudo aa-enforce /etc/apparmor.d/usr.sbin.libvirtd
# CentOS/RHEL (SELinux)
sudo setsebool -P virt_use_nfs 1
sudo setsebool -P virt_use_samba 1
# Verificar contexto de SELinux
ls -Z /var/lib/libvirt/images/
Aislar Redes de VM
# Crear red aislada sin NAT ni reenvío
cat << 'EOF' > secure-net.xml
<network>
<name>secure</name>
<bridge name='virbr-secure'/>
<ip address='172.16.0.1' netmask='255.255.255.0'/>
</network>
EOF
sudo virsh net-define secure-net.xml
sudo virsh net-start secure
Conclusión
Ahora tienes un entorno de virtualización KVM/QEMU completamente funcional instalado y configurado en tu sistema Linux. Esta poderosa pila de virtualización de código abierto proporciona características de nivel empresarial con rendimiento cercano al nativo, lo que la hace adecuada para todo, desde entornos de desarrollo hasta cargas de trabajo de producción.
Conclusiones clave de esta guía:
- KVM aprovecha la virtualización por hardware para un rendimiento óptimo
- La configuración adecuada de CPU, memoria y E/S es crucial para el rendimiento
- Los controladores Virtio proporcionan el mejor rendimiento paravirtualizado
- Libvirt proporciona capacidades de gestión robustas a través de virsh y virt-manager
- Los puentes de red y pools de almacenamiento ofrecen opciones de infraestructura flexibles
A medida que continúes trabajando con KVM/QEMU, explora temas avanzados como migración en vivo, paso a través de GPU y agrupamiento de alta disponibilidad para desbloquear aún más capacidades. La pila de virtualización está en constante evolución, así que mantente actualizado con las últimas versiones de kernel y QEMU para obtener un rendimiento y seguridad óptimos.
Recuerda respaldar tus VMs regularmente, monitorear el uso de recursos y seguir las mejores prácticas de seguridad para mantener un entorno de virtualización estable y seguro. Con la base establecida en esta guía, estás bien equipado para construir y administrar infraestructura virtualizada sofisticada utilizando tecnologías de código abierto.


