Gestión de Máquinas Virtuales con virsh: Guía Completa
Introducción
Virsh (Virtualization Shell) es la interfaz de línea de comandos para gestionar máquinas virtuales KVM/QEMU a través de libvirt. Como la herramienta más potente y flexible para la administración de VMs, virsh proporciona control granular sobre cada aspecto del ciclo de vida de las máquinas virtuales, desde la creación y configuración hasta el monitoreo y la solución de problemas.
Esta guía completa explora las extensas capacidades de virsh, cubriendo desde operaciones básicas de VMs hasta técnicas avanzadas de gestión utilizadas en entornos de producción. Ya sea que estés gestionando una única VM de desarrollo u orquestando cientos de máquinas virtuales en múltiples hosts, dominar virsh es esencial para una gestión eficiente de la virtualización.
A diferencia de herramientas gráficas como virt-manager, virsh ofrece comandos scriptables y compatibles con automatización que se integran perfectamente en flujos de trabajo DevOps, pipelines de CI/CD y soluciones de infraestructura como código. Su interfaz consistente y conjunto completo de características lo convierten en la herramienta de elección para administradores de sistemas profesionales e ingenieros de cloud.
Al final de esta guía, serás competente en el uso de virsh para gestionar máquinas virtuales, redes, pools de almacenamiento y snapshots, permitiéndote automatizar flujos de trabajo complejos de virtualización y solucionar problemas con confianza.
Comprendiendo Virsh y Libvirt
¿Qué es Virsh?
Virsh es una herramienta de línea de comandos que se comunica con el demonio libvirt (libvirtd) para gestionar plataformas de virtualización incluyendo KVM, QEMU, Xen, VMware y otros. Proporciona:
- Gestión del ciclo de vida de VMs (crear, iniciar, detener, eliminar)
- Asignación y modificación de recursos
- Configuración de redes y almacenamiento
- Operaciones de snapshots y clonación
- Capacidades de migración en vivo
- Recopilación de estadísticas y monitoreo
Arquitectura de Libvirt
┌──────────────────────────────────────┐
│ virsh (Herramienta CLI) │
├──────────────────────────────────────┤
│ libvirt API (libvirt-client) │
├──────────────────────────────────────┤
│ libvirtd (Demonio de Virtualización) │
├──────────────────────────────────────┤
│ Controladores de Hipervisor (KVM, QEMU, Xen) │
├──────────────────────────────────────┤
│ Hardware Físico │
└──────────────────────────────────────┘
URIs de Conexión
Virsh se conecta a hipervisores usando esquemas de URI:
# Conexión al sistema local (predeterminada)
virsh --connect qemu:///system
# Conexión remota vía SSH
virsh --connect qemu+ssh://usuario@host-remoto/system
# Conexión remota vía TLS
virsh --connect qemu+tls://host-remoto/system
# Sesión de usuario (no-root)
virsh --connect qemu:///session
# Verificar conexión actual
virsh uri
Comandos Básicos de Virsh
Obtener Ayuda
# Ayuda general
virsh help
# Ayuda para comando específico
virsh help list
virsh help start
# Listar todos los comandos por categoría
virsh help | less
# Buscar comandos
virsh help | grep snapshot
Listar Máquinas Virtuales
# Listar VMs en ejecución
virsh list
# Listar todas las VMs (incluyendo detenidas)
virsh list --all
# Listar VMs con detalles adicionales
virsh list --all --title
# Listar solo VMs inactivas
virsh list --inactive
# Listar con más información
virsh list --all --name
virsh list --all --uuid
Salida de ejemplo:
Id Name State
----------------------------
1 ubuntu-vm running
2 centos-vm running
- debian-vm shut off
Información y Detalles de VMs
# Mostrar información de la VM
virsh dominfo ubuntu-vm
# Mostrar ID de la VM
virsh domid ubuntu-vm
# Mostrar UUID de la VM
virsh domuuid ubuntu-vm
# Mostrar estado de la VM
virsh domstate ubuntu-vm
# Mostrar todos los metadatos de la VM
virsh metadata ubuntu-vm --uri http://example.com/
# Mostrar configuración de la VM (XML)
virsh dumpxml ubuntu-vm
# Mostrar configuración con información de seguridad
virsh dumpxml ubuntu-vm --security-info
# Guardar configuración en archivo
virsh dumpxml ubuntu-vm > ubuntu-vm.xml
Gestión del Ciclo de Vida de VMs
Iniciar Máquinas Virtuales
# Iniciar una VM
virsh start ubuntu-vm
# Iniciar VM y abrir consola
virsh start ubuntu-vm --console
# Iniciar desde estado pausado
virsh start ubuntu-vm --paused
# Forzar inicio (ignorar errores)
virsh start ubuntu-vm --force-boot
# Iniciar con dispositivo de arranque específico
virsh start ubuntu-vm --boot-device cdrom
Detener Máquinas Virtuales
# Apagado ordenado (señal ACPI)
virsh shutdown ubuntu-vm
# Apagado con modo específico
virsh shutdown ubuntu-vm --mode acpi
# Apagado forzado (inmediato)
virsh destroy ubuntu-vm
# Reiniciar VM
virsh reboot ubuntu-vm
# Reiniciar con ACPI
virsh reboot ubuntu-vm --mode acpi
# Reinicio duro (como botón de reset físico)
virsh reset ubuntu-vm
Suspender y Reanudar
# Suspender (pausar) VM
virsh suspend ubuntu-vm
# Reanudar VM suspendida
virsh resume ubuntu-vm
# Guardar estado de VM en disco (hibernar)
virsh save ubuntu-vm /var/lib/libvirt/images/ubuntu-vm.save
# Restaurar VM desde estado guardado
virsh restore /var/lib/libvirt/images/ubuntu-vm.save
# Guardar con XML personalizado para restaurar
virsh save ubuntu-vm --xml custom.xml /tmp/ubuntu-vm.save
Configuración de Autoinicio
# Habilitar autoinicio al arrancar el host
virsh autostart ubuntu-vm
# Deshabilitar autoinicio
virsh autostart ubuntu-vm --disable
# Verificar estado de autoinicio
virsh dominfo ubuntu-vm | grep Autostart
Eliminar Máquinas Virtuales
# Indefinir VM (eliminar configuración, mantener disco)
virsh undefine ubuntu-vm
# Indefinir y eliminar todo el almacenamiento
virsh undefine ubuntu-vm --remove-all-storage
# Indefinir con snapshots
virsh undefine ubuntu-vm --snapshots-metadata
# Indefinir con estado guardado gestionado
virsh undefine ubuntu-vm --managed-save
# Eliminación completa
virsh undefine ubuntu-vm \
--remove-all-storage \
--snapshots-metadata \
--managed-save
Crear y Definir Máquinas Virtuales
Crear VM desde XML
# Crear archivo XML de configuración de VM
cat > ubuntu-vm.xml << 'EOF'
<domain type='kvm'>
<name>ubuntu-vm</name>
<memory unit='GiB'>4</memory>
<vcpu placement='static'>2</vcpu>
<os>
<type arch='x86_64' machine='pc'>hvm</type>
<boot dev='hd'/>
</os>
<devices>
<disk type='file' device='disk'>
<driver name='qemu' type='qcow2'/>
<source file='/var/lib/libvirt/images/ubuntu-vm.qcow2'/>
<target dev='vda' bus='virtio'/>
</disk>
<interface type='network'>
<source network='default'/>
<model type='virtio'/>
</interface>
<graphics type='vnc' port='-1' autoport='yes'/>
<console type='pty'/>
</devices>
</domain>
EOF
# Definir VM desde XML
virsh define ubuntu-vm.xml
# Crear e iniciar inmediatamente
virsh create ubuntu-vm.xml
# Definir pero no iniciar
virsh define ubuntu-vm.xml
Usar virt-install con virsh
# Crear VM con virt-install
virt-install \
--name ubuntu-vm \
--memory 4096 \
--vcpus 2 \
--disk path=/var/lib/libvirt/images/ubuntu-vm.qcow2,size=20 \
--os-variant ubuntu22.04 \
--network network=default,model=virtio \
--graphics vnc \
--cdrom /var/lib/libvirt/images/ubuntu-22.04.iso \
--print-xml > ubuntu-vm.xml
# Revisar y modificar XML antes de definir
vim ubuntu-vm.xml
# Definir la VM
virsh define ubuntu-vm.xml
Editar Configuración de VMs
Edición Interactiva de XML
# Editar configuración de la VM
virsh edit ubuntu-vm
# Esto abre el XML de la VM en tu editor predeterminado
# Los cambios se validan antes de guardar
Modificar Configuraciones de VMs
# Cambiar descripción de la VM
virsh desc ubuntu-vm "Servidor web Ubuntu 22.04"
# Ver descripción
virsh desc ubuntu-vm
# Cambiar título de la VM
virsh metadata ubuntu-vm \
--uri http://libvirt.org/title \
--key title \
--set "Servidor Web de Producción"
# Establecer metadatos personalizados
virsh metadata ubuntu-vm \
--uri http://example.com/ \
--key environment \
--set "production"
Modificación de Recursos
# Cambiar memoria máxima (requiere reinicio de VM)
virsh setmaxmem ubuntu-vm 8G --config
# Cambiar memoria actual (en vivo)
virsh setmem ubuntu-vm 4G --live
# Cambiar memoria permanentemente
virsh setmem ubuntu-vm 4G --config
# Ver configuración de memoria
virsh dommemstat ubuntu-vm
# Cambiar cantidad de vCPUs
virsh setvcpus ubuntu-vm 4 --config --maximum
virsh setvcpus ubuntu-vm 4 --config
virsh setvcpus ubuntu-vm 4 --live
# Ver información de CPU
virsh vcpucount ubuntu-vm
virsh vcpuinfo ubuntu-vm
Gestión de Recursos de VMs
Gestión de CPU
# Fijar vCPU a CPU física
virsh vcpupin ubuntu-vm 0 0
virsh vcpupin ubuntu-vm 1 1
# Ver fijación de CPU
virsh vcpupin ubuntu-vm
# Desfijar vCPU (permitir programación en cualquier CPU)
virsh vcpupin ubuntu-vm 0 0-7
# Establecer shares de CPU (prioridad de programación)
virsh schedinfo ubuntu-vm --set cpu_shares=2048
# Ver información del planificador
virsh schedinfo ubuntu-vm
# Mostrar estadísticas de CPU
virsh cpu-stats ubuntu-vm --total
Gestión de Memoria
# Establecer objetivo del globo de memoria
virsh setmem ubuntu-vm 2G
# Ver estadísticas de memoria
virsh dommemstat ubuntu-vm
# Establecer parámetros de memoria
virsh memtune ubuntu-vm --hard-limit 8388608 --soft-limit 4194304
# Ver ajuste de memoria
virsh memtune ubuntu-vm
# Obtener información del globo de memoria
virsh dominfo ubuntu-vm | grep memory
Gestión de Discos
# Listar discos de la VM
virsh domblklist ubuntu-vm
# Mostrar estadísticas de disco
virsh domblkstat ubuntu-vm vda
# Adjuntar nuevo disco a VM en ejecución
virsh attach-disk ubuntu-vm \
/var/lib/libvirt/images/ubuntu-vm-disk2.qcow2 \
vdb \
--driver qemu \
--subdriver qcow2 \
--type disk \
--live
# Adjuntar disco permanentemente
virsh attach-disk ubuntu-vm \
/var/lib/libvirt/images/ubuntu-vm-disk2.qcow2 \
vdb \
--driver qemu \
--subdriver qcow2 \
--config --persistent
# Desconectar disco
virsh detach-disk ubuntu-vm vdb --live
virsh detach-disk ubuntu-vm vdb --config
# Redimensionar disco
virsh blockresize ubuntu-vm vda 50G
# Obtener información de disco
virsh domblkinfo ubuntu-vm vda
Gestión de Interfaces de Red
# Listar interfaces de red de la VM
virsh domiflist ubuntu-vm
# Mostrar estadísticas de interfaz
virsh domifstat ubuntu-vm vnet0
# Adjuntar interfaz de red
virsh attach-interface ubuntu-vm \
--type network \
--source default \
--model virtio \
--config --live
# Desconectar interfaz de red
virsh detach-interface ubuntu-vm \
--type network \
--mac 52:54:00:xx:xx:xx \
--config
# Obtener detalles de interfaz
virsh domif-getlink ubuntu-vm vnet0
# Establecer estado del enlace
virsh domif-setlink ubuntu-vm vnet0 up
virsh domif-setlink ubuntu-vm vnet0 down
Gestión de Pools de Almacenamiento
Listar Pools de Almacenamiento
# Listar todos los pools de almacenamiento
virsh pool-list --all
# Listar pools activos
virsh pool-list
# Listar pools inactivos
virsh pool-list --inactive
# Listar con información detallada
virsh pool-list --all --details
Crear Pools de Almacenamiento
# Crear pool de almacenamiento basado en directorio
virsh pool-define-as mypool dir \
--target /var/lib/libvirt/pools/mypool
# Construir el pool
virsh pool-build mypool
# Iniciar el pool
virsh pool-start mypool
# Establecer autoinicio del pool
virsh pool-autostart mypool
# Creación de pool en una línea
virsh pool-define-as mypool dir --target /var/lib/libvirt/pools/mypool && \
virsh pool-build mypool && \
virsh pool-start mypool && \
virsh pool-autostart mypool
Operaciones de Pools de Almacenamiento
# Mostrar información del pool
virsh pool-info mypool
# Mostrar XML del pool
virsh pool-dumpxml mypool
# Actualizar pool (escanear nuevos volúmenes)
virsh pool-refresh mypool
# Eliminar pool (destruir)
virsh pool-destroy mypool
# Indefinir pool
virsh pool-undefine mypool
# Eliminar almacenamiento del pool
virsh pool-delete mypool
Gestión de Volúmenes
# Listar volúmenes en pool
virsh vol-list mypool
# Crear nuevo volumen
virsh vol-create-as mypool \
ubuntu-vm-disk.qcow2 \
20G \
--format qcow2
# Clonar volumen
virsh vol-clone \
--pool mypool \
ubuntu-vm-disk.qcow2 \
ubuntu-vm-disk-clone.qcow2
# Eliminar volumen
virsh vol-delete --pool mypool ubuntu-vm-disk.qcow2
# Mostrar información del volumen
virsh vol-info --pool mypool ubuntu-vm-disk.qcow2
# Obtener ruta del volumen
virsh vol-path --pool mypool ubuntu-vm-disk.qcow2
# Redimensionar volumen
virsh vol-resize --pool mypool ubuntu-vm-disk.qcow2 30G
# Subir a volumen
virsh vol-upload --pool mypool ubuntu-vm-disk.qcow2 /path/to/image.qcow2
# Descargar desde volumen
virsh vol-download --pool mypool ubuntu-vm-disk.qcow2 /backup/image.qcow2
Gestión de Redes
Listar Redes
# Listar todas las redes
virsh net-list --all
# Listar redes activas
virsh net-list
# Listar redes inactivas
virsh net-list --inactive
Crear Redes Virtuales
# Crear red NAT
cat > nat-network.xml << 'EOF'
<network>
<name>nat-network</name>
<forward mode='nat'>
<nat>
<port start='1024' end='65535'/>
</nat>
</forward>
<bridge name='virbr1' stp='on' delay='0'/>
<ip address='192.168.100.1' netmask='255.255.255.0'>
<dhcp>
<range start='192.168.100.2' end='192.168.100.254'/>
</dhcp>
</ip>
</network>
EOF
virsh net-define nat-network.xml
virsh net-start nat-network
virsh net-autostart nat-network
# Crear red aislada
cat > isolated-network.xml << 'EOF'
<network>
<name>isolated-network</name>
<bridge name='virbr-iso' stp='on' delay='0'/>
<ip address='10.0.0.1' netmask='255.255.255.0'>
<dhcp>
<range start='10.0.0.2' end='10.0.0.254'/>
</dhcp>
</ip>
</network>
EOF
virsh net-define isolated-network.xml
virsh net-start isolated-network
virsh net-autostart isolated-network
# Crear red bridge (para bridge existente)
cat > bridge-network.xml << 'EOF'
<network>
<name>bridge-network</name>
<forward mode='bridge'/>
<bridge name='br0'/>
</network>
EOF
virsh net-define bridge-network.xml
virsh net-start bridge-network
Operaciones de Red
# Mostrar información de red
virsh net-info default
# Mostrar XML de red
virsh net-dumpxml default
# Editar red
virsh net-edit default
# Iniciar red
virsh net-start nat-network
# Detener red
virsh net-destroy nat-network
# Establecer autoinicio de red
virsh net-autostart nat-network
# Deshabilitar autoinicio
virsh net-autostart nat-network --disable
# Eliminar red
virsh net-undefine nat-network
# Mostrar concesiones DHCP
virsh net-dhcp-leases default
Gestión de DHCP de Red
# Agregar entrada DHCP estática
virsh net-update default add ip-dhcp-host \
"<host mac='52:54:00:xx:xx:xx' name='webserver' ip='192.168.122.10'/>" \
--live --config
# Eliminar entrada DHCP
virsh net-update default delete ip-dhcp-host \
"<host mac='52:54:00:xx:xx:xx'/>" \
--live --config
# Agregar rango DHCP
virsh net-update default add ip-dhcp-range \
"<range start='192.168.122.100' end='192.168.122.200'/>" \
--live --config
# Ver todas las concesiones DHCP
virsh net-dhcp-leases default --mac 52:54:00:xx:xx:xx
Gestión de Snapshots
Crear Snapshots
# Crear snapshot
virsh snapshot-create-as ubuntu-vm \
snapshot1 \
"Estado de instalación limpia"
# Crear snapshot con XML personalizado
virsh snapshot-create ubuntu-vm
# Crear snapshot con estado de disco
virsh snapshot-create-as ubuntu-vm snapshot2 \
"Antes de actualizaciones" \
--disk-only
# Crear snapshot sin estado de memoria (más rápido)
virsh snapshot-create-as ubuntu-vm snapshot3 \
"Snapshot rápido" \
--no-metadata
# Crear snapshot con disco específico
virsh snapshot-create-as ubuntu-vm snapshot4 \
--diskspec vda,file=/var/lib/libvirt/images/snap4.qcow2
Listar Snapshots
# Listar todos los snapshots
virsh snapshot-list ubuntu-vm
# Listar con vista de árbol
virsh snapshot-list ubuntu-vm --tree
# Listar con información detallada
virsh snapshot-list ubuntu-vm --details
# Mostrar snapshot actual
virsh snapshot-current ubuntu-vm
# Mostrar solo nombre del snapshot actual
virsh snapshot-current ubuntu-vm --name
Operaciones de Snapshots
# Mostrar información del snapshot
virsh snapshot-info ubuntu-vm snapshot1
# Mostrar XML del snapshot
virsh snapshot-dumpxml ubuntu-vm snapshot1
# Revertir a snapshot
virsh snapshot-revert ubuntu-vm snapshot1
# Revertir e iniciar VM
virsh snapshot-revert ubuntu-vm snapshot1 --running
# Eliminar snapshot
virsh snapshot-delete ubuntu-vm snapshot1
# Eliminar snapshot e hijos
virsh snapshot-delete ubuntu-vm snapshot1 --children
# Eliminar solo metadatos del snapshot
virsh snapshot-delete ubuntu-vm snapshot1 --metadata
Relaciones Padre-Hijo de Snapshots
# Mostrar padre del snapshot
virsh snapshot-parent ubuntu-vm snapshot2
# Mostrar hijos del snapshot
virsh snapshot-list ubuntu-vm --tree
# Crear snapshot hijo
virsh snapshot-create-as ubuntu-vm child-snapshot \
"Hijo de snapshot1" \
--parent snapshot1
Gestión de Consola y Pantalla
Acceder a la Consola de VM
# Conectar a consola serial
virsh console ubuntu-vm
# Salir de la consola: Ctrl+]
# Conectar con consola segura
virsh console ubuntu-vm --safe
# Forzar reconexión de consola
virsh console ubuntu-vm --force
Gestión de Pantalla VNC
# Mostrar pantalla VNC
virsh vncdisplay ubuntu-vm
# Salida: :0 (significa puerto 5900)
# Conectar con visor VNC
virt-viewer ubuntu-vm
# Conexión VNC remota
virt-viewer -c qemu+ssh://usuario@host/system ubuntu-vm
# Cambiar contraseña VNC
virsh domdisplay ubuntu-vm
Gráficos y Pantalla
# Obtener URI de pantalla
virsh domdisplay ubuntu-vm
# Establecer contraseña de gráficos
virsh edit ubuntu-vm
# Agregar en sección de gráficos:
# <graphics type='vnc' passwd='tucontraseña'/>
# Tomar captura de pantalla
virsh screenshot ubuntu-vm /tmp/screenshot.ppm
# Convertir a formato común
convert /tmp/screenshot.ppm /tmp/screenshot.png
Monitoreo y Estadísticas
Monitoreo de Recursos del Sistema
# Estadísticas de VMs en tiempo real
virt-top
# Mostrar estadísticas de dominio
virsh domstats ubuntu-vm
# Estadísticas de CPU
virsh cpu-stats ubuntu-vm --total
# Estadísticas por CPU
virsh cpu-stats ubuntu-vm
# Estadísticas de memoria
virsh dommemstat ubuntu-vm
# Estadísticas de dispositivos de bloque
virsh domblkstat ubuntu-vm vda
# Información de dispositivos de bloque
virsh domblkinfo ubuntu-vm vda
# Estadísticas de interfaces de red
virsh domifstat ubuntu-vm vnet0
Monitoreo de Rendimiento
# Obtener información de trabajo de VM (para operaciones de larga duración)
virsh domjobinfo ubuntu-vm
# Monitorear ajuste de E/S de bloque
virsh blkiotune ubuntu-vm
# Establecer peso de E/S
virsh blkiotune ubuntu-vm --weight 500
# Obtener información de tiempo de VM
virsh domtime ubuntu-vm
# Establecer tiempo de VM
virsh domtime ubuntu-vm --now
# Mostrar información de control
virsh domcontrol ubuntu-vm
# Mostrar razón del estado
virsh domstate ubuntu-vm --reason
Monitoreo de Eventos
# Monitorear todos los eventos
virsh event --all
# Monitorear eventos para dominio específico
virsh event --domain ubuntu-vm
# Monitorear eventos de ciclo de vida
virsh event --event lifecycle
# Monitorear tipos de eventos específicos
virsh event --event reboot
virsh event --event shutdown
# Listar tipos de eventos
virsh event --list
Operaciones Avanzadas
Preparación para Migración en Vivo
# Verificar capacidades de migración
virsh capabilities
# Obtener XML de VM para planificación de migración
virsh dumpxml ubuntu-vm > ubuntu-vm-migrate.xml
# Probar viabilidad de migración
virsh migrate --verbose --live --p2p ubuntu-vm \
qemu+ssh://host-destino/system \
--dry-run
Clonación de VMs
# Clonar VM (la VM debe estar apagada)
virt-clone --original ubuntu-vm \
--name ubuntu-vm-clone \
--file /var/lib/libvirt/images/ubuntu-vm-clone.qcow2
# Clonar con nombre automático
virt-clone --original ubuntu-vm --auto-clone
# Clonar solo discos específicos
virt-clone --original ubuntu-vm \
--name ubuntu-vm-clone \
--file /var/lib/libvirt/images/disk1.qcow2 \
--file /var/lib/libvirt/images/disk2.qcow2
Respaldo y Restauración
# Respaldar configuración de VM
virsh dumpxml ubuntu-vm > /backup/ubuntu-vm-config.xml
# Respaldar incluyendo información sensible
virsh dumpxml ubuntu-vm --security-info > /backup/ubuntu-vm-full.xml
# Respaldar disco
virsh domblklist ubuntu-vm
cp /var/lib/libvirt/images/ubuntu-vm.qcow2 /backup/
# Restaurar VM
virsh define /backup/ubuntu-vm-config.xml
cp /backup/ubuntu-vm.qcow2 /var/lib/libvirt/images/
virsh start ubuntu-vm
# Copia de bloque para respaldo en vivo
virsh blockcommit ubuntu-vm vda --active --pivot
Gestión de Estados Guardados
# Guardar estado de VM en archivo
virsh save ubuntu-vm /var/lib/libvirt/save/ubuntu-vm.save
# Guardar con descripción
virsh save ubuntu-vm /var/lib/libvirt/save/ubuntu-vm.save \
"Estado pre-actualización"
# Restaurar VM desde estado guardado
virsh restore /var/lib/libvirt/save/ubuntu-vm.save
# Mostrar información del estado guardado
virsh save-image-dumpxml /var/lib/libvirt/save/ubuntu-vm.save
# Editar XML del estado guardado
virsh save-image-edit /var/lib/libvirt/save/ubuntu-vm.save
# Definir nuevo XML para restaurar
virsh save-image-define /var/lib/libvirt/save/ubuntu-vm.save new-config.xml
Seguridad y Control de Acceso
Listas de Control de Acceso
# Establecer permisos de VM
virsh edit ubuntu-vm
# Agregar etiquetas de seguridad (ejemplo de SELinux)
<seclabel type='dynamic' model='selinux' relabel='yes'>
<label>system_u:system_r:svirt_t:s0:c100,c200</label>
<imagelabel>system_u:object_r:svirt_image_t:s0:c100,c200</imagelabel>
</seclabel>
Gestión de Secretos
# Definir secreto (para discos cifrados, etc.)
cat > secret.xml << 'EOF'
<secret ephemeral='no' private='yes'>
<description>Clave de cifrado LUKS</description>
<uuid>12345678-1234-1234-1234-123456789abc</uuid>
</secret>
EOF
virsh secret-define secret.xml
# Establecer valor del secreto
virsh secret-set-value 12345678-1234-1234-1234-123456789abc \
$(echo -n "contraseñasecreta" | base64)
# Listar secretos
virsh secret-list
# Obtener valor del secreto
virsh secret-get-value 12345678-1234-1234-1234-123456789abc
# Eliminar secreto
virsh secret-undefine 12345678-1234-1234-1234-123456789abc
Solución de Problemas con Virsh
Depuración de Problemas de VMs
# Obtener información de error detallada
virsh domstate ubuntu-vm --reason
# Verificar estado de control de VM
virsh domcontrol ubuntu-vm
# Ver información de trabajo del dominio
virsh domjobinfo ubuntu-vm
# Volcar núcleo de VM para análisis
virsh dump ubuntu-vm /tmp/ubuntu-vm.dump --memory-only
# Reiniciar VM (reinicio duro)
virsh reset ubuntu-vm
# Enviar secuencia de teclas a VM
virsh send-key ubuntu-vm KEY_LEFTCTRL KEY_LEFTALT KEY_DELETE
Gestión del Demonio Libvirt
# Verificar versión de libvirt
virsh version
# Obtener información del sistema
virsh sysinfo
# Mostrar capacidades del host
virsh capabilities
# Obtener información del host
virsh nodeinfo
# Mostrar estadísticas de memoria
virsh nodememstats
# Mostrar estadísticas de CPU
virsh nodecpustats
# Obtener mapa de CPU del host
virsh nodecpumap
# Suspender host
virsh nodesuspend mem 3600
# Obtener estado del demonio libvirt
systemctl status libvirtd
# Reiniciar demonio libvirt
systemctl restart libvirtd
Problemas Comunes y Soluciones
Problema: La VM no arranca
# Verificar estado detallado
virsh domstate ubuntu-vm --reason
# Verificar que el disco existe
virsh domblklist ubuntu-vm
# Verificar permisos del disco
ls -l /var/lib/libvirt/images/
# Validar XML
virsh define ubuntu-vm.xml
# Verificar logs
journalctl -u libvirtd -f
tail -f /var/log/libvirt/qemu/ubuntu-vm.log
Problema: No se puede conectar a la consola
# Verificar que la consola está configurada
virsh dumpxml ubuntu-vm | grep console
# Probar diferente tipo de consola
virsh console ubuntu-vm --devname serial0
# Verificar si la VM está respondiendo
virsh domstate ubuntu-vm
Problema: La red no funciona
# Verificar que la red está activa
virsh net-list
# Iniciar red si es necesario
virsh net-start default
# Verificar interfaz de red de la VM
virsh domiflist ubuntu-vm
# Verificar concesiones DHCP
virsh net-dhcp-leases default
Automatización y Scripting
Operaciones por Lotes
#!/bin/bash
# Iniciar todas las VMs
for vm in $(virsh list --name --inactive); do
echo "Iniciando $vm..."
virsh start "$vm"
done
# Detener todas las VMs en ejecución ordenadamente
for vm in $(virsh list --name); do
echo "Apagando $vm..."
virsh shutdown "$vm"
done
# Crear snapshots para todas las VMs
for vm in $(virsh list --name --all); do
snapshot_name="snapshot-$(date +%Y%m%d-%H%M%S)"
echo "Creando snapshot $snapshot_name para $vm"
virsh snapshot-create-as "$vm" "$snapshot_name" "Snapshot automatizado"
done
Script de Monitoreo de Recursos
#!/bin/bash
# Monitorear recursos de VMs
while true; do
clear
echo "=== Uso de Recursos de VMs ==="
echo ""
for vm in $(virsh list --name); do
echo "VM: $vm"
# Uso de CPU
cpu_time=$(virsh cpu-stats "$vm" --total | grep "cpu_time" | awk '{print $3}')
echo " Tiempo de CPU: $cpu_time segundos"
# Uso de memoria
virsh dommemstat "$vm" | head -n 4
# Uso de disco
virsh domblkstat "$vm" vda | head -n 2
echo ""
done
sleep 5
done
Automatización de Respaldos
#!/bin/bash
# Script de respaldo automatizado de VMs
BACKUP_DIR="/backup/vms"
DATE=$(date +%Y%m%d)
mkdir -p "$BACKUP_DIR"
for vm in $(virsh list --name --all); do
echo "Respaldando $vm..."
# Respaldar configuración
virsh dumpxml "$vm" > "$BACKUP_DIR/${vm}-${DATE}.xml"
# Crear snapshot
virsh snapshot-create-as "$vm" "backup-$DATE"
# Respaldar disco (si la VM está apagada)
if [ "$(virsh domstate $vm)" = "shut off" ]; then
disk=$(virsh domblklist "$vm" | grep vda | awk '{print $2}')
if [ -n "$disk" ]; then
cp "$disk" "$BACKUP_DIR/${vm}-${DATE}.qcow2"
fi
fi
done
echo "Respaldo completado"
Optimización de Rendimiento
Ajuste de Rendimiento de VMs
# Establecer modo de CPU a host-passthrough
virsh edit ubuntu-vm
# Cambiar: <cpu mode='host-passthrough'/>
# Habilitar paso de caché de CPU
<cpu mode='host-passthrough'>
<cache mode='passthrough'/>
</cpu>
# Establecer fijación de hilos de E/S
virsh edit ubuntu-vm
<iothreads>2</iothreads>
<iothreadids>
<iothread id='1'/>
<iothread id='2'/>
</iothreadids>
# Fijar hilos de E/S
virsh iothreadpin ubuntu-vm 1 0-3
virsh iothreadpin ubuntu-vm 2 4-7
# Establecer respaldo de memoria
<memoryBacking>
<hugepages/>
<nosharepages/>
<locked/>
</memoryBacking>
Ajuste de Dispositivos de Bloque
# Establecer parámetros de ajuste de E/S
virsh blkiotune ubuntu-vm --device /dev/vda --total-bytes-sec 104857600
virsh blkiotune ubuntu-vm --device /dev/vda --read-bytes-sec 52428800
virsh blkiotune ubuntu-vm --device /dev/vda --write-bytes-sec 52428800
# Establecer limitación de E/S de bloque
virsh blockresize ubuntu-vm vda 50G
Conclusión
Virsh es una herramienta indispensable para gestionar máquinas virtuales KVM/QEMU, proporcionando control completo sobre cada aspecto de la infraestructura de virtualización. Esta guía ha cubierto los comandos y operaciones esenciales necesarios para la gestión diaria de VMs, desde operaciones básicas de ciclo de vida hasta ajustes avanzados y solución de problemas.
Puntos clave:
- Virsh proporciona gestión de VMs scriptable y compatible con automatización
- Domina las operaciones básicas (iniciar, detener, listar) antes de pasar a características avanzadas
- Comprende los pools de almacenamiento y las redes para una gestión eficiente de recursos
- Usa snapshots estratégicamente para flujos de trabajo de respaldo y pruebas
- Monitorea regularmente el rendimiento de las VMs para identificar cuellos de botella
- Aprovecha virsh en scripts para automatización y operaciones por lotes
A medida que ganes competencia con virsh, descubrirás que es la forma más eficiente de gestionar infraestructura de virtualización, especialmente cuando se combina con herramientas de gestión de configuración como Ansible o Terraform. La interfaz de línea de comandos habilita poderosas posibilidades de automatización que las herramientas gráficas no pueden igualar.
Continúa explorando características avanzadas de virsh como migración en vivo, ajuste NUMA y fijación de CPU para optimizar el rendimiento en cargas de trabajo de producción. Con dominio de virsh, podrás gestionar entornos de virtualización a gran escala con confianza y eficiencia.


