Administración de máquinas virtuales con libvirt

miércoles, 30 de agosto de 2023
Tiempo de lectura 7 minutos

Siguiendo con algunas funciones presentes en libvirt que creo que podría ser útil conocer, esta publicación va dedicada, de nuevo, a la administración de máquinas virtuales con la herramienta libvirt y su aplicación virsh, que permite correr algunos de los comandos quizá más útiles a la hora de trabajar con archivos de esta clase de VM. Todos estos comandos, normalmente, se ejecutan como root.

Administración de dominio

Si se desea conocer la lista de dominios actualmente creados, se puede hacer con el siguiente comando. Puede cambiarse –all por –autostart, por ejemplo, si quieres ver todos los dominios configurados para iniciar al arrancar el sistema anfitrión:

# virsh list --all
 Id   Name    State
------------------------
 2    test    running
 6    test2   running
 9    bot2    running
 -    bot     shut off

Para iniciar el dominio, simplemente se utiliza el comando start:

# virsh start test
Domain 'test' started

Para detenerlo, existen dos maneras diferentes. Se puede detener de manera regular, utilizando el comando shutdown, lo que es similar a apagar tu equipo utilizando para ello las funciones que el sistema operativo ya proporciona, aunque también existe el comando destroy, que a diferencia de lo que se pueda llegar a pensar, en realidad no elimina el dominio, sino que simplemente lo apaga de manera forzada. Esto es similar a desconectar de golpe el cable de alimentación del equipo físico.

# virsh shutdown test
Domain 'test' is being shutdown
# virsh destroy test

Finalmente, si el dominio no aparece en la lista mostrada con el comando list –autostart, significa que deberás iniciarlo manualmente cada que el sistema del equipo anfitrión arranque. Para configurar el inicio automático del dominio, simplemente se utiliza el comando autostart:

# virsh autostart test
Domain 'test' marked as autostarted

Si olvidamos la información de conexión a la pantalla utilizando el protocolo spice, se puede recuperar con o sin contraseña, con el comando siguiente:

# virsh domdisplay test --include-password --all
spice://localhost:5901?password=pwtest

Si quieres conocer la información sobre las interfaces de red disponibles a la máquina virtual, así como las direcciones IP asignadas a esta, se utiliza el comando siguiente:

# virsh domifaddr test
 Name       MAC address          Protocol     Address
-------------------------------------------------------------------------------
 vnet5      52:54:00:56:25:fa    ipv4         192.168.122.61/24

Algo más de información general del dominio se puede conseguir con este comando:

# virsh dominfo test
Id:             6
Name:           test
UUID:           35bc6234-fc63-4717-9bcb-18d36de32d25
OS Type:        hvm
State:          running
CPU(s):         2
CPU time:       9671.1s
Max memory:     2097152 KiB
Used memory:    2097152 KiB
Persistent:     yes
Autostart:      enable
Managed save:   no
Security model: apparmor
Security DOI:   0
Security label: libvirt-35bc6234-fc63-4717-9bcb-18d36de32d25 (enforcing)

indagando en la información del nodo

antes de realizar algunas tareas que se pudieran considerar más avanzadas, se requiere tener un profundo conocimiento sobre las características del nodo donde se está ejecutando el dominio. Para esto se pueden utilizar muchos comandos diferentes, de entre los que me han parecido especialmente interesantes los siguientes:

Revisar la cantidad de CPU disponibles y en línea, lo que nos puede ser útil al momento de asignar las CPU virtuales y hacer cpu pinning en caso necesario:

# virsh nodecpumap --pretty
CPUs present:   12
CPUs online:    12
CPU map:        0-11

Editar la definición del archivo de dominio. Los dominios se guardan en formato XML, en /etc/libvirt/qemu y pueden ser editados a mano, aunque es recomendable editarlos con este comando para evitar tener que reiniciar libvirt luego de guardar el archivo si se hacen cambios menores:

# virsh edit test

Una vez editando el dominio, puedes añadir o remover definiciones de dispositivos manualmente. Esto es especialmente útil ya que luego de haber terminado con la instalación del sistema, no necesitamos más las imágenes ISO montadas en las unidades de CD. Así que se puede buscar el dispositivo, bajo una de las etiquetas , y eliminar toda su definición.

Si los cambios son importantes, como el número de CPU virtuales asignados al dominio o nuevos dispositivos, quizá sí sea necesario reiniciar el servicio libvirtd:

# systemctl restart libvirtd

Si se desea renombrar el dominio, se puede hacer de manera sencilla con este comando, aunque el fichero de disco virtual no es renombrado:

# virsh domrename test nuevo-nombre

Finalmente, si lo que se desea es eliminar un dominio, se puede hacer borrando su definición, que es la información ubicada en el fichero XML. De manera predeterminada, libvirt no elimina las imágenes de disco adjuntas a las VM para evitar pérdida de información. El comando de manera básica es este. Cabe señalar que el dominio deberá estar ya detenido para poder eliminarlo:

# virsh undefine test

Este comando tiene opciones que permiten seleccionar los dispositivos de almacenamiento que se eliminarán, o si se desea mantener el dispositivo TPM o la NBRAM, pero esos ya se consideran casos avanzados. De todos modos, siempre se puede consultar la ayuda de virsh escribiendo algo parecido a esto:

# virsh undefine --help

Resguardando los archivos

Una vez que logré instalar Windows 10 en una máquina virtual usando los drivers VirtIO, me decidí a preservar esa máquina como un sistema base. Técnicamente es una máquina que contiene instalado NVDA y Google Chrome, y nada más. Mi idea es simple: si en algún momento necesito de nuevo una máquina limpia, puedo recrear esta máquina virtual. Para ello, de momento, solo me he limitado a copiar los archivos /etc/libvirt/windows-10-nvda.xml y /var/lib/libvirt/images/windows-10-nvda.qcow2, teniendo especial atención de haber removido antes los dispositivos de imágenes ISO en el XML de la VM. También hay que utilizar el comando virt-sparsify de esta forma:

# virt-sparsify /var/lib/libvirt/windows-10-nvda.qcow2 path/to/backup/windows-10-nvda.qcow2

Este comando hará algo muy necesario: Eliminará todo el espacio “vacío” en la imagen de disco que se creó para la máquina virtual. Esto es muy útil para poder copiarlo a cualquier otro lado. Esto tiene una explicación curiosa. Al crear un archivo de disco para la máquina virtual, se crea un archivo qcow2. Estos archivos están diseñados para ocupar hasta una cantidad de espacio determinada, por ejemplo 50 GB, pero no se usarán esos 50 GB hasta que el sistema que se encuentre dentro de la máquina virtual lo solicite. De ahí su nombre, qcow2 (copy on write 2).

Esto tiene como inconveniente que muchas herramientas, como stat, ls o incluso cp, no toman en cuenta el espacio actualmente usado por la imagen de disco, sino el espacio máximo posible en el archivo. Lo que hace que al copiar se copien los 50 GB que podría pesar el archivo, en lugar de los 15 o 20 que puedan estar ocupados. Si no se ocupa todo el tamaño del archivo, ¿Cómo es que el sistema copia 50 GB? Porque los llena con ceros, haciendo básicamente que el sistema reserve todo ese espacio. De ahí que virt-sparsify reduzca el espacio usado en el disco hasta el verdaderamente necesario. Es recomendable correr este comando para copiar la imagen de disco de una VM que se desee guardar, aunque dependiendo del tamaño del disco y hacia dónde se copie, puede tardar bastante tiempo.

Una vez almacenada en otro lugar la máquina virtual, se puede utilizar el archivo de su definición, que es el XML, y su imagen de disco, para recrearla bien en el mismo anfitrión o en otro diferente. Esto se puede hacer en dos pasos. Primero hay que “definir” la máquina virtual en el anfitrión, utilizando este comando:

# virsh define --file ruta/al/archivo.xml

Finalmente, utilizando el simple comando cp, podemos colocar la imagen de disco en la ruta donde se define en el XML. En una instalación sin alterar, la ruta por defecto es siempre /var/lib/libvirt/images. Si la ruta ha sido cambiada en alguno de los anfitriones, se debe editar el XML para actualizar la ruta manualmente.

conclusión

Creo que esto ha sido lo más interesante que he visto en varios años. En alguna ocasión he llegado a usar Proxmox, que me parece una fantástica herramienta, pero no hay nada como aprender las bases sobre las tecnologías en las que Proxmox y otras herramientas se han ido construyendo a lo largo de los años. Llegados a este punto, tengo un equipo que corre varias máquinas virtuales para diversas necesidades, solamente resta investigar sobre cómo permitir conexiones entrantes a una de ellas.

Comments

You can use your Mastodon account to reply to this post.

Reply

Administración Linux NAS

libvirt administración linux debian virsh