🎨 Sysprovider Code
Sysprovider LogoWiki
🇪🇸Hosting español para ecommerce

Virtualización con KVM y QEMU

Actualizado el 29 de abril de 2026

La virtualización se ha convertido en un pilar fundamental en la gestión de infraestructuras modernas. En el ecosistema Linux, la combinación de KVM (Kernel-based Virtual Machine) y QEMU (Quick Emulator) representa la solución de virtualización de código abierto más potente, flexible y ampliamente adoptada. A diferencia de soluciones propietarias, KVM y QEMU ofrecen un rendimiento casi nativo, una integración profunda con el kernel de Linux y una escalabilidad que va desde un portátil de desarrollo hasta centros de datos completos.

Este artículo es una guía técnica extensa para SysAdmins que desean dominar la virtualización con KVM y QEMU. Cubriremos desde los fundamentos arquitectónicos hasta la creación y gestión de máquinas virtuales (VMs) mediante herramientas de línea de comandos y scripts, todo ello con un enfoque práctico y orientado a la producción.

¿Qué es KVM y cómo funciona?

KVM es un módulo del kernel de Linux que convierte al propio Linux en un hipervisor de tipo 1 (bare-metal). Se carga como un módulo (kvm.ko) y, junto con el módulo específico para la CPU (kvm_intel o kvm_amd), permite que el kernel gestione directamente las extensiones de virtualización del hardware.

Componentes clave de KVM

  • Módulo del kernel (kvm.ko): Proporciona la interfaz de virtualización central, exponiendo el dispositivo /dev/kvm. Este dispositivo permite a un proceso en espacio de usuario (como QEMU) ejecutar instrucciones de la CPU invitada directamente en la CPU física.
  • Módulo específico de CPU: kvm_intel (para CPUs con tecnología Intel VT-x) o kvm_amd (para CPUs con AMD-V). Sin estos, KVM no puede funcionar, ya que necesita las instrucciones de virtualización asistida por hardware.
  • Dispositivo /dev/kvm: Es el punto de entrada. Cualquier proceso que tenga permisos para abrir este archivo puede crear y gestionar máquinas virtuales.

[INFO] Para verificar que tu CPU soporta virtualización, ejecuta: grep -E 'svm|vmx' /proc/cpuinfo. Si ves vmx (Intel) o svm (AMD), estás listo.

El papel de QEMU: El emulador que da vida a las VMs

Mientras que KVM se encarga de la virtualización a nivel de CPU y memoria, QEMU actúa como el emulador de dispositivos y el gestor de la máquina virtual en espacio de usuario. QEMU por sí solo puede emular CPUs completas (por ejemplo, emular una CPU ARM en una x86), pero esto es muy lento. Al combinarlo con KVM, QEMU delega la ejecución de instrucciones críticas al hardware real, logrando un rendimiento casi nativo.

Funciones principales de QEMU en la pareja KVM+QEMU

  1. Emulación de dispositivos: Proporciona a la VM dispositivos virtuales: discos (virtio, SATA, IDE), red (virtio-net, e1000), USB, gráficos (VGA, SPICE, VNC), etc.
  2. Gestión de la memoria: Asigna y gestiona la RAM de la VM.
  3. Interfaz de usuario: Ofrece consolas gráficas (VNC, SPICE) y seriales.
  4. Línea de comandos: La herramienta qemu-system-x86_64 es el núcleo para crear y arrancar VMs.

La arquitectura es simple: KVM (kernel) + QEMU (usuario) = Máquina virtual eficiente.

Instalación del stack KVM + QEMU en Linux

La instalación varía ligeramente según la distribución, pero el paquete base es el mismo. Asumiremos una distribución basada en Debian/Ubuntu o RHEL/CentOS/Rocky Linux.

En distribuciones basadas en Debian/Ubuntu

sudo apt update
sudo apt install qemu-kvm libvirt-daemon-system libvirt-clients bridge-utils virt-manager
  • qemu-kvm: El paquete principal de QEMU con soporte KVM.
  • libvirt-daemon-system: Demonio y herramientas de gestión de virtualización (recomendado).
  • libvirt-clients: Herramientas de línea de comandos como virsh.
  • bridge-utils: Para crear puentes de red.
  • virt-manager: GUI opcional pero muy útil para gestión visual.

En distribuciones basadas en RHEL (CentOS, Rocky, Alma)

sudo dnf install qemu-kvm libvirt virt-install bridge-utils virt-manager

Después de la instalación, asegúrate de que el servicio libvirtd esté activo y habilitado:

sudo systemctl enable --now libvirtd
sudo systemctl status libvirtd

[TIP] Añade tu usuario al grupo libvirt (o kvm en algunas distros) para evitar usar sudo constantemente: sudo usermod -aG libvirt $USER. Cierra sesión y vuelve a entrar.

Creación de tu primera máquina virtual

Para crear una VM de forma rápida y eficiente, usaremos virt-install, una herramienta de línea de comandos que simplifica el proceso.

Ejemplo: Instalar un servidor Ubuntu Server 22.04

Primero, descarga la ISO de Ubuntu Server:

wget https://releases.ubuntu.com/22.04/ubuntu-22.04-live-server-amd64.iso

Ahora, crea la VM:

sudo virt-install \
  --name ubuntu-server \
  --ram 2048 \
  --vcpus 2 \
  --disk path=/var/lib/libvirt/images/ubuntu-server.qcow2,size=20,format=qcow2 \
  --cdrom /ruta/a/ubuntu-22.04-live-server-amd64.iso \
  --network bridge=virbr0,model=virtio \
  --graphics vnc,listen=0.0.0.0 \
  --os-variant ubuntu22.04

Explicación de los parámetros:

  • --name: Nombre de la VM.
  • --ram: RAM en MB.
  • --vcpus: Número de CPUs virtuales.
  • --disk: Ruta y tamaño del disco. El formato qcow2 permite snapshots y crecimiento dinámico.
  • --cdrom: ISO de instalación.
  • --network: Red en modo NAT (usando el bridge virtual virbr0).
  • --graphics: Habilita VNC para la instalación gráfica.
  • --os-variant: Optimiza la configuración para el SO invitado.

[WARNING] Si no especificas --graphics, la instalación se realizará en modo texto por consola serial. Para servidores, es más eficiente usar --graphics none y --console pty,target_type=serial.

Gestión de máquinas virtuales con virsh

virsh es la herramienta de línea de comandos definitiva para gestionar VMs a través de libvirt. Es esencial para cualquier SysAdmin.

Comandos básicos de virsh

  • Listar VMs en ejecución: virsh list
  • Listar todas las VMs (incluso apagadas): virsh list --all
  • Iniciar una VM: virsh start nombre-vm
  • Apagar una VM (ACPI): virsh shutdown nombre-vm
  • Forzar apagado: virsh destroy nombre-vm
  • Conectarse a la consola gráfica (VNC): virsh vncdisplay nombre-vm (te da el display VNC)
  • Conectarse a la consola serial: virsh console nombre-vm
  • Eliminar una VM (y su configuración): virsh undefine nombre-vm (primero debes destruirla)

Gestión de almacenamiento

Los discos de las VMs se almacenan en pools de almacenamiento. El pool por defecto suele ser /var/lib/libvirt/images.

  • Listar pools: virsh pool-list
  • Crear un nuevo pool (ejemplo, en un disco externo):
    virsh pool-define-as --name datos --type dir --target /mnt/datos-vm
    virsh pool-build datos
    virsh pool-start datos
    virsh pool-autostart datos
    
  • Crear un volumen (disco) dentro de un pool:
    virsh vol-create-as datos disco-servidor-web.qcow2 50G --format qcow2
    

Redes virtuales: NAT, Bridge y Redes Aisladas

La configuración de red es crítica. libvirt ofrece tres modos principales:

Red NAT (por defecto)

  • Bridge virtual: virbr0 (creado automáticamente).
  • Funcionamiento: Las VMs tienen una IP privada (192.168.122.x). El tráfico sale al exterior mediante NAT (masquerading) a través de la IP del host.
  • Uso: Ideal para entornos de pruebas o cuando solo necesitas que las VMs tengan acceso a internet.

Red Bridge (Recomendado para producción)

  • Bridge físico: Se crea un bridge (br0) que conecta directamente la interfaz física del host (ej. eth0) con las VMs.
  • Funcionamiento: Las VMs obtienen una IP en la misma red física que el host. Son visibles como equipos independientes en la LAN.
  • Configuración (en /etc/network/interfaces o netplan):
    # Ejemplo con netplan (Ubuntu)
    network:
      version: 2
      ethernets:
        eth0:
          dhcp4: no
      bridges:
        br0:
          interfaces: [eth0]
          dhcp4: yes
    

Red Aislada

  • Funcionamiento: Las VMs se comunican solo entre sí y con el host, pero no tienen acceso a la red externa.
  • Uso: Ideal para laboratorios de seguridad o entornos donde las VMs no deben tener conexión a internet.

