Prosty backup maszyn wirtualnych Hyper-V z wykorzystaniem PowerShell

Jak wiadomo, ludzie w IT dzielą się na 2 grupy – Ci co robią backup i Ci co zaczną go robić. Doświadczeni obserwatorzy środowiska wyodrębniają jeszcze dwie podgrupy spośród tych co robią backup – bowiem Ci co robią backup dzielą się na tych co go sprawdzają, oraz na tych co myślą, że go mają. Tak czy inaczej – wiadomo, że backup jest podstawą do zapewnienia choćby minimalnego poziomu bezpieczeństwa dla organizacji po jakiejś bardziej lub mniej poważnej awarii. Nie będziemy tu jednak rozważać strategii backupu, tylko skupimy się na prostym rozwiązaniu – jak backupować wirtualne maszyny na Hyper-V bez udziału oprogramowania zewnętrznego (płatnego 😉 ).

Jak można się domyśleć – skorzystamy z dobrodziejstw PowerShell i modułów do obsługi Hyper-V przez PowerShell. Oczywiście zakładamy, że rola Hyper-V lub Hyper-V Server już są zainstalowane i jakieś wirtualne maszyny tam już działają. Może się jednak zdarzyć, że podczas instalacji pominięto moduły PowerShell do zarządzania Hyper-V. Aby to zrobić, wystarczy wykonać jedną z dwóch komend:

Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Hyper-V-Management-PowerShell

lub:

Install-Module Hyper-V

Na serwerze, wystarczy utworzyć katalog na dysku C: o nazwie powiedzmy – scripts. Tam umieścić należy skrypt pobrany z gitlaba (tak ,tak mam już swoje repozytorium 😉 może i pojawi się wpis jak pożenic github/gitlab z VSCode 😉 ) https://gitlab.com/pberent/hyperv_backup . Zdaję sobie sprawę, że nie jest to narzędzie idealne, oraz, że są lepsze rozwiązania – szczególnie komercyjne. Jednak to nie wymaga zbyt wielkich nakładów (poza zapewnieniem jakiegoś zewnętrznego miejsca na kopie plików konfiguracyjnych i plików vhd/vhdx.

Co robi skrypt? W prostych słowach – kopiuje te pliki które pozwolą odtworzyć w całości i bezproblemowo maszyny na innym hoście Hyper-V. W podanym w parametrach wykonywania skryptu folderze – zakłada katalogi z nazwą maszyny wirtualnej, a w nich zakłada foldery ze znacznikiem czasowym określającym dzień wykonania kopii.

Folder backupu maszyny o nazwie WINDHCP01

Skrypt działa na każdym systemie Windows z zainstalowanymi w/w funkcjami. Działa w całości w PowerShell, więc działa także na serwerach „Core” może być startowany na życzenie z następującymi przykładowymi parametrami:

corebackup.ps1 -Keep 8 -TargetDir \\serwer\udzial -L C:\temp -Subject 'HYPERV Backup' -Smtp 192.168.0.5 -SendTo ja@mail.com -From hyperv@domena

Wszystkie parametry opisane są w skrypcie, ale przypomnę co oznaczają i jak je używać. Warto zaznaczyć, że tylko jeden parametr jest wymagany i jest to parametr:

  • TargetDir – określa miejsce przechowywania backupów – może być to ścieżka UNC jak \\serwer\udzial, może to być też litera dysku i ścieżka do folderu np: B:\backup
  • Keep (parametr opcjonalny) – określa ile ostatnich kopii ma być przechowywanych (należy liczyć się z tym, że kolejne kopie nie są kopiami przyrostowymi, więc jeśli nie stosuje się do przechowywania tych kopii jakiegoś systemu z bardzo porządną deduplikacją miejsce może się szybko skończyć)
  • L (parametr opcjonalny) – miejsce przechowywania plików log dla skryptu
  • Subject, Smtp, SendTo, From (parametry opcjonalne) – określają czy wysłać powiadomienie mailowe o skończonej pracy skryptu, gdzie, z jakim tematem i kto ma być określony jako „nadawca”
  • NoBanner (parametr opcjonalny) – nie wyświetla wspaniałego logo widocznego na oczątku tego wpisu 😉 zalecany gdy chcemy dodać skrypt do Task Schedulera / Harmonogramu Zadań

Wywołanie skryptu przez Task Scheduler / Harmonogram zadań to już formalność. Wystarczy utworzyć nowe zadanie startujące o wyznaczonej godzinie i jako akcję ustawić „Start a program” / „Uruchom Program” gdzie startujemy powershell.exe i jako paramtery podajemy parametry skryptu poprzedzone chwilowym wyłączenie sprawdzania wykonywania skryptów ;). Skrypt oczywiście należy wykonywać z poziomu użytkownika domenowego lub lokalnego, który ma dostęp do katalogu docelowego określonego przez parametr TargetDir.

-ExecutionPolicy Bypass c:\scripts\corebackup.ps1 -Nobanner -Keep 8 -TargetDir \\serwer\udzial -L C:\temp -Subject 'HYPERV Backup' -Smtp 192.168.0.5 -SendTo ja@mail.com -From hyperv@domena

Skrypt ma także funkcję radzenia sobie z klastrami i auto-balancerem zasobów (wyłącza go na czas trwania), ale domyślnie jest to zakomentowane w skrypcie, gdyż jeszcze pracuje nad sposobem synchronizacji backupów pomiędzy nodami klastra. Problem stanowią takie maszyny, które hyper-v postanowi przenieść podczas backupu, dlatego skrypt włącza tą funkcję, niestety – skrypt musi startować na każdym nodzie klastra osobno, co powoduje problemy w momencie gdy jeden skrypt skończy szybciej niż inny. W chwili obecnej można to traktować jako opcję eksperymentalną, nad którą pracuję i pewnie niebawem coś wymyślę 😉

Oczywiście nie jest to rozwiązanie pozbawione wad i zdaję sobie z tego sprawę – jednak zawsze warto mieć jakiś mechanizm backupu. Nawet taki najprostszy może uratować odrobinę stresu gdy świat się zawali.

Piotr Berent

Piotr Berent od 2002 w pocie czoła pracujący w środowisku IT, obecnie freelancer - Inżynier Systemowy. Entuzjasta wirtualizacji, automatyzacji i rozwiązań opartych o narzędzia open-source.

8 komentarzy

  1. sdfsdfdfsds pisze:

    Jeszcze są ci, któzy sprawdzają backupy.

  2. Kamil pisze:

    Witam, dzięki bardzo przydany skrypt, mam pytanie: robiąc ręcznie backupy najpierw wprowadzam maszyny w tryb save lub wyłączam, wtedy mogę skopiować pliki .vhdx. Ten skrypt widzę najpierw tworzy snapshota, następnie skrypt kopiuje dyski. Pytanie co sprawia że nie musisz wyłączać/zapisywać maszyny przed tym kopiowaniem dysków.
    Dobrze myślę że działa to tak:
    1. Tworzymy snapshot dzięki temu główny plik .vhdx maszyny jest wolny i można go kopiować
    2. Kopiujemy ten główny .vhdx a maszyna nowe stany zapisuje do pliku snapshota który zostawiamy w spokoju
    3. Po skopiowaniu scalamy zmiany z snapshota z głównym .vhdx i kasujemy snapshot.

    Pozdrawiam.

    • Piotr Berent pisze:

      Dokładnie tak jak napisałeś.

      A teraz małe rozwinięcie tematu. W dawnych prehistorycznych czasach ESX3.0 😉 nie było, żadnego sensownego narzędzia do backupowania maszyn wirtualnych… ale VMWare dawał coś co się nazywało VCB albo jakoś tak. To narzędzie robiło dokładnie to co mój skrypt:
      – stworzenie snapshota
      – skopiowanie dysku
      – scalenie snapshota

      Cała magia jest ukryta w samej idei snapshotów. Mianowicie w chwili robienia snapshotu – zamrażany jest „główny” plik z dyskiem maszyny – czy to hyper-v, czy VMWare, czy każdy inny wirtualizator – ten plik robi się tylko do odczytu. Mechanizm robienia snapshotów robi plik „delty” który zawiera wszystkie chwilowe zmiany pomiędzy „zamrożonym” plikiem a chwilą obecną. Jeśli przywracasz maszynę sprzed snapshotu – po prostu uruchamiasz uruchamiasz ją z zamrożonego pliku dysku a plik delty jest usuwany. Jeśli decydujesz się usunąć snapshot – różnica pomiędzy plikiem delty a plikiem zamrożonym jest do niego po prostu wrzucana. Generalnie zasada jest taka, że ten zamrożony plik to jest w 100% działająca maszyna, więc możesz ten plik skopiować i odpalić w innym miejscu. Jasne – nie jest to metoda idealna. Z kilku powodów – po pierwsze zawsze kopiujesz cały plik, po drugie mało przydatne dla serwerów z bazami danych, ale te lepiej jest backupować dumpami moim zdaniem 😉

  3. broniszewski pisze:

    czy konieczne jest wykonywanie az tak duzego szeregu skomplikowanych informacji? czy nie daloby sie wykonac tej operacji standarowymi operacajami jak copy?

    • Piotr Berent pisze:

      Nie. Pliki wirtualnej maszyny są w „ciągłym użyciu” nie da się ich tak po prostu skopiować, bo przywrócenie takiej kopii będzie po prostu nie możliwe.

  4. Andy pisze:

    Fajowy skrypt, naprawdę się przydaję 🙂

    Zauważyłem jednak iż tworzy na kolejnych dniach już dyski avhdx czyli pierwszego dnia z harmoogramu zrobił ładnie zrzut i przeniósł plik *.VHDX, Natomiast kolejne zrzuty robi już jako *.avhdx, próbowałem ręcznie scalić te snapowe/duchy dyski do głównego ale brak efektu. Natomiast maszyny np Linuxowe faktycznie robi bardzo ładnie i w okresie np 5 dni pojawiają się prawidłowe kopie plików *.VHDX. pozwoliłem zmodyfikować sobie serwer smtp dla środowiska poza domeną 🙂

    If ($SmtpServer)
    {
    $SMTPPort = „587”
    $pass = ConvertTo-SecureString „hasło do meila” -AsPlainText -Force
    $cred = New-object System.Management.Automation.PsCredential(„przykład@poczta.pll”,$pass)
    $MailSubject = „$HVHost Hyper-V Backup Utility Log”
    $MailBody = Get-Content -Path $Log | Out-String
    Send-MailMessage -To $MailTo -From $MailFrom -Subject $MailSubject -Body $MailBody -SmtpServer $SmtpServer -Credential ($cred) -Port 587

Leave a Reply to sdfsdfdfsds Cancel reply