Хочу поделиться с вами простым и быстрым способом бесплатно бэкапить виртуальные машины, работающие под гипервизором hyper-v с помощью утилиты hvbackup. Если в режиме работы полноценного сервера с графическим интерфейсом это может быть не очень актуально, так как присутствует штатное средство для бэкапа, но если вы используете бесплатную версию Hyper-V Server, вопрос становится очень актуальным.
На углубленном курсе "Архитектура современных компьютерных сетей" вы с нуля научитесь работать с Wireshark и «под микроскопом» изучите работу сетевых протоколов. На протяжении курса надо будет выполнить более пятидесяти лабораторных работ в Wireshark.
Содержание:
Если вы еще не настроили бесплатный гипервизор hyper-v, рекомендую познакомиться с моим материалом на эту тему - Установка и настройка Windows Hyper-V Server 2019. Если у вас он уже настроен и встал вопрос о том, как быстро, удобно и бесплатно его забэкапить, то я рекомендую воспользоваться бесплатной утилитой HV Backup.
HVBackup описание утилиты для hyper-v
Основной целью проекта HVBackup было создание бесплатного, простого и эффективного решения для резервного копирования виртуальных машин hyper-v, работающих как в одиночном режиме, так и в кластере.
Утилита работает на всех версиях операционной системы, начиная с Windows Server 2008 и далее, как в графическом режиме, так и Server Core установках. Утилита поддерживает в том числе и бесплатную редакцию гипервизора Hyper-V Server.
HVBackup поддерживает app consistent и crash consistent бэкапы hyper-v, используя VSS, встроенный в систему. Существует множество коммерческих решений, основанных на таком же способе бэкапа виртуальных машин, но среди бесплатных мне известен только этот продукт.
Компания codeplex, производитель программы, утверждает, что она регулярно использует HVBackup в своей инфраструктуре, что гарантирует высокое качество работы и своевременные исправления или изменения.
Программа может запускаться из командной строки, вызываться из Powershell скриптов, либо быть встроенной в любое .Net приложение через соответствующую библиотеку.
Принцип работы этой утилиты достаточно прост. Программа создает в указанном каталоге отдельный zip архив для каждой виртуальной машины, который включает в себя всю информацию, относящуюся к ней.
Системные требования:
.Net Framework 3.5
Установка .Net Framework 3.5 в командной строке
Чтобы установить .Net Framework 3.5 необходимо выполнить следующие команды в Powershell.
Windows Server или Hyper-V Server 2012:
Install-WindowsFeature NET-Framework-Core
Windows Server 2008 или 2008 R2 (не core):
ocsetup NetFx3
Windows Server (core) или Hyper-V Server 2008 / 2008 R2:
ocsetup NetFx3-ServerCore
HVBackup пример использования
Выполнить полный VSS backup всех виртуальных машин хоста:
HVBackup -a -o d:\vm-backup
Выполнить полный VSS backup списка виртуальных машин (необходимо использовать кавычки, если имена машин содержат пробелы). Бэкап выполняется на удаленный сервер:
HVBackup -l "VM1,VM2" -o \\backup-server\wm-backup
Сделать полный бэкап виртуальных машин, список которых содержится в текстовом файле (каждая ВМ в отдельной строке):
HVBackup -f list.txt -o d:\wm-backup
Скрипт для автоматического бэкапа
Если вы хотите запланировать автоматическое выполнение резервного копирования, то удобнее всего сделать простой bat файл для этих целей и запланировать его исполнение. Создадим backup-all.cmd следующего содержания:
set BCKPATH="\\backup-server\wm-backup" rem net use %BCKPATH% /user:<user> <password> pushd %BCKPATH% && forfiles.exe -m *.zip -d -7 -c "cmd /c del @path" popd HVBackup.exe -a -o %BCKPATH% 1> log_out.txt 2> log_err.txt
Этот скрипт перед выполнением бэкапа всех виртуальных машин будет удалять zip файлы старше 7-ми дней в указанной директории. Пути и параметры вы можете подредактировать под свои нужды.
Теперь создадим запланированное задание на сервере для периодического выполнения резервного копирования созданным ранее скриптом:
schtasks.exe /create /tn HVBackup /tr c:\backup-all.cmd /sc DAILY /ru <username> /rp /st 01:00:00
Если необходимо удалить задание:
schtasks.exe /delete /tn HVBackup /f
Немедленное выполнение задания:
schtasks.exe /run /tn HVBackup
Параметры командной строки HVBackup
Использование: HVBackup.exe [options]
-b, --backup
Выполнить backup (по-умолчанию).
-r, --restore
Выполнить восстановление.
-f, --file
Текстовый файл, содержащий список виртуальных машин по одной в каждой строке.
-l, --list
Список виртуальных машин для бэкапа.
-a, --all
Резервное копирование всех виртуальных машин на сервере.
-n, --name
Если указано, то делается бэкап только перечисленных виртуальных машин.
-g, guid
Если указано, то делается бэкап перечисленных виртуальных машин по GUID.
-o, --output
Обязательный параметр. Конечная папка для архивов. Может быть в виде локального или сетевого пути.
--outputformat
Формат имени архива виртуальной машины. {0} имя машины, {1} GUID машины и {2} текущая дата и время. По-умолчанию: "{0}_{2:yyyyMMddHHmmss}.zip"
-s, --singlevss
Сделать один snapshot для всех виртуальных машин.
--help
Вывести справку по командам:
Заключение
На этом все. Единственное замечание - я не тестировал падение производительности во время выполнения бэкапа. На глаз я не заметил никаких тормозов в работе виртуальных машин. Но они у меня все ненагруженные были. Время выполнения бэкапа каждой машины значительное. Но, конечно, оно зависит от множества факторов.
Есть хорошая возможность совместить HVBackup и бэкап серверов с rsync. Например, делать архивы локально на сервере с hyper-v, монтировать к linux серверу папку и с помощью rsync забирать zip файлы с виртуальными машинами. Либо сразу делать резервное копирование на линуксовую самбу, к примеру. По приведенной выше ссылки есть пример на эту тему.
На углубленном курсе "Архитектура современных компьютерных сетей" вы с нуля научитесь работать с Wireshark и «под микроскопом» изучите работу сетевых протоколов. На протяжении курса надо будет выполнить более пятидесяти лабораторных работ в Wireshark.
Проблемка!( Программа не видит виртуальные машины! Если в конфиге указать -а, то запускается, не вижу виртуалки, до свидания! Если реально указать лист с названиями! Ворнинг!!! Виртуальная машина не найдена! Что с эти делать? Сталкивался кто?
К сожалению функция восстановления не работает. Не знаете, как восстановить машину? Ключ -r не работает.
А как на Core установить пакет Visual C++ для Visual Studio?
По ходу никак. Значит теперь этот вариант не для core
А почему никак? Я давно не использовал эту штуку, поэтому не могу подсказать.
Zerox, привет.
По ходу что-то не то сделал и обращаюсь за помощью.
1. Установил .Net Framework 3.5
2. По ссылке скачал утилитку
3. Распаковал на гипервизор 2016 (редакция Core)
при попытке запуска файла в повершеле (теперь он называется HyperVBackup.exe) сервер пишет следующее
"HyperVBackup : Имя "HyperVBackup" не распознано как имя командлета, функции, файла сценария или
выполняемой программы. Проверьте правильность написания имени, а также наличие и правильность пу
ти, после чего повторите попытку."
Попробуй запустить не в powershell, а в обычном cmd и используй имя файла с .exe - HyperVBackup.exe.
+
+ Получилось. Теперь все как у всех :) те же ошибки и предупреждения. Читаем дальше
Как правильно установить программу? Я скачал архив с программой, распаковал на сервере c hyper v. Netframework 35 уже был установлен. Запускаю exe-шник с программой, после этого мелькнул экран с командной строкой и закрылся.
Так у меня вся статья на тему того, как пользоваться программой. Вы ее читали, или сразу комментировать пошли?
Статью я читал, но ни где написано что делать со скачанным архивом hvbackup. Ну да ладно проехали, сам разобрался. Другой вопрос, возникает ошибка при создании бэкапа:
C:\Windows\system32>C:\HyperVBackup.v3\HyperVbackup.exe -l "Virt2" -o E:\WBADMIN\
HyperVBackup 3
Copyright (C) 2012 Cloudbase Solutions SRL
Copyright (C) 2016/2017 Coliseo Software SRL
[2020-07-22 13:32:11.1244] Info: HyperVBackup started at 22.07.2020 13:32:11
Error: Не удалось загрузить файл или сборку "AlphaVSS.x64.dll" либо одну из их зависимостей. Не найден указанный модуль.
в System.Reflection.RuntimeAssembly._nLoad(AssemblyName fileName, String codeBase, Evidence assemblySecurity, RuntimeAssembly locationHint, StackCrawlMark& stackMark, IntPtr pPrivHostBinder, Boolean throwOnFileNotFound, Boolean forIntrospection, Boolean suppressSecurityChecks)
в System.Reflection.RuntimeAssembly.InternalLoadAssemblyName(AssemblyName assemblyRef, Evidence assemblySecurity, RuntimeAssembly reqAssembly, StackCrawlMark& stackMark, IntPtr pPrivHostBinder, Boolean throwOnFileNotFound, Boolean forIntrospection, Boolean suppressSecurityChecks)
в System.Reflection.Assembly.Load(AssemblyName assemblyRef)
в Alphaleonis.Win32.Vss.VssUtils.LoadImplementation()
в HyperVBackUp.Engine.BackupManager.BackupSubset(IDictionary`2 vmNamesMapSubset, Options options, ILogger logger)
в HyperVBackUp.Engine.BackupManager.VssBackup(IEnumerable`1 vmNames, VmNameType nameType, Options options, ILogger logger)
в HyperVBackup.Console.Program.Main(String[] args)
[2020-07-22 13:32:11.7806] Error: System.IO.FileNotFoundException: Не удалось загрузить файл или сборку "AlphaVSS.x64.dll" либо одну из их зависимостей. Не найден указанный модуль.
Имя файла: 'AlphaVSS.x64.dll'
в System.Reflection.RuntimeAssembly._nLoad(AssemblyName fileName, String codeBase, Evidence assemblySecurity, RuntimeAssembly locationHint, StackCrawlMark& stackMark, IntPtr pPrivHostBinder, Boolean throwOnFileNotFound, Boolean forIntrospection, Boolean suppressSecurityChecks)
в System.Reflection.RuntimeAssembly.InternalLoadAssemblyName(AssemblyName assemblyRef, Evidence assemblySecurity, RuntimeAssembly reqAssembly, StackCrawlMark& stackMark, IntPtr pPrivHostBinder, Boolean throwOnFileNotFound, Boolean forIntrospection, Boolean suppressSecurityChecks)
в System.Reflection.Assembly.Load(AssemblyName assemblyRef)
в Alphaleonis.Win32.Vss.VssUtils.LoadImplementation()
в HyperVBackUp.Engine.BackupManager.BackupSubset(IDictionary`2 vmNamesMapSubset, Options options, ILogger logger)
в HyperVBackUp.Engine.BackupManager.VssBackup(IEnumerable`1 vmNames, VmNameType nameType, Options options, ILogger logger)
в HyperVBackup.Console.Program.Main(String[] args)
В чем может быть проблема?
Судя по всему Visual C++ redist package не хватает.
Добрый день! Можно ли восстанавливать бэкап на другом сервере с Hyper-V? Если можно напишите полную команду восстановления машины или пример восстановления
Можно. Я сейчас точно не помню, в каком формате на выходе бэкап у HVBackup, но вроде бы получается то же самое, что если бы вы сделали экспорт виртуальной машины. Соответственно, на другом сервере вам надо сделать импорт виртуальной машины из распакованного бэкапа от HVBackup. Если это не сработает, то можете просто на новом сервере создать виртуальную машину и указать для нее диск из архива HVBackup.
На windows server 2016 core выдавало ошибку о том что отсутствует библиотека AlphaVSS.x64.dll или связанные с ней зависимости, чтобы решить проблему необходимо поставить пакет Visual C++ для Visual Studio 2015. Удачи!
Пользуюсь благодаря вашей статье HVBackup'ером уже более двух лет. Очень доволен, вначале бекапил виртуалки на Hyper-V 2008 , сейчас развернул виртуалки на Hyper-V 2012, думал что прога не справится, мол старая версия, но всё хорошо. На 2012 все бекапит )))
Да, как простой и бесплатный вариант он неплох. Хотя мне кажется, лучше взять бесплатную редакцию Veeam. Я перестал использовать HVBackup, потому что он очень долго выполняет бэкап. Уж не знаю, почему так получается.
Потому, что он етиегомать использует только одно ядро!! у меня на 24х-ядерном сервере бекап выполняется на 15 часов дольше, чем на i5. И как заставить его использоваться остальныя ядра - я так и не понял.
точнее вот, нашлось:
mt Enable multi-threaded compression (only for 7zip
format)
надо будет испробовать
Спасибо большое. На сайте разработчика что-то для внутреннего пользования...
А экзэшник я тоже искал и... не нашёл.
Попробую юзать.
Ещё раз спасибо большое за статью и за быстрый отклик
Спасибо, что отозвались.
В статье Вы пишите Создадим backup-all.cmd,
а в нем HVBackup.exe...
Чувствую, что вопрос мой очень глупый, но
всё же просветите плиз.
Буду очень благодарен
Моя ошибка в предыдущем комментарии. Давно не настраивал hyper-v. Сейчас посмотрел на своих серверах, там действительно .exe файл. Я почему-то подумал, что это был скрипт. Раньше в архиве был экзешник, а сейчас с сайта разработчиков я вообще не пойму, что скачивается. Похоже, что не скомпилированные источники. Попробую разобраться, если что, выложу ту версию, что есть у меня сейчас.
Нашел актуальную ссылку на экзешник:
https://github.com/ColiseoSoftware/hypervbackup/releases
Поправлю статью.
А в архиве https://archive.codeplex.com/?p=hypervbackup нет EXE файла!??
Или я что-то не понимаю
Зачем там exe файл? Его и не должно быть.
Все работает, единственное что, как разбить бекап по емкости 2 гб.
Можно после бэкапа отдельным батником с помощью того же 7zip разбить архив на части.
Интересно, а почему используются всевозможные надстройки на стандартную команду PowerShell export-VM?
Она работает без всевозможных телодвижений и необходимости устанавливать .Net.
Спасибо автору за материал.
Некоторое время использовал HVBackup по этой инструкции, метод работает, но есть недостатки:
1. Очень долгое время выполнения
2. С Одной VM на Win2008 у меня так и не смог снять снимок, пришлось бэкапить её отдельно wbadmin'ом. На их форуме такие проблемы часто постят, многим помогает перекомпиляция программы из исходников, я пробовать не стал.
3. В архивах кроме собственно vhdx нередко попадаются avhdx, объединять приходится вручную. объединение не всегда происходит корректно.
В итоге плюнул, перешёл на veeam backup free
Инструкция: https://www.veeam.com/blog/ru/veeam-backup-free-edition-now-with-powershell.html
Программа бесплатная, работает на порядок быстрее, проблем с ней не возникло.
Настраивается тоже скриптами.
Из минусов -- бесплатная версия делает только полные бэкапы, инкрементальные не умеет
Все верно. Veeam backup free более удобное средство. У самого все руки не доходят статью про него написать.
Оно то удобное, но скрипт повершеловский почему то изредка сбоит, и вместо очищения директории через 2 недели он начинает очищать свежесоданные бекапы. Я был удивлен когда старье лежит а новых нет хоть и отчет приходит как создан.
Здравствуйте.
Попробовал hvbackup. Не могу ее кому ни будь рекомендовать.
Одну ВМ второго поколения с CentOS 7, вообще отказался бекапить , сказал "не могу создать snapshot".
Вторую , VHDX 32Gb, бекапил 45 минут, и сжал слабо. Что мне делать с моими 15 ВМ, объемом около 1Tb ?
Лучше уж Windows Server Backup (wbadmin). Благо он входит Hyper-V сервер, и очистку может делать по количеству последних копий.
По скорости у меня к нему претензий не было, как сжимает не помню.
С уважением.
Все верно, для больших машин это средство не подходит. Но в целом это проблема всех бэкаперов такого типа для любого гипервизора. Что в xen, что в kvm, бэкап всей машины из снепшота делается очень долго. Но что есть лучше из бесплатных решений?
Я же написал, Windows Server Backup. Он доступен как компонент сервера Hyper-V(Install-WindowsFeature Windows-Server-Backup), правда только в командной строке(wbadmin). Умеет работать с разделами, папками и виртуальными машинами. Может делать копии в локальные и сетевые папки. Поддерживает VSS, есть планировщик, работает довольно шустро.
В полной версии сервера есть графическая оболочка.
Initializing VSS
Error: The requested object was a duplicate.
как избавится от этой ошибки, перерыл весь интернет, ситуация такова, машины кластеризованы, попробывал на самой маленькой и второстепенной размер vhdx 20гб все получилось,а с монстрами типа 300гб выдает эту ошибку и хоть ты тресни.
C:\HVBackup>HVBackup -l "Use***" -o D:\backup
Cloudbase HyperVBackup 1.0 beta1
Copyright (C) 2012 Cloudbase Solutions Srl
http://www.cloudbasesolutions.com
Initializing VSS
Starting snapshot set for:
Backup Using Child Partition Snapshot\Use***
Volumes:
D:\
Component: "Backup Using Child Partition Snapshot\Use***"
Archive: "D:\backup\Use***_20150807102330.zip"
Entry: "Use***/Use***/Use***/Use***.vhd"
.............Error: Не удалось найти указанный файл.
в System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath)
в System.IO.FileStream.ReadCore(Byte[] buffer, Int32 offset, Int32 count)
в System.IO.FileStream.Read(Byte[] array, Int32 offset, Int32 count)
в Ionic.Zip.SharedUtilities.ReadWithRetry(Stream s, Byte[] buffer, Int32 offs
et, Int32 count, String FileName)
в Ionic.Zip.ZipEntry._WriteEntryData(Stream s)
в Ionic.Zip.ZipEntry.Write(Stream s)
в Ionic.Zip.ZipFile.Save()
в Cloudbase.Titan.HyperV.Backup.BackupManager.BackupFiles(String backupOutput
Path, String backupOutputFormat, IList`1 components, IDictionary`2 volumeMap, ID
ictionary`2 snapshotVolumeMap, IDictionary`2 vmNamesMap, Int32 compressionLevel)
в Cloudbase.Titan.HyperV.Backup.BackupManager.BackupSubset(IDictionary`2 vmNa
mesMapSubset, String backupOutputPath, String backupOutputFormat, Int32 compress
ionLevel)
в Cloudbase.Titan.HyperV.Backup.BackupManager.VSSBackup(IEnumerable`1 vmNames
, VMNameType nameType, String backupOutputPath, String backupOutputFormat, Boole
an singleSnapshot, Int32 compressionLevel)
в Cloudbase.Titan.HyperV.Backup.CLI.Program.Main(String[] args)
C:\HVBackup>