Под капотом · Виртуализация · Бэкапы
Резервная копия (push)
Пользователь запускает резервное копирование дисков в файл. Вот какие команды он использует:
virsh backup-begin vm1 backup.xml virsh domjobinfo vm1
После выполнения команд гипервизор начинает копировать диски:
- Команда backup-begin запускает запись копии с момента старта;
- Команда domjobinfo показывает прогресс и статус задачи;
- ВМ всё это время продолжает работать.
-
пользователь 1. Пользователь вводит команду бэкапа
virDomainBackupBegin(xml, null)
Иногда перед этим замораживают I/O гостя, чтобы копия была согласованной, а не «как при сбое питания». Без заморозки копия crash-consistent; fsfreeze даёт согласованность файловой системы, но не приложения.
-
libvirt 2. Демон разбирает описание бэкапа
<domainbackup mode='push'> <disks> <disk name='vda' type='file'> <target file='/backup/vda.qcow2'/> </disk> </disks> </domainbackup>Для push-режима target с путём обязателен: без него libvirt сгенерирует имя сам, добавив метку времени.
-
QEMU 3. QEMU запускает block job
{"execute":"blockdev-backup", "arguments":{"device":"node-D","target":"node-E","sync":"full"}}Точка во времени фиксируется на старте команды, а не на её завершении.
-
диск / RAM 4. Чтение идёт из зафиксированного состояния
QEMU читает цепочку → пишет в target гость продолжает писать в активный слой
Поэтому простой не нужен: копируется уже зафиксированный срез.
-
QEMU 5. Job завершается
{"event":"BLOCK_JOB_COMPLETED"}После этого ресурсы job освобождаются.
-
libvirt 6. Демон закрывает бэкап
virDomainBackupEnd()
Память в такую копию не входит: это бэкап дисков, а не «снимок ВМ».