Как и было обещано в предыдущей статье "VmWare-Server управление машинами из консоли с помощью vmrun", в данной выкладываю скрипт, выполняющий бэкап виртуальной машины (в данном примере машины - Test). Небольшое отступление, т.к. некоторые длинные строки не помещаются в формате сайта, для них сделаны переносы с помощью символа "==>". При копировании скрипта, символы переноса надо убрать, а команду записать в одну строку. Скрипт хорошо комментирован, поэтому требует минимум пояснений. Основные параметры задаются в самом начале скрипта. Задаем логин пароль для администратора виртуальных машин, администратора гостевой ОС, в качестве которой выступает ОС W2k3. Сам скрипт размещаем в директории /root/script/vmbackup (необходимые директории нужно создать). У меня скрипт называется vmbackuptest.sh, делаем скрипт исполняемым, права только владельцу root, остальным запрещаем все - это важно, т.е. chmod 700. Скрипт ведет подробный лог своих действий (содержание лога ниже), путь для файлов логов /root/script/vmbackup/log, в директории будут создаваться файлы следующего вида: 2011-02-09.log (в скрипте этого нет, но легко добавить команду, которая хранит нужное количество логов или сжимает старые логи), которые отправляются администратору на e-mail. В данном примере папка для виртуальных машин - стандартная: /var/lib/vmware/Virtual Machines/, а сама машина находится здесь: /var/lib/vmware/Virtual Machines/Test. Под избыточные бэкапы в системе выделен отдельный HDD, директория с бэкапами расположена по этому пути: /mnt/backup/vmbackup (нужно создать).В данной папке автоматом создается папка формата 2011-02-09, в которую копируются виртуальные машины, в данном примере будет создано следующее: /mnt/backup/vmbackup/2011-02-09/Test/. Итак, сам скрипт в первом приближении, будем считать альфа-альфа (хорошо написанный код не гарантирую, но скрипт выполняет нужные действия, любые предложения по улучшению, принимаются):
#!/bin/sh # -----------------------------------
# Created and Support Ohalnikov Oleg
# Site: http://unixa.ru
# Created: 2011-02-07
# -----------------------------------
# Администратор сервера виртуальных машин:
USER=login
PASS=password # Пользователь виртуальной машины:
USERVM=login
PASSVM=password # Имя хоста витртуальной машины:
HOSTVM=Test.host.loc # Краткое имя:
VM=Test # E-mail администратора:
MAILADM=
Этот e-mail защищен от спам-ботов. Для его просмотра в вашем браузере должна быть включена поддержка Java-script
# Директория для логов:
DIRLOG=/root/script/vmbackup/log # Директория с виртуальной машиной:
DIRVM='/var/lib/vmware/Virtual Machines/Test' # Директория для бэкапов:
DIRVMBAC=/mnt/backup/vmbackup # Дата - время:
DATE=`date '+%Y-%m-%d'`
TIME=`date '+%H:%M:%S'`
echo "$DATE $TIME Запуск резервного копирования виртуальной машины==>
$HOSTVM." > $DIRLOG/$DATE.log; # Убедимся, что виртуальная машина действительно запущена.
if [ `vmrun -T server -h https://localhost:8333/sdk -u $USER -p $PASS ==>
list | grep $VM | wc -l` = "0" ]
then
echo $DATE $TIME "Виртуальная машина $HOSTVM не была==> запущена." >> $DIRLOG/$DATE.log;
echo "$DATE $TIME Список запущенных виртуальных==> машин:" >> $DIRLOG/$DATE.log;
echo "------" >> $DIRLOG/$DATE.log;
vmrun -T server -h https://localhost:8333/sdk -u $USER -p $PASS==>
list >> $DIRLOG/$DATE.log;
echo "------" >> $DIRLOG/$DATE.log;
echo "$DATE $TIME Начато резервное копирование файлов==> виртуальной машины $HOSTVM." >> $DIRLOG/$DATE.log;
if [ ! -e "$DIRVMBAC/$DATE" ]; then
mkdir $DIRVMBAC/$DATE
fi
cp -arxp "$DIRVM"/ $DIRVMBAC/$DATE/;
echo "$DATE $TIME Резервное копирование файлов==> виртуальной машины $HOSTVM - завершено." >> $DIRLOG/$DATE.log;
else
echo "$DATE $TIME Список запущенных виртуальных==> машин:" >> $DIRLOG/$DATE.log;
echo "------" >> $DIRLOG/$DATE.log;
vmrun -T server -h https://localhost:8333/sdk -u $USER -p $PASS ==> list >> $DIRLOG/$DATE.log;
echo "------" >> $DIRLOG/$DATE.log;
echo "$DATE $TIME Послана команда на выключение виртуальной ==> машины $HOSTVM." >> $DIRLOG/$DATE.log;
vmrun -T server -h https://localhost:8333/sdk -u $USER -p $PASS ==>
-gu $USERVM -gp $PASSVM runProgramInGuest ==>
"[standard] $VM/$VM.vmx" "C:\stop\stop.cmd"; # Cкрипт stop.cmd находится по указанному пути на ОС w2k3
# (виртуальная машина) имеет следующее содержание:
# c:\windows\system32\shutdown /s /t 10 /f /d p:1:1 /c "backup"
# позволяет корректно выключить w2k3 сервер через 10 секунд,
# при этом посылает уведомления на все консоли и делает запись
# в системный журнал с пометкой "backup".
# Цикл выполняется до тех пор, пока PID виртуальной машины существует. while [ `ps waux | grep vmware-vmx | grep $VM | awk '{print }'` = "1" ]
do
sleep 60
done # Еще раз убедимся, что виртуальная машина действительно остановлена. if [ `ps waux | grep vmware-vmx | grep $VM | awk '{print }'` = "1" ]
then
echo "$DATE $TIME Виртуальная машина $HOSTVM не завершила==> свою работу." >> $DIRLOG/$DATE.log;
echo "$DATE $TIME Резервное копирование==> прервано." >> $DIRLOG/$DATE.log;
echo "BackupVM $HOSTVM $DATA Error" | mail -s "BackupVM==>
$HOSTVM $DATA Error" $MAILADM < $DIRLOG/$DATE.log;
exit 0;
else
echo "$DATE $TIME Виртуальная машина $HOSTVM ==> остановлена." >> $DIRLOG/$DATE.log;
echo "------" >> $DIRLOG/$DATE.log;
vmrun -T server -h https://localhost:8333/sdk -u $USER -p ==>
$PASS list >> $DIRLOG/$DATE.log;
echo "------" >> $DIRLOG/$DATE.log;
echo "$DATE $TIME Начато резервное копирование файлов==> виртуальной машины $HOSTVM." >> $DIRLOG/$DATE.log;
if [ ! -e "$DIRVMBAC/$DATE" ]; then
mkdir $DIRVMBAC/$DATE
fi
cp -arxp "$DIRVM"/ $DIRVMBAC/$DATE/;
echo "$DATE $TIME Резервное копирование файлов виртуальной==> машины $HOSTVM - завершено." >> $DIRLOG/$DATE.log;
fi
fi # Сравниваем MD5 файлов оригиналов и бэкапов
echo "$DATE $TIME Контрольные суммы файлов. Сначала==> оригинал, потом копия:" >> $DIRLOG/$DATE.log;
echo "------" >> $DIRLOG/$DATE.log;
find "$DIRVM" -type f -exec md5sum {} \; | sort >> $DIRLOG/$DATE.log;
echo "------" >> $DIRLOG/$DATE.log;
find $DIRVMBAC/$DATE/$VM -type f -exec md5sum {} \; | ==>
sort >> $DIRLOG/$DATE.log;
echo "------" >> $DIRLOG/$DATE.log;
Команда много проще, и не требует дополнительного скрипта на гостевой машине. Первое объяснение - дополнительный скрипт ведет записи в журнале гостевой ОС, по которым видно, что это плановый останов. Ну и второе, после suspend, start виртуальной машины не смог выполнится самостоятельно и потребовалось ручное вмешательство, что не приемлемо, все должно происходить автоматом.
Теперь о логе. Формат лога может выглядеть по разному, в зависимости была ли запущена виртуальная машина на момент начала выполнения бэкапа или была остановлена. Возможные ошибки так же фиксируются в логе. Ниже приведу лог, нормального - полного цикла выполнения бэкапа. Т.е. сначала останавливаем виртуальную машину, потом выполняем копирование файлов, потом считаем MD5 суммы оригиналов и копий, запускаем виртуальную машину. Вот что будет в логе и что придет администратору на почту: