351.3 QEMU

Introducción

QEMU (Quick Emulator) es un emulador y virtualizador genérico de código abierto. Puede funcionar como emulador puro (traduciendo instrucciones por software) o como virtualizador en combinación con KVM, ofreciendo rendimiento casi nativo.

QEMU como Emulador y Virtualizador

Modo Emulación (sin KVM)

Traduce instrucciones de una arquitectura a otra por software. Permite ejecutar ARM en x86, por ejemplo, pero con rendimiento reducido.

# Emular sistema ARM en host x86
qemu-system-arm -M versatilepb -kernel zImage -dtb versatile-pb.dtb

Modo Virtualización (con KVM)

Ejecuta código nativo en la CPU del host usando extensiones de hardware. Requiere misma arquitectura host/guest.

# Virtualización con aceleración KVM
qemu-system-x86_64 -enable-kvm -m 2048 -hda disco.qcow2

Para el examen: La opción -enable-kvm o -accel kvm activa la aceleración KVM. Sin ella, QEMU funciona en modo emulación pura, mucho más lento.

qemu-system-x86_64

Comando principal para ejecutar máquinas virtuales x86_64:

# Ejemplo completo de arranque de VM
qemu-system-x86_64 \
  -enable-kvm \
  -m 2048 \
  -smp 2 \
  -cpu host \
  -hda /var/lib/libvirt/images/vm.qcow2 \
  -cdrom /iso/ubuntu.iso \
  -boot d \
  -net nic -net user \
  -vnc :1 \
  -daemonize

Opciones fundamentales

OpciónDescripción
-enable-kvmActivar aceleración KVM
-m <MB>Memoria RAM en MB
-smp <N>Número de CPUs virtuales
-cpu hostExponer las características reales de la CPU
-hda <imagen>Disco duro primario
-cdrom <iso>CD-ROM virtual
-boot <orden>Orden de arranque: c=disco, d=cdrom, n=red
-daemonizeEjecutar en segundo plano
-name <nombre>Nombre de la VM
-nographicSin interfaz gráfica (solo consola serial)

qemu-img: Gestión de Imágenes de Disco

Crear imágenes

# Crear imagen qcow2 de 20GB (thin provisioning)
qemu-img create -f qcow2 disco.qcow2 20G
 
# Crear imagen raw de 10GB
qemu-img create -f raw disco.raw 10G
 
# Crear imagen con backing file (copy-on-write)
qemu-img create -f qcow2 -b base.qcow2 -F qcow2 snapshot.qcow2

Obtener información

# Información de una imagen
qemu-img info disco.qcow2
 
# Información incluyendo cadena de backing files
qemu-img info --backing-chain disco.qcow2

Convertir formatos

# Convertir raw a qcow2
qemu-img convert -f raw -O qcow2 disco.raw disco.qcow2
 
# Convertir qcow2 a vmdk (VMware)
qemu-img convert -f qcow2 -O vmdk disco.qcow2 disco.vmdk
 
# Convertir con compresión
qemu-img convert -c -f raw -O qcow2 disco.raw disco.qcow2

Redimensionar

# Aumentar tamaño en 10GB
qemu-img resize disco.qcow2 +10G
 
# Establecer tamaño exacto
qemu-img resize disco.qcow2 50G
 
# Reducir tamaño (requiere --shrink)
qemu-img resize --shrink disco.qcow2 15G

Snapshots

# Crear snapshot interno
qemu-img snapshot -c snap1 disco.qcow2
 
# Listar snapshots
qemu-img snapshot -l disco.qcow2
 
# Aplicar (revertir a) snapshot
qemu-img snapshot -a snap1 disco.qcow2
 
# Eliminar snapshot
qemu-img snapshot -d snap1 disco.qcow2

Para el examen: Los snapshots internos solo están soportados en formato qcow2. Las imágenes raw no soportan snapshots.

Formatos de Imagen

FormatoExtensiónCaracterísticas
raw.img, .rawSin overhead, mejor rendimiento, sin snapshots, tamaño completo
qcow2.qcow2Nativo QEMU, thin provisioning, snapshots, compresión, cifrado
vmdk.vmdkFormato VMware
vdi.vdiFormato VirtualBox
vhd/vhdx.vhd, .vhdxFormato Microsoft Hyper-V

Comparativa de formatos

Característicarawqcow2vmdkvdi
Thin provisioningNo
SnapshotsNoLimitadoNo
CompresiónNoNo
CifradoNoSí (LUKS)NoNo
Backing filesNoNoNo
RendimientoMáximoMuy buenoBuenoBueno

Snapshots: Internos vs Externos

Snapshots Internos

Se almacenan dentro del propio archivo qcow2. Capturan el estado del disco (y opcionalmente RAM y dispositivos).

# Crear snapshot interno desde QEMU Monitor
(qemu) savevm mi-snapshot
 
# Restaurar snapshot
(qemu) loadvm mi-snapshot
 
# Desde línea de comandos
qemu-img snapshot -c mi-snapshot disco.qcow2

Snapshots Externos

Crean un nuevo archivo qcow2 que usa la imagen original como backing file. La imagen original queda en modo solo lectura.

# Crear snapshot externo
qemu-img create -f qcow2 -b disco.qcow2 -F qcow2 disco-snap1.qcow2
 
# Cadena de backing files
# base.qcow2 ← snap1.qcow2 ← snap2.qcow2 (activa)

Para el examen: Los snapshots externos usan copy-on-write: solo almacenan los bloques que han cambiado respecto al backing file. Son más eficientes para workflows de ramificación.

QEMU Monitor

Interfaz interactiva de control de QEMU accesible durante la ejecución:

# Acceder al monitor (Ctrl+Alt+2 en ventana gráfica)
# O iniciar con monitor en stdio
qemu-system-x86_64 -monitor stdio ...

Comandos del Monitor

ComandoDescripción
info statusEstado de la VM
info snapshotsListar snapshots
info blockInformación de dispositivos de bloque
info networkInformación de red
savevm <nombre>Crear snapshot (estado completo)
loadvm <nombre>Restaurar snapshot
stopPausar la VM
contReanudar la VM
quitSalir de QEMU
system_resetReiniciar la VM
system_powerdownApagado ACPI
migrate <uri>Migrar la VM
change vnc :2Cambiar puerto VNC

Emulación de Dispositivos

Red

# Red de usuario (NAT, sin configuración)
-net nic -net user
 
# TAP device (bridging)
-netdev tap,id=net0,ifname=tap0,script=no -device virtio-net-pci,netdev=net0
 
# Bridge directo
-netdev bridge,id=net0,br=br0 -device virtio-net-pci,netdev=net0

Almacenamiento

# Disco con interfaz virtio (mejor rendimiento)
-drive file=disco.qcow2,format=qcow2,if=virtio
 
# Disco IDE clásico
-drive file=disco.qcow2,format=qcow2,if=ide
 
# Múltiples discos
-drive file=disco1.qcow2,if=virtio,index=0 \
-drive file=disco2.qcow2,if=virtio,index=1

Dispositivos genéricos

# USB tablet (mejor integración del ratón)
-device usb-tablet
 
# Tarjeta de sonido
-device ich9-intel-hda -device hda-output
 
# Puerto serie redirigido a stdio
-serial stdio

Consola Serial

# Redirigir consola serial a la terminal
qemu-system-x86_64 -nographic -serial mon:stdio ...
 
# El guest necesita configurar la consola serial en GRUB:
# GRUB_CMDLINE_LINUX="console=ttyS0,115200n8"

VNC y SPICE

# Habilitar VNC en display :1 (puerto 5901)
qemu-system-x86_64 -vnc :1 ...
 
# VNC con contraseña
qemu-system-x86_64 -vnc :1,password=on ...
 
# SPICE (mejor rendimiento para escritorio)
qemu-system-x86_64 \
  -spice port=5930,disable-ticketing=on \
  -device virtio-vga \
  -device virtio-serial-pci \
  -chardev spicevmc,id=spicechannel0,name=vdagent \
  -device virtserialport,chardev=spicechannel0,name=com.redhat.spice.0

Para el examen: SPICE ofrece mejor rendimiento para entornos de escritorio que VNC, soportando audio, USB remoto y copiar/pegar bidireccional. VNC es más universal y simple.

Resumen

ConceptoDetalle clave
-enable-kvmActiva aceleración hardware
qcow2Formato nativo, soporta snapshots y thin provisioning
rawMejor rendimiento, sin funcionalidades avanzadas
qemu-imgHerramienta para crear, convertir y gestionar imágenes
QEMU MonitorControl interactivo de la VM en ejecución
virtioDrivers PV para mejor rendimiento en E/S
SPICE > VNCSPICE para escritorio, VNC para acceso básico

Trampas del examen

Errores comunes y distinciones criticas que LPI suele evaluar en este subtema:

  • -enable-kvm vs modo emulacion — Sin -enable-kvm (o -accel kvm), QEMU funciona en modo emulacion pura por software, ordenes de magnitud mas lento. El examen puede mostrar un comando qemu-system-x86_64 y preguntar por que la VM es muy lenta: la respuesta es que falta -enable-kvm.
  • qcow2 vs raw: snapshots — Solo qcow2 soporta snapshots internos, backing files, compresion y cifrado LUKS. Las imagenes raw NO soportan ninguna de estas funcionalidades. Si te preguntan como crear un snapshot interno en una imagen raw, la respuesta es que no es posible.
  • qemu-img resize --shrink — Aumentar el tamano de una imagen no requiere flag especial (qemu-img resize disco.qcow2 +10G), pero reducir el tamano SI requiere --shrink como medida de seguridad. Olvidar --shrink al reducir produce un error.
  • Snapshot -c vs -a vs -d — En qemu-img snapshot: -c crea (create), -a aplica/revierte (apply), -d elimina (delete), -l lista. El examen puede mezclar estas flags para confundir.
  • Snapshots internos vs externos — Los internos se almacenan dentro del propio archivo qcow2. Los externos crean un nuevo archivo overlay que usa la imagen original como backing file (solo lectura). Los externos son mas eficientes para ramificacion (branching) pero crean cadenas de dependencia.
  • QEMU Monitor: savevm vs snapshotsavevm en el QEMU Monitor captura el estado completo (disco + RAM + dispositivos). qemu-img snapshot -c desde la linea de comandos solo captura el estado del disco. No son equivalentes.
  • VNC :1 = puerto 5901 — El display VNC :N corresponde al puerto 5900 + N. Asi, -vnc :1 escucha en el puerto 5901, -vnc :0 en 5900. El examen puede preguntar en que puerto se conecta un cliente VNC.
  • SPICE vs VNC — SPICE ofrece audio, USB remoto, copiar/pegar bidireccional y mejor rendimiento para escritorio. VNC es mas simple y universal pero con menos funcionalidades. El examen preguntara cual protocolo elegir para entornos de escritorio (SPICE) vs acceso basico remoto (VNC).
  • -net user vs -netdev tap-net user proporciona NAT simple sin configuracion (ideal para pruebas), pero no permite que la VM sea accesible desde el exterior. -netdev tap con bridge permite conectividad completa bidireccional. Cuidado con confundir cuando se necesita cada uno.
  • -cpu host expone las flags reales de la CPU — Esta opcion pasa las caracteristicas reales del procesador al guest, necesaria para migracion en vivo (la CPU debe ser compatible) y para funcionalidades avanzadas. Sin -cpu host, QEMU emula una CPU generica con menos features.