Как работать с моментальными снимками QEMU/savevm так, чтобы это было предсказуемо, как в Virtual Box?

Как работать с моментальными снимками QEMU/savevm так, чтобы это было предсказуемо, как в Virtual Box?

В: Есть ли способ запустить виртуальную машину QEMU, в которой у меня будет возможность (онлайн или офлайн) сохранять точку восстановления по мере ее выполнения?

длинный текст с расследованием, уже рассмотренными альтернативами и небольшими тирадами:

Мне сложно понять многочисленные, совершенно несовместимые способы хранения и отмены состояния/изменений в виртуальной машине и на дисках в QEMU.

Здесь-snapshotфлаг. Но, похоже, этого не сделано (цитата из документа

Это еще не завершенная работа, и по мере ее продвижения все может измениться.

), и зависит отгостевой агент, который, похоже, также не реализован и несколько сломан, поскольку разработчики переключились на другую технологию при переносе с QMP на QAPI, а затем оставили его на полпути, чтобы поработать над избыточными «решениями» libvirt.

В обоих документах упоминается QEMU версии 0.16~17... но на всех моих системах установлена ​​версия 7.2+, поэтому я не уверен, является ли это какой-то внутренней версией библиотеки или действительно старыми документами.

А потом естьмоментальные снимки файловой системы -drive file=hda.qcow2,snapshot=onчто, похоже, не работает на моей системе. Я имею в виду, это работает, так как все всегда выгружается при использовании этой опции. На самом деле нет способа зафиксировать какие-либо данные в моментальном снимке образа QCOW2.

Затем, естьsavevmкоманда монитора, но хотя это единственный вариант, который, похоже, действительно использует возможности моментальных снимков QCOW2, он также будет хранить множество нежелательных состояний ЦП/памяти (они скорее раздражают, что-то ломают в дальнейшем и действительно помогают только в редких случаях контроля качества, и я не вижу способа легко отбросить их при следующем запуске и сохранить только изменения QCOW2)

И вот что я хотел. Способ всегда фиксировать изменения, но иметь способ, когда машинане в сетисохраните эту точку вхранение в виде моментального снимка.

Но последний метод полностью отключен от qemu и образов. Мне приходится создавать новые имена файлов по мере продвижения, вместо добавления сохраненных состояний.

Я думаю, что идеальным вариантом было бы иметь этот метод автономного состояния, но использовать внутреннюю поддержку снимков QCOW2 вместо разных файлов.

Наконец, естьдругой вариантэто последний вариант использования в автономном режиме, но он выполняется в режиме онлайн. т. е. во время работы виртуальной машины приостановите выполнение с помощью агента QEMU, создайте новый файл снимка на внешнем хосте и дайте указание работающему экземпляру переключиться на этот новый оверлей снимка и возобновить выполнение.

решение1

Я не понимаю, что вы подразумеваете под «предсказуемостью», но думаю, вы ищете это:

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

(из справочной страницы qemu-img &https://www.qemu.org/docs/master/tools/qemu-img.html#cmdoption-qemu-img-commands-arg-snapshot)

Эта команда создаствнутреннийснимок/контрольная точка в образе виртуальной машины qcow2 (я не уверен, работает ли это с другими форматами дисков).

(В отличие от формата qemu-img snapshot create -f qcow2 -b <backing.file> -F qcow2 <image.file>, который создает новый файл образа на диске и использует существующий в качестве резервного файла. - Хорошо подходит для неизменяемых архивов.)

Полный список функций, поддерживаемых вашей конкретной версией QEMU, смотрите qemu-img --helpв выводе.

Пример:

$ 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
$

Чтобы создать снимок,qemu-img требуется блокировка записив файле, то есть он будет работать только для автономных виртуальных машин.


Чтобы создатьснимоквонлайн-виртуальная машина, вам необходимо использовать команды «HMP» из запущенного qemu-systemпроцесса:

(qemu) savevm my_snapshot

(qemu) loadvm my_snapshot

для сохранения и загрузки снимков соответственно. Чтобы получить такую ​​консоль в вашей виртуальной машине, запущенной с терминала, вы можете запустить ее с аргументом monitor:

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

что создаст unix-сокет для связи с вашей виртуальной машиной:

#!/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

и тогда все, что вам нужно сделать, это

$ ./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

... и как только вы снова окажетесь в автономном режиме, вы сможете снова переключиться на использование 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           

Связанный контент