351.4 Libvirt y Herramientas Relacionadas

Introducción

Libvirt es la capa de abstracción estándar para gestionar plataformas de virtualización en Linux. Con un peso de 9 puntos, este es el subtema más importante de toda la especialidad LPIC-3 305. Proporciona una API unificada, un demonio de gestión y herramientas de línea de comandos para controlar múltiples hipervisores.

Arquitectura de Libvirt

┌──────────────────────────────────────────────┐
│ Herramientas de usuario                       │
│ virsh │ virt-manager │ virt-install │ oVirt   │
├──────────────────────────────────────────────┤
│              libvirt API (C, Python)          │
├──────────────────────────────────────────────┤
│              libvirtd (demonio)               │
├──────┬───────┬────────┬───────┬──────────────┤
│ QEMU │ KVM   │ Xen    │ LXC   │ VirtualBox   │
│driver│driver │driver  │driver │driver         │
└──────┴───────┴────────┴───────┴──────────────┘

Componentes principales

ComponenteDescripción
libvirtdDemonio que gestiona conexiones, autenticación y operaciones de virtualización
API libvirtAPI en C con bindings para Python, Perl, Java, Go, etc.
DriversBackends para cada tecnología: QEMU/KVM, Xen, LXC, VirtualBox
XML de dominioFormato declarativo para definir VMs

URIs de Conexión

Las URIs identifican el hipervisor y el host al que conectarse:

URIDescripción
qemu:///systemKVM/QEMU local con privilegios de sistema
qemu:///sessionKVM/QEMU local como usuario sin privilegios
qemu+ssh://host/systemKVM/QEMU remoto vía SSH
qemu+tcp://host/systemKVM/QEMU remoto vía TCP
xen:///Xen local
lxc:///Contenedores LXC locales
test:///defaultDriver de pruebas
# Conectar a hipervisor local
virsh -c qemu:///system
 
# Conectar a hipervisor remoto por SSH
virsh -c qemu+ssh://usuario@host/system

Para el examen: La diferencia entre qemu:///system y qemu:///session es crucial. system ejecuta VMs como root con acceso completo a redes bridge. session ejecuta VMs como usuario normal con red NAT.

virsh: Herramienta Principal

Gestión de Dominios

# Listar VMs activas
virsh list
 
# Listar todas las VMs (activas e inactivas)
virsh list --all
 
# Iniciar una VM definida
virsh start mi-vm
 
# Apagado ordenado (ACPI)
virsh shutdown mi-vm
 
# Apagado forzado
virsh destroy mi-vm
 
# Reiniciar
virsh reboot mi-vm
 
# Suspender (pausa)
virsh suspend mi-vm
 
# Reanudar
virsh resume mi-vm

Definir y Crear Dominios

# Definir VM persistente desde XML (no la arranca)
virsh define mi-vm.xml
 
# Crear VM transitoria desde XML (la arranca inmediatamente)
virsh create mi-vm.xml
 
# Eliminar definición de VM (no borra discos)
virsh undefine mi-vm
 
# Eliminar definición incluyendo almacenamiento
virsh undefine mi-vm --remove-all-storage

Para el examen: define crea una VM persistente (sobrevive reinicios del host). create crea una VM transitoria (desaparece al apagarse). undefine elimina la definición pero NO los discos a menos que se use --remove-all-storage.

Información del Dominio

# Información general
virsh dominfo mi-vm
 
# Listar discos de la VM
virsh domblklist mi-vm
 
# Listar interfaces de red de la VM
virsh domiflist mi-vm
 
# Ver XML completo de definición
virsh dumpxml mi-vm
 
# Editar XML de la VM
virsh edit mi-vm
 
# Estadísticas de CPU
virsh cpu-stats mi-vm
 
# Estadísticas de bloque
virsh domblkstat mi-vm vda

Consola

# Conectar a la consola serial de la VM
virsh console mi-vm
 
# Salir con Ctrl+]

Autostart

# Habilitar arranque automático con el host
virsh autostart mi-vm
 
# Deshabilitar arranque automático
virsh autostart --disable mi-vm

Snapshots con virsh

# Crear snapshot
virsh snapshot-create-as mi-vm --name snap1 --description "Antes de actualizar"
 
# Listar snapshots
virsh snapshot-list mi-vm
 
# Ver información del snapshot
virsh snapshot-info mi-vm snap1
 
# Revertir a un snapshot
virsh snapshot-revert mi-vm snap1
 
# Eliminar snapshot
virsh snapshot-delete mi-vm snap1
 
# Ver snapshot actual
virsh snapshot-current mi-vm

Migración de VMs

Migración en Vivo (Live Migration)

