Для того, чтобы бесплатно, без смс и красиво бэкапить виртуальные машины на ESXi без их остановки, с настраиваемым расписанием и прочими радостями, можно использовать скрипт ghettoVCB. Кратко о его фиче - он может на работающей виртуалке по расписанию создать снапшот, скопировать диски машины и удалить снапшот.

Этот скрипт разрабатывается и поддерживается сообществом, у него множество модификаций и могут быть разные проблемы с настройкой и установкой, но основные моменты мы рассмотрим ниже.

Рассмотрим вариант, когда у вас есть домен и вы в нем решили поднять ESXi и делать с него бекапы виртуалок на NFS (на FreeNAS к примеру).

Как поднять ESXi и виртуалки в нем - тема для другой статьи. Предположим, что он уже поднят.

1. ESXi вводим в домен.

Делается это чаще всего для того, чтобы интегрировать ESXi в AD и иметь возможность настраивать единую аутентификацию в домене, на ESXi и при доступе к NFS. Для этого на нем надо открыть порт 53 TCP на встроенном в ESXi firewall. (Возможно, это касается только отдельных случаев, или только особых версии ESXi, но у нас (ESXi 5.0) этот порт был закрыт, и это приводило к ошибке при присоединении к домену: The specified domain either does not exist or could not be contacted.) Есть статья по этому поводу - https://kb.vmware.com/s/article/2008408. Если у вас этот порт открыт (не перепутайте с UDP!) то у вас должно зайти в домен и без нижеописанного.

Если пройдем в Configuration, далее в Security Profile и там, нажав Properties раздела Firewall, мы, конечно, сможем открыть порт TCP 53 через интерфейс ESXi. Но, как мы видим в статье https://kb.vmware.com/s/article/2007381 эти правила неустойчивы к перезагрузке ESXi. Можно сделать так, как написано в статье - http://deinfotech.blogspot.ru/2012/03/problem-joining-ESXi-50-host-to-active.html, где описан подобный случай.

Мы сделали у себя так:

- Заходим через WinSCP на наш ESXi по SSH (для этого SSH должен быть октрыт на ESXi в разделе Configuration -> Security Profile -> Services -> Properties -> Выбрать SSH -> Нажать кнопку Options, где надо для сервиса SSH поставить запуск SSH при загрузке хоста "Start and stop with host" если хотите иметь доступ и после перезагрузки ESXi и стартануть его нажав "Start", либо просто нажать "Start" если он нужен только сейчас).

- Открываем etc/vmware/firewall/ и видим там файл service.xml, который открываем на редактирование, например, в Notepad++ (как подвязать в WinSCP открывание файлов через нужный редактор тема другой статьи).

- Опускаемся вниз, смотрим номер последнего правила для firewall. У нас это было - 031, значит создаем 032:
<ConfigRoot>
  <service id='0032'>
    <id>dns tcp</id>
    <rule id='0000'>
      <direction>inbound</direction>
      <protocol>tcp</protocol>
      <porttype>dst</porttype>
      <port>53</port>
    </rule>
    <rule id='0001'>
      <direction>outbound</direction>
      <protocol>tcp</protocol>
      <porttype>dst</porttype>
      <port>53</port>
    </rule>
    <enabled>true</enabled>
    <required>false</required>
  </service>
</ConfigRoot>



Это правило можно сделать отдельным файлом или вписать в основной файл конфигурации (добавив в существующее правило, либо, как мы сделали выше, дописав еще одно). Надо помнить, что оно может исчезнуть после перезагрузки (ESXi восстанавливает свои системные файлы и каталоги после перезагрузки и для сохранения изменений обычно используют /etc/rc.local.d/local.sh, может в новых версиях ESXi есть другие способы) и, если это мешает, то создавайте скрипты для копирования файла с этим правилом после перезагрузки, как предлагают по ссылке, которую я давал выше или другими хитрыми способами (например создать собственный файл формата VIB и инсталлировать его на гипервизор - http://moonlightsoft.blogspot.ru/2013/08/vmware-esxi-5.html или тут есть готовый - http://www.v-front.de/2012/01/howto-use-esxi-5-as-ntp-server-or-howto.html).

- Перезапускаем firewall командой esxcli network firewall refresh подключившись к ESXi через PuTTY. Кстати, через PuTTY мы можем и создать правило, или файл отдельный с правилом, и выполнить все остальные действия через командную строку и vi (Кратко о командах редактор vi  - для ввода и редактирования информации жмем “a”, чтобы применить настройки "Esc". Чтобы выйти с сохранениями ":wq" чтобы без ":q!"), если у нас нет WinSCP или если командная строка вам роднее.



- Вот теперь нам ничего не должно помешать ввести ESXi в домен через Configuration -> Authentication Services ->  Properties. У вас откроется форма внесения хоста в AD. В меню Select Directory Service Type выбираем Active Directory. Указываем название домена в формате FQDN имени и жмем Join Domain. После этого в строке Directory services type должна надпись смениться на Active Directory. Конечно имя своего ESXi, шлюз, DNS сервера своего домена и сам домен вы прописали до этого в DNS and Routing. А еще настроили источник времени вашего домена в Time Configuration.


- Теперь идем на вкладку Permissions панели управления ESXi и там мы видим текущих пользователей, группы и их роли. На пустом месте правой кнопкой вызываем менюшку для добавления нового пользователя - Add Permission. Жмем кнопку Add и в списке должны увидеть свой домен и своих доменных пользователей. Там же назначаются права - можно выбрать администратора, чтобы не разбираться в галочках и получить полные права для выбранного пользователя. Если почитать статьи то можно наткнуться на ограничения такой доменной учетки и нюансы ее использования и настройки (например, создание особых групп в AD). Но нам пока хватило и этого.

- Для того, чтобы все сервисы обслуживающие взаимодействие ESXi с доменом запустились и работали, нужно перезапустить ESXi или через командную строку передернуть демонов или ручками запустить их в первый раз тут - Configuration -> Security Profile -> Services -> Properties -> сервисы помеченные в скобках как "Active Directory Service".

2. Добавляем в ESXi скрипт ghettoVCB.

- Находим и качаем скрипт, например, тут - https://github.com/lamw/ghettoVCB.

- Через WinSCP (или PuTTY) закачиваем архив в удобную директорию на ESXi. Мы выбрали тот каталог, где лежат наши виртуалки - /vmfs/volumes/datastore/. Распаковываем (команда в PuTTY: tar -zxvf ghettoVCB-master.tar.gz) его и получаем каталог ghettoVCB-master (cтоит упомянуть, что в нашем случае слово master в имени архива и файла означает лишь специальную версию скрипта и в вашей версии он может называться просто ghettoVCB и значит полученный после распаковки каталог будет называться просто ghettoVCB).

- Через PuTTY под root'ом ставим бит исполнения (переходим в нужную директорию):
# chmod u+x /ghettoVCB-master/ghettoVCB.sh
# chmod u+x /ghettoVCB-master/ghettoVCB-restore.sh

- Далее с помощью vi редактируем файл конфигурации (ghettoVCB.conf) нашего скрипта (vi используем, чтобы исключить вероятность проставления лишних знаков в неверной кодировке и т.д.) или создаем новый. Вот пример такого файла с комментариями:
# Указываем куда будем монтировать NFS раздел
VM_BACKUP_VOLUME=/vmfs/volumes/backup
# Указываем формат VMDK диска, который будет создан при бэкапе (может быть: zeroedthick, eagerzeroedthick, thin, 2gbsparse).
DISK_BACKUP_FORMAT=thin
# Определяет количество бэкапов на одну машину (каждый последующий будет удаляться скриптом). Если, например, скрипт (рассказывается ниже) будет бэкапить машины каждый час, то при указании числа 24, мы получим бэкапы каждый час на протяжении одного дня.
VM_BACKUP_ROTATION_COUNT=4
# Определяет, будет ли машина выключаться перед бэкапом (enabled=1 disabled=0) (скрипт поддерживает бэкап при включенной машине).
POWER_VM_DOWN_BEFORE_BACKUP=0
# Отключение дисков на время бэкапа (enabled=1 disabled=0).
ENABLE_HARD_POWER_OFF=0
# При включенном предыдущем параметре, определяет количество времени (1 единица = 60 секунд), прежде чем скрипт выполнит принудительное отключение диска.
ITER_TO_WAIT_SHUTDOWN=3
# При включенном параметре POWER_VM_DOWN_BEFORE_BACKUP, определяет количество времени (1 единица = 60 секунд), прежде чем скрипт выполнит жесткое выключение (без использования ShutDown Guest).
POWER_DOWN_TIMEOUT=5
# Параметр, при включении которого забэкапленные файлы будут помещаться в архив (enabled=1 disabled=0) (Внимание: это тестовый параметр для данной версии скрипта, мой совет его отключать, так как есть риск потери не только файлов бэкапа, но и файлов машины).
ENABLE_COMPRESSION=0
# Бэкап машин со снапшотами (последние версии скриптов это умеют, но нам не надо).
ALLOW_VMS_WITH_SNAPSHOTS_TO_BE_BACKEDUP=0
# NFS диск будет подключатся только на время бэкапа.
ENABLE_NON_PERSISTENT_NFS=1
# NFS диск отключится после завершения бэкапа.
UNMOUNT_NFS=1
# NFS сервер, куда будут лететь бэкапы (у нас не получилось использовать DNS имя сервера NFS и видимо тут работает только IP).
NFS_SERVER=10.10.10.3
# Каталог NFS диска который будет примонтирован в каталог указанный в VM_BACKUP_VOLUME
NFS_MOUNT=/mnt/backup/vmware
# Имя, которое будет присвоено подключенному массиву (datastores identification).
NFS_LOCAL_NAME=backup
# Папка на NFS сервере (для каждого ESXi своя).
NFS_VM_BACKUP_DIR=autobackup/vm01
# Данный параметр отображает, сколько минут будет дано время на создания снапшота работающей машины, после чего скрипт будет отключен (если повременной, то только этот бэкап не будет создан, далее всё пойдет в штатном режиме). Данный параметр необходим, если по каким либо причинам машина не сделала снимок, прежде чем переходить в режим ожидания, для того, чтобы не потерять данные машины в режиме работы.
SNAPSHOT_TIMEOUT=15
# Следующие параметры будут отсылать логи на мэйл, при учете того, что в самом скрипте изначально прописаны данные smtp, pop и другие настройки. Данные параметры являются экспериментальными (для нашей версии скрипта) и не будут работать без дополнительных настроек. При желании отсылки логов на свой емэйл, требуется ознакомиться с основами perl и досконально изучить данную статью: http://www.waldrondigital.com/2010/05/11/ghettovcb-e-mail-rotate-logs-batch-file-for-vmware/
EMAIL_LOG=0
EMAIL_SERVER=mail.myDOMen
EMAIL_SERVER_PORT=25
EMAIL_DELAY_INTERVAL=1
EMAIL_TO=Этот адрес электронной почты защищён от спам-ботов. У вас должен быть включен JavaScript для просмотра.
EMAIL_FROM=Этот адрес электронной почты защищён от спам-ботов. У вас должен быть включен JavaScript для просмотра.

и т.д.
У скрипта множество дополнительных параметров, значение которых можно прочитать в документации. Для наших нужд вышеприведенных вполне достаточно.
Если нужно несколько планов бэкапов, с разной периодичностью и параметрами — создаём необходимое количество конфигураций.

Для того, чтобы создать список виртуалок, которым надо сделать бэкап, пишем в директории скрипта:
# vi vmlist
Откроется файлик vmlist (пока еще не созданный) со списком тех машин, которые нужно забэкапить (пока еще пустой). Для ввода и редактирования информации жмем “a”, чтобы применить настройки "Esc". Чтобы выйти с сохранениями ":wq" чтобы без ":q!".
Список виртуалок можно узнать с помощью команды esxcli vm process list. Каждая строчка списка — одна машина.

Вводим имена машин, далее вводим vi log и, ничего не изменяя в пустом файле, жмем ":wq" (создастся файл для логов - log).

3. Запуск скрипта. (далее привожу информацию с http://www.vmgu.ru/articles/vmware-esx-ghetto-vcb-manual).

Чтобы проверить данный скрипт можем запустить его разово. Для этого ознакомимся с параметрами запуска скрипта:

     -a     Бэкапит все машины
     -f     Использование списка ВМ
     -c     Конфигурация директории бэкапа
     -g     Использование файла конфигурации
     -l     Использование файла логов
     -d     Описание логов [info|debug|dryrun] (изначально: info)

Запустим, например, всё это со следующими параметрами:

./ghettoVCB.sh -f ./vmlist -g ./ghettoVCB.conf -l ./log

Самое главное: это последние 3-4 строчки: ###### Final status: All VMs backed up OK! ######

Если видим такое, бэкап прошел успешно. Если видим крики об ошибках, читаем, где накосячили.

Основные типы ошибок:

- ВМ, которые нужно бэкапить, НЕ ДОЛЖНЫ содержать снапшотов (см. тут, почему снапшоты - это плохо).
- Кривой путь к хранилищам.
- При включенном NFS режиме кривая настройка записи данных на NFS.

После всего этого необходимо настроить режим создания бэкапов по времени. Для этого необходимо воспользоваться параметрами CronTab. Для этого проделываем следующее:

# cd /var/spool/cron/crontabs/

var/spool/cron/crontabs/ # vi <имя пользователя> (по умолчанию root)

Откроется повременной запуск скриптов. На новой строчке впишем следующее:

* * * * * /vmfs/volumes/datastore/ghettoVCB-master/ghettoVCB.sh -f ./vmlist -g ./ghettoVCB.conf -l ./log

Файл crontab состоит из строк, содержащих шесть полей. Поля разделяются пробелами или символами табуляции. Первые пять полей - целочисленные шаблоны, задающие:

 *  - минуту (0-59),
 *  - час (0-23),
 *  - день месяца (1-31),
 *  - месяц года (1-12),
 *  - день недели (0-6, причем 0=воскресенье).

Шестое поле в строке файла crontab - строка, выполняемая командным интерпретатором в указанные моменты времени. Символ % (процент) в этом поле, если он не замаскирован \ (обратной косой), преобразуется в символ новой строки.

Только первая строка (до символа % или до конца строки) поля команды выполняется командным интерпретатором. Другие строки передаются команде как стандартный входной поток. Любая строка, начинающаяся символом #, считается комментарием и игнорируется. Файл не должен содержать пустых строк.

Например, если мы хотим, чтобы бэкапы происходили, каждый день по будням в 2 часа 15 минут, наша строка должна выглядеть следующим образом:

15 2 * * 1-5 /vmfs/volumes/datastore/ghettoVCB-master/ghettoVCB.sh -f ./vmlist -g ./ghettoVCB.conf -l ./log

Еще пример (Используется другой файл конфигурации - 4week.conf и сохраняем логи в стандартный каталог логов):
3    18   *   *   6     /vmfs/volumes/datastore/ghettoVCB-master/ghettoVCB.sh -g /ghettoVCB-master/4week.conf -f /ghettoVCB-master/week.list > /var/log/ghettoVCB-backup-week-$((($(date +\%d)-1)/7+1)).log

Системное время идёт в UTC, потому необходимо делать поправку на текущий часовой пояс. В моём случае +7 часов — бэкап запустится в воскресенье в 1 час ночи. Логи писать обязательно (или переправлять в /dev/null), иначе при переполнении буфера, отведённого для пользователя, скрипт может зависнуть. Конструкция $((($(date +\%d)-1)/7+1)) выдаёт номер недели в месяце, таким образом не наплодим мусора.

Перезапускаем cron:

# kill $(cat /var/run/crond.pid)
# crond


Для сохранения данных выходим из vi c параметром :wq! (или меняем права на файл, например, так: # chmod u+w /var/spool/cron/crontabs/root).

После перезагрузки хоста файл /var/spool/cron/crontabs/root возвращается к своему значению по умолчанию, для того, чтобы сохранился рутовый кронтаб - добавляем в ./etc/rc.local.d/local.sh следующее:

# cat /etc/rc.local.d/local.sh
#...................
/bin/kill $(cat /var/run/crond.pid)
/bin/echo "3    18   *   *   6     /ghettoVCB-master/ghettoVCB.sh -g /ghettoVCB-master/4week.conf -f /ghettoVCB-master/week.list > /var/log/ghettoVCB-backup-week-$((($(date +\%d)-1)/7+1)).log" >> /var/spool/cron/crontabs/root
/bin/busybox crond

4. Восстановление из бэекапа:
Сразу нужно учитывать, что машина, резервирование которой производилось на горячую, после восстановления будет как после краша — возможна потеря данных внутри машины.

- Подключаем хранилище с бэкапом на целевой ESXi сервер по NFS, либо просто копируем туда данные по ssh.

- Создаём конфигурационный файл «vms_to_restore» такого вида:

# cat /ghettoVCB-master/vms_to_restore
#"<DIRECTORY or .TGZ>;<DATASTORE_TO_RESTORE_TO>;<DISK_FORMAT_TO_RESTORE>"
# DISK_FORMATS
# 1 = zeroedthick
# 2 = 2gbsparse
# 3 = thin
# 4 = eagerzeroedthick
# e.g.
"/vmfs/volumes/restore/autobackup/vm01/vCenterUpdate/vCenterUpdate-2015-08-13_07-55-50/;/vmfs/volumes/local_vm01/;3;vCenterUpdate-restore"

Где по порядку через ";":

    путь, где лежит восстанавливаемая машина;
    путь, куда восстановить машину (директория под неё будет создана);
    тип диска машины для восстановления;
    новое имя машины (не обязательно).

- Запускаем тестовый прогон:

# /ghettoVCB-master/ghettoVCB-restore.sh  -c /ghettoVCB-master/vms_to_restore -d 1

И боевой:

# /ghettoVCB-master/ghettoVCB-restore.sh  -c /ghettoVCB-master/vms_to_restore -l /var/log/vms-restore.log

################## Restoring VM: vCenterUpdate-restore  #####################
Start time: Fri Aug 14 06:05:06 UTC 2015
Restoring VM from: "/vmfs/volumes/restore/autobackup/vm01/vCenterUpdate/vCenterUpdate-2015-08-13_07-55-50/"
Restoring VM to Datastore: "/vmfs/volumes/local_vm01/" using Disk Format: "thin"
Creating VM directory: "/vmfs/volumes/local_vm01//vCenterUpdate-restore" ...
Copying "vCenterUpdate.vmx" file ...
Restoring VM's VMDK(s) ...
Updating VMDK entry in "vCenterUpdate-restore.vmx" file ...
Destination disk format: VMFS thin-provisioned
Cloning disk '/vmfs/volumes/restore/autobackup/vm01/vCenterUpdate/vCenterUpdate-2015-08-13_07-55-50//vCenterUpdate.vmdk'...
Clone: 100% done.
Registering vCenterUpdate-restore ...
12
End time: Fri Aug 14 06:11:19 UTC 2015

- Радуемся.

Второй вариант. Так как бэкап представляет собой дамп машины с конфигурационным файлом, то можно просто:

- Cкопировать его куда-нибудь на ESXi сервер.

- Исправить файл конфигурации машины (*.vmx), изменив поля имени и местоположения диска машины:

displayName = vCenterUpdate-restore
extendedConfigFile = "vCenterUpdate-restore.vmxf"
scsi0:0.fileName  = "vCenterUpdate-restore-0.vmdk"
sched.swap.derivedName = "vCenterUpdate-ff0c3749.vswp"

Пути до файлов можно (и нужно) указывать относительно директории машины.

- Через vSphereClient идём в хранилище:

Configuration -> storage -> ПКМ -> "browse datastore"

и добавляем новую машину в список:

ПКМ -> "Add to inventory" на файле *.vmx

- Если сервер восстановления другой, то в настройках машины меняем «Network Connection».

- При первом запуске оно спросит, от куда нарисовалась машина, нужно ответить, что перенесли.
Если ответить, что клонировали — изменит уникальные данные, в том числе mac адрес сетевой карты.

Более подробные настройки взаимодействия скрипта с почтой, сохранения правил и настроек firewall'а после перезагрузки или изменения ESXi, создание VIB пакета и т.д. можно почитать тут - https://habrahabr.ru/post/265043/.

Нам хватило вышеописанного и для ручного режима с кратковременным расписанием этого более чем достаточно. Большую часть этой статьи я скомпоновал из статей, ссылки на которые приводил выше, пытаясь объединить всю найденную информацию в одну статью, когда я сам разбирался и перескакивал из вкладки на вкладку. Из-за этого могут быть какие то несостыковки в настройках (взятые из разных мест), но вроде бы текст почистил и уже несколько человек по этому гайду успешно добились результата.

5. Несколько нюансов с которыми мы сталкивались: (будем дополнять при возникновении новых)

- Если при запуске бекапа вылезает ошибка:
ghettoVCB.sh: line 836: syntax error: Bad substitution
То надо в файле ghettoVCB.sh в 836 строке заменить "${PROBLEM_VMS/$VM_NAME}" на "${PROBLEM_VMS}/${VM_NAME}" (пропущены фигурнаые скобки в некоторых вариантах скрипта).