¿Cómo trabajar con instantáneas/savevm de QEMU de una manera que sea predecible como una caja virtual?

¿Cómo trabajar con instantáneas/savevm de QEMU de una manera que sea predecible como una caja virtual?

P: ¿Hay alguna manera de tener una máquina virtual QEMU en ejecución, donde tenga la opción de (en línea o fuera de línea) guardar un punto de restauración sobre la marcha?

texto largo con investigación, alternativas ya examinadas y pequeñas peroratas:

Me está costando entender las múltiples formas, completamente incompatibles, de qemu de almacenar y descartar estados/cambios en una máquina virtual y discos.

Ahí está el-snapshotbandera. Pero no parece que se haya hecho (cita del doc.

Es un trabajo en progreso y las cosas pueden cambiar a medida que avanzamos.

), y depende deagente invitado, que tampoco parece estar terminado y está algo roto ya que los desarrolladores cambiaron de marcha al migrarlo de QMP a QAPI, y luego lo eliminaron a mitad de camino para trabajar en "soluciones" excesivas de libvirt.

Ambos documentos mencionan la versión 0.16~17 de QEMU... pero todos mis sistemas tienen la versión 7.2+, así que no estoy seguro de si se trata de alguna versión de biblioteca interna o de documentos realmente antiguos.

Entonces hayinstantáneas del sistema de archivos -drive file=hda.qcow2,snapshot=onque no parece funcionar en mi sistema. Quiero decir, funciona porque siempre se desecha todo cuando se usa esa opción. No hay forma de enviar datos a una instantánea de la imagen QCOW2.

Entonces haysavevmcomando de monitor, pero si bien es el único que realmente parece hacer uso de las capacidades de instantáneas de QCOW2, también almacenará muchos estados de CPU/memoria no deseados (son más bien una molestia que estropea las cosas más adelante y solo ayudan en casos raros de control de calidad). y no veo una manera de descartarlos fácilmente en la próxima ejecución y conservar solo los cambios de QCOW2)

Y ahí está lo que quería. Una forma de realizar siempre cambios, pero teniendo una manera de hacerlo, cuando la máquina estádesconectadoguarda ese punto en elalmacenamiento como una instantánea.

Pero ese último método está completamente desconectado de qemu y las imágenes. Tengo que crear nuevos nombres de archivos a medida que avanzo, en lugar de agregar estados de guardado.

Creo que el estado ideal sería tener este método de estado fuera de línea, pero usando soporte interno de instantáneas QCOW2 en lugar de archivos diferentes.

Finalmente, hayotra opciónese es el último caso de uso fuera de línea, pero realizado en línea. es decir, mientras ejecuta la máquina virtual, suspenda la ejecución a través del agente qemu, cree un nuevo archivo de instantánea en el host externo e indique a la instancia en ejecución que cambie a esa nueva superposición de instantáneas y reanude la ejecución.

Respuesta1

No entiendo lo que quieres decir con predecible, pero creo que podrías estar buscando esto:

List, apply, create or delete snapshots in image FILENAME.

qemu-img snapshot \
    [--object OBJECTDEF] [--image-opts] [-U] [-q] \
    [-l | -a SNAPSHOT | -c SNAPSHOT | -d SNAPSHOT] FILENAME


    Parameters to snapshot subcommand:

    SNAPSHOT
           Is the name of the snapshot to create, apply or delete

    -a     Applies a snapshot (revert disk to saved state)
    -c     Creates a snapshot
    -d     Deletes a snapshot
    -l     Lists all snapshots in the given image

(de la página de manual de qemu-img &https://www.qemu.org/docs/master/tools/qemu-img.html#cmdoption-qemu-img-commands-arg-snapshot)

Este comando creará uninternoinstantánea/punto de control dentro de la imagen qcow2 vm (no estoy seguro de si funciona con otros formatos de disco).

(A diferencia del formato qemu-img snapshot create -f qcow2 -b <backing.file> -F qcow2 <image.file>que creará un nuevo archivo de imagen en el disco y utilizará el existente como archivo de respaldo. Bueno para archivos inmutables).

Para obtener la lista completa de funciones admitidas por su versión específica de qemu, consulte qemu-img --helpel resultado.

Ejemplo:

$ qemu-img snapshot -l myamazingqemuvm.qcow2
$ qemu-img snapshot -c testing myamazingqemuvm.qcow2
$ qemu-img snapshot -l myamazingqemuvm.qcow2
Snapshot list:
ID        TAG               VM SIZE                DATE     VM CLOCK     ICOUNT
1         testing               0 B 2023-05-21 00:57:50 00:00:00.000          0
$ qemu-img snapshot -d testing myamazingqemuvm.qcow2
$ qemu-img snapshot -l myamazingqemuvm.qcow2
$

Para crear una instantánea,qemu-img requiere un bloqueo de escrituraen el archivo, lo que significa que solo funcionará para máquinas virtuales sin conexión.


Para crear uninstantáneaenuna máquina virtual en línea, debe utilizar los comandos "HMP" desde el qemu-systemproceso en ejecución:

(qemu) savevm my_snapshot

(qemu) loadvm my_snapshot

para guardar y cargar instantáneas, respectivamente. Para obtener dicha consola en su VM iniciada en terminal, puede iniciarla con el monitorargumento:

qemu-system-x86_64 [...] -monitor unix:/tmp/qemu-mon_${VMNAME}.sock,server,nowait

que creará un socket Unix para comunicarse con su VM:

#!/bin/sh
#
# connect to qemu monitor socket
# disconnect from it with Ctrl-C

MACHINE="${1}"
SOCKET="/tmp/qemu-mon_${MACHINE}.sock"

echo "CONNECTING TO ${MACHINE} ..."
socat ${SOCKET} STDIN

y luego todo lo que necesitas hacer es

$ ./qemu-monitor.sh myamazingqemuvm
CONNECTING TO myamazingqemuvm ...
QEMU 5.2.0 monitor - type 'help' for more information
(qemu) savevm testsnap
savevm testsnap
(qemu) loadvm testsnap
loadvm testsnap

... y una vez que vuelvas a estar desconectado, podrás volver a usar qemu-img snapshot:

$ qemu-img snapshot -l myamazingqemuvm.qcow2
Snapshot list:
ID        TAG               VM SIZE                DATE     VM CLOCK     ICOUNT
1         testing               0 B 2023-05-21 00:57:50 00:00:00.000          0
2         testsnap          14.3 MiB 2023-05-21 01:03:45 00:05:32.995           

información relacionada