libvirt

Introducción

libvirt es una API, un daemon (libvirtd) y un conjunto de herramientas que proporciona una interfaz unificada para gestionar distintos hipervisores: KVM/QEMU, Xen, LXC, VMware ESXi y otros. Es la capa de abstracción estándar en Linux para administrar máquinas virtuales desde la línea de comandos (virsh) o desde interfaces gráficas (virt-manager).

Arquitectura

  • libvirtd: daemon que gestiona los hipervisores y expone la API
  • virsh: cliente CLI que se comunica con libvirtd
  • virt-manager: cliente gráfico
  • libvirt API: usada por herramientas como OpenStack, oVirt, Proxmox

libvirt se conecta al hipervisor mediante URIs de conexión:


qemu:///system      # KVM/QEMU como root (daemon del sistema)
qemu:///session     # KVM/QEMU como usuario sin privilegios
xen:///             # Xen
lxc:///             # LXC
          

Dominios (máquinas virtuales)

En libvirt, las VMs se denominan dominios. Su configuración se define en XML y libvirt la almacena en /etc/libvirt/qemu/.


virsh list                  # VMs en ejecución
virsh list --all            # todas las VMs (incluidas las apagadas)
virsh dominfo nombre-vm     # información detallada de una VM
virsh dumpxml nombre-vm     # XML de configuración de la VM
          

Redes virtuales

libvirt gestiona redes virtuales. Los modos más comunes son:

  • NAT (por defecto): las VMs acceden a Internet a través del host
  • Bridge: la VM tiene IP directa en la red física del host
  • Isolated: red privada solo entre VMs, sin salida
  • Routed: el host enruta el tráfico sin NAT

virsh net-list --all                  # listar redes
virsh net-info default                # info de la red NAT por defecto
virsh net-start default               # arrancar red
virsh net-autostart default           # activar en el arranque
virsh net-dumpxml default             # ver XML de la red
          

Pools de almacenamiento

Un pool es una fuente de almacenamiento gestionada por libvirt (directorio, LVM, NFS, iSCSI). Dentro de un pool se crean volúmenes (los discos de las VMs).


virsh pool-list --all                         # listar pools
virsh pool-info default                       # info del pool por defecto
virsh vol-list default                        # volúmenes del pool "default"
virsh vol-info nombre.qcow2 --pool default    # info de un volumen concreto

# El pool "default" almacena imágenes en:
ls /var/lib/libvirt/images/
          

Formato de imagen qcow2

El formato estándar para discos de VMs en KVM es qcow2 (QEMU Copy-On-Write v2). Sus ventajas:

  • Aprovisionamiento fino: ocupa solo el espacio realmente usado
  • Snapshots integrados
  • Compresión y cifrado opcionales

# Crear un volumen qcow2 de 20 GB
virsh vol-create-as default mi-disco.qcow2 20G --format qcow2

# Ver info de una imagen directamente con qemu-img
qemu-img info /var/lib/libvirt/images/mi-disco.qcow2
          

Configuración XML

Toda la configuración en libvirt se expresa en XML. Ejemplo simplificado de una VM:


<domain type='kvm'>
  <name>mi-vm</name>
  <memory unit='MiB'>2048</memory>
  <vcpu>2</vcpu>
  <os>
    <type arch='x86_64'>hvm</type>
  </os>
  <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='network'>
      <source network='default'/>
      <model type='virtio'/>
    </interface>
  </devices>
</domain>
          

# Editar la configuración de una VM existente
virsh edit nombre-vm
          

libvirt es la interfaz estándar para gestionar KVM en Linux. Su modelo basado en XML permite automatizar la creación y configuración de VMs de forma reproducible.

Herramientas de gestión

Índice de la sección

Índice del curso