[TIP] Para obtener el mejor rendimiento de red en las VMs, asegúrate de que el modelo de NIC virtual sea virtio. Es un driver paravirtualizado que reduce la sobrecarga de emulación.

Rendimiento y optimización: Más allá de lo básico

Para entornos de producción, la configuración por defecto no es suficiente. Aquí tienes optimizaciones clave:

1. Uso de VirtIO

VirtIO es un estándar de paravirtualización. Los drivers VirtIO para discos y redes reducen drásticamente la latencia y el overhead. En Linux invitado, estos drivers suelen estar incluidos. En Windows, debes instalarlos manualmente (los drivers se encuentran en el proyecto Fedora).

  • Disco: bus=virtio en la definición de la VM.
  • Red: model=virtio en la interfaz de red.

2. Aislamiento de CPUs (CPU Pinning)

Para cargas de trabajo intensivas (bases de datos, HPC), puedes asignar CPUs físicas específicas a las VMs, evitando la contención.

virsh vcpupin nombre-vm 0 2   # El vCPU 0 se ejecuta en el CPU físico 2
virsh vcpupin nombre-vm 1 3   # El vCPU 1 se ejecuta en el CPU físico 3

3. Huge Pages

Las páginas de memoria de 2MB o 1GB reducen la carga del TLB (Translation Lookaside Buffer), mejorando el rendimiento de la memoria.

En el host:

# Reservar 1024 páginas de 2MB (2GB)
echo 1024 > /sys/kernel/mm/hugepages/hugepages-2048kB/nr_hugepages

En la VM:

<memoryBacking>
  <hugepages/>
</memoryBacking>

4. Modo de caché del disco

Para discos, el modo writeback o unsafe puede mejorar el rendimiento, pero conlleva riesgos de pérdida de datos. El modo writethrough es más seguro pero más lento.

# En virt-install
--disk ...,cache=writeback

[WARNING] Nunca uses cache=unsafe en producción a menos que sepas exactamente lo que haces. Puede causar corrupción de datos si el host falla.

Snapshots y backups

Los snapshots permiten capturar el estado de una VM en un instante. Son ideales para pruebas o antes de aplicar actualizaciones.

Crear un snapshot (solo para discos qcow2)

virsh snapshot-create-as nombre-vm snapshot1 "Snapshot antes de actualizar"

Listar snapshots

virsh snapshot-list nombre-vm

Revertir a un snapshot

virsh snapshot-revert nombre-vm snapshot1

Eliminar un snapshot

virsh snapshot-delete nombre-vm snapshot1

[INFO] Los snapshots no son backups. Si eliminas el disco base, pierdes todo. Para backups reales, usa virt-clone o copia el archivo qcow2 mientras la VM está apagada.

Automatización con scripts

Un SysAdmin eficiente automatiza todo. Aquí tienes un script bash para crear una VM rápidamente:

#!/bin/bash
# Script: crear-vm.sh
# Uso: ./crear-vm.sh nombre-vm ram-mb vcpus disco-gb iso-path

VM_NAME=$1
RAM=$2
VCPUS=$3
DISK_GB=$4
ISO=$5

DISK_PATH="/var/lib/libvirt/images/${VM_NAME}.qcow2"

virt-install \
  --name $VM_NAME \
  --ram $RAM \
  --vcpus $VCPUS \
  --disk path=$DISK_PATH,size=$DISK_GB,format=qcow2 \
  --cdrom $ISO \
  --network bridge=br0,model=virtio \
  --graphics none \
  --console pty,target_type=serial \
  --os-variant detect=on,name=linux \
  --extra-args "console=ttyS0,115200n8 serial"

Conclusión

La combinación KVM y QEMU es la solución de virtualización nativa de Linux más potente, flexible y eficiente. A diferencia de soluciones como VirtualBox (tipo 2), KVM ofrece rendimiento bare-metal y una integración total con el ecosistema Linux. Dominar herramientas como virsh, virt-install, la configuración de redes bridge y las optimizaciones de rendimiento (VirtIO, CPU pinning, Huge Pages) te permitirá gestionar desde un laboratorio local hasta un clúster de servidores de producción.

La virtualización con KVM no es solo una habilidad técnica; es la base sobre la que se construyen infraestructuras modernas, desde nubes privadas (OpenStack) hasta entornos de contenedores anidados. Si trabajas con Linux, aprender KVM es una inversión que multiplica tu valor como SysAdmin.

¿Necesitas ayuda?Son dos de nuestros técnicos, Agustín y Mikel, y están disponibles para resolver cualquier problema.

Hablar con ellos ahora
Agustín y Mikel