Резервное копирование виртуальной машины QEMU/KVM с паузой и записью памяти

Ранее на habr.com была статья, в которой было описано как сделать копию работающей виртуальной машины (ВМ) с использованием гостевого агента QEMU. Что же делать, если в ВМ нельзя установить этот агент? В таком случае поможет кратковременная пауза виртуальной машины и запись её памяти. Перерыв в доступности ВМ будет только на время записи её памяти на диск и чтения обратно.
Порядок действий опишем, как последовательность команд терминала.
Процесс копирования.
Запрашиваем состояние ВМ
$ virsh list
Id Name State
----------------------------------------------------
2 my_vm running
ВМ работает.
Создаем папку для копии:
$ mkdir -p ~/backup/my_vm
Запрашиваем список дисков ВМ
$ virsh domblklist my_vm --details
Type Device Target Source
------------------------------------------------
file disk hda /var/lib/libvirt/images/my.img
Делаем внешний снимок диска для минимизации времени простоя ВМ :
$
virsh snapshot-create-as --domain my_vm bus \
--disk-only --atomic --no-metadata \
--diskspec hda,snapshot=external,file=/var/lib/libvirt/images/my.img-bus
Domain snapshot bus created
Записываем память ВМ в директорию копии
$
virsh save my_vm ~/backup/my_vm/memory.dump
Domain my_vm saved to /home/piter/backup/my_vm/memory.dump
ВМ при этом выключается.
Копируем снимок диска :
$ cp /var/lib/libvirt/images/my.img-bus ~/backup/my_vm/
Файл снимка содержит только изменения, прошедшие со времени его создания, т.е. размер его невелик и копируется он быстро.
Восстанавливаем ВМ из файла памяти :
$
virsh restore --running ~/backup/my_vm/memory.dump
Domain restored from /home/piter/backup/my_vm/memory.dump
ВМ работает, можно копировать основной диск.
$ cp /var/lib/libvirt/images/my.img ~/backup/my_vm/
После того как диск скопирован - присоединяем снимок к основному диску
$ virsh blockcommit my_vm hda --active --pivot
Successfully pivoted
Удаляем файл снимка
$ rm /var/lib/libvirt/images/my.img-bus
Копируем в папку файл - описатель ВМ libvirt
$ virsh dumpxml my_vm > ~/backup/my_vm/libvirt.xml
Процесс копирования завершен.
Копия ВМ содержит неконсистентный файл диска, снимок диска и снимок памяти ВМ:
$ ls ~/backup/my_vm/
libvirt.xml memory.dump my.img my.img-bus
Процесс восстановления.
Останавливаем ВМ
$ virsh shutdown my_vm
Восстанавливаем из копии файлы диска и его снимка
$ cp ~/backup/my_vm/my.img /var/lib/libvirt/images/my.img
$ cp ~/backup/my_vm/my.img-bus /var/lib/libvirt/images/my.img-bus
Восстанавливаем ВМ из файла памяти:
$
virsh restore --running ~/backup/my_vm/memory.dump
Domain restored from /home/piter/backup/my_vm/memory.dump
ВМ работает, присоединяем снимок к основному диску
$ virsh blockcommit my_vm hda --active --pivot
Successfully pivoted
Удаляем его
$ rm /var/lib/libvirt/images/my.img-bus
Процесс восстановления завершен.
Таким образом QEMU предоставляет гибкие возможности по управлению виртуальной машиной — можно выбрать наиболее подходящие.