Некоторое время назад озаботился решением вопроса бэкапа виртуальных машин kvm. Когда стал разбираться в теме, с удивлением обнаружил, что каких-то удобных, устоявшихся решений для горячего бэкапа виртуальных машин без остановки работы в kvm нет. Ни коммерческих решений не увидел, ни бесплатных. Пришлось самому вникать в суть и разбираться в теме.
На углубленном курсе "Архитектура современных компьютерных сетей" вы с нуля научитесь работать с Wireshark и «под микроскопом» изучите работу сетевых протоколов. На протяжении курса надо будет выполнить более пятидесяти лабораторных работ в Wireshark.
Введение
С гипервизором kvm лично мне приходилось мало работать. Еще в первое мое знакомство с гипервизорами, когда я выбирал, какой использовать в своей работе, kvm мне не понравился вообще по следующим причинам:
- Нет удобного инструмента для управления гипервизором под Windows. Для меня это критично, так как моя основная рабочая система ОС Windows.
- Не увидел готового образа, который бы позволил быстро и без лишних движений развернуть гипервизор на новом железе.
В итоге я остановился на Xen там, где нужно поставить систему на программный рейд mdadm, и Hyper-V в тех случаях, где рейд либо не нужен совсем, либо он аппаратный. В своей работе так или иначе приходится сталкиваться с различными системами, поэтому разбираться приходится во всем, в том числе и в kvm.
Есть 2 различных способа сделать бэкап виртуальной машины kvm:
- С остановкой или заморозкой системы на короткий промежуток времени.
- Без остановки системы вообще.
Для первого случая все относительно просто, каких-то нюансов нет. Во втором случае возникают нюансы и вопросы. Просто взять и сделать горячий бэкап виртуальной машины в kvm не получится. Вопрос рассмотрения архивных копий виртуальных машин нужно начинать с выбора типа жесткого диска, который будет использоваться. В зависимости от этого будет разная стратегия бэкапа. С этого мы и начнем.
Какой диск выбрать в kvm - lvm, raw (img) или qcow2
В kvm есть несколько типов дисков, которые вы можете использовать в своей работе. Они имеют принципиальные отличия как по своей работе, так и по способам бэкапа. Выбирать тот или иной тип нужно в зависимости от ваших задач. Рассмотрим эти типы подробнее.
LVM. Тут все понятно. Использование lvm томов в виде дисков виртуальных машин. Такой диск будет блочным устройством и должен работать быстрее всех остальных типов, так как нет лишней прослойки в виде файловой системы.
Плюсы:
- Снэпшоты средствами самого lvm, с них легко снять бэкап без остановки виртуальной машины.
- Максимальное быстродействие.
- Легко изменить размер диска.
Минусы:
- Более сложное управление по сравнению с дисками в виде отдельных файлов.
- Менее гибкое управление пространством диска. Если весь диск разбить на lvm разделы для виртуалок, то места на нем не останется, даже если вируталки будут пустые.
- Более сложный перенос на другой сервер.
RAW. Это обычный формат сырых данных. Среди дисков в виде файлов это будет самый простой и быстрый вариант. Все данные пишутся как есть без дополнительных обработок и служебной информации. Формат является универсальным для большинства популярных гипервизоров.
Плюсы:
- Максимальная простота и производительность среди образов в виде файла.
- Универсальный формат с поддержкой в большинстве гипервизоров.
- Легкость переноса виртуальной машины на другой сервер. Достаточно просто скопировать файл.
Минусы:
- Не поддерживает снепшоты ни в каком виде.
- Занимает сразу все выделенное пространство на диске, даже если внутри виртуальной машины место будет свободно. Из-за отсутствия фрагментации в некоторых случаях это может оказаться плюсом.
QCOW2. Родной формат для гипервизора QEMU. Расшифровывается как QEMU Copy-on-write. Этот формат позволяет создавать динамические диски для виртуальных машин, а так же поддерживает снепшоты. Теоретически, скорость работы должна хоть и не сильно, но уступать RAW. Как обстоит дело на практике, я не знаю, не замерял и подробно эту информацию не проверял.
Плюсы:
- Поддержка снепшотов и динамических дисков. Как следствие - более удобное управление дисковым пространством.
- Легкость переноса виртуальной машины на другой сервер. Достаточно просто скопировать файл.
Минусы:
- Более низкая производительность, по сравнению с другими типами образов.
У каждого типа есть свои преимущества и недостатки. Lvm проще всего бэкапить, но им сложнее всего управлять. Для того, кто хорошо знаком с lvm это не проблема, если сталкиваешься первый раз, то возникает много вопросов. У raw нет снепшотов, лично для меня это большой минус, я этот формат вообще не рассматриваю. Если нет максимальной нагрузки на дисковую подсистему, то QCOW2 мне кажется наиболее приемлемым вариантом. Собственно, ниже и пойдет рассказ, как совместить удобство управления QCOW2 и простоту бэкапов и снэпшотов lvm. Я покажу, как сделать живой бэкап виртуальной машины kvm в формате qcow2 без остановки виртуальной машины.
Бэкап виртуальной машины kvm без остановки
Перед практической реализацией живого бэкапа виртуальной машины, снова немного поговорим о теории. Для бэкапа виртуальной машины kvm достаточно просто скопировать ее диски в виде файлов. Это можно сделать даже при работающей машине. Но если в этот момент на виртуалке идет какая-то дисковая активность, вы скорее всего получите неработающий образ. И это логично. Значит нам, чтобы гарантированно скопировать диск, виртуальную машину нужно выключить, либо придумать что-то еще.
Это "что-то еще" является снепшот. Мы можем сделать во время бэкапа снепшот виртуальной машины, зафиксировав ее состояние и сделать копию с этого снепшота. После завершения копирования снепшот объединяется с основным файлом и машина продолжает работать в штатном режиме. Завершать работу или замораживать виртуальную машину в данном случае нет необходимости.
С самими снепшотами тоже есть нюансы. Есть 2 разных типа снепшота. Например, если вы сделаете снепшот qcow2 средствами virt-manager, то удивитесь, не увидев новый файл снепшота. Оказывается, снепшот будет создан внутри qcow2, а файл как был один, так и останется. Это очень неудобно, так как если у вас будет занят весь доступный для файла объем, вы гарантированно получите ошибку при старте вашей виртуалки. А контролировать объем диска, в котором находятся снепшоты трудно и неудобно. И бэкапы в таком случае делать тоже не получится. Хотя получится, но все равно не удобно. Нужно будет отдельными командами конвертировать состояние виртуальной машины до снепшота в отдельный файл и его уже забирать для бэкапа. Плюс ко всему машину в этом случае нужно будет заморозить на момент создания снимка. Заморозка будет кратковременной, но все равно без нее не обойтись. Я приведу для примера команды, которыми это можно делать, но сам я не стал использовать такой способ, потому что, во-первых, не смог найти команды на объединения снепшота и основного файла, во-вторых, меня не устраивает даже кратковременная заморозка системы.
Замораживаем виртуалку:
# virsh domfsfreeze vm-name
Делаем снепшот:
# qemu-img create -f qcow2 -b vm-name.qcow2 vm-name-snapshot.qcow2
Размораживаем
# virsh domfsthaw vm-name
Конвертируем снепшот в отдельный образ:
# qemu-img convert -O raw vm-name-snapshot.qcow2 /backup-vm/vm-name-snapshot.img
Преобразовываем raw обратно в qcow2:
# qemu-img convert -O qcow2 /backup-vm/vm-name-snapshot.img /backup-vm/vm-name-snapshot.qcow2
После этого надо объединить снимок с остальным файлом. Я не стал искать, как это сделать, так как тут используется заморозка виртуальной машины, хоть и кратковременная, но я хочу обойтись без нее. Поэтому я стал дальше искать варианты.
В рунете я вообще не нашел информации, как все сделать красиво, удобно и быстро. Нашел инструкцию на официальном сайте libvirt - http://wiki.libvirt.org/page/Live-disk-backup-with-active-blockcommit Дальше фактически будет перевод с моими пояснениями.
Установка qemu-guest-agent
Мы будем делать снепшот средствами virsh. При этом остановки или заморозки системы не будет вообще. Чтобы этот вариант корректно работал, вам необходимо установить на виртуальную машину qemu-guest-agent. Для этого вам сначала нужно добавить Channel Device по имени org.qemu.guest_agent.0. Проще всего это сделать через virt-manager.
Затем в систему надо установить пакет qemu-guest-agent. Для debian и centos все просто:
# apt-get install qemu-guest-agent
# yum install qemu-guest-agent
Для windows надо с диска virtio-win установить пакет qemu-ga из папки guest-agent, которая находится в корне диска.
Подробнее об установке qemu-guest-agent можно прочитать в документации redhat. Теперь у нас все готово для выполнения живого бэкапа виртуальной машины в kvm без остановки этой виртуалки.
Выполняем снепшот виртуальной машины:
# virsh snapshot-create-as --domain vm-name backup-snapshot -diskspec vda,file=/snapshot/vm-name-backup.qcow2 --disk-only --atomic --quiesce --no-metadata
vm-name | имя виртуальной машины |
backup-snapshot | название снэпшота, может быть любым |
vda | имя диска, для которого указываем адрес снепшота |
/snapshot/vm-name-backup.qcow2 | путь и имя файла для снепшота |
Для того, чтобы узнать имена дисков виртуальной машины, воспользуйтесь командой:
# virsh domblklist vm-name
После того, как сделали снимок, скопируйте куда вам нужно основной файл виртуальной машины. Я предпочитаю его сразу сжимать всеми ядрами процессора с помощью архиватора pigz:
# pigz -c /virt/vm-name.qcow2 > /backup-vm/vm-name.qcow2.gz
Когда выполнение бэкапа завершено, объединим снапшот с основным файлом:
# virsh blockcommit vm-name vda --active --verbose --pivot
После этого файл снэпшота можно удалить:
# rm /snapshot/vm-name-backup.qcow2
Для полноты картины забэкапим еще и настройки виртуалки:
# virsh dumpxml vm-name > /backup-vm/vm-name.xml
И на этом все. Мы сделали полный бэкап работающей виртуальной машины kvm без ее остановки. Сама она даже не поняла, что с ней что-то сделали. Работающие БД на ней не испытывают никаких проблем. Проверял на postgresql. Терминальные сессии в windows server тоже чувствуют себя отлично.
Скрипт для автоматического бэкапа виртуальных машин KVM
По мотивам всего написанного выше я набросал простенький скрипт для автоматического живого бэкапа всех дисков всех работающих в момент выполнения скрипта виртуальных машин. Обращаю внимание, что бэкапятся все диски. Скрипт привожу просто для примера, не используйте его, если вам не нужны полные бэкапы всех дисков. Лично я бэкаплю только небольшие системные диски. Все, что много весит, предпочитаю архивировать другими способами уже изнутри виртуальной машины. Если это базы данных, то делаю бэкапы нужных баз postgresql, если это файловый сервер, то использую rsync для создания инкрементных бэкапов. Ну и так далее. Каждый выбирает средства на свой вкус.
#!/bin/bash # Дата год-месяц-день data=`date +%Y-%m-%d` # Папка для бэкапов backup_dir=/backup-vm # Список работающих VM vm_list=`virsh list | grep running | awk '{print $2}'` # Список VM, заданных вручную, через пробел #vm_list=(vm-1 vm-2) # Лог файл logfile="/var/log/kvmbackup.log" # Использовать это условие, если список VM задается вручную #for activevm in "${vm_list[@]}"; # Использовать это условие, если список работающих VM берется автоматически for activevm in $vm_list do mkdir -p $backup_dir/$activevm # Записываем информацию в лог с секундами echo "`date +"%Y-%m-%d_%H-%M-%S"` Start backup $activevm" >> $logfile # Бэкапим конфигурацию virsh dumpxml $activevm > $backup_dir/$activevm/$activevm-$data.xml echo "`date +"%Y-%m-%d_%H-%M-%S"` Create snapshots $activevm" >> $logfile # Список дисков VM disk_list=`virsh domblklist $activevm | grep vd | awk '{print $1}'` # Адрес дисков VM disk_path=`virsh domblklist $activevm | grep vd | awk '{print $2}'` # Делаем снепшот диcков virsh snapshot-create-as --domain $activevm snapshot --disk-only --atomic --quiesce --no-metadata sleep 2 for path in $disk_path do echo "`date +"%Y-%m-%d_%H-%M-%S"` Create backup $activevm $path" >> $logfile # Вычленяем имя файла из пути filename=`basename $path` # Бэкапим диск pigz -c $path > $backup_dir/$activevm/$filename.gz sleep 2 done for disk in $disk_list do # Определяем путь до снепшота snap_path=`virsh domblklist $activevm | grep $disk | awk '{print $2}'` echo "`date +"%Y-%m-%d_%H-%M-%S"` Commit snapshot $activevm $snap_path" >> $logfile # Объединяем снепшот virsh blockcommit $activevm $disk --active --verbose --pivot sleep 2 echo "`date +"%Y-%m-%d_%H-%M-%S"` Delete snapshot $activevm $snap_path" >> $logfile # Удаляем снепшот rm $snap_path done echo "`date +"%Y-%m-%d_%H-%M-%S"` End backup $activevm" >> $logfile done
Обращаю внимание на несколько моментов:
vm_list может либо автоматически заполняться списком работающих виртуальных машин, либо можно вручную указать список только тех машин, которые нужно бэкапить. Для этого нужно раскомментировать соответствующую строку в начале скрипта при объявлении переменной. Затем выбрать подходящую строку для цикла for. Он будет немного разным, в зависимости от списка.
Снепшоты будут создаваться в той же папке, где хранится основной файл данных. На время отладки советую для начала закомментировать строку с удалением снепшота, на всякий случай. Рекомендую этот крипт прогнать сначала на тестовом сервере. Я его написал на примере одного гипервизора, больше нигде не проверял. Но работает он однозначно, я проверил несколько раз с разными списками VM. В итоге оставил его у себя на сервере в работе.
Для регулярной очистки бэкапов, если они у вас будут храниться где-то в доступном с этого сервера месте, можно добавить в самый конец условие очистки. Для полного бэкапа VM мне видится нормальной схема хранения бэкапов в несколько месяцев, с созданием архивов раз в неделю. Чаще бэкапить системные диски не вижу смысла, там редко бывают ежедневные изменения.
/usr/bin/find /backup-vm/*/ -type f -mtime +90 -exec rm -rf {} \;
Данная команда удалит все файлы старше 90 дней в папках с названиями виртуальных машин, расположенных в /backup-vm.
Заключение
В начале статьи я сказал, что не встретил готового решения по живому бэкапу kvm. (upd. Уже после публикации статьи мне подсказали готовое решение kvmBackup.) На самом деле это не совсем верно. Есть хорошая готовая сборка на основе kvm - proxmox. Я подробно рассматривал ее в отдельном материале - Установка и настройка proxmox. Но все же это решение конкретного коллектива разработчиков со своими возможностями и ошибками. В проксмокс реализован живой бэкап виртуальных машин из коробки. К сожалению, я не смог быстро найти техническую реализацию их решения. Возможно, все было бы еще проще. Но так тоже ничего получилось.
На углубленном курсе "Архитектура современных компьютерных сетей" вы с нуля научитесь работать с Wireshark и «под микроскопом» изучите работу сетевых протоколов. На протяжении курса надо будет выполнить более пятидесяти лабораторных работ в Wireshark.
А что мешает:
1) создать на гипервизоре lv
2) хранить любые образы (raw, qcow..) на этой lv
3) перед бэкапом сделать снэпшот lv: lvcreate ... -s ...
4) подмонтировать снэпшот куда-нибудь, например в /mnt/snap_vms
5) неспешно скопировать все нужные диски виртуалок из /mnt/snap_vms любым предпочитаемым способом в место назначения
6) отмонтировать снэпшот: umount /mnt/snap_vms
7) удалить снэпшот: lvremove ... (он больше не нужен, т.к. актуальное состояние файлов образов в lv)
?
запустил скрипт, потерял образы винтов, как вернуть их пока машины работают ?
Как так то? Надо же аккуратно всё проверять сначала. Если виртуалки ещё работают, значит файлы на самом деле не удалены. Как их восстановить можно почитать в заметках:
https://t.me/srv_admin/1770
https://t.me/srv_admin/1786
Интересно, а можно сделать копию диска ВМ, а потом просто делать снэпшоты и объединять с этой копией? Просто каждый раз делать полную копию дисков- нужно очень много места..
Добрый день
Доработал скрипт с разными проверками. Может кому пригодится. А то я очень сильно был удивлен когда удалился мой образ ВМ из-за ошибок на первых шагах. Потерял данные :(
https://github.com/darksmoke/Scripts/blob/main/Linux/kvm_live_backup.sh
Спасибо, полезная доработка. Хотя я достаточно быстро отказался от такого способа бэкапа и перешёл на готовые решения. Слишком много нюансов, которые нужно учитывать. Работает ненадежно. Проще поставить proxmox и использовать его встроенные бэкапы.
Добрый день. Везде лазил, но похожего не нашёл ... При работающих виртуалках, ПЕРЕНЁС их файлы (CentOS 8 KVM) в другой каталог. Через неделю заметил это. А виртуалки работали, копила данные ... Как теперь из работающей виртуалки сделать файл? Одну потерял остановив ...
Даже не представляю, как это исправить. Наверняка как-то можно, но моих знаний не хватает, чтобы что-то предложить. То ли виртуалки в оперативной памяти новые данные копят, то ли продолжают писать в удаленный файл. Не известно. Но раз они все еще работают, значит данные в том или ином виде живы.
Вот именно, живы и трудятся...
Будем искать дальше
Напишите, ели получится восстановить виртуалки. Очень интересно, как это сделать. Я бы задал вопрос на https://qna.habr.com/
Добрый день!
Огромное спасибо за Ваш скрипт!
Позволил себе его немного доработать.
В частности реализовал отработку параметра --diskspec при наличии нескольких дисков в виртуалке.
Кусок кода ниже.
# Список виртуальных дисков VM
disk_list=`virsh domblklist $activevm | grep vd | awk '{print $1}'`
for disk in $disk_list
do
diskspec="${diskspec} --diskspec $disk,file=$snap_dir/$activevm.$disk.snapshot"
done
Где snap_dir - отдельная папка со снапшотами
Используем полученную переменную в следующей команде.
# Делаем снепшот диcков
virsh snapshot-create-as --domain $activevm snapshot$diskspec --disk-only --atomic --quiesce --no-metadata >> $logfile
Отсутствие пробела между snapshot и $diskspec это не ошибка, ибо при формировании переменной пробел уже присутствует.
В результате решаем проблему хранения снапшотов в одной директории с основными образами и случайного удаления образов дисков вместо снапшотов в дальнейшем.
Ещё, при определении того какие виртуальные машины бэкапить, неплохо было бы проверять, запущен ли на них qemu-agent, потому как бэкап без работающего агента завершится ошибкой.
for activevm in $vm_list
do
# Проверяем активность агента на VM
virsh qemu-agent-command $activevm '{"execute":"guest-ping"}' > /dev/null 2>&1
if [ $? -eq 0 ] ;then
echo "`date +"%Y-%m-%d_%H-%M-%S"` Agent is alive on $activevm" >> $logfile
# Агент доступен, продолжвем
И в конце, в секции когда снапшоты объединяются с основным образом и затем удаляются, сделал проверку не только пути снапшота, но и что виртуальная машина использует именно снапшот в данный момент.
# Проверяем что VM использует снапшот, благо его расширение мы знаем
virsh domblklist $i | grep $disk | awk '{print $2}' | grep -q snapshot
if [ $? -eq 0 ] ;then
echo "`date +"%Y-%m-%d_%H-%M-%S"` Commit snapshot $i $snap_dir/$activevm.$disk.snapshot" >> $logfile
# Объединяем снапшот
virsh blockcommit $activevm $disk --active --verbose --pivot >> $logfile
sleep 2
echo "`date +"%Y-%m-%d_%H-%M-%S"` Delete snapshot $activevm $snap_dir/$activevm.$disk.snapshot" >> $logfile
# Удаляем снепшот
#rm -f $snap_dir/$activevm.$disk.snapshot
else
echo "`date +"%Y-%m-%d_%H-%M-%S"` Snapshot $activevm $snap_dir/$activevm.$disk.snapshot not present" >> $logfile
fi
Надеюсь мои доработки будут кому-нибудь полезны.
Спасибо за информацию. Этих доработок не хватало явно. Я не использую этот метод сам как раз из-за того, что слишком много дополнительных проверок надо делать, чтобы все работало корректно и без сюрпризов. Натыкался то на одно, то на другое.
"Я не использую этот метод" - Можете поделиться что в итоге используете ?
Скрипт вроде работает корректно когда руками его запускаешь, но нельзя учесть всё.
Спасибо!
Везде, где нужно kvm, ставлю proxmox.
Proxmox наглухо прибит гвоздями к debian, а я предпочитаю CentOS.
Думаю у Proxmox под капотом та же логика работы, что и у "нашего" скрипта, может только более продвинутая система отслеживания работы и вылавливания ошибок.
В любом случае, спасибо!
Это да, я тоже люблю все на centos держать, но тут решил, что оно того не стоит. Лучше взять из коробки. Благо, я debian знаю не хуже чем centos. Одинаково с тем и другим работаю.
у вас не осталось полного текста вашего скриптика ?
Мда, с удалением образа машины вместо снэпшота - это жестко -))
Пока так:
error: unsupported configuration: online commit not supported with this QEMU binary
# virsh -v
4.5.0
Для удалятелей я отдельно предупреждение сделал: " На время отладки советую для начала закомментировать строку с удалением снепшота, на всякий случай."
Вообще, я больше не использую подобные скрипты. Несколько раз тоже накалывался с неожиданным поведением. До удаления дисков не доходило, но иногда возникают нестандартные ситуации, на которые надо писать отдельно обработки в скрипте. И ситуаций таких довольно много. Сидеть руками все в скрипте описывать не удобно и не эффективно.
Добрый день!
error: Guest agent is not responding: QEMU guest agent is not connected
это что за ошибка подскажите
Так в ошибке все сказано. Не работает guest-agent на виртуальной машине.
Zerox, а инструкцию по установке и настройке KVM на CentOS вы не писали?
Я proxmox использую - https://serveradmin.ru/ustanovka-i-nastroyka-proxmox/
скрип жесть, убил мне виртуалку.. ничего не забекапил.
К таким вопросам надо с головой подходить и понимать, что ты делаешь и что делает скрипт. Он ничего не убивается, если настроено все правильно.
он попытался стереть снапшот, который не создался.. и вместо него стер саму виртуалку.
Специально написал: "На время отладки советую для начала закомментировать строку с удалением снепшота, на всякий случай. Рекомендую этот крипт прогнать сначала на тестовом сервере."
Я не понимаю, ребята, а как же vol-clone???
Объясните плиз)
Подскажите, вот создал я снимок виртуальной машины в KVM "sudo virsh snapshot-create-as --domain generic --name generic_backup --diskspec hdb,file=/mnt/kvm/backup/generic.qcow2 --disk-only --atomic --quiesce --no-metadata
" и он нормально создался.
Пишу "sudo virsh snapshot-list generic" и снимки отсутствуют. Пиушу "sudo virsh domblklist generic" и вижу "hdb /mnt/kvm/backup/generic.qcow2" . Не пойму почему первая команда нечего не выводит ?
Нашел ответы в комментариях выше =)
Не очень понятно, получается делается снимок и система продолжает работать со снимка, в это время мы копируем образ самой виртуальной машины и после чего сливаем основной образ со снимком?
Да.
Добрый день. Не получается запустить virt-manager через putty. Выдает ошибку (virt-manager:6095): Gtk-WARNING **: cannot open display:
Хотя до этого все настраивал и работало. Просто решил заново все перезалить и настроить, чтобы составить для себя инструкцию в ворде. И все, кабздец, не получается запустить вирт менеджер)))))
1. В винде запущен VcXsrv
2. #vi /etc/ssh/sshd_config
X11Forwarding yes
X11DisplayOffset 10
X11UseLocalhost yes
#service sshd restart
3. в путти Connection ->SSH -> X11 ставлю галку на против пункта- Enable X11 forwarding
Я такими настройками не занимался, не подскажу.
Дружище, напиши пожалуйста как твоем скрипте сделать, так чтобы было открыто исходящие пакеты на порт 22 для ssh чтобы пробросить X11
мне кажется дело в все в этом, я до сих пор ..бусь с этой проблемой))))
Короче ПАСАНЫ!!! Если у вас не будет работать virt-manager и выдает ошибку (virt-manager:6463): Gtk-WARNING **: cannot open display:
То это: 1) Перегрузить ПК клиент и сервер или 2) Это значит у вас отключен ipv6, да да, три недели е..ался и нашел все же причину))) Проброс X11 идет по ipv6, ппц)
C чем связана - трудно сказать. В сети много вопросов-ответов по этой ситуации. Я не нашел, окончательного решения, которое бы избавило от этой ситуации навсегда. Грешат на libvirt. После такого сообщения ситуация выглядит следующим образом: изменения из файла снапшота накатываются на исходный файл вашей ВМ, но не происходит окончательного переключения активного диска на исходный файл. Изменения продолжают писаться и в исходный файл и в файл снапшота, это видно если выгрузить конфиг командой virsh dumpxml. Почему-то не получается сделать окончательное переключение активности на исходный файл ВМ и отключить снапшот. У меня делается резервное копирование 2х ВМ и такая ошибка на более загруженной машине появляется чаще, где-то раз в 10-15 дней. На другой реже.
Похоже, из-за постоянной высокой нагрузки на диск, не получается выполнить слияние полностью без остановки машины. Возможно, стоит сделать задержку на несколько секунд, если есть такая ошибка, и попробовать снова. И так несколько раз.
Добрый день!
Приходилось ли вам сталкиваться с ситуацией, когда при накате снапшота на основной файл коммандой
virsh blockcommit YOUR_VM hda --active --pivot
выдавалась ошибка:
error: failed to pivot job for disk hda
error: block copy still active: disk 'hda' not ready for pivot yet
Как вы из нее выходите и автоматизировали в скрипте обработку этого события?
С делаю так (не знаю корректно это или нет):
virsh blockjob YOUR_VM hda --pivot
Не было такой ошибки. С чем она связана?
Вероятно, не установлен гостевой агент в системе или читайте внимательно "block copy still active", что как бы намекает, что все еще выполняется блочное копирование.
В примере выше это никак не реализовано, но по факту можно проверять: если .snapshot не создан, то выполнять копирование выключением ВМ.
А вообще, спасибо за статью - натоклнуло на мысль, как реализовать и написать свой скрипт.
Добрый день!
Спасибо за интересную и, главное - полезную информацию.
Не могли бы Вы пояснить более подробно следующий шаг, который выполняется после создания снепшота виртуальной машины:
"
После того, как сделали снимок, скопируйте куда вам нужно основной файл виртуальной машины. Я предпочитаю его сразу сжимать всеми ядрами процессора с помощью архиватора pigz и далее по тексту ..."
Интересует несколько вопросов:
1. Процесс копирования основного файла виртуальной машины осуществляется при включенной машине? Обычное копирование? А как же желание исключить влияние активности в файловой системе VM ?
2. Зачем объединять основной файл со снимком?
Можно не давать развернутый ответ, а предложить ссылки для изучения.
Спасибо.
1. Да, обычное копирование при включенной машине. Вся новая активность виртуальной машины выполняется в файл снепшота. Собственно, он для этого и делается.
2. Для того, чтобы снимка не было. Снимки ухудшают производительность виртуальной машины, поэтому держать их постоянно не нужно без крайней необходимости.
Добрый день !
на сервере 2 виртуалки - винда и centos, в обе добавлены каналы org.qemu.guest-agent.0, тип unix. на винде поставлены дрова и запущены две службы. при попытке заморозки или снэпшота на centos - всё проходит на ура. при потыке заморозить винду получаю следующее:
# virsh domfsfreeze vm2
error: Unable to freeze filesystems
error: internal error: unable to execute QEMU agent command 'guest-fsfreeze-freeze': this feature or command is not currently supported
Версия qemu:Compiled against library: libvirt 3.2.0
Using library: libvirt 3.2.0
Using API: QEMU 3.2.0
Running hypervisor: QEMU 2.9.0
В чем проблема ? CentOS Linux release 7.4.1708 (Core)
Нужно установить репозиторий centos-qemu-ev, и обновиться. Из этого репозитория всё работает как надо. Проверено.
Спасибо за помощь!
Все стало понятно!
Надо будет попробовать, и конечно не на рабочем.
Там простой на данный момент невозможен.
P.S. Я хотел это сделать чтобы можно было настроить backup-vm всех б на данный момент их 3.
Ничего я думаю что-то получиться.
Выше есть данные что стоит, если есть идея как поправить скрипт который будет работать смогу попробовать.
Поставить ещё Виртуалку и попробовать.
Ещё раз спасибо всем.
Может я что-то не так делаю?
Хотя вроде следую выше описанному.
Выполняем команду
virsh snapshot-create-as --domain dns.server1 backup-snapshot -diskspec hdb,file=/virt/snapshot/dns.server1-backup.qcow2 --disk-only --atomic --quiesce --no-metadata
Получаем ответ
ошибка: Операция не поддерживается: Этот QEMU не поддерживает создание снимка работающего диска
Подумал может остановить, хорошо еще этот ДНС пока не production only test server
virsh shutdown --domain dns.server1
Выполняем команду
virsh snapshot-create-as --domain dns.server1 backup-snapshot -diskspec hdb,file=/virt/snapshot/dns.server1-backup.qcow2 --disk-only --atomic --quiesce --no-metadata
Получаем ответ: Снимок домена backup-snapshot создан
Проверяем
196K dns.server1-backup.qcow2
Странно что так выходит.
Выше писали что на CentOS пакеты старые может в этом проблема?
Но на этом сервере уже есть 2 виртуалки рабочие и используются на полную.
Просто обнови QEMU - сейчас есть 2.11.0 версия
У меня 2.9.0 и нет ошибок
В CentOS добави epel-release repository
Доброе утро!
Как ни странно он стоит epel-release repository но нет ничего нового.
Я конечно еще проверю но не думаю что обновится.
Попробуй добавить репозиторий qemu-kvm-rhev.repo - здесь много вкусного для qemu
[root@study ~]# cat /etc/yum.repos.d/qemu-kvm-rhev.repo
[qemu-kvm-rhev]
name=oVirt rebuilds of qemu-kvm-rhev
baseurl=http://resources.ovirt.org/pub/ovirt-4.1/rpm/el7Server/
mirrorlist=http://resources.ovirt.org/pub/yum-repo/mirrorlist-ovirt-3.5...
enabled=1
skip_if_unavailable=1
gpgcheck=0
перепроверил репозиторий на наличие qemu-kvm
[root@study ~]# yum whatprovides qemu-kvm
10:qemu-kvm-1.5.3-141.el7.x86_64 : QEMU is a machine emulator and virtualizer
Repo : base
10:qemu-kvm-ev-2.9.0-16.el7_4.8.1.x86_64 : QEMU is a machine emulator and
: virtualizer
Repo : @qemu-kvm-rhev
Просто добави репозиторий @qemu-kvm-rhev (написал выше)
Потом установи qemu c репозиторий @qemu-kvm-rhev:
yum --disablerepo=* --enablerepo=qemu-kvm-rhev install qemu-kvm
Спасибо за помощь!
Так как Сервер уже в рабочем состоянии это ему не помешает?
2 Виртуалки уже работают!
Спасибо ещё раз.
Рад был помочь
Конечно помешает. Надо удалить старый, и поставить новый, иначе будет конфликт, да и yum не позволит установить
На рабочем сервере не рекомендую выполнять такие действия. Обязательно проверять все на резервном. Если, конечно, для вас невозможен простой. Если простой возможен, тогда можно пробовать, но на всякий случай не забывайте про бэкап.
Здравствуйте, у меня в процессе воспроизведения возник вопрос, разве после снепшота (в данном случаи на горячую) и после его применении на основной системе, OS не должна откатится в состояние до снепшота?
Нет
В том и дело что "горячий снапшот"
Если отследишь с virsh domblklist vm_name увидите что создаётся новый фаил где записываются изменения пока основной фаил (диск) копируется / или что там ещё делаете с ним. А когда делаете merge - то изменения записываются в основной фаил (диск) и с virsh domblklist vm_name увидите что активен стал основной диск - и он далее будет работать. И машина не откатится нигде потому что негде откатится.
Спасибо за ответ
Теперь понятно, почему VM работает как в чем не бывало, при манипуляциями с основным файлом (диском)
Доброе утро Володя.
Да вы совершенно правы!!!
Спасибо за подсказку!!!
На первом dns.server1 это hdb , на втором это vdb и на третьем vdb и vdc так как там два диска.
Спасибо большое, сегодня же протестирую и напишу как это работает!
Здравствуйте!
Очень подробно ор\писано и спасибо автору.
Но я столкнулся с той же проблемой что описал firebolt про удаление дисков.
Команды которые я использовал следующие :
virsh snapshot-create-as --domain dns.server1 backup-snapshot -diskspec vda,file=/virt/snapshot/dns.server1-backup.qcow2 --disk-only --atomic --quiesce --no-metadata
virsh snapshot-create-as --domain web.server1 backup-snapshot -diskspec vda,file=/virt/snapshot/web.server1-backup.qcow2 --disk-only --atomic --quiesce --no-metadata
virsh snapshot-create-as --domain mail.server1 backup-snapshot -diskspec vda,file=/virt/snapshot/mail.server1-backup.qcow2 --disk-only --atomic --quiesce --no-metadata
Подскажите где я ошибся в команде.
Единственное чего добился это что snapshot/mail.server1-backup.qcow2 заменял собой основной диск и сервер естественно после это не загружался.
Меняя какой диск должен работать я запускал его в течении 1-2 минут.
Данные у меня такие :
CentOS Linux release 7.4.1708 (Core)
virsh version
Скомпилировано с помощью: libvirt 3.2.0
Библиотека: libvirt 3.2.0
API: QEMU 3.2.0
Гипервизор: QEMU 1.5.3
Если нужны ещё какие нибудь данные могу предоставить.
Ошибка по-моему в названии устройства. Скорее всего у вас не " vda", что то из этого набора - "sda" "sdb" "hda" "hdb"
Что бы выяснить что что вписать вместо "vda" виполните команду "virsh domblklist dns.server1 " , "virsh domblklist web.server1", "virsh domblklist mail.server1"
Вы пишете, в начале статьи - "После этого надо объединить снимок с остальным файлом. Я не стал искать, как это сделать, так как тут используется заморозка виртуальной машины, хоть и кратковременная, но я хочу обойтись без нее. Поэтому я стал дальше искать варианты."
Не смог понять, какая именно команда из приведенных вами выше, "замораживает" виртуальную машину?
Ниже идут примеры команд:
Эта команда не замораживает виртуальную машину, а делает образ консистентным, то есть дает гарантию целостности файловой системы гостевой машины. На практике это выражается в том, что когда вы загрузите систему из сохраненного образа, она точно включится, и вы не получите предупреждения о предыдущем некорректном завершении работы, ведь при включении сохраненного образа работающей машины, произойдет запуск как если бы до этого было аварийное выключение. Тоже самое делает ключ --quiesce, который вы используете при создании снэпшота.
А разве чтобы сделать образ консистентным не нужно на какое то время заморозить машину? Нужно же остановить все дисковые операции, чтобы, к примеру, та же бд остановилась и прекратила активность.
Ну так вы же все равно замораживаете все дисковые операции, используя ключ --quiesce, вот в этой команде:
# virsh snapshot-create-as --domain vm-name backup-snapshot -diskspec vda,file=/snapshot/vm-name-backup.qcow2 --disk-only --atomic --quiesce --no-metadata
--quiesce это как бы более лаконичное представление virsh domfsfreeze vm-name, перед началом создания снапшота. И virsh domfsthaw vm-name после окончания создания.
Выдержка из мана virsh:
If --quiesce is specified, libvirt will try to use guest agent to freeze and unfreeze domain's mounted file systems. However, if domain has no guest agent, snapshot creation will fail. Currently, this requires --disk-only to be passed as well
Что-то вы меня совсем запутали. domfsfreeze я не использую, отказался от этого способа, о чем и написал в статье. Вместо него я использую snapshot-create-as. То есть в статье я привел пример отдельного использования этих двух методов. Вместе я их не применяю.
# virsh snapshot-create-as --domain vm-name backup-snapshot -diskspec vda,file=/snapshot/vm-name-backup.qcow2 --disk-only --atomic --quiesce --no-metadata
тоже самое, что последовательность следующих комманд :
#virsh domfsfreeze vm-name
# virsh snapshot-create-as --domain vm-name backup-snapshot -diskspec vda,file=/snapshot/vm-name-backup.qcow2 --disk-only --atomic --no-metadata
#virsh domfsthaw vm-name
То есть, на низком уровне, опция --quiesce делает, то же самое, что и domfsfreeze и domfsthaw. Кстати даже при активации этих опций нет абсолютных гарантий, что вы получите полностью рабочую копию виртуальной машины. Система загрузится, но если в момент создания снэпшота были открытые файлы, или активные транзакции БД, то существует ненулевой шанс, что файлы или базы будут повреждены. Кажется, единственный шанс гарантированно получить рабочую копию виртуальной машины, это делать бэкап, когда машина выключена. А важные данные архивировать внутри ВМ, средствами гостевой машины.
Спасибо за разъяснение. Я, видимо, либо перевел неправильно, либо не допонял. Я думал процесс domfsfreeze более длительный по времени и представляет собой другой механизм.
А насчет бэкапа все верно. Я в бэкапах виртуальных машин полагаюсь только на системные разделы. То есть по сути сохраняю настройки системы. Все данные и приложения внутри систем всегда бэкаплю отдельно и держу их на отдельных дисках.
Внимание! Этот скрипт бэкапа очень опасный! За 2 месяца тестирования я уже три раза поудалял файлы жестких дисков своих виртуальных машин. Если формат файла не qcow2 и снапшоты не поддерживаются, если виртуалка запущена, но qemu-agent не отвечает, если... Еще какой-то момент был мною выявлен при тестировании этого скрипта, уже не помню. ...тогда хана вашей виртуалке - скрипт удалит вместо снапшота сам основной файл жесткого диска.
Так что скрипт требует глубокой доработки. Во-первых, создание архива на удаленном диске - это уже ненадежно, я получал испорченные бэкапы. Этот момент уже исправлен - я создаю бэкап локально, считаю контрольную сумму, копирую на удаленный диск, считаю его контрольную сумму, потом сверяю.
Во-вторых нужно создать условие, которое не допустит удаления основного файла жесткого диска виртуальной машины. Этот момент предстоит осуществить.
Жалко, что мой комментарий будет внизу и его мало кто увидит.
Ну а вообще, за наличие такой базы я автору конечно же благодарен! На основе этой базы можно сделать что-то достойное. Я даже своим могу поделиться, когда сделаю до конца
Сталкивался с этим, но тут только на свою невнимательность приходится пенять. Сейчас, когда на гипервизорах все базы qcow2 и установлены агенты, все в порядке. Но даже если это не так, то диск не удаляется безвозвратно. Он уходит в бэкап, откуда его можно распаковать обратно и запустить виртуальную машину. Так что безвозвратной потери виртуалки не происходит в любом случае.
Бэкапы я тоже делаю локально, потом копирую. Но это универсальное правило, относится не только к этому случаю, но и ко всем остальным. Шанс получить битый файл при создании бэкапа на сетевой диск достаточно высок. Я всегда делаю бэкапы сначала локально, а потом переношу.
Скрипт, конечно, не идеальный, но свои задачи выполняет. У меня успешно трудится. Когда все отлажено и лишний раз гипервизор не дергают.
Диски удаляются безвозвратно в тех случаях, которые я описал. Это я уже проверил. В таком виде, в каком он у меня сейчас, я его в бою использовать не осмелюсь. Надо допилить. Когда сделаю, давайте, вам его отдам, опубликуете в свою статью?
Конечно опубликую. Может себе на вооружение возьму.
Автор спасибо, все отлично.
Есть опыт бэкапа таким образом FreeBSD систем? Не удается повесить на guest машину qemu-agent:
error: Guest agent is not responding: QEMU guest agent is not connected
Не пробовал с freebsd. Надо смотреть, поддерживает ли qemu эту систему. Если нет, то вариантов не вижу, только гасить машину и бэкапить на холодное.
Полностью не согласен с автором на счет минусов LVM.
1) Не вижу сложностей у правлении дисками.
2) Для оптимизации места можно использовать LVM Thin provisioning. Она использует TRIM и поэтому, предположительно, должна работать и с Windows guest https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/6/html/Logical_Volume_Manager_Administration/thinprovisioned_volumes.html
3) В чем разница что переносить, файл или LVM раздел. Из раздела легко получается файл (и наоборот) командами DD или qemu-img convert, например вот так: qemu-img convert /dev/vg00/lvimage -O qcow2 -с file.qcow и он будет уже сжат.
В достоинства lvm можно записать еще и возможность кэширования тома на SSD, если это необходимо.
Здравствуйте! Вопрос немного не в тему... Подскажите, как можно наиболее легко перенести виртуальную машину находящуюся на lvm (suse linux interprise 11 sp 3) на hyper-v (2016). Заранее спасибо.
Сходу не скажу, нет такого опыта. Но думаю решение легко нагуглится. У всех современных гипервизоров есть возможность перемещать виртуалки между собой. По крайней мере мне всегда удавалось перенести виртуальную машину на другой гипервизор, если это требовалось. Если совсем не получится, то можно пойти другим путем и использовать Veeam Agent для Linux FREE.
qemu-img convert /dev/vg00/lvimage -O vhdx file.vhdx диск машины вы таким образом сконвертируете. А дальше все зависит от гостевой ОС.
Теперь столкнулся со следующей проблемой, при попытке сделать снапшот командой:
[root@server-kvm2 ~]# virsh snapshot-create-as --domain CentOS-7 CentOS-7-snapshot -diskspec vda,file=/snapshot/vm-name-backup.qcow2 --disk-only --atomic --quiesce --no-metadata
Получаю ошибку: Operation not supported: live disk snapshot not supported with this QEMU binary
Результат поисков, говорит, что базовые пакеты в CentOS урезанные и нужно подключать отдельный репозиторий "oVirt rebuilds of qemu-kvm-rhev", так ли это?
Скорее всего да. В репозиториях centos все очень старое. Из-за этого я использую для kvm debian. Так просто проще и меньше нюансов ненужных.
Можно поставить epel-repository (yum install epel-release) и взять более новые версии
Сам на Centos7, # virsh version
Using library: libvirt 3.2.0
Using API: QEMU 3.2.0
Running hypervisor: QEMU 2.9.0
Большое спасибо Вам за статью! Более полезного материала ни где больше не встречал.
Однако руководствуясь Вашими примерами у меня возникли проблемы с qemu-guest-agent. После настройки сhannel Device и попытки запуска qemu-guest-agent сервис не запускается, перепроверял как описано в официальном документации RedHat. Выходит ошибка:
Jun 13 12:05:37 server-kvm7 polkitd[904]: Registered Authentication Agent for unix-process:176099:143685278 (system bus name :1.6226 [/usr/bin/pktty
Jun 13 12:07:07 server-kvm7 systemd[1]: Job dev-virtio\x2dports-org.qemu.guest_agent.0.device/start timed out.
Jun 13 12:07:07 server-kvm7 systemd[1]: Timed out waiting for device dev-virtio\x2dports-org.qemu.guest_agent.0.device.
-- Subject: Unit dev-virtio\x2dports-org.qemu.guest_agent.0.device has failed
-- Defined-By: systemd
-- Support: http://lists.freedesktop.org/mailman/listinfo/systemd-devel
--
-- Unit dev-virtio\x2dports-org.qemu.guest_agent.0.device has failed.
--
-- The result is timeout.
Jun 13 12:07:07 server-kvm7 systemd[1]: Dependency failed for QEMU Guest Agent.
-- Subject: Unit qemu-guest-agent.service has failed
-- Defined-By: systemd
-- Support: http://lists.freedesktop.org/mailman/listinfo/systemd-devel
--
-- Unit qemu-guest-agent.service has failed.
--
-- The result is dependency.
Jun 13 12:07:07 server-kvm7 systemd[1]: Job qemu-guest-agent.service/start failed with result 'dependency'.
Jun 13 12:07:07 server-kvm7 systemd[1]: Job dev-virtio\x2dports-org.qemu.guest_agent.0.device/start failed with result 'timeout'.
Jun 13 12:07:07 server-kvm7 polkitd[904]: Unregistered Authentication Agent for unix-process:176099:143685278 (system bus name :1.6226, object path
Подскажите, какие дополнительные настройки Вы проделывали, чтобы запустить qemu-guest-agent ?
Ничего сверх того, что описано в статье. У меня без проблем работают агенты, поэтому не знаю, чем тут можно помочь. Нужно разбираться на месте, гуглить ошибки в англоязычном инете.
Разобрался, по ошибке запускал qemu-guest-agent со стороны KVM сервера, а не со стороны виртуального хоста.
Ещё раз спасибо за статью!
У меня та же проблема. Но стартую на вирте.
Надо читать инструкции. И строго следовать им.
Сперва ставим в настройках сервера, что есть GA, а потом уже на госте инсталлируем пакет.
Поставил галку, снёс GA, установил GA.
Напишите пожалуйста, статью на тему гипервизора KVM на CentOS 7/Debian 8, с установки гипервизора до загрузки виртуальных машин, удаленного к ним подключения, установки на них ос...!Настройка сетей, vlan, vSwitch!
На Центос7 вроде не будет работать там libvirt урезанный.
На Centos 7 не проверял.
Я проверял, надо QEMU обновлять, иначе не работает. У меня Цент7 и КВМ основная система.
На Centos как обычно, все очень старых версий. Нужно ставить более свежие версии QEMU и libvrt. Возможность делать снепшоты описанным способом появилась не так давно, по сравнению с возрастом гипервизора. Года 2-3 назад, точно не помню. Где-то встречал об этом упоминание.
Windows я так не стал бы сохранять. Не надежно ИМХО, как там теневое копирование прошло или не прошло, неизвестно. А для Linux очень не плохо расписано здесь: https://habrahabr.ru/post/242213/. С Windows в KVM это проблема. Пока хорошего и надежного решения я не вижу. Может если только штатными средствами из под самой Windows сохранять на Linux шару samba, а оттуда уже бекапить, но тоже не очень.
А на какой системе вы экспериментировали? Кто хост?
Спасибо.
Хост Debian 8.
Здравствуйте!
Как специалист пощупавший n-систем виртуализации на какой из них посоветуете остановиться. Сам пользуюсь Hyper-V. Но думаю может есть смысл перейти на что то другое, особенно когда сервер нужно в дата-центре разместить. Спасибо.
Я сам больше всего люблю hyper-v, особенно в составе полноценного windows server. Мне трудно сказать, что лучше. Если есть аппаратный рейд, то можно использовать hyper-v. Если рейда нет совсем, то обязательно настраиваю программный mdadm и использую либо xenserver, либо kvm. Они одинаково неудобны :) Но зато бесплатно и с надежным рейдом. Не рассматриваю esxi вообще, так как платные версии очень дорогие, а бесплатная малофункциональна.
на Hyper-V если нет аппаратного рейда виртуалки сохраняю на зеркало. проблем пока не было )))
Зеркало на чем реализовано?
Гм... А у редхата почитать никак?
Вместо того, чтобы умничать, можно было просто ссылку привести.
Это я к тому, что после миграции средствами KVM исходный файл не удаляется. И с него вполне можно делать backup. В proxmox исходный файл удаляется.
Вообще то KVM уже умеет живую миграцию виртуалок из коробки ) Попробуйте на 2х серверах с одинаковым комплектом ПО одной версии. Авторизация между серверами по SSH ключами. У меня в Gentoo работает. На счет Debian & CentOS не скажу ... ПО не свежее.
У меня так:
Linux 4.4.26-gentoo x86_64
libvirt - 2.1.0-r2
qemu - 2.7.0-r5
На отдельной машине:
virt-manager - 1.3.2
Кстати да, сессии пользователей все равно рвутся ... даже у proxmox. Есть решение от VmWare, но это совсем другая история и бабки.
Так миграция, это же не бэкап. Я ее и не проверял. Она отлично работает в кластерах proxmox, это видел.
посмотрите на veeam agent for linux, есть снапшоты, всё намного проще и бесплатно.
Я смотрел это решение. Но это немного не то. Где-то можно пользоваться, по ситуации, но мне кажется, что бэкап на уровне виртуальной машины удобнее и быстрее, нежели бэкап из самой системы. Это разные подходы, которые нужны в разных ситуациях.