LINUX.ORG.RU

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

 , , ,


2

3

Всегда хочется сократить время на резервное копирование. Это возможно, если копировать не всю виртуальную машину (ВМ) вместе с операционной системой, а только необходимые пользовательские файлы. Существует много путей это сделать (ssh, spice-vdagent, VirtioFS, ….), я напишу про два не очень распространенных.

Копирование файлов с помощью гостевого агента QEMU.
Если применяется копирование ВМ без выключения, то конечно в ВМ установлен гостевой агент.

Подробно про установку - см. например https://bozza.ru/art-337.html . Наличие агента позволяет скопировать файлы ВМ без установки дополнительных программ.

Пример.

Проверяем наличие гостевого агента ВМ

virsh qemu-agent-command my_vm '{"execute":"guest-ping"}'
{"return":{}}

Узнаем подробности про операционную систему

virsh qemu-agent-command my_vm '{"execute":"guest-get-osinfo"}'
{"return":{"name":"Debian GNU/Linux","kernel-release":"4.9.235-antix.1-486-smp","version":"10 (buster)","pretty-name":"Debian GNU/Linux 10 (buster)","version-id":"10","kernel-version":"#1 SMP Mon Sep 14 19:22:35 EDT 2020","machine":"i686","id":"debian"}}

Интересуемся, какие документы есть у пользователя «user»

$ virsh qemu-agent-command my_vm  '{"execute": "guest-exec", "arguments": {"path": "/usr/bin/ls","arg": ["/home/user/Документы"],"capture-output": true}}'
{"return":{"pid":2181}}
virsh qemu-agent-command my_vm  '{"execute": "guest-exec-status","arguments": {"pid": 2181 }}'
{"return":{"exitcode":0,"out-data":"c29tZV9maWxlLnR4dAo=","exited":true}}

# результат получаем в кодировке "base64"
echo "c29tZV9maWxlLnR4dAo=" |  base64 --decode
some_file.txt

Читаем пользовательский файл

virsh qemu-agent-command my_vm  '{"execute":"guest-file-open", "arguments": {"path": "/home/user/Документы/some_file.txt","mode": "r"}}'
{"return":1000}

virsh qemu-agent-command my_vm  '{"execute": "guest-file-read", "arguments" : {"handle":1000, "count" : 64000}}'
{"return":{"count":24,"buf-b64":"0JLRgdC10Lwg0L/RgNC40LLQtdGCIQoK","eof":true}}

echo "0JLRgdC10Lwg0L/RgNC40LLQtdGCIQoK" |  base64 --decode
Всем привет!

virsh qemu-agent-command my_vm  '{"execute": "guest-file-close", "arguments" : {"handle":1000}}'
{"return":{}}

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

Копирование файлов из смонтированного снимка диска
Тут конечно опять понадобится гостевой агент, чтобы сделать целостный снимок диска.

Пример.

Cмотрим, какие есть диски

virsh domblklist my_vm
Target     Source
------------------------------------------------
hda        /var/lib/libvirt/images/my.img

Делаем снимок с заморозкой файловой системы («–quiesce»)

virsh snapshot-create-as my_vm bus  --disk-only --atomic  --quiesce --no-metadata
Domain snapshot bus created

Файл диска становится доступным для чтения и монтирования. Если диск в формате qcow2 - воспользуйтесь «qemu-nbd»

fdisk -l /var/lib/libvirt/images/my.img
Диск /var/lib/libvirt/images/my.img: 3,8 GiB, 4089446400 байт, 7987200 секторов
Единицы: секторов по 1 * 512 = 512 байт
Размер сектора (логический/физический): 512 байт / 512 байт
Размер I/O (минимальный/оптимальный): 512 байт / 512 байт
Тип метки диска: dos
Идентификатор диска: 0x57a18de7

Устр-во                         Загрузочный  начало   Конец Секторы Размер Идентификатор Тип
/var/lib/libvirt/images/my.img1 *              2048 6875135 6873088   3,3G            83 Linux
/var/lib/libvirt/images/my.img2             6875136 7923711 1048576   512M            83 Linux

mkdir -p ~/tmp/mnt

Смещение начала раздела №1 2048x512 = 1048576. Монтируем раздел диска только для чтения!

sudo mount -t auto -o ro,noload,loop,offset=1048576 /var/lib/libvirt/images/my.img ~/tmp/mnt 

Читаем файл пользователя

ls ~/tmp/mnt/home/user/Документы/
some_file.txt

cat ~/tmp/mnt/home/user/Документы/some_file.txt 
Всем привет!

Отмонтируем

sudo umount  ~/tmp/mnt 

Завершаем работу со снимком

virsh blockcommit my_vm hda --active --pivot
Successfully pivoted

virsh domblklist my_vm
Target     Source
------------------------------------------------
hda        /var/lib/libvirt/images/my.img

rm /var/lib/libvirt/images/my.bus

Способ работает быстро, можно для большого количества файлов применить «rsync». Можно скомбинировать со способом №1: запустить бэкап чего-либо внутри ВМ, дождаться окончания, а затем уже перенести результат вне ВМ.

За что мне нравится Linux - за многобразие разных способов получения результата.

Версии программ.
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

virsh qemu-agent-command my_vm  '{"execute": "guest-info"}'
{"return":{"version":"3.1.0" .....
Ссылки:

QEMU Guest Agent Protocol Reference: https://qemu-project.gitlab.io/qemu/interop/qemu-ga-ref.html



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

Погоди он еще не добрался до guestfs-tools. Там еще с 10ок статей наклепает ;)

mx__ ★★★★★
()

встречал дурацкий вид хостинга на vbox-php, советовал перейти на прохмох, но уж как работало, менять не стали, для бекапов использовал систему снепшотов - клонирования, бекапилось и восстанавливалось без проблем

s-warus ★★★★
()

Тут конечно опять понадобится гостевой агент, чтобы сделать целостный снимок диска.

Опция --quiesce (для которой нужен агент) «замораживает» активность ФС. Но это не делает снапшот application consistent. Он будет filesystem consistent (см. например https://kb.synology.com/en-sg/DSM/tutorial/What_is_file_system_consistent_sna...).

И как я понимаю, поскольку ФС не отмонтирована, то в случае filesystem consistent снапшота нужен будет fsck, как и в случае crash consistent снапшота. Преимущества опции --quiesce не очевидны. Разве что снижение шансов повреждения ФС.

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