Если Вы используете гипервизор KVM (он же QEMU/KVM) и хотите реализовать простое резервное копирование своих виртуальных машин — я поделюсь с Вами скриптом, который писал для себя. Что делает этот скрипт- при запуске, он дает команду «потушить» указанную ему виртуальную машину, ждет пока она завершит работу, определяет, какие файлы-диски она использует, подключает указанную сетевую шару и начинает по очереди сливать в нее эти файлы, прогоняя их через zip архиватор. После чего делает дамп конфига виртуалки в эту же папку, размонтирует папку и запускает виртуальную машину обратно.
Все действия подробно логируются. Требуется наличие в системе утилиты mount.cifs , которая обычно входит в состав пакета cifs-utils.
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 57 |
!#/bin/bash vmDomainName=*имя виртуальной машины* CurentDate=$(date +%Y-%m-%d) kvmStore="*путь до хранилища файлов-дисков ВМ" backupDir="*путь до хранилища резервных копий*" BackupLog="*путь до хранилища логов*/$vmDomainName-backup.log" Smbshare="*путь до smb шары*" # //ip/shared_folder Smbuser="*имя пользователя smb шары*" smbpassword="*пароль пользователя smb шары*" echo "===================================================================" >> $BackupLog echo "$CurentDate: Start $vmDomainName virtual machine backup!" >> $BackupLog # выключаем машину echo "$(date +%H-%M-%S): Shuting down VM $vmDomainName" >> $BackupLog virsh shutdown $vmDomainName >> $BackupLog # считываем ее статус vmStatus=$(virsh list --all | grep $vmDomainName | cut -d " " -f26,27) # ждем пока машина завершит работу while [ "$vmStatus" != "shut off" ]; do #echo "Wait shutting down $vmDomainName" >> $BackupLog sleep 1 vmStatus=$(virsh list --all | grep $vmDomainName | cut -d " " -f26,27) done echo "$(date +%H-%M-%S): Done!" >> $BackupLog # как только виртуалка потухла, начинаем дампить echo "$(date +%H-%M-%S): Start dumping VM $vmDomainName" >> $BackupLog # получаем список дисков в формате .qcow / .qcow2 (а только такие нам нужны) vmDomainDisks=$(virsh domblklist $vmDomainName | grep .qcow | cut -d " " -f9) # монтируем удаленную хранилку /sbin/mount.cifs $Smbshare $backupDir -o user=$Smbuser ,password=$smbpassword,iocharset=utf8 >> $BackupLog cd $backupDir # копируем-архивируем диски по списку for disk in $vmDomainDisks; do diskName=$(echo $disk | cut -d"/" -f4) echo "$(date +%H-%M-%S): Archiving $diskName" >> $BackupLog zip $vmDomainName-[$diskName]-$(date +%Y-%m-%d).zip $disk >> $BackupLog echo "$(date +%H-%M-%S): Done!" >> $BackupLog done echo "$(date +%H-%M-%S): Dumping VM $vmDomainName Done!" >> $BackupLog # делаем дамп конфига ( мало ли он менялся) virsh dumpxml $vmDomainName > $backupDir/$vmDomainName_$CurentDate.xml cd /home umount $backupDir # запускам виртуалку обратно echo "$(date +%H-%M-%S): Starting VM $vmDomainName" >> $BackupLog virsh start $vmDomainName >> $BackupLog echo "$(date +%H-%M-%S): Done!" >> $BackupLog exit 0 |
П.С. перед использованием скрипта, настоятельно рекомендую протестировать его сервере виртуализации и ВМ, не находящихся в промышленной эксплуатации (т.е. на тестовом стенде)!
П.П.С. У меня этот скрипт так и не пошел в промышленную эксплуатацию, по двум причинам — нужно было сохранить максимальный аптайм ВМ, плюс я нашел другое- более удобное (лично для меня) решение. Какое — расскажу в следующих заметках!
П.П.С. Выбирая картинку для этой статьи, наткнулся на более гибкое но при этом и более сложное решение. Не мог им не поделиться. Выбирайте, что Вам удобней и пользуйтесь!