
В: Есть ли способ запустить виртуальную машину 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