Всегда хочется сократить время на резервное копирование. Это возможно, если копировать не всю виртуальную машину (ВМ) вместе с операционной системой, а только необходимые пользовательские файлы. Существует много путей это сделать (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


