LINUX.ORG.RU

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

 , , ,


3

2

В интернете есть статьи, где было описано как сделать бэкап работающей виртуальной машины (ВМ) с использованием гостевого агента QEMU (см. например https://bozza.ru/art-337.html ). Что же делать, если в ВМ нельзя установить этот агент? В таком случае поможет кратковременная пауза виртуальной машины и запись её памяти. Перерыв в доступности ВМ будет только на время записи её памяти на диск и чтения обратно.

Опишу последовательность действий, как набор команд терминала.

Процесс копирования.
  1. Запрашиваем состояние ВМ
virsh list  
 Id    Name                           State
----------------------------------------------------
 2     my_vm                          running

ВМ работает.

  1. Создаем папку для бэкапа:
mkdir -p ~/backup/my_vm 
  1. Запрашиваем список дисков ВМ
virsh domblklist my_vm --details
Type       Device     Target     Source
------------------------------------------------
file       disk       hda        /var/lib/libvirt/images/my.img
  1. Делаем внешний снимок диска для минимизации времени простоя ВМ:
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
  1. Записываем память ВМ в директорию бэкапа
virsh save my_vm ~/backup/my_vm/memory.dump
Domain my_vm saved to /home/piter/backup/my_vm/memory.dump

ВМ при этом выключается.

  1. Копируем снимок диска:
cp /var/lib/libvirt/images/my.img-bus ~/backup/my_vm/

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

  1. Восстанавливаем ВМ из файла памяти:
virsh restore --running ~/backup/my_vm/memory.dump
Domain restored from /home/piter/backup/my_vm/memory.dump
  1. ВМ работает, можно без спешки скопировать основной диск.
cp /var/lib/libvirt/images/my.img ~/backup/my_vm/
  1. После того как диск скопирован — присоединяем файл снимка к диску
virsh blockcommit my_vm hda --active --pivot
Successfully pivoted
  1. и удаляем его
rm /var/lib/libvirt/images/my.img-bus
  1. Копируем в папку файл описания ВМ libvirt:
virsh dumpxml my_vm > ~/backup/my_vm/libvirt.xml

Процесс копирования завершен.

Копия ВМ содержит неконсистентный файл диска, снимок диска и снимок памяти ВМ:

ls  ~/backup/my_vm/
libvirt.xml  memory.dump  my.img  my.img-bus
Процесс восстановления.
  1. Останавливаем ВМ
virsh shutdown my_vm
  1. Восстанавливаем из копии файлы диска и его снимка
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
  1. Восстанавливаем ВМ из файла памяти:
virsh restore --running ~/backup/my_vm/memory.dump
Domain restored from /home/piter/backup/my_vm/memory.dump
  1. ВМ работает, присоединяем файл снимка к диску
virsh blockcommit my_vm hda --active --pivot
Successfully pivoted
  1. и удаляем его
rm /var/lib/libvirt/images/my.img-bus

Процесс восстановления завершен.



Проверено: hobbit ()
Последнее исправление: hobbit (всего исправлений: 3)
Ответ на: комментарий от hobbit

Версии:

qemu-system-x86_64 --version
QEMU emulator version 2.11.1(Debian 1:2.11+dfsg-1ubuntu7.42)
Copyright (c) 2003-2017 Fabrice Bellard and the QEMU Project developers

virsh --version
4.0.0
smola0609
() автор топика

Отлично! Сейчас как раз пилю свой велосипед для управления снапшотами на базе backing files, само собой получается ограничение на то, что ВМ должна быть выключена для манипуляции со снапшотами. С подходом через паузу+сохранение памяти, гипотетически можно подумать о сохранении всего состояния машины

Jurik_Phys ★★★★★
()
Ответ на: комментарий от hobbit

В "статье" написана полная дичь.

Вот правильные статьи:

https://wiki.qemu.org/Documentation/CreateSnapshot
https://qemu-project.gitlab.io/qemu/system/images.html#vm-005fsnapshots

Руками в qemu его сценарий достигается через savevm + на выбор:

  1. копирование внешнего файла снапшота
  2. инкрементальное копирование существующего qcow

Оффдока на virsh тут.

LamerOk ★★★★★
()
Ответ на: комментарий от LamerOk

В «статье» написана полная дичь.

да не, вроде рабочий алгоритм.

Вот правильные статьи:

и что там есть по задаче бэкапа с мин. простоем?

копирование внешнего файла снапшота

в статье это и делается в т.ч.

инкрементальное копирование существующего qcow

через virsh backup-begin ?

MirandaUser2
()
Ответ на: комментарий от MirandaUser2

да не, вроде рабочий алгоритм.

раздельное создание снапшота диска и дампа памяти вызывает сомнение.
Не очень знаком с либвиртом и не вижу постановки машины на паузу — дамп памяти может не соответствовать состоянию диска и ситуация может быть хуже, чем со снапшотом без дампа. Особенно если дисков несколько.

и что там есть по задаче бэкапа с мин. простоем?

где запрос на минимальный простой, если «ВМ при этом выключается»?

xgatron
()
Ответ на: комментарий от xgatron

раздельное создание снапшота диска и дампа памяти вызывает сомнение.

это Redirect-on-Write external снапшот, т.е. основной образ (my.img) в момент создания снапшота «замораживается», а запись измененных блоков ведется в файл my.img-bus.
Запись в my.img-bus прекращается в момент сохранения состояния VM (virsh save), т.о. дамп памяти memory.dump консистентен с my.img-bus (а после virsh blockcommit консистентен с основным образом)

где запрос на минимальный простой, если «ВМ при этом выключается»?

Запрос сформулирован в статье:

Перерыв в доступности ВМ будет только на время записи её памяти на диск и чтения обратно.

На самом деле там ещё прибавляется время на копирование RoW снапшота my.img-bus (на 6 шаге), но он должен быть небольшого размера.
Основной образ (my.img) копируется уже после включения VM (virsh restore).

MirandaUser2
()
Ответ на: комментарий от MirandaUser2

это Redirect-on-Write external снапшот, т.е. основной образ (my.img)

в чем будет отличие от «полный снапшот → скопировать образ → откатить скопированный образ до снапшота»? Подразумевается, что работает не только для qcow2?

Запрос сформулирован в статье:

Перерыв в доступности ВМ будет только на время записи её памяти на диск и чтения обратно.

это довольно расплывчатый запрос без каких либо критериев кроме условной целостности. Да и клиенты по идее поотваливаются

xgatron
()
Для того чтобы оставить комментарий войдите или зарегистрируйтесь.