9.2.2.1.2.2.2. Gestión

Hasta ahora sólo hemos introducido cómo crear máquinas virtuales, pero nada de lo referente a arrancarlas, pararlas o modificarlas: el propósito de este epígrafe es desarrollar esto otro.

9.2.2.1.2.2.2.1. Arranque

Para arrancar una máquina virtual basta con:

$ virsh start bullseye

donde «bullseye» es el nombre que le dimos al crearla con virt-install (opción -n). La orden entenderá que se creó la máquina con el hipervisor definido por defecto, porque de lo contrario habrá que incluirlo en la orden a través de --connect (o simplemente, -c):

$ virsh -c qemu:///system start bullseye

Esto, no obstante, aunque lo arranque, no nos hará aparecer el huésped. Para conectar a él deberemos utilizar virt-viewer:

$ virt-viewer bullseye

orden que también entenderá que la máquina utiliza el hipervisor por defecto, con lo que, si no lo hace, lo tendremos que especificar expresamente:

$ virt-viewer -c qemu:///system bullseye

Nota

No abundaremos más en ello. Entiéndase a partir de ahora que es preciso especificar el hipervisor, si este no es el predeterminado.

virt-viewer es capaz de determinar qué acceso al huésped se definió (VNC, Spice) con lo que no es necesario especificar más. De hecho, si no se expresa el nombre de la máquina, abrirá una ventana previa con la que permitirá escoger a cuál de las máquinas arrancadas se quiere conectar. En cualquier caso, si se quiere cónocer cómo el visor accede a la máquina puede ejecutarse:

$ virsh domdisplay bullseye
spice://127.0.0.1:5900

La única excepción es si renunciamos a la salida gráfica y escogimos el acceso a través del puerto serie, en cuyo caso deberemos conectar así:

$ virsh console bullseye

9.2.2.1.2.2.2.2. Información

La lista de máquinas disponibles puede consultarse con:

$ virsh list --all --title

en que debemos añadir --all si queremos que también se muestren las máquinas apagadas. Se pueden aplicar distintos filtros que pueden consultarse con la orden[1]:

$ virsh help list

Advertencia

Se listan sólo máquinas de un hipervisor (en este caso el predeterminado). Deberá utilizar --connect para consultar máquinas de otros hipervisores.

UUna vez localizada una máquina quizás querramos conocer más información de ella al respecto:

$ virsh dominfo bullseye
$ virsh domblklist bullseye
$ virsh domstats bullseye

9.2.2.1.2.2.2.3. Parada

Si quiere enviarse una señal de apagado ordenado al huésped:

$ virsh shutdown bullseye

Y también existe la variante con reboot para reiniciarlo. Si nuestra intención es apagarlo a las bravas con todas las consecuencias que ello pueda acarrear entonces debe usarse otra forma:

$ virsh destroy bullseye

Si lo que se pretende es suspender y posteriormente restablecer su ejecución, pero sin apagarlo:

$ virsh suspend bullseye
$ virsh resume bullseye

En cambio, si se desea que la suspensión sea prolongada y recuperar en un momento posterior el punto en que se encontraba el anfitrión, se deberá guardar en un archivo el estado:

$ virsh save bullseye /lo/guardo/donde/quiero/bullseye.save

Posteriormente se podrá recuperar:

$ virsh restore /lo/guardo/donde/quiero/bullseye.save
$ virt-viewer bullseye

orden en que puede comprobarse que no es necesario especificar a qué máquina nos referimos.

9.2.2.1.2.2.2.4. Borrado

Para borrar una máquina:

$ virsh undefine bullseye

9.2.2.1.2.2.2.5. Instantáneas

Como en otras aplicaciones del género, también existe la posibilidad de crear y gestionar instantáneas. Para crear una:

$ virsh snapshot-create-as bullseye --name "primera" --description "Mi primera instantánea"

La instantánea se traducirá en una instantánea de disco (que como está en formato QCOW2, podremos comprobar con qemu-img snapshot) y una instantánea de la características de la máquina virtual. Podemos a continuación arrancar la máquina, hacer algunos cambios y crear una nueva instantánea:

$ virsh snapshot-create-as bullseye --name "segunda" --description "Mi segunda instantánea"

Para listar las instantáneas asociadas a la máquina:

$ virsh snapshot-list bullseye
 Nombre    Hora de creación            Estado
------------------------------------------------
 primera   2023-01-01 10:51:48 +0100   shutoff
 segunda   2023-01-01 11:08:59 +0100   shutoff

Cuando, como es el caso, existen varias instantáneas podemos dudar cuál de ellas es la instantánea a partir de la cual se genera el estado actual de la máquina:

$ virsh snapshot-current bullseye --name
segunda
$ virsh snapshot-info bullseye --current
Nombre:         segunda
Dominio:        bullseye
Actual:         si
Estado:         shutoff
Ubicación:     interno
Padre:          primera
Hijos:          0
Descendientes:  0
Metadatos:      si

