Application: Bacula v.3.2/v.5.2.
В комплект программного обеспечения "VMware Server 2" входит утилита "vmrun"; самостоятельная, насколько я понял, программа, реализующая весьма удобный функционал управления "VMware Server 2" из "командной строки".
Последовательность шагов по осуществлению резервного копирования виртуальной машины будет примерно такая:
С помощью утилиты "vmrun" осуществляем "suspend" (иначе говоря - сохраняем состояние, "замораживаем", "ставим на паузу") гостевой виртуальной машины с целью "сбросить" состояние ее оперативной памяти на дисковые устройства (процедура длится от одной минуты до пяти);
Копируем все файлы виртуальной машины во временную директорию (скорость сильно зависит от производительности дисковой подсистемы, может и за пять минут скопировать виртуальную машину гигабайт эдак на пятьдесят, а может и полчаса копаться);
С помощью утилиты "vmrun" снимаем состояние "suspend";
Осуществляем резервирование на сервер Bacula копии виртуальной машины из временной директории;
Удаляем временную копию.
Копируем все файлы виртуальной машины во временную директорию (скорость сильно зависит от производительности дисковой подсистемы, может и за пять минут скопировать виртуальную машину гигабайт эдак на пятьдесят, а может и полчаса копаться);
С помощью утилиты "vmrun" снимаем состояние "suspend";
Осуществляем резервирование на сервер Bacula копии виртуальной машины из временной директории;
Удаляем временную копию.
Для этого внесём в задание Bacula указание на запуск, перед его исполнением и после, ряда скриптов и команд на стороне клиента.
Для "VMWare Server 2" создадим на стороне клиента скрипт, исполняющий непосредственно "заморозку" виртуальной машины и копирование её файлов во временную директорию:
# mkdir -p /etc/custom/bacula
# touch /etc/custom/bacula/backup-vmware-machine0.sh
# chmod u+x /etc/custom/bacula/backup-vmware-machine0.sh
# chmod -R go-rwx /etc/custom/bacula
# touch /etc/custom/bacula/backup-vmware-machine0.sh
# chmod u+x /etc/custom/bacula/backup-vmware-machine0.sh
# chmod -R go-rwx /etc/custom/bacula
# cat /etc/custom/bacula/backup-vmware-machine0.sh
#!/bin/bash
LOGIN="vmware"
PASSWD="strongPassword"
DATASTORE="datastore0"
VMX="machine0/machine0.vmx"
STATE="0"
# Выясняем состояние целевой виртуальной машины перед резервированием для его последующего восстановления
if [ "`/usr/bin/vmrun -T server -h https://127.0.0.1:8333/sdk -u $LOGIN -p $PASSWD list | grep -i $VMX`" != "" ]
then
# Считаем виртуальную машину запущенной
STATE="1"
fi
if [ "$STATE" == "1" ]
then
# "Замораживаем" состояние виртуальной машины
/usr/bin/vmrun -T server -h "https://127.0.0.1:8333/sdk" -u "$LOGIN" -p "$PASSWD" suspend "[$DATASTORE] $VMX"
# Выжидаем некоторое время
sleep 10
# В случае, если виртуальная машина продолжает работу, не смотря на явное указание к "заморозке" - отменяем операцию резервирования с сообщением об ошибке
if [ "`/usr/bin/vmrun -T server -h https://127.0.0.1:8333/sdk -u $LOGIN -p $PASSWD list | grep -i $VMX`" != "" ]
then
# "Размораживаем" состояние виртуальной машины
/usr/bin/vmrun -T server -h "https://127.0.0.1:8333/sdk" -u "$LOGIN" -p "$PASSWD" start "[$DATASTORE] $VMX"
exit 1
fi
fi
# Копируем всё содержимое директории виртуальной машины
cp -R /var/lib/vmware/datastore0/machine0 /tmp/bacula/backup
if [ "$STATE" == "1" ]
then
# "Размораживаем" состояние виртуальной машины
/usr/bin/vmrun -T server -h "https://127.0.0.1:8333/sdk" -u "$LOGIN" -p "$PASSWD" start "[$DATASTORE] $VMX"
fi
# Завершаем исполнение скрипта в соответствии с требованиями Bacula
exit 0
LOGIN="vmware"
PASSWD="strongPassword"
DATASTORE="datastore0"
VMX="machine0/machine0.vmx"
STATE="0"
# Выясняем состояние целевой виртуальной машины перед резервированием для его последующего восстановления
if [ "`/usr/bin/vmrun -T server -h https://127.0.0.1:8333/sdk -u $LOGIN -p $PASSWD list | grep -i $VMX`" != "" ]
then
# Считаем виртуальную машину запущенной
STATE="1"
fi
if [ "$STATE" == "1" ]
then
# "Замораживаем" состояние виртуальной машины
/usr/bin/vmrun -T server -h "https://127.0.0.1:8333/sdk" -u "$LOGIN" -p "$PASSWD" suspend "[$DATASTORE] $VMX"
# Выжидаем некоторое время
sleep 10
# В случае, если виртуальная машина продолжает работу, не смотря на явное указание к "заморозке" - отменяем операцию резервирования с сообщением об ошибке
if [ "`/usr/bin/vmrun -T server -h https://127.0.0.1:8333/sdk -u $LOGIN -p $PASSWD list | grep -i $VMX`" != "" ]
then
# "Размораживаем" состояние виртуальной машины
/usr/bin/vmrun -T server -h "https://127.0.0.1:8333/sdk" -u "$LOGIN" -p "$PASSWD" start "[$DATASTORE] $VMX"
exit 1
fi
fi
# Копируем всё содержимое директории виртуальной машины
cp -R /var/lib/vmware/datastore0/machine0 /tmp/bacula/backup
if [ "$STATE" == "1" ]
then
# "Размораживаем" состояние виртуальной машины
/usr/bin/vmrun -T server -h "https://127.0.0.1:8333/sdk" -u "$LOGIN" -p "$PASSWD" start "[$DATASTORE] $VMX"
fi
# Завершаем исполнение скрипта в соответствии с требованиями Bacula
exit 0
Корректируем конфигурацию сервера Bacula:
# cat /etc/bacula/bacula-dir.conf
....
Job {
Name = "job-backup-test.domain.local"
Type = Backup
....
# Создаем директорию для временной копии и зачищаем директорию от содержимого, если она уже имелась
ClientRunBeforeJob = "mkdir -p /tmp/bacula/backup"
ClientRunBeforeJob = "rm -rf /tmp/bacula/backup/*"
ClientRunBeforeJob = "/etc/custom/bacula/backup-vmware-machine0.sh"
# Удаляем следы жизнедеятельности скриптов резервирования (хотя можно этого и не делать, получится эдакий недельный "бэкап")
ClientRunAfterJob = "rm -rf /tmp/bacula/backup/*"
....
Job {
Name = "job-backup-test.domain.local"
Type = Backup
....
# Создаем директорию для временной копии и зачищаем директорию от содержимого, если она уже имелась
ClientRunBeforeJob = "mkdir -p /tmp/bacula/backup"
ClientRunBeforeJob = "rm -rf /tmp/bacula/backup/*"
ClientRunBeforeJob = "/etc/custom/bacula/backup-vmware-machine0.sh"
# Удаляем следы жизнедеятельности скриптов резервирования (хотя можно этого и не делать, получится эдакий недельный "бэкап")
ClientRunAfterJob = "rm -rf /tmp/bacula/backup/*"
....
В описании области резервирования указываем файл "дампа":
# cat /etc/bacula/bacula-dir.conf
....
FileSet {
Name = "file-set-test.domain.local"
Include {
....
File = "/tmp/bacula/backup/"
....
FileSet {
Name = "file-set-test.domain.local"
Include {
....
File = "/tmp/bacula/backup/"
....
Всё просто.
20 марта 2012 в 01:25
20 марта 2012 в 08:44
21 марта 2012 в 23:38