Сервер с горсткой виртуальных машин редко оправдывает покупку дорогой системы резервного копирования. Почти всё нужное уже встроено в Windows Server: копирование целых машин через службу теневого копирования, утилита wbadmin в командной строке, готовые командлеты PowerShell и репликация на резервный узел. Дальше по шагам: разовая и плановая архивация машин, возврат их из архива, роль контрольных точек и экспорта.
Штатные инструменты Windows Server для защиты виртуальных машин
Отдельный серверный продукт для старта не нужен: достаточно компонента "Архивация Windows Server". Откройте Диспетчер серверов → Управление → Добавить роли и компоненты → Компоненты, отметьте пункт "Архивация Windows Server" и нажмите Установить. Быстрее сделать то же в PowerShell от имени администратора: после команды ниже в системе появятся графическая консоль, утилита wbadmin и модуль PowerShell, все командлеты которого носят приставку WB в имени.
Install-WindowsFeature Windows-Server-Backup
Выгодный момент здесь в том, что копирование идёт на уровне узла. Внутрь гостевой системы ничего ставить не требуется: архив забирает конфигурацию машины, файлы её состояния с расширениями .vmcx, .vmgs и .vmrs и виртуальные диски. В один архив попадает всё, из чего машина собрана, и после восстановления её не придётся пересобирать по кускам.
VSS-модуль записи Hyper-V и целостность данных внутри гостя
Когда архивация запускается на узле, за снимок машин отвечает VSS-модуль записи Hyper-V. Он присутствует во всех версиях Windows Server с Hyper-V и рассчитан на умеренный масштаб: все машины одного сервера копируются одновременно. В момент снимка модуль приостанавливает запись на виртуальные диски и через службы интеграции просит гостевую систему подготовить свои данные. Внутри гостя просыпается собственная служба теневого копирования, и файлы с базами оказываются согласованными; у Linux-машин для этого используется заморозка файловой системы.
Зачем такая церемония? Если скопировать файл .vhdx у работающей машины напрямую, копия ляжет на диск в момент, когда половина транзакций ещё в полёте. Развернуть из неё базу данных без потерь почти невозможно. Согласованность внутри гостя и есть разница между настоящим архивом и простым файлом.
С этим связана и тонкость контрольных точек. Стандартная точка снимает не только диски, но и память машины; для тестовых стендов удобно, а для систем, которые реплицируют данные между узлами, вроде Active Directory, откат может обернуться рассогласованием. Рабочая точка действует иначе: та же служба внутри гостя, память не снимается, данные согласованные. В свежих версиях она выбрана по умолчанию.
Разовая архивация выбранных машин через PowerShell
Откройте PowerShell от имени администратора: Пуск → введите powershell → правый клик по пункту Windows PowerShell → Запуск от имени администратора. Введите блок целиком; сначала появится запрос учётной записи для сетевой папки, затем консоль покажет ход копирования по каждой машине.
$Policy = New-WBPolicy
$Vms = Get-WBVirtualMachine
Add-WBVirtualMachine -Policy $Policy -VirtualMachine $Vms
$Cred = Get-Credential
$Target = New-WBBackupTarget -NetworkPath "\\fileserver\vmbackup" -Credential $Cred
Add-WBBackupTarget -Policy $Policy -Target $Target
Start-WBBackup -Policy $Policy
Разбор по строкам. New-WBPolicy создаёт пустую политику в режиме правки; Get-WBVirtualMachine перечисляет машины узла; Add-WBVirtualMachine добавляет их в архивацию, а при передаче отдельных объектов из выдачи скопируются лишь выбранные машины. Get-Credential спросит учётную запись с правом записи на ресурс, New-WBBackupTarget примет путь к нему; UNC-путь и учётные данные меняете под свою сеть. Add-WBBackupTarget привязывает место хранения к политике, Start-WBBackup запускает работу. Когда всё завершится, на ресурсе появится папка WindowsImageBackup с копиями машин.
Если копии удобнее держать локально, замените строку с Get-Credential и сетевой путь одной строкой ниже:
$Target = New-WBBackupTarget -VolumePath "E:"
Том E: должен быть другим носителем, а не диском, где лежат сами машины. Для целого диска подойдёт пара командлетов Get-WBDisk и New-WBBackupTarget с параметрами -Disk и -Label, где -Label задаёт подпись носителя. Нюанс такой: при сетевом ресурсе политика принимает только одно место хранения, а томов и дисков можно добавить несколько. Ход работы всегда виден через Get-WBJob; при запуске Start-WBBackup с параметром -Async управление вернётся сразу, а статус покажет этот же командлет.
Плановая архивация по расписанию и хранение копий
Чтобы не запускать копирование руками, соберите ту же политику и назначьте время. Блок ниже собирает политику со всеми машинами узла, направляет копии на том E: и ставит работу на 22:00; после выполнения последней строки архивация запускается сама каждый день.
$Policy = New-WBPolicy
$Vms = Get-WBVirtualMachine
Add-WBVirtualMachine -Policy $Policy -VirtualMachine $Vms
$Target = New-WBBackupTarget -VolumePath "E:"
Add-WBBackupTarget -Policy $Policy -Target $Target
Set-WBSchedule -Policy $Policy -Schedule 22:00
Set-WBPolicy -Policy $Policy
Set-WBSchedule принимает список времён через запятую, например 12:00,22:00, и тогда машина получит две копии в сутки. Поправить уже действующую плановую политику можно через Get-WBPolicy с параметром -Editable, иначе объект не даст себя менять.
Место хранения выбирают заранее и хладнокровно. Копия на диске с машинами при отказе железа исчезнет вместе с ними. Отдельный физический диск описывается командлетом Get-WBDisk и подключается через New-WBBackupTarget с параметром -Disk и подписью -Label. Сетевой ресурс дешевле диска, но у него есть капкан: повторная архивация той же машины в ту же папку затирает прежнюю копию, а сорванная посреди пути работа оставит узел без обеих. Правило простое: раскладывайте копии по подпапкам и держите двойной запас места на ресурсе.
Узлу тоже нужна защита: при отказе железа машинам будет некуда возвращаться. Командная строка от имени администратора, правый клик по Командной строке → Запуск от имени администратора, затем команда ниже; копия тома d: вместе с состоянием системы уйдёт в папку WindowsImageBackup на диске f:.
wbadmin start backup -backupTarget:f: -include:d: -systemstate -vssCopy -quiet
Ключ -quiet убирает лишние вопросы, а -vssCopy оставляет в покое историю файлов, чтобы не ломать чужие цепочки копий. Посмотреть созданные архивы можно командой wbadmin get versions; она выведет список версий вида 03/31/2020-09:00, и именно этот идентификатор понадобится при восстановлении. Бывает и обратная беда: каталог архивов на узле повреждён, тогда командлет Restore-WBCatalog восстанавливает его прямо с места хранения.
Восстановление машины и отдельных файлов из архива
Восстановление целой машины выполняется в PowerShell от имени администратора. Сначала прочитайте каталог архивов командой ниже; в переменной окажется набор, где в массиве Application перечислены заархивированные машины.
$Backup = Get-WBBackupSet
Выберите нужную машину по индексу и верните на прежнее место; после выполнения команда воссоздаст её файлы и зарегистрирует машину на узле.
Start-WBHyperVRecovery -BackupSet $Backup -VMInBackup $Backup.Application[0].Component[0]
Индекс Component[0] означает первую машину в наборе, Component[1] вторую и так далее. Если вернуть машину нужно в другую папку или на другой том, добавьте три параметра в ту же команду: -TargetPath задаёт путь, -UseAlternateLocation обновляет конфигурацию и заново регистрирует машину, -RecreatePath воссоздаёт исходную структуру папок. После работы машина появится в диспетчере Hyper-V, останется включить её.
Отдельные тома и файлы достаются из тех же архивов через wbadmin. В командной строке от имени администратора введите команду вида ниже, где версия после -version совпадает с выводом wbadmin get versions; том вернётся на место целиком.
wbadmin start recovery -version:03/31/2020-09:00 -itemType:Volume -items:d:
Для папки с содержимым используется itemType File и ключ -recursive, а поведение при совпадении имён регулирует параметр -overwrite со значениями Overwrite, CreateCopy или Skip. Так за пару минут достаётся один потерянный документ из тома, целиком заархивированного вместе с машинами.
Контрольные точки и реплика не заменяют резервную копию
Точка хранится не как готовая копия, а как файл .avhdx рядом с обычным .vhdx. Пока точка живёт, все новые записи уходят в .avhdx, и файл растёт. При удалении точки Hyper-V сливает .avhdx и .vhdx обратно; удалять .avhdx руками нельзя, иначе структура диска останется повреждённой. Гора старых точек на рабочем сервере означает и гору слияний, каждое из которых тормозит машину.
Тип точки решает, что попадёт в снимок. Стандартная копирует и память: удобно для тестов, рискованно для баз. Рабочая делает согласованную копию средствами гостя и память не трогает. Переключается тип в диспетчере: Диспетчер Hyper-V → правый клик по машине → Параметры → Управление → Контрольные точки → выбор нужного варианта. Ту же работу делает команда ниже; после её выполнения стандартные точки для db01 создаваться не будут.
Set-VM -Name "db01" -CheckpointType ProductionOnly
Снять точку и увидеть список можно командами ниже; точка появится под именем машины с датой и временем создания.
Checkpoint-VM -Name "db01"
Get-VMCheckpoint -VMName "db01"
Откат выполняется в диспетчере: раздел Контрольные точки → правый клик по точке → Применить; пункт "Создать контрольную точку и применить" в окне подстрахует текущее состояние. Лишние точки убирает командлет Remove-VMCheckpoint, но помните про слияние файлов.
Второй опорой защиты служит Hyper-V Replica. Она копирует машину на другой узел асинхронно: изменения собираются на уровне блоков в файлах .hrl рядом с дисками и отправляются каждые 30 секунд, 5 или 15 минут, а на принимающей стороне хранится до 24 почасовых точек восстановления. Эти возможности входят в Windows Server без доплаты. Логика у реплики чисто аварийная: при отказе узла или целой площадки машина поднимается на втором узле, а после ремонта возвращается обратной репликацией. Реплика честно копирует и плохие данные: удалённая утром база к вечеру исчезнет в обеих сторонах. Против ошибок людей спасает только настоящая резервная копия, снятая во времени.
Экспорт машины и минимальный набор для малого бизнеса
Экспорт создаёт полный дубликат машины в заданной папке. В PowerShell от имени администратора введите команду ниже; на диске появится папка с подпапками Snapshots, Virtual Hard Disks и Virtual Machines, где лежат файлы точек, диски и конфигурация, и такой набор импортируется на другой узел без пересборки.
Export-VM -Name "db01" -Path "E:\Export"
Для всех машин сразу командлет принимает конвейер, и каждая машина уедет в собственную папку.
Get-VM | Export-VM -Path "E:\Export"
Работающую машину экспортируют с параметром -CaptureLiveState и значением CaptureDataConsistentState: состояние снимется механизмом рабочих контрольных точек, без остановки служб. Отдельную точку тоже можно выгрузить командлетом Export-VMCheckpoint, передав имена машины и точки и путь. Ценность экспорта не в ежедневной рутине, а в страховке перед обновлением или переносом: рядом лежит заведомо рабочая копия целой машины.
Минимальный набор для сервера с пятью-десятью машинами выглядит так:
- Плановая политика из прошлых разделов, копирующая все машины каждую ночь на отдельный диск или сетевой ресурс;
- Разовая команда wbadmin для тома с машинами и состояния системы узла, чтобы при поломке железа поднять узел целиком;
- Еженедельный экспорт ключевых машин на внешнее хранилище;
- Реплика на второй узел, если он есть в хозяйстве;
- Тестовое восстановление раз в квартал, потому что копия, которую ни разу не поднимали, остаётся предположением.
Платные системы дают длинные цепочки инкрементных копий, дедупликацию и каталог с поиском по точкам, и когда машин становится пара десятков, они начинают окупаться. До этой отметки штатных средств хватает с запасом: все нужные инструменты входят в Windows Server, а одновременный снимок всех машин узла на таком масштабе незаметен. Проверка восстановления по-прежнему дешевле любой подписки.