Para cambiar la instantánea actual:

$ virsh snapshot-revert bullseye --snapshotname primera
$ virsh snapshot-current bullseye --name
primera

Y, si arrancamos la máquina, nos encontraremos con el estado en que se encontraba la máquina cuando hicimos la primera instantánea. Ya sólo nos queda saber cómo eliminarlas:

$ virsh snapshot-delete bullseye --snapshotname segunda
Instantánea de dominio segunda borrada

9.2.2.1.2.2.2.6. Modificación

Una vez que se ha creado la máquina virtual, es posible rectificar alguna de sus características. La forma general de hacerlo es editando el archivo XML de configuración y modificando alguno de sus valores:

$ virsh edit bullseye

Ciertamente, es bastante más fácil utilizar virt-manager para esta tarea, así que nos centramos aquí en definir redes a fin de que podamos asociar interfaces de huéspedes a ellas.

Advertencia

Con el hipervisor qemu:///session no tendremos suficientes permisos para esta tarea, así que se supondrá que hemos definido qemu:///system como el hipervisor predeterminado:

$ export LIBVIRT_DEFAULT_URI='qemu:///system'

Estas redes se corresponden con las que en QEmu identificamos como redes internas con interfaz puente. Lo primero es comprobar qué redes hay predefinidas:

$ virsh net-list --all
 Nombre    Estado   Inicio automático   Persistente
-----------------------------------------------------
 default   activo   si                  si

Nota

La razón de usar --all se debe a que sin la opción sólo se muestran redes activas.

O sea, la red «default», que tiene las siguientes características:

$ virsh net-info default
Nombre:         default
UUID:           720444bf-50b1-4d7e-a317-eee4c110f5f4
Activar:        si
Persistente:    si
Autoinicio:     si
Puente:         virbr0

Y, efectivamente, existe una interfaz puente en el sistema así definida:

$ ip link show dev virbr0
5: virbr0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN
    mode DEFAULT group default qlen 1000 link/ether 52:54:00:d3:79:28 brd ff:ff:ff:ff:ff:ff

Estas redes suelen estar configuradas, de suerte que se le asocia a la interfaz puente la primera IP de la red y se define un rango para que los huésped reciban una configuración automáticamente. Esto puede comprobarse con la orden:

$ virsh net-dumpxml default

que nos mostrará el siguiente XML:

<network>
  <name>default</name>
  <uuid>720444bf-50b1-4d7e-a317-eee4c110f5f4</uuid>
  <forward mode='nat'>
    <nat>
      <port start='1024' end='65535'/>
    </nat>
  </forward>
  <bridge name='virbr0' stp='on' delay='0'/>
  <mac address='52:54:00:d3:79:28'/>
  <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>

Nota

Para proporcinar direcciones IP dinámicas, el demonio libvirtd ejecuta un dnsmasq por cada una de estas interfaces puente. Puede comprobarlo consultando el estado del demonio:

# invoke-rc.d libvirtd status

Para crear una segunda red, lo más sencillo es tomar esta definición como plantilla:

$ virsh  net-dumpxml default > /tmp/redinterna1.xml

Editar el archivo para alterar, al menos, algunas características (nombre, uuid, direcciones IP y definición de la interfaz puente):

<network>
  <name>interna1</name>
  <uuid>42fe3446-b5cf-4704-93e7-63f2b30b0ed8</uuid>
  <forward mode='nat'>
    <nat>
      <port start='1024' end='65535'/>
    </nat>
  </forward>
  <bridge name='virbr1' stp='on' delay='0'/>
  <mac address='52:54:00:d3:79:29'/>
  <ip address='192.168.123.1' netmask='255.255.255.0'>
    <dhcp>
      <range start='192.168.123.20' end='192.168.123.254'/>
    </dhcp>
  </ip>
</network>

Nota

Un uuid (pseudo)aleatorio podemos obtenerlo cada ver que leemos el siiguiente archivo:

$ cat /proc/sys/kernel/random/uuid
42fe3446-b5cf-4704-93e7-63f2b30b0ed8

Hecho lo cual podremos crear la nueva red:

$ virsh net-define /tmp/redinterna1.xml
La red interna1 se encuentra definida desde /tmp/redinterna1.xml
$ virsh net-list --all
 Nombre     Estado   Inicio automático   Persistente
------------------------------------------------------
 default    activo   si                  si
 interna1   activo   no                  si

Nota

Existe la alternativa virsh net-create, pero genera redes no persistentes.

La red ya estará disponible para que la usemos en máquinas virtuales, pero al reiniciar se encontrará inactiva y habrá que activarla con el subcomando net-start. Puede alterarse esto con:

$ virsh net-autostart interna1

Sea como sea, la red ya estará disponible para que la usemos:

$ virt-install --osinfo debian11 -n bullseye --metadata title="Debian Bullseye" --memory 1024 --vcpus 2 \
   --network network=interna1 --disk disco.qcw --import --noreboot --autoconsole none

Notas al pie