+7 (812) 325 84 00

+7 (499) 322 07 96

VSS бэкап Windows Server 2008 Hyper-V из командной строки штатными средствами ОС без использования Windows Backup

Во время очередного внедрения Hyper-V возникла задача регулярного бэкапа работающих виртуальных машин. При этом, промышленного ПО резервного копирования с поддержкой систем виртуализации от Microsoft (Symantec Backup Exec, Microsoft DPM или аналогичного) у заказчика не было - все ресурсы резервировались с помощью различных версий Windows Backup и самописными скриптами. Стандартного ПО управления виртуальными системами Microsoft (System Center Virtual Machine Manager), имеющего интерфейс PowerShell, также не имелось.

Виртуальные машины были запущены круглосуточно, поэтому бэкап простым копированием файлов VM из каталога Hyper-V был невозможен в принципе. В числе виртуальных машин был и контроллер домена (Windows Server 2003), что делало невозможным использование снимков Snapshots для этой системы. Как известно, при восстановлении контроллера домена из снимка Hyper-V возможно явление рассинхронизации USN (USN rollback), для Windows Server 2003 описанное в статье "875495 - How to detect and recover from a USN rollback in Windows Server 2003", http://support.microsoft.com/kb/875495.

Поэтому оптимальным вариантом был бэкап виртуальных машин с помощью Windows Server 2008 VSS из родительского раздела. Windows Server 2008 RTM не имеет VSS-провайдера для Hyper-V, поскольку при выходе Windows 2008 Hyper-V еще не был в релизе; однако, после выхода Hyper-V такой провайдер появился. Это провайдер инсталлируется в систему при установки роли Hyper-V, но после этого он должен еще быть зарегистрирован в системе администратором. Необходимые действия описаны в статье 958662 ("How to back up Hyper-V virtual machines from the parent partition on a Windows Server 2008-based computer by using Windows Server Backup", http://support.microsoft.com/kb/958662. В этой статье имеется ссылка на MSI хотфикс, делающий нужную работу автоматически, и инструкции по правке реестра вручную.

Windows Backup в Windows Server 2008 имеет одну не очень приятную особенность - для выполнения бэкапа VSS она требует, чтобы резервировался весь том, на котором находятся данные, с которых делается снимок. Однако, в данном конкретном случае, на диске с
виртуальными машинами также лежало порядка 400 Гб статических данных, которые резервировались самостоятельно и с другим графиком. Дабы в каждую копию VM не писалось почти лишних полтерабайта, очень хотелось вытащить только требуемые данные, но при этом именно в виде снимка VSS. В результате экспериментов родилась следующая методика.

Windows Server 2008 имеет стандартную утилиту командной строки diskshadow (описана здесь - http://technet.microsoft.com/ru-ru/library/cc772172(WS.10).aspx). Она позволяет создавать VSS-снимки логического тома "на лету" и монтировать их в каталог файловой системы, наподобие точек монтирования томов. Это позволяет нам смонтировать VSS-согласованный снимок тома и скопировать из него только ту часть данных, которая относится к Hyper-V, в согласованном состоянии, НЕ ПРЕРЫВАЯ РАБОТЫ ВИРТУАЛЬНОЙ МАШИНЫ.

Состояние (state) виртуальной машины в данном случае будет то, которое допускается гостевой системой - то есть, гости без установленных компонент интеграции, Windows 2000 и XP на время снятия снимка переводятся в Saved State; кроме того, не допускается использование динамических дисков. В моем случае, резервированию подлежали только машины под Windows Server 2008 и 2003 с установленными IC и фиксированными дисками, так что проблемы это не создало.

Diskshadow имеет скриптовой интерфейс наподобие diskpart, что дает возможность запустить утилиту из командной строки, передав ей текстовый файл со скриптом в качестве параметра. Поскольку VSS-копия создается на время работы скрипта, хорошо бы было прямо из него вызвать необходимые команды для копирования данных в хранилище резервных копий - то есть, рекурсивно вызвать командный интерпретатор. И такая возможность есть - это diskshadow скрипт-команда exec. Подробное описание скриптового языка смотреть в описании команды по приведенной ссылке.

Для работы с хранилищем резервных копий (в моем случае - удаленной папкой в сети) можно использовать любое удобное для этого средство, например всем известную утилиту Robocopy (http://ru.wikipedia.org/wiki/Robocopy).

В результате получается следующее "наколенное" решение по онлайн-бэкапу виртуальных машин:

1) Скрипт "Backup.CMD" - ставится на исполнение в Windows Task Scheduler, учетная запись запуска должна иметь права копирования в целевую папку, так как вся задача запускается в ее контексте безопасности, и запускаться с повышенными привилегиями в локальной системе:

REM Online Hyper-V VM backup
REM Run under native 64-bit environment only
REM Use the diskshadow command to support "live" Hyper-V backup though VSS
REM For recovery, restore backup folder to original location with permissions, then restart "Hyper-V Virtual Machine Management" service on host system
REM For example use Robocopy with /SEC or /COPYALL
diskshadow /s Backup.TXT > Backup.LOG
del /f *.cab


2) Скрипт "Backup.TXT" - исполняется из Diskshadow.exe, передается ей в качестве параметра с ключом /s; наследует контекст безопасности Backup.CMD:

# Буква диска S: и должна быть свободна !!!
delete shadows all
set context persistent
set verbose on
add volume e: alias HVDisk
create
expose %HVDisk% S:
exec Copy_To_Store.CMD
delete shadows all


(в моем случае виртуальные машины находятся в папке E:\VM родительской системы, скрипт экспортирует созданный VSS-интерфейс к диску E: как S:

3) Скрипт "Copy_To_Store.CMD" - вызывается изнутри Diskshadow.exe, выполняет всю логику копирования, которая может быть любой. В моем случае он запускает Robocopy с нужными параметрами:

robocopy S:\VM "z:\Backup\VMBackup" /COPYALL /MIR /NP /XF *.ISO /R:2 /W:5
REM Dummy command to clear the robocopy errorlevel
verify >nul


Вот и все. Перед и после своего исполнения, exec скрипт diskshadow выполняет очистку имеющихся теневых копий, дабы копировалась только необходимая (delete shadows all). Также, на финише выполняется очистка метаданных VSS (в виде файлов CAB).

Лог Backup.log создается для того, чтобы администратор мог отслеживать, что реально происходит в процессе бэкапа. Пример такого лога за один сеанс приведен ниже:

Microsoft DiskShadow, версия 1.0
© Корпорация Майкрософт (Microsoft Corporation), 2007
На компьютере: SERVER0, 18.01.2010 15:29:38

-> # Source is http://serverfault.com/questions/55789/command-line-backup-of-running-hyper-v-images-using-volume-shadow-copies-vss-an
-> # Буква диска S: и должна быть свободна !!!
-> delete shadows all
В системе не найдены теневые копии.
-> set context persistent
-> set verbose on
-> add volume e: alias HVDisk
-> create
Исключение модуля записи "BITS Writer", поскольку исключены все его компоненты.
Исключение модуля записи "Shadow Copy Optimization Writer", поскольку исключены все его компоненты.
Компонент "\Initial Store" модуля записи "Microsoft Hyper-V VSS Writer" исключен из архивации,
так как ему требуется том C:\, отсутствующий в наборе теневых копий.
Компонент "\BCD\BCD" модуля записи "ASR Writer" исключен из архивации,
так как ему требуется том C:\, отсутствующий в наборе теневых копий.
Компонент "\Registry" модуля записи "Registry Writer" исключен из архивации,
так как ему требуется том C:\, отсутствующий в наборе теневых копий.
Компонент "\WMI" модуля записи "WMI Writer" исключен из архивации,
так как ему требуется том C:\, отсутствующий в наборе теневых копий.
Компонент "\COM+ REGDB" модуля записи "COM+ REGDB Writer" исключен из архивации,
так как ему требуется том C:\, отсутствующий в наборе теневых копий.
Модуль записи "ASR Writer" теперь полностью исключен из архивации, поскольку исключен
недоступный для выбора компонент верхнего уровня "\BCD\BCD".
Модуль записи "Registry Writer" теперь полностью исключен из архивации,
поскольку он не содержит компоненты, которые можно включить.
Модуль записи "WMI Writer" теперь полностью исключен из архивации,
поскольку он не содержит компоненты, которые можно включить.
Модуль записи "COM+ REGDB Writer" теперь полностью исключен из архивации,
поскольку он не содержит компоненты, которые можно включить.

* Включение модуля записи "Microsoft Hyper-V VSS Writer":
+ Добавление компонента: \8DA86C8E-0A54-4B5F-9388-8BAB8ED8984C
+ Добавление компонента: \D20DF20A-7C8C-4C09-8D45-EC8108C99A9F

Псевдоним HVDisk для теневой копии с кодом {484f49e3-e1ba-4645-b228-b2c718326a1e} установлен в качестве переменной среды.
Псевдоним VSS_SHADOW_SET для набора теневых копий с кодом {d8f83e24-a6e2-41a7-8564-9abc2e51b892} установлен в качестве переменной среды.
Вставленный файл Manifest.xml в CAB-файл 42-18.01.2010-15_--_SERVER0.cab
Вставленный файл BCDocument.xml в CAB-файл 42-18.01.2010-15_--_SERVER0.cab
Вставленный файл WM0.xml в CAB-файл 42-18.01.2010-15_--_SERVER0.cab
Вставленный файл WM1.xml в CAB-файл 42-18.01.2010-15_--_SERVER0.cab
Вставленный файл WM2.xml в CAB-файл 42-18.01.2010-15_--_SERVER0.cab
Вставленный файл WM3.xml в CAB-файл 42-18.01.2010-15_--_SERVER0.cab
Вставленный файл WM4.xml в CAB-файл 42-18.01.2010-15_--_SERVER0.cab
Вставленный файл WM5.xml в CAB-файл 42-18.01.2010-15_--_SERVER0.cab
Вставленный файл WM6.xml в CAB-файл 42-18.01.2010-15_--_SERVER0.cab
Вставленный файл DisFBCB.tmp в CAB-файл 42-18.01.2010-15_--_SERVER0.cab

Запрос всех теневых копий с этим кодом набора теневых копий {d8f83e24-a6e2-41a7-8564-9abc2e51b892}

* Код теневой копии = {484f49e3-e1ba-4645-b228-b2c718326a1e} %HVDisk%
- Набор теневых копий: {d8f83e24-a6e2-41a7-8564-9abc2e51b892} %VSS_SHADOW_SET%
- Исходное число теневых копий = 1
- Имя исходного тома: \\?\Volume{3a6faea4-de71-11de-9714-02215ecb8917}\ [E:\]
- Время создания: 18.01.2010 15:30:50
- Имя устройства теневой копии: \\?\GLOBALROOT\Device\HarddiskVolumeShadowCopy1
- Исходный компьютер: SERVER0.giproruda.local
- Обслуживающий компьютер: SERVER0.giproruda.local
- Недоступен
- Код поставщика: {b5946137-7b9f-4925-af80-51abd60b20d5}
- Атрибуты: No_Auto_Release Persistent Differential

Количество перечисленных теневых копий: 1
-> expose %HVDisk% S:
-> %HVDisk% = {484f49e3-e1ba-4645-b228-b2c718326a1e}
Теневая копия успешно предоставлена в качестве точки подключения S:\.
-> exec Copy_To_Store.CMD

C:\Admin\Скрипты\VMBackup>robocopy S:\VM "z:\Backup\VMBackup" /COPYALL /MIR /NP /XF *.ISO /R:2 /W:5

-------------------------------------------------------------------------------
ROBOCOPY :: Robust File Copy for Windows
-------------------------------------------------------------------------------

Начало: Mon Jan 18 15:42:48 2010

Источник : S:\VM\
Назначение : z:\Backup\VMBackup\

Файлы: *.*

Исключенные файлы: *.ISO

Параметры: *.* /S /E /COPYALL /PURGE /MIR /NP /R:2 /W:5

------------------------------------------------------------------------------

0 S:\VM\
Новая папка 0 S:\VM\Hyper-V\
Новая папка 0 S:\VM\Hyper-V\SERVER5\
Новая папка 1 S:\VM\Hyper-V\SERVER5\Virtual Machines\
Новый файл 14768 8DA86C8E-0A54-4B5F-9388-8BAB8ED8984C.xml
Новая папка 2 S:\VM\Hyper-V\SERVER5\Virtual Machines\8DA86C8E-0A54-4B5F-9388-8BAB8ED8984C\
Новый файл 2.0 g 8DA86C8E-0A54-4B5F-9388-8BAB8ED8984C.bin
Новый файл 20.0 m 8DA86C8E-0A54-4B5F-9388-8BAB8ED8984C.vsv
Новая папка 1 S:\VM\Hyper-V\Virtual Machines\
Новый файл 14972 D20DF20A-7C8C-4C09-8D45-EC8108C99A9F.xml
Новая папка 2 S:\VM\Hyper-V\Virtual Machines\D20DF20A-7C8C-4C09-8D45-EC8108C99A9F\
Новый файл 2.0 g D20DF20A-7C8C-4C09-8D45-EC8108C99A9F.bin
Новый файл 20.0 m D20DF20A-7C8C-4C09-8D45-EC8108C99A9F.vsv
Новая папка 4 S:\VM\Virtual Hard Disks\
Новый файл 48 desktop.ini
Новый файл 32.0 g SERVER2.VHD
Новый файл 51.0 g SERVER5_C.VHD
Новый файл 10.0 g SERVER5_Y.VHD

------------------------------------------------------------------------------

Всего Скопировано Пропущено Несоответствий Сбоев Дополнительно
Папок: 8 7 1 0 0 0
Файлов: 10 10 0 0 0 0
Байт: 97.039 g 97.039 g 0 0 0 0
Время: 0:40:45 0:40:39 0:00:00 0:00:06

Скорость: 42719893 байт/сек
Скорость: 2444. 451 МБ/мин.

Конец: Mon Jan 18 16:23:34 2010

C:\Admin\Скрипты\VMBackup>REM Dummy command to clear the robocopy errorlevel

C:\Admin\Скрипты\VMBackup>verify 1>nul
-> delete shadows all
Удаление теневой копии {484f49e3-e1ba-4645-b228-b2c718326a1e} на томе \\?\Volume{3a6faea4-de71-11de-9714-02215ecb8917}\ от поставщика {b5946137-7b9f-4925-af80-51abd60b20d5} [Атрибуты: 0x00520009]...

Количество удаленных теневых копий: 1


Лог формируется в кодировке командной строки (MS-DOS).

Идея взята отсюда : http://serverfault.com/questions/55789/command-line-backup-of-running-hyper-v-images-using-volume-shadow-copies-vss-an, и доработана по потребности.

P.S. Для должной регистрации восстановленных VM, проще всего после операции восстановления перезапустить службу "Hyper-V Virtual Machine Management" в родительской системе, в моем случае это было вполне приемлемо. Машины после восстановления будут в остановленном состоянии; последствия запуска в гостевой системе будут подобны запуску после сбоя питания. К сожалению, восстановить машину в запущенном виде с сохранением состояния невозможно, однако в остальном метод вполне рабочий.

Но, конечно, правильнее все таки использовать не Windows Backup, а нормальные средства резервного копирования.