Ещё одно резервное копирование: Виртуальные машины на Hyper-V

30.09.2011 - 15:03

Предыдущий пост рассказывал, о том, как круто работает штука wbadmin, но! Если у нас "всё" сложнее?
Если у нас есть Hyper-V кластер, на общем диске которого крутятся виртуальные машинки? Общий диск мы не сможем забэкапить от имени какой-то Node, так как все Node-ы, входящие в состав кластера имеют равноценные права на этот общий ресурс. Что делать?
Да даже, если и нет кластера, а есть просто Hyper-V на StandAlone, а мы будем бэкапить папку с VHD виртуальных машин - где гарантия того, то после "слёта" виртуальной машины, мы сможем правильно её восстановить заменой VHD?
Ответ простой и сложный одновременно. Нужно делать экспорт каждой виртуальной машины. Решение есть, будем применять!

Мы будем использовать PowerShell. Очень классный инструмент, должон заметить ))) Синтаксис схож с языком Си, а использование системных библиотек WMI намного проще, чем у VBS, в котором приходилось обращаться через sql-запросы.

Для начала, установим модуль поддержки Hyper-V через PS. Microsoft поленились сделать это самостоятельно, но нашлись работящие парни, которые вмиг всё исправили. Для тех, кто обеспокоен проблемой самописного кода, данный модуль сертифицирован Microsoft, так что его можно использовать со спокойной совестью.
В архиве есть install.cmd, который нужно выполнить от имени администратора. Для унификации, данный скрипт написан даже для Server Core, в котором используется DISM для установки. Я устанавливал для Стандарт и Энтерпрайз, поэтому очевидно, что в процессе установки будет 2 ошибки, ничего страшного! Я, по началу, сам испугался и потратил около 2-х часов на решение данной проблемы, пока не понял сути.
Итак! После успешной установки, откроется окно PS с импортированным модулем. Функций для работы - море! Там же, на сайте производителя, есть пдф-ка с описанием команд. Детальное описание использования команд и параметров можно получить в консоли PS написав:

Get-Help <command> -full

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

  1. Находиим указанную ВМ.
  2. Если запущена - проводим остановку с помощью встроенной технологии HeartBeat.
  3. Проводим экспорт.
  4. Проводим запуск ВМ.

Тело скрипта:

# Определяем входящий параметр
param ($VM)

# Установка разрешения выполнения сценариев
Set-ExecutionPolicy unrestricted -force
# Если модуль не подключен

if (!(Get-Module -Name hyperv))
    {
        # Включить модуль
        import-module hyperv
    }
# Если имя ВМ не указано
if($VM -eq $null)
    {
        Write-Host "Введите имя виртуальной машины"
    }

# получаем текущую дату
$date = Get-Date -format yyyy-MM-dd
# Устанавливаем путь для РК
$backupDir = "h:\new"

# Создаём папку с именем - текущей датой
New-Item -path $backupDir\$date -type directory -force
# Начианем запись действий и их результатов
Start-Transcript -path $backupDir\$date.txt

# Если состояние машины - "Работает", то
    if((Get-VMSummary $VM).enabledstate -eq "Running")
    {
        # Запустить выключение без подтверждения
        invoke-vmshutdown -vm $VM -force
        # Экспорт ВМ без подтверждения со всеми файлами (xml, vhd и т.д.) и подождать, пока не выполнится
        export-VM -VM $VM -path $backupDir\$date -force -copystate -wait
        # Запуск ВМ потверждением включения на протяжении 300с перед выполнением следующей команды
        Start-VM -vm $VM -HeartBeatTimeOut 300  
    }
    else
    {
        # Экспорт ВМ без подтверждения со всеми файлами (xml, vhd и т.д.) и подождать, пока не выполнится
        export-VM -VM $VM -path $backupDir\$date -force -copystate -wait
    }
Stop-Transcript    

Данный скрипт я одолжил у очень хорошего человека, под ником alexstef, на форуме разработчика. За что ему огромное спасибо!
Признаюсь, я пытался ему помочь в его проблеме на форуме, но у меня всё работало, видно, это его системная ошибка.
Комментариев в теле скрипта - в изобилии. Сразу скажу, что скрипт не может быть использован для остановки не Windows систем, установленных на Hyper-V, кроме последних Suse и RedHat. Запускать скрипт нужно с повышенными правами, потому как в ОС Windows Server 2008 и выше, по умолчанию установлена опция "Не выполнять никакие скрипты" для защиты системы. Во второй строчке мы снимаем эту защиту для выполняемого скрипта.
Остаётся вопрос №2! Как автоматически запустить данный скрипт? Ответ: (За подсказку спасибо дядьке)

  1. Создаём обычное задание на запуск скрипта.
  2. На вкладке выбора программы для запуска пишем в поле "Action" адрес команды PowerShell
    %Windir%\System32\WindowsPowerShell\v1.0\powershell.exe
  3. Адрес скрипта указываем в поле "Add arguments". Поле должно выглядеть так:
    -Command "& {<path\script.ps1> <VM_name>}"
  4. Опять же, задание должно выполняться с наивысшим приоритетом!

Задание создано. Нажимаем Run задания и радуемся!
Естественно, если дело касается кластера, то прийдёться данное задание установить на каждую Ноду, с учётом доступных ВМ на отдельной из Нод.

Огромное спасибо любознательным и не ленивым людям за предоставленные материалы и подсказки.
Отдельное спасибо интернету Happy

Ваша оценка: Нет Средняя: 3.5 (4 голосов)