Backup | Archiwizacja | Kopia zapasowa działających maszyn wirtualnych VirtualBox | .ova Linux

Kopie zapasowe obrazów maszyn wirtualnych z jednoczesną ich kompresją ? – pomysł dobry, ale jak to zautomatyzować i zrobić w sposób bezpieczny dla samego obrazu? Takie pytania pojawiły się jak już doprowadziłem system(y) do stanu z którego jestem zadowolony. Logiczne jest, że nie możemy robić kopii pracujących maszyn wirtualnych, więc trzeba je zatrzymać zrobić kopię, a następnie przywrócić do stanu poprzedniego. Zacząłem szukać rozwiązania ( w pisaniu skryptów delikatnie mówiąc dobry nie jestem ) i udało się znaleźć skrypt który w oryginale znajdziecie w linku poniżej.

Najważniejsze jest zrobienie porządku z rejestracją maszyn ponieważ ich stan pełni tutaj kluczową rolę.

Jeżeli instalowaliście VirtualBox na użytkowniku i z poziomu użytkownika nimi zarządzacie, nie wykonujcie poniższych komend z sudo. Odczyt stanu, rejestracja i wyrejestrowanie z poziomu użytkownika.

Odczyt stanu wszystkich zarejestrowanych maszyn:

VBoxManage list vms -l | grep -e ^Name: -e ^State | sed s/\ \ //g | cut -d: -f2-

VBoxManage list vms --long | grep -e Name -e State

Rejestracja maszyny

vboxmanage registervm /home/admin/MaszynyWirtualne/vm1-domena/vm1-domena.vbox

Wyrejestrowanie maszyny

vboxmanage unregistervm /home/admin/MaszynyWirtualne/vm1-domena/vm1-domena.vbox

Start maszyny wirtualnej z systemem hosta (jeżeli konieczne)

VBoxManage modifyvm vm1-domena --autostart-enabled on
sudo service vboxautostart-service restart

Teraz najważniejsze i to co robi robotę, czyli skrypt

źródło: https://vorkbaard.nl/backup-script-for-virtualbox-vms-in-debian/

Mała zmiana na końcu, mail przestał być wspierany dlatego zainstalowałem msmtp. Jeżeli nie potrzebujesz informacji o przebiegu backupu po prostu usuń wszystko od linii # Notify the admin

!/bin/bash
 
# This scripts loops through all the user's VirtualBox vm's, pauses them,
# exports them and then restores the original state.
#
# VirtualBox's snapshot system is not stable enough for unmonitored use yet.
#
# Vorkbaard, 2012-02-01
 
# =============== Set your variables here ===============
 
  EXPORTDIR=/mnt/dysk-2tb/KopieMaszynWirtualnych
  MYMAIL=your@email.address
  VBOXMANAGE="/usr/bin/VBoxManage -q"
 
# =======================================================
 
# Generate a list of all vm's; use sed to remove the double quotes.
 
# Note: better not use quotes or spaces in your vm name. If you do,
# consider using the vms' ids instead of friendly names:
# for VMNAME in $(vboxmanage list vms | cud -t " " -f 2)
# Then you'd get the ids in your mail so you'd have to use vboxmanage 
# showvminfo $id or something to retrieve the vm's name. I never use
# weird characters in my vm names anyway.
 
