Создание резервных копий ВМ подручными средствами

Проблема создания резервных копий виртуальных машин забесплатно давно меня волновала.
Вернее, не просто создания резервных копий, но регулярного создания резервных копий и проверки целостности.
До появления ESX3m5 Update4 можно было делать резервные копии достаточно просто — с помощью скриптов на Powershell или RCLI. Но всему хорошему рано или поздно приходит конец — и компания VMware решила, что раз ESXi — бесплатное решение, то и функционал публичного API (используемый вышеперечисленными инструментами) будет доступен только в режиме чтения. То есть, посмотреть информацию с хоста можно, изменить — нельзя.
«Мыши плакали, кололись, но продолжали есть кактус»…
Я рассмотрел несколько бесплатных решений: Trilead VM Explorer и Veeam FastSCP Free. Везде были свои минусы:
— Trilead — это законченное средство для бэкапа одной ВМ. Т.е. вы нажали «Backup VM» и все — бэкап пошел создаваться. Но, скорость работы не превышала 5Мб/сек, кроме того, сделать бэкап нескольких ВМ или настроить регулярный бэкап в бесплатной версии нельзя. Ну и можно забыть про оповещения;
— Veeam — решение более интересное. 🙂 Там присутствует возможность настраивать задания по копированию, загвоздка лишь в том, что копируется весь каталог с ВМ. А ведь там лежат файлы, которые недоступны для чтения, — своп и жесткий диск. Соответственно, проблемы с перенаправлением свопа и создания снимков ложатся целиком на плечи системного администратора. Правда, был и плюс — наличие оповещения. В общем, тоже не айс.
И тут Михаил Михеев показал, как пользоваться гуглом и подкинул ссылку на достаточно адекватное и бесплатное средство. Данное средство позволяет делать бэкапы не только с ESX, но и с бесплатных серверов ESXi.
Я его попробовал и хочу прорекламировать вам. 🙂

1) Разрешаем доступ к нашему серверу по SSH. Вот инструкция для ESXi;
2) Скачиваем клиент для подключения по ssh, например, PuTTy;
3) Скачиваем скрипт ghettoVCB.sh и помещаем по пути «/vmfs/volumes/datastore». Ни в коем случае не редактируем его под Windows;
4) Разрешаем его запуск — «chmod +x /vmfs/volumes/datastore/ghettoVCB.sh;
5) Пытаемся запустить скрипт. Если при запуске выдается сообщение «Cannot be found», скорее всего, скрипт немного кривой. Выполняем команду «vi ghettoVCB.sh» — если скрипт содержит символы «^M», его нужно немного исправить. Для выхода из VI нажимаем сначала «Esc», затем «:q» и «Enter». После этого в командной строке выполняем «sed ‘s/.$//g’ ghettoVCB.sh > ghettoVCBFixed.sh». Теперь просмотрим файл ghettoVCBFixed.sh — «vi ghettoVCBFixed.sh». Если наборы символов «^M» пропали, делаем новый скрипт запускаемым (пункт2) и пытаемся запустить. «Правильный» скрипт после запуска должен сругаться — что у вас не указан файл со списком ВМ;
6) Через графический интерфейс удаляем старый скрипт и переименовываем новый: ghettoVCBFixed.sh -> ghettoVCB.sh;
7) Редактируем скрипт — «vi /vmfs/volumes/datastore/ghettoVCB.sh» и нажимаем «Insert». Давайте изучим доступные параметры:
— VM_BACKUP_VOLUME=/vmfs/volumes/backup (Резервное NFS-хранилище)
— ENABLE_2GB_SPARSE=0 (Измените на 1, если вы хотите дробить VMDK кусками по 2GB)
— VM_BACKUP_ROTATION_COUNT=3 (Сколько бэкапов будет храниться для виртуальной машины)
— VM_BACKUP_DIR_NAMING_CONVENTION (как будет формироваться название. По умолчанию вполне адекватно)
— POWER_VM_DOWN_BEFORE_BACKUP=0 (При значении — 0 вы получаете «живой» бэкап без остановки ВМ)
— ENABLE_HARD_POWER_OFF=0 (Соответственно, выключение ВМ не через vmware tools, а физически)
— ITER_TO_WAIT_SHUTDOWN=4 (тайм-аут для физического выключения ВМ)
8) Сохраняем наш скрипт. Для этого нажимаем «Esc», затем «:wq» и «Enter»;
9) Создаем файл со списком машин — «vi /vmfs/volumes/datastore/vmbackup». В данном файле набираем список ВМ точно так же, как они называются в vClient. Например, так:
vm1
vm2
DC1
ExchSrv
В вашем файле будут содержаться названия четырех ВМ. Сохраняем файл (пункт6);
10) Давайте посмотрим текущее время на вашем ESXi. Для этого выполним команду «date»:
Mon Aug 3 08:28:52 UTC 2009. Текущее время на рабочей станции — 14:28.
Мой сервер синхронизируется с NTP-сервером предприятия, кроме того, сейчас на локальных станциях настроено летнее время, поэтому разница во времени сервера и локальной станции — 6 часов. Запомним эту цифру;
11) Отредактируем файл заданий планировщика CRON. Для этого выполним команду «vi /var/spool/cron/crontabs/root». Добавим новую строку (новое задание) вида:
«00 19 * * 7 /vmfs/volumes/datastore/ghettoVCB.sh /vmfs/volumes/datastore/vmbackup»
Это означает, что в 19:00 каждое воскресенье мы выполняем команду «/vmfs/volumes/datastore/ghettoVCB.sh /vmfs/volumes/datastore/vmbackup». А так как у нас смещение зимой +5 часов, а летом +6, то задание будет выполняться либо в 0:00, либо в 1:00 в понедельник;
12) Перезапустим демона-планировщика 🙂
Для этого выполним следущие команды:
«kill `ps ax | grep cron | awk ‘{print $1}’`». Обратите внимание, что ` и ‘ — разные знаки!
«crond»
13) Лог ghettobackup.log, который лежит на NFS-сервере, затем можно отправить по почте, чтобы ознакомиться с результатами;
Вот и все, дерзайте 🙂
P.S. Огромное спасибо мистеру новичку за бесценную помощь в настройке CRON под ESXi.

Запись опубликована в рубрике VMware, vSphere с метками . Добавьте в закладки постоянную ссылку.

92 комментария на «Создание резервных копий ВМ подручными средствами»

  1. ata говорит:

    А cron под esxi не работает?

  2. CLaiN говорит:

    спасибо!

  3. новичок говорит:

    если дать доступ к хосту по ssh, то можно и cron заставить работать.

  4. Андрей Вахитов говорит:

    Наверное, у меня что-то не настроено? 🙂
    ~ # crontab
    -ash: crontab: not found
    Установка RPM-пакетов в ESXi также запрещена. 🙂
    Подскажите виндусятнегу, как установить Cron на BusyBox (на ESXi).

  5. новичок говорит:

    ну, вот как-то так примерно:
    >echo «my_task_text» >> /var/spool/cron/crontabs/root

  6. новичок говорит:

    эээ, забыл, после чего обязательно надо перезапустить crond

  7. A.Vakhitov говорит:

    /sbin # /sbin/service cron stop
    -ash: /sbin/service: not found

    Еще идеи?

  8. новичок говорит:

    >kill `ps ax | grep cron | awk ‘{print $1}’`
    >crond

  9. A.Vakhitov говорит:

    Спасибо. Пробую настроить!

  10. новичок говорит:

    Если кто-то делает этим скриптом backup на nfs сервер, то какова скорость? лично у меня она не превышает 5-10 МБайт/с в гигабитной сети, что весьма и весьма мало (.

  11. A.Vakhitov говорит:

    Примерно 15Мбайт/сек.

  12. A.Vakhitov говорит:

    Как и обещал — пишу отчет об использовании в качестве планировщика Cron.
    После изменения настроек Cron в файле /var/spool/cron/crontabs/root и перезапуска Cron резервное копирование действительно отрабатывает. Еще раз огромное спасибо новичку за советы по работе с командной строкой. За выходные выложу обновленную инструкцию с использованием Cron вместо планировщика Windows (пункт 8 — пункт 11).
    P.S. Вот только у меня не получилось убить Crond с помощью
    kill `ps ax | grep cron | awk ‘{print $1}’`
    Вместо этого я получил его PID и выполнил команду «kill PID».

  13. новичок говорит:

    `ps ax | grep cron | awk ‘{print $1}’` как раз и возвращает PID процесса. Опробовано на ESXi 3.5 u4, ESXi 4.0. Везде работало.

  14. Vitaliy говорит:

    Спасибки большое за ценную информацию и за скрипт! но есть одна маленькая проблемка backup делается локально на том же сервере ESX, а как его автоматически после backup переслать на другой ESX?

  15. Vitaliy говорит:

    А как после backup автоматически передать файлы на другую ESX? Ведь путь в скрипте указывается локальный.

  16. dim-soft говорит:

    есть ли возможность сделать backup с одного esxi на другой ?

  17. новичок говорит:

    После прочтения текста скрипта, делающего backup ВМ, возник вопрос. Насколько я понял, суть действий скрипта заключается в том, что делается snapshot, после чего файлы *.vmdk копируются куда-то. А вот и сам вопрос — если ВМ, диски которой копируются, была включена, то будут ли корректны файлы самой ВМ внутри vmdk файлов? Ведь на момент создания снапшотов, что-то могло быть в ОЗУ машины и в таком случае будет записано в файл снапшота и, следовательно, не попадет в наш бэкап. Или же перед созданием снапшота все буферы сначала скидываются внутрь vmdk, а уже потом делается снапшот и можно не бояться за целостность данных внутри *.vmdk файлов?

  18. dim-soft говорит:

    а как можно по NFS расшарить папку с VMFS с локального стораджа ?
    чтобы одному esxi скопировать свои VM другому ?

  19. новичок говорит:

    В ESXi нет nfs сервера.

  20. A.Vakhitov говорит:

    Прошу прощения за недельное отсутствие — свадьба 🙂
    Отвечаю по порядку:
    Vitaliy: А как после backup автоматически передать файлы на другую ESX?
    Ответ: С самого сервера файлы можно копировать только в пределах хранилищ этого сервера. А это локальные диски (DAS), FC, NFS, iSCSI. Чтобы скопировать файлы на другой сервер надо как-то подключить его ресурсы к серверу со выполняющимся скриптом, либо использовать сторонние утилиты, например, Veeam FastSCP Free. Для пересылки файлов на другой сервер вы можете использовать задания в FastSCP Free.
    новичок: вопрос по снимкам…
    Ответ: Если упрощенно, то снимки можно делать с содержимым оперативной памяти и без нее. При откате на снимок с содержимым ОЗУ вы сразу получаете работающую систему. При откате на снимок без содержимого — как будто вы во время работы нажали Reset. Скрипт делает снимок без содержимого ОЗУ, соответственно, при создании снимка файлы внутри VMDK будут настолько корректны, насколько этого позволяет используемая файловая система и приложения. Т.е. минимально необходимый набор — наличие журналируемой ФС, например, NTFS и журналируемого приложения.
    Прошу прощения, что не сказал сразу, но приложения рекомендуется бэкапить и восстанавливать на уровне гостевой ОС, а не хоста!
    dim-soft: а как можно по NFS расшарить папку с VMFS с локального стораджа?
    Ответ: тут лучше использовать ВМ, внутри которой развернут сервер NFS или iSCSI. Есть бесплатные решения как на Windows, так и на Linux.

  21. новичок говорит:

    а какой командой делается снапшот ОЗУ? В списке, получаем при выводе «vim-cmd vmsvc» такой команды нет точно:
    snapshot.create
    snapshot.dumpoption
    snapshot.get
    snapshot.remove
    snapshot.removeall
    snapshot.revert
    snapshot.setoption

  22. Cirill говорит:

    Спасибо за заметку.

    Вышла новая версия с поддержкой компрессии … увы, не выполняется бэкап всех дисков, бэкапит только системный.

  23. A.Vakhitov говорит:

    При использовании команды «snapshot.create»:
    «vim-cmd vmsvc/snapshot.create /vmfs/volumes/datastore/test/test.vmx snapshot_name snapshot_description 1»
    Как раз параметр «1» и означает, что при создании снимка создается копия оперативной памяти (и есть возможность откатится на работающую машину).

  24. A.Vakhitov говорит:

    Cirill: если дашь ссылку на новый скрипт, могу попробовать его доработать.

  25. новичок говорит:

    Спасибо

  26. новичок говорит:

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

  27. A.Vakhitov говорит:

    Если не сложно, подкинь ссылку — почитаю…

  28. A.Vakhitov говорит:

    Ух ты, FTP-сервер. Спасибо 🙂

  29. новичок говорит:

    Да не за что ) Я вот когда второй хост подниму, тогда и сам попробую )

  30. Cirill говорит:

    Ссылка вообщем то у вас дана в статье )
    http://communities.vmware.com/docs/DOC-8760
    предыдущая версия работает нормально, но без компрессии.

    обновленный скрипт

    http://communities.vmware.com/servlet/JiveServlet/download/8760-39-26752/ghettoVCB.sh;jsessionid=888719BDD368AA5DB01DBF586C5CAE01

  31. dim-soft говорит:

    с FTP получилось, но скорость 5 мегабайт 🙁
    лучше не получиться ?

  32. A.Vakhitov говорит:

    я с FTP не пробовал, так что не знаю, нормальная это скорость для него или нет.
    По поводу скриптов — попробую посмотреть…

  33. A.Vakhitov говорит:

    Достаточно хорошо рассматривается вопрос о быстром копировании файлов между двумя ESX серверами (http://communities.vmware.com/thread/29721?tstart=0). За ссылку спасибо Михееву Михаилу (vm4.ru).

  34. Cirill говорит:

    к сожалению ssh клиент только на хостах ESX
    ESXi клиента ssh нет … или не нашел как включить )

    есть мысль — а нельзя ли модифицировать toolbox входящий в состав ESXi добавить туда bzip2 (для более быстрого сжатия) и ssh клиента?

    gzip у меня по SAN не больно шустро складывал, 8-12 мбпс.
    vmkfstools отработал намного быстрее, в пике до 60 мбпс
    похоже, что копирование через ssh упирается в быстродействие gzip

    … как и написано в топике (http://communities.vmware.com/thread/29721?tstart=0) правильнее всего копировать через vmkfstools ибо «Copying/exporting/importing with vmkfstools also doesn’t affect the performance of the LUN as badly because it only issues 1 scsi reservation»
    осталось только придумать как получить прямой доступ к сторажу с одного хоста на другой

    что если соорудить конструкцию с перенаправлением входа-выхода через ssh?

    как то так …
    vmkfstools -i /vmfs/path/file | ssh -c blowfish-cbc machine2 vmkfstools «>» /vmfs/path/file

    или из области фантазий
    перенаправлять выход vmkfstools в упаковщик, выход упаковщика перенаправлять через ssh на другой хост, распаковывать и пихать на vmkfstools ))

  35. Xapepama говорит:

    SSH включается просто. Жмем alt-f1 в меню, при загруженной машине (хост, нам нужен хост и прямо на нем все делаем!) он выпадает в консоль, там игнорируя здравый смысл печатаем UNSUPPORTED (ничего видно не будет, я не шучу!) После этого оно запрашивает пароль рута, вводим, попадаем в консоль, ура! Открываем файл vi /etc/inetd.conf и правим вот эту строку:

    #ssh stream tcp nowait root /sbin/dropbearmulti dropbear ++min=0,swap,group=shell -i -K60

    Просто стираем комментирующую «решетку»(#).
    Сохраняем файл и даем команду на ребут, это важно, иначе так и останетесь в этой консоле навсегда, если сделаете логаут и поможет только резет.

    Что касается внешнего хранилища, то есть такая команда esxcfg-x (x — продолжение команды), оно лежит в папке /sbin. Там много вариаций на тему esxcfg-x, но нам нужен esxcfg-nas — почитайте его man, там все предельно ясно. Я подцепил так внешнее хранилище, прямо к папке vmfs, т.е. к стораджу общему.

  36. Xapepama говорит:

    А теперь скажите мне, как правильно сделать восстановление машины из полной копии папки с машиной? т.е. я зарядил копию всего содержимого папки виртуальной машины (vmware ESXi) возможно ли теперь её подцепить куда-нибудь? Я создал новую машину и просто подменил папку, подсунув этой машине файлы из архивной копии, оно ругнулось: какого хрена? ты копировал что ли машины? Я ответил: да. И оно запустилось, но косяк с конфигом, сетевухи, размер харда и.т.п. Как это учесть и заставить хост проглотить все старые настройки виртуальной машины из бэкапа?

  37. A.Vakhitov говорит:

    Тут дело в том, что надо не создавать новую машину, а добавить существующую из окна браузера Datastore. Для этого у вас должны быть скопированы не только VMDK, но и файл VMX. Нажимаете правой кнопкой мыши по VMX-файлу и делаете Add to Datastore.

  38. Xapepama говорит:

    to A.Vakhitov извините, а можно подробнее, я совсем ничего не понял. Где взять браузер Datastore? У меня управляется клиентом vSphere и версия бесплатная, может это мешает мне увидеть что-то, потому, что его просто нет в бесплатной версии? Нет?

  39. Xapepama говорит:

    Нашел, спасибо.

  40. sergei4 говорит:

    Делаю копию ВМ с помощью этого скрипта. выполняется без ошибок.потом просматриваю через WinSCP папку с копией ВМ, а там только файл *.vmx. может ли это быть из за того что я копии делаю на локальный диск?

  41. Xapepama говорит:

    Ребята, натолкнулся на проблему. Скрипт ghettoVCB.sh при правильной конфигурации, ругается на то, что у меня есть Snapshot виртуальной машины и отказывается делать копию, вообще.
    Вот, что нашел на сайте:
    10Q: I have VMs that have snapshots. I want to back these things up but the script doesn’t let me do it. How do I fix that?
    10A: VM snapshots are not meant to be kept for long durations. When backing up a VM that contains a snapshot, you should ensure all snapshots have been committed prior to running a backup. No exceptions will be made…ever.

    http://blog.theworldrunsontechnology.com/2009/04/creating-virtual-machine-backups-in.html

    Что это значит? Снапшоты — руками, что-ли удалять каждый раз, что за бред? В честь чего этот праздник то? Или я опять, что-то упускаю..

  42. A.Vakhitov говорит:

    2Sergei4: Пока не готов ответить — болею и не могу посмотреть — у меня с одной ВМ такие же проблемы.

    2Xapepama: к сожалению, организация снапшотов в VMware ESX такова, что при создании снапшота у вас есть ссылка только на предыдущий VMDK-файл. Соответственно, если у вас куча снимков, то будет следующая цепочка ссылок: Snap(XXX).VMDK->Snap(XXX-1).VMDK->…->Snap001.VMDK->VM.VMDK.
    Данный скрипт копирует только предыдущий VMDK, как я понимаю.

  43. Xapepama говорит:

    2A.Vakhitov это я уже понял. Че за бред, почему он не может отключить машину через vmtools и забрать папку, всю папку на другой носитель. Тьфу. Буду копать код, вырывать куски, фигли.

  44. Xapepama говорит:

    Почитал кое, что:
    Неразумное использование снапшотов

    Некоторые администраторы используют снапшоты не в качестве временной меры, создания точки отката при внесении изменений, а на постоянной основе. Делаем что-то — снапшот. И не удаляем. А вдруг понадобится? Получается как в анекдоте про дохлую кошку: «Не пригодилась».
    Снапшоты в абсолютном большинстве случаев не нужны больше, чем на неделю. Патчим систему? Снапшот. Патчи работают, все ОК? Удаляем снапшот.

    http://www.itcommunity.ru/blogs/vadmin/archive/category/2682.aspx

    Все понял, каюсь. А теперь расскажите, кто знает как заставить vmware не трогать /var/spool/cron/crontabs/root — файл, оно его просто меняет на стандартный, полупустой и все, что вы писали, что б скрипт работал по расписанию удаляется. Что делать, не перезагружать никогда, бред.

  45. Xapepama говорит:

    Есть идея. Положить архив .tar.gz в vmfs\volumes\.. А потом в инит прописать архиватору распаковывать каждый раз при загрузке новый файл /crontabs/root — но, это как то не спортивно, что ли.

  46. Андрей Вахитов говорит:

    From «новичок»:
    Надо добавить в файл автозагрузки «/etc/rc.local» свой скрипт, который будет выполнять все действия по добавлению нужной информации в планировщик. Файл «/etc/rc.local» после перезагрузки хоста не меняется и все внесенные в него изменения сохраняются.

  47. Максим говорит:

    Подскажите пожалуйста, где что нужно поменять в скрипте чтобы делать снапшоты не только дисков но и памяти?

    Пробовал добавлять единичку в этой строчке:
    ${VMWARE_CMD} vmsvc/snapshot.create ${VM_ID} vcb_snap VCB_BACKUP_${VM_NAME}_`date +%F` > /dev/null 2>&1

    после редактирования выглядила так:
    ${VMWARE_CMD} vmsvc/snapshot.create ${VM_ID} vcb_snap VCB_BACKUP_${VM_NAME}_`date +%F` 1 > /dev/null 2>&1

    В результате клонирование проходило быстрее чем создавался снапшот, и скрипт до конца не прорабатывался.

  48. A.Vakhitov говорит:

    По идее должно работать…
    Максим, а смысл создания снимка с оперативной памятью при работе скрипта? Все равно вы его удаляете, а это происходит на работающей ВМ.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *