UMGUM.COM 

Bacula + Linux + VMware server 2 image backup ( Резервное копирование образов VMware Server 2 с помощью Bacula в среде OS Linux. )

28 февраля 2011  (обновлено 29 декабря 2014)

Эта публикация отнесена в архив. Она неактуальна.

OS: VMware Server на Linux Debian Lenny в качестве "хостовой" операционной системе.
Application: Bacula v.3.2/v.5.2.

В комплект программного обеспечения "VMware Server 2" входит утилита "vmrun"; самостоятельная, насколько я понял, программа, реализующая весьма удобный функционал управления "VMware Server 2" из "командной строки".

Последовательность шагов по осуществлению резервного копирования виртуальной машины будет примерно такая:

С помощью утилиты "vmrun" осуществляем "suspend" (иначе говоря - сохраняем состояние, "замораживаем", "ставим на паузу") гостевой виртуальной машины с целью "сбросить" состояние ее оперативной памяти на дисковые устройства (процедура длится от одной минуты до пяти);
Копируем все файлы виртуальной машины во временную директорию (скорость сильно зависит от производительности дисковой подсистемы, может и за пять минут скопировать виртуальную машину гигабайт эдак на пятьдесят, а может и полчаса копаться);
С помощью утилиты "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

# 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

Корректируем конфигурацию сервера 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/*"
  ....

В описании области резервирования указываем файл "дампа":

# cat /etc/bacula/bacula-dir.conf

....
FileSet {
  Name = "file-set-test.domain.local"
  Include {
....
    File = "/tmp/bacula/backup/"
....

Всё просто.


Заметки и комментарии к публикации:


Оставьте свой комментарий ( выразите мнение относительно публикации, поделитесь дополнительными сведениями или укажите на ошибку )