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
| Componente | Descripción |
|---|---|
| libvirtd | Demonio que gestiona conexiones, autenticación y operaciones de virtualización |
| API libvirt | API en C con bindings para Python, Perl, Java, Go, etc. |
| Drivers | Backends para cada tecnología: QEMU/KVM, Xen, LXC, VirtualBox |
| XML de dominio | Formato declarativo para definir VMs |
URIs de Conexión
Las URIs identifican el hipervisor y el host al que conectarse:
| URI | Descripción |
|---|---|
qemu:///system | KVM/QEMU local con privilegios de sistema |
qemu:///session | KVM/QEMU local como usuario sin privilegios |
qemu+ssh://host/system | KVM/QEMU remoto vía SSH |
qemu+tcp://host/system | KVM/QEMU remoto vía TCP |
xen:/// | Xen local |
lxc:/// | Contenedores LXC locales |
test:///default | Driver de pruebas |
# Conectar a hipervisor local
virsh -c qemu:///system
# Conectar a hipervisor remoto por SSH
virsh -c qemu+ssh://usuario@host/systemPara el examen: La diferencia entre
qemu:///systemyqemu:///sessiones crucial.systemejecuta VMs como root con acceso completo a redes bridge.sessionejecuta 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-vmDefinir 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-storagePara el examen:
definecrea una VM persistente (sobrevive reinicios del host).createcrea una VM transitoria (desaparece al apagarse).undefineelimina 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 vdaConsola
# 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-vmSnapshots 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-vmMigració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/systemPara el examen: La migración en vivo (
--live) transfiere la memoria mientras la VM sigue funcionando. La opción--copy-storage-allpermite 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 listvirt-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-cloneConfiguració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
| Tipo | Descripción | Uso |
|---|---|---|
| NAT | Red privada con NAT al exterior (default) | Desarrollo, pruebas |
| Bridge | VM conectada directamente al bridge del host | Producción |
| Isolated | Red solo entre VMs, sin acceso exterior | Laboratorios aislados |
| Macvtap | Conexión directa a interfaz del host | Rendimiento |
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-redXML 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-poolVolumes
# 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-poolArchivos Importantes
| Ruta | Descripción |
|---|---|
/etc/libvirt/libvirtd.conf | Configuració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
| Concepto | Detalle clave |
|---|---|
virsh define vs create | Persistente vs transitoria |
virsh undefine | No borra discos (sin —remove-all-storage) |
qemu:///system vs session | Root con bridge vs usuario con NAT |
Migración --live | VM sigue funcionando durante la migración |
| virt-install | Automatizar creación de VMs |
| virt-clone | Clonar VMs existentes |
| Storage pools | Abstracción de almacenamiento en libvirt |
| Redes: NAT, bridge, isolated | Tres modos principales de red |
Trampas del examen
Errores comunes y distinciones criticas que LPI suele evaluar en este subtema:
virsh definevsvirsh create—defineregistra una VM persistente (sobrevive reinicios del host) pero NO la arranca.createarranca una VM transitoria que desaparece al apagarse. El examen preguntara cual usar para que una VM este disponible tras reiniciar el host.virsh destroyno borra la VM —destroyhace un apagado forzado inmediato (como cortar la corriente), NO elimina la definicion ni los discos. Para eliminar la definicion se usavirsh undefine. La terminologia es intencionadamente confusa en el examen.virsh undefineno borra discos por defecto —undefineelimina 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 trasundefine.qemu:///systemvsqemu:///session—systemcorre como root, acceso a bridges de red reales, VMs visibles para todos los usuarios.sessioncorre 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
--livevs--offline—--livetransfiere la VM mientras sigue funcionando (requiere almacenamiento compartido o--copy-storage-all).--offlinesolo transfiere la definicion XML sin datos de disco ni memoria.--copy-storage-allpermite migracion sin almacenamiento compartido pero es mucho mas lenta. virsh shutdownvsvirsh destroy—shutdownenvia senal ACPI al guest para un apagado ordenado (el guest puede ignorarla si no tiene ACPI configurado).destroymata el proceso QEMU inmediatamente. Sishutdownno funciona, es porque el guest no tiene soporte ACPI.- Storage pool
pool-define-asvspool-create-as—pool-define-asdefine el pool de forma persistente sin iniciarlo.pool-create-ascrea un pool transitorio que desaparece al reiniciar libvirtd. Sigue el mismo patron quedefinevscreatepara dominios. - Red NAT (default) usa virbr0 — La red
defaultde libvirt crea el bridgevirbr0con la subred192.168.122.0/24y DHCP. Esta red es NAT, no bridge. Las VMs en reddefaultpueden salir a internet pero no son accesibles desde fuera sin port forwarding. virsh editvs editar XML manualmente —virsh editabre 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 usarvirsh edit.virt-install --os-variantno 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.