Backup VM без остановки:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
В клиенте устанавливаем Агент QEMU! ------------------------------------------- Информация: virsh domblklist vm-name - узнаем имена дисков виртуальной машины virsh list --all - вывести список всех виртуалок vm-name - имя виртуальной машины backup-snapshot - название снэпшота, может быть любым vda -имя диска, для которого указываем адрес снепшота /snapshot/vm-name-backup.qcow2 - путь и имя файла для снепшота ------------------------------------------- На сервере: 0) virsh snapshot-create-as --domain vm-name backup-snapshot -diskspec vda,file=/snapshot/vm-name-backup.qcow2 --disk-only --atomic --quiesce --no-metadata - выполняем снимок виртуалки 1) pigz -c /virt/vm-name.qcow2 > /backup-vm/vm-name.qcow2.gz - архивируем основной файл виртуалной машины 2) virsh blockcommit vm-name vda --active --verbose --pivot - выполняем слияние снапшота + диск 3) rm /snapshot/vm-name-backup.qcow2 - удаляем снапшот 4) virsh dumpxml vm-name > /backup-vm/vm-name.xml - бэкапим настройки виртуалки Пример: virsh snapshot-create-as linux2 "snapshot" "snapshot comment" --disk-only --quiesce --atomic --diskspec vda,snapshot=external,file=/PVE/linux2.vda.qcow2 blockcommit linux2 vda --active --verbose --pivot |
Ошибка выполнения слияния в debian 10
1 2 3 4 5 |
!!! При выполнении (virsh blockcommit vm-name vda --active --verbose --pivot) !!! Ошибка (error: internal error: unable to execute QEMU command 'block-commit': Could not reopen file: Permission denied) !!! Временное решение sudo aa-status - смотрим состояние AppArmor sudo aa-teardown - вырубаем AppArmor |
На госте:
1 2 |
0) Диск должен быть virtio 1) Должен быть установлен guest-agent ( канал org.qemu.guest_agent.0 ) |
Скрипт бэкапа:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 |
#!/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 |
Пример рабочий сервер:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 |
#!/bin/bash # Дата год-месяц-день data=`date +%Y-%m-%d` # Папка для бэкапов backup_dir=/mnt/datastore1/backup_VM/ # Список работающих VM #vm_list=`virsh list | grep running | awk '{print $2}'` # Список VM, заданных вручную, через пробел vm_list=(mail squid voice nginx mirtashop b14esh nagios linux) #vm_list=(nagios) # Лог файл 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/$data.$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 |
Очистка папки с бэкапами(старое):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
!!! вызов (|xargs /bin/rm -f) можно заменить модным параметром у -delete для команды find #!/bin/bash #/mnt/datastore1/backup_VM cd /mnt/datastore1/backup_VM #b14esh find /mnt/datastore1/backup_VM/b14esh -name "*.qcow2.gz" -mtime +30 |xargs /bin/rm -f {}; find /mnt/datastore1/backup_VM/b14esh -name "*.xml" -mtime +30 |xargs /bin/rm -f {}; #mail find /mnt/datastore1/backup_VM/mail -name "*.qcow2.gz" -mtime +30 |xargs /bin/rm -f {}; find /mnt/datastore1/backup_VM/mail -name "*.xml" -mtime +30 |xargs /bin/rm -f {}; #mirtashop find /mnt/datastore1/backup_VM/mirtashop -name "*.qcow2.gz" -mtime +30 |xargs /bin/rm -f {}; find /mnt/datastore1/backup_VM/mirtashop -name "*.xml" -mtime +30 |xargs /bin/rm -f {}; #nginx find /mnt/datastore1/backup_VM/nginx -name "*.qcow2.gz" -mtime +30 |xargs /bin/rm -f {}; find /mnt/datastore1/backup_VM/nginx -name "*.xml" -mtime +30 |xargs /bin/rm -f {}; #squid find /mnt/datastore1/backup_VM/squid -name "*.qcow2.gz" -mtime +30 |xargs /bin/rm -f {}; find /mnt/datastore1/backup_VM/squid -name "*.xml" -mtime +30 |xargs /bin/rm -f {}; #voice find /mnt/datastore1/backup_VM/voice -name "*.qcow2.gz" -mtime +30 |xargs /bin/rm -f {}; find /mnt/datastore1/backup_VM/voice -name "*.xml" -mtime +30 |xargs /bin/rm -f {}; #nagios find /mnt/datastore1/backup_VM/nagios -name "*.qcow2.gz" -mtime +30 |xargs /bin/rm -f {}; find /mnt/datastore1/backup_VM/nagios -name "*.xml" -mtime +30 |xargs /bin/rm -f {}; #linux find /mnt/datastore1/backup_VM/linux -name "*.qcow2.gz" -mtime +30 |xargs /bin/rm -f {}; find /mnt/datastore1/backup_VM/linux -name "*.xml" -mtime +30 |xargs /bin/rm -f {}; |
Очистка папки с бэкапами:
1 2 3 4 5 6 7 |
#!/bin/bash #b14esh find /mnt/datastore1/backup_VM/b14esh/ -type f -name "*.qcow2.gz" -mtime +30 -delete find /mnt/datastore1/backup_VM/b14esh/ -type f -name "*.xml" -mtime +30 -delete #mail find /mnt/datastore1/backup_VM/mail/ -type f -name "*.qcow2.gz" -mtime +30 -delete find /mnt/datastore1/backup_VM/mail/ -type f -name "*.xml" -mtime +30 -delete |
Пример переноса ВМ:
1 2 3 4 5 6 7 8 9 10 |
На хосте с которого копируем ВМ: 0) Копируем диск на новый хост (файл myserver.qcow2) 1) Выгружаем настройки ВМ virsh dumpxml myserver > /mnt/data-1/myserver.xml - сохранить настройки ВМ На хосте на котором разворачиваем бэкап: 0) Восстанавливаем ВМ virsh define /home/user/myserver.xml 1) При необходимости правим (указываем месторасположение образа жесткого диска): virsh edit myserver |
Пример восстановления ВМ:
1 2 3 4 5 6 7 |
На хосте на котором разворачиваем бэкап: 0) Восстанавливаем ВМ Перенесли диски ВМ любым доступным способом 1) Подключили конфиг virsh define /home/user/myserver.xml 2) При необходимости правим (указываем месторасположение образа жесткого диска): virsh edit myserver |