La VM continúa funcionando durante la migración. Requiere:

  • Almacenamiento compartido (NFS, iSCSI, Ceph, etc.)
  • Misma arquitectura de CPU
  • Conectividad de red entre hosts
  • libvirtd ejecutándose en ambos hosts
# Migración en vivo
virsh migrate --live mi-vm qemu+ssh://host-destino/system
 
# Migración en vivo con túnel
virsh migrate --live --p2p --tunnelled mi-vm qemu+ssh://host-destino/system
 
# Migración con copia de almacenamiento
virsh migrate --live --copy-storage-all mi-vm qemu+ssh://host-destino/system
 
# Migración offline (VM apagada)
virsh migrate --offline --persistent mi-vm qemu+ssh://host-destino/system

Para el examen: La migración en vivo (--live) transfiere la memoria mientras la VM sigue funcionando. La opción --copy-storage-all permite migrar sin almacenamiento compartido copiando los discos.

virt-install

Herramienta para crear VMs de forma automatizada:

# Instalación básica desde ISO
virt-install \
  --name mi-vm \
  --ram 2048 \
  --vcpus 2 \
  --disk path=/var/lib/libvirt/images/mi-vm.qcow2,size=20,format=qcow2 \
  --cdrom /iso/ubuntu-22.04.iso \
  --os-variant ubuntu22.04 \
  --network bridge=br0 \
  --graphics vnc,listen=0.0.0.0 \
  --noautoconsole
 
# Instalación desde red (PXE)
virt-install \
  --name mi-vm \
  --ram 2048 \
  --vcpus 2 \
  --disk size=20 \
  --pxe \
  --network bridge=br0 \
  --os-variant centos-stream9
 
# Instalación con ubicación de red (Kickstart)
virt-install \
  --name mi-vm \
  --ram 2048 \
  --disk size=20 \
  --location http://mirror.centos.org/centos/9-stream/BaseOS/x86_64/os/ \
  --extra-args "ks=http://server/ks.cfg" \
  --os-variant centos-stream9
 
# Listar variantes de SO disponibles
virt-install --osinfo list

virt-manager

Interfaz gráfica para gestionar VMs a través de libvirt. Permite:

  • Crear, configurar y eliminar VMs
  • Ver consola gráfica (VNC/SPICE)
  • Gestionar redes virtuales y almacenamiento
  • Monitorizar rendimiento
  • Conectar a hipervisores remotos vía SSH

virt-clone

Clonar una VM existente:

# Clonar VM con nuevo nombre y disco
virt-clone \
  --original mi-vm \
  --name mi-vm-clon \
  --file /var/lib/libvirt/images/mi-vm-clon.qcow2
 
# Clonar con autodescubrimiento de discos
virt-clone --original mi-vm --auto-clone

Configuración XML del Dominio

Estructura básica

<domain type='kvm'>
  <name>mi-vm</name>
  <memory unit='MiB'>2048</memory>
  <vcpu placement='static'>2</vcpu>
  <os>
    <type arch='x86_64' machine='pc-q35-6.2'>hvm</type>
    <boot dev='hd'/>
  </os>
  <features>
    <acpi/>
    <apic/>
  </features>
  <cpu mode='host-passthrough'/>
  <devices>
    <disk type='file' device='disk'>
      <driver name='qemu' type='qcow2'/>
      <source file='/var/lib/libvirt/images/mi-vm.qcow2'/>
      <target dev='vda' bus='virtio'/>
    </disk>
    <interface type='bridge'>
      <source bridge='br0'/>
      <model type='virtio'/>
    </interface>
    <graphics type='vnc' port='-1' autoport='yes'/>
    <console type='pty'/>
  </devices>
</domain>

Redes Virtuales

Tipos de red

TipoDescripciónUso
NATRed privada con NAT al exterior (default)Desarrollo, pruebas
BridgeVM conectada directamente al bridge del hostProducción
IsolatedRed solo entre VMs, sin acceso exteriorLaboratorios aislados
MacvtapConexión directa a interfaz del hostRendimiento

Gestión de redes

# Listar redes virtuales
virsh net-list --all
 
# Ver XML de red
virsh net-dumpxml default
 
# Crear red desde XML
virsh net-define red.xml
 
# Iniciar red
virsh net-start mi-red
 
# Activar autostart
virsh net-autostart mi-red
 
# Eliminar red
virsh net-destroy mi-red
virsh net-undefine mi-red
 
# Editar red existente
virsh net-edit mi-red

XML de red NAT (default)

<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>

Storage Pools y Volumes

Storage Pools

# Listar pools de almacenamiento
virsh pool-list --all
 
# Crear pool tipo directorio
virsh pool-define-as mi-pool dir --target /var/lib/libvirt/images/mi-pool
 
# Construir pool
virsh pool-build mi-pool
 
# Iniciar pool
virsh pool-start mi-pool
 
# Autostart
virsh pool-autostart mi-pool
 
# Información del pool
virsh pool-info mi-pool
 
# Refrescar contenido
virsh pool-refresh mi-pool

Volumes

# Listar volúmenes de un pool
virsh vol-list mi-pool
 
# Crear volumen
virsh vol-create-as mi-pool mi-disco.qcow2 20G --format qcow2
 
# Información del volumen
virsh vol-info mi-disco.qcow2 --pool mi-pool
 
# Eliminar volumen
virsh vol-delete mi-disco.qcow2 --pool mi-pool
 
# Clonar volumen
virsh vol-clone mi-disco.qcow2 mi-disco-copia.qcow2 --pool mi-pool

Archivos Importantes

RutaDescripción
/etc/libvirt/libvirtd.confConfiguración del demonio libvirtd
/etc/libvirt/qemu/XMLs de dominios definidos
/var/lib/libvirt/images/Directorio por defecto de imágenes
/var/lib/libvirt/qemu/Estado de runtime de las VMs
/var/log/libvirt/qemu/Logs de las VMs QEMU/KVM
/etc/libvirt/qemu/networks/Definiciones de redes virtuales
/etc/libvirt/storage/Definiciones de pools de almacenamiento

Resumen

ConceptoDetalle clave
virsh define vs createPersistente vs transitoria
virsh undefineNo borra discos (sin —remove-all-storage)
qemu:///system vs sessionRoot con bridge vs usuario con NAT
Migración --liveVM sigue funcionando durante la migración
virt-installAutomatizar creación de VMs
virt-cloneClonar VMs existentes
Storage poolsAbstracción de almacenamiento en libvirt
Redes: NAT, bridge, isolatedTres modos principales de red

Trampas del examen

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

  • virsh define vs virsh createdefine registra una VM persistente (sobrevive reinicios del host) pero NO la arranca. create arranca una VM transitoria que desaparece al apagarse. El examen preguntara cual usar para que una VM este disponible tras reiniciar el host.
  • virsh destroy no borra la VMdestroy hace un apagado forzado inmediato (como cortar la corriente), NO elimina la definicion ni los discos. Para eliminar la definicion se usa virsh undefine. La terminologia es intencionadamente confusa en el examen.
  • virsh undefine no borra discos por defectoundefine elimina solo la definicion XML. Los discos permanecen en el disco. Para eliminar tambien los discos hay que usar --remove-all-storage. El examen puede preguntar por que el espacio en disco no se libera tras undefine.
  • qemu:///system vs qemu:///sessionsystem corre como root, acceso a bridges de red reales, VMs visibles para todos los usuarios. session corre como usuario normal, solo red NAT, VMs privadas del usuario. Las tres barras (///) indican conexion local (host vacio entre la segunda y tercera barra).
  • Migracion --live vs --offline--live transfiere la VM mientras sigue funcionando (requiere almacenamiento compartido o --copy-storage-all). --offline solo transfiere la definicion XML sin datos de disco ni memoria. --copy-storage-all permite migracion sin almacenamiento compartido pero es mucho mas lenta.
  • virsh shutdown vs virsh destroyshutdown envia senal ACPI al guest para un apagado ordenado (el guest puede ignorarla si no tiene ACPI configurado). destroy mata el proceso QEMU inmediatamente. Si shutdown no funciona, es porque el guest no tiene soporte ACPI.
  • Storage pool pool-define-as vs pool-create-aspool-define-as define el pool de forma persistente sin iniciarlo. pool-create-as crea un pool transitorio que desaparece al reiniciar libvirtd. Sigue el mismo patron que define vs create para dominios.
  • Red NAT (default) usa virbr0 — La red default de libvirt crea el bridge virbr0 con la subred 192.168.122.0/24 y DHCP. Esta red es NAT, no bridge. Las VMs en red default pueden salir a internet pero no son accesibles desde fuera sin port forwarding.
  • virsh edit vs editar XML manualmentevirsh edit abre el XML en un editor y valida los cambios antes de aplicarlos. Editar directamente los archivos XML en /etc/libvirt/qemu/ no actualiza la configuracion en memoria y puede causar inconsistencias. Siempre usar virsh edit.
  • virt-install --os-variant no es opcional en la practica — Aunque tecnicamente opcional, --os-variant (o --osinfo) optimiza la configuracion de hardware virtual para el SO invitado (virtio, ACPI, etc.). Omitirlo puede causar rendimiento suboptimo o fallos de arranque del guest.