for VMNAME in $(vboxmanage list vms | cut -d " " -f 1 | sed -e 's/^"//'  -e 's/"$//')
do
 
  ERR="nothing"
  SECONDS=0
 
  # Delete old export.log file if it exists
    if [ -e export.log ]; then rm export.log; fi
 
  # Get the vm state
    VMSTATE=$(vboxmanage showvminfo $VMNAME --machinereadable | grep "VMState=" | cut -f 2 -d "=")
    echo "$VMNAME's state is: $VMSTATE."
 
  # If the VM's state is running or paused, save its state
    if [[ $VMSTATE == \"running\" || $VMSTATE == \"paused\" ]]; then
      echo "Saving state..."
      vboxmanage controlvm $VMNAME savestate
      if [ $? -ne 0 ]; then ERR="saving the state"; fi
    fi
 
  # Export the vm as appliance
    if [ "$ERR" == "nothing" ]; then
      echo "Exporting the VM..."
      vboxmanage export $VMNAME --output $EXPORTDIR/$VMNAME-new.ova &> export.log
      if [ $? -ne 0 ]; then
        ERR="exporting"
      else
        # Remove old backup and rename new one
       if [ -e $EXPORTDIR/$VMNAME.ova ]; then rm $EXPORTDIR/$VMNAME.ova; fi
       mv $EXPORTDIR/$VMNAME-new.ova $EXPORTDIR/$VMNAME.ova
       # Get file size
       FILESIZE=$(du -h $EXPORTDIR/$VMNAME.ova | cut -f 1)
      fi
    else
      echo "Not exporting because the VM's state couldn't be saved." &> export.log
    fi
 
  # Resume the VM to its previous state if that state was paused or running
    if [[ $VMSTATE == \"running\" || $VMSTATE == \"paused\" ]]; then
        echo "Resuming previous state..."
        vboxmanage startvm $VMNAME --type headless
        if [ $? -ne 0 ]; then ERR="resuming"; fi
        if [ $VMSTATE == \"paused\" ]; then
          vboxmanage controlvm $VMNAME pause
          if [ $? -ne 0 ]; then ERR="pausing"; fi
        fi
      fi
 
  # Calculate duration
    duration=$SECONDS
    duration="Operation took $(($duration / 60)) minutes, $(($duration % 60)) seconds."
 
  # Notify the admin
    if [ "$ERR" == "nothing" ]; then
      MAILBODY="Virtual Machine $VMNAME was exported succesfully!"
      MAILBODY="$MAILBODY"$'\n'"$duration"
      MAILBODY="$MAILBODY"$'\n'"Export filesize: $FILESIZE"
      MAILSUBJECT="VM $VMNAME succesfully backed up"
    else
      MAILBODY="There was an error $ERR VM $VMNAME."
      if [ "$ERR" == "exporting" ]; then
        MAILBODY=$(echo $MAILBODY && cat export.log)
      fi
      MAILSUBJECT="Error exporting VM $VMNAME"
    fi
 
   #Send the mail
        echo -e "Subject:""$MAILSUBJECT\n$MAILBODY" | msmtp $MYMAIL
       
  # Clean up
    if [ -e export.log ]; then rm export.log; fi
i
 
done

Ostatni krok to dodanie cronjob z wywołaniem skryptu – koniecznie na użytkowniku

0 23 * * * /mnt/dysk-2tb/KopieMaszynWirtualnych/kopie-maszyn-skrypt.sh

W moim przypadku padło na godziny nocne i w chwili obecnej codziennie.

Muszę zaznaczyć, że nie ufam do końca odczytom stanu VirtualBox. Czasami GUI pokazuje, że maszyna wirtualna działa, a odczyt stanu komendą pokazuje, że jest wyłączona. Najgorsze jest to, że można wywalić funkcjonalność domeny, ponieważ mimo że maszyna wirtualna jest uruchomiona można ją uruchomić raz jeszcze! Rozwiązania na to nie znalazłem… Irytuje mnie to strasznie… Szukam dalej.

Skomentuj

Wprowadź swoje dane lub kliknij jedną z tych ikon, aby się zalogować:

Logo WordPress.com

Komentujesz korzystając z konta WordPress.com. Wyloguj /  Zmień )

Zdjęcie na Google

Komentujesz korzystając z konta Google. Wyloguj /  Zmień )

Zdjęcie z Twittera

Komentujesz korzystając z konta Twitter. Wyloguj /  Zmień )

Zdjęcie na Facebooku

Komentujesz korzystając z konta Facebook. Wyloguj /  Zmień )

Połączenie z %s