Backup VirtualBox na Linuxu?

Zdravo.

Imam nekaj virtual machines (VirtualBox) znotraj Linuxa in bi jih rad backupiral. Našel sem način, da narediš snapshot in potem backupiraš, ampak vse kar sem našel, je napisano za ročno backupiranje.

Rad bi to avtomatiziral, verjetno se to da z nekaj skriptanja in VBoxManage nekako? Je kdo že delal kaj takšnega in bi lahko dal kakšne smernice?

2 odgovora

4 4

Sem že poskušal automatizirati backup VMjev tudi jaz, ampak nisem nikoli našel ustrezne rešitve, tako da do sedaj še nimam rešeno. S svojim vprašanjem si me malo spomnil na to in sem šel spet malo raziskovati. Naletel sem na tale odgovor na superuser.com, ki se mi zdi dobra smernica za nadaljevanje. Mogoče tudi v kombinaciji z odgovorom SlimDeluxe? Bom čez vikend poskusil nekaj narediti s tem in updatam tale odgovor, če mi uspe kaj zadovoljivega.

Edit 28. 10. 2018:

Nek hiter poskus backup skripte, ki backupira VMje, ki tečejo. Komentarji o tem, kako zadeva deluje, so znotraj skripte. Delno sem uporabil rešitev SlimDeluxe z export, ampak vmes vtaknil clonevm, da lahko backupiramo snapshote. Se priporočam za predloge za izboljšavo, seveda.

#!/usr/bin/bash

BACKUP_DESTINATION='/tvoja/backups/mapa'
KEEP_SNAPSHOTS='5 days'
KEEP_BACKUPS='5 days'

for VM in $( VBoxManage list vms  | sed -r 's/\"(.*)\".*\{.*\}/\1/' ); do
    # briši snapshote
    # upošteva vse snapshote v obliki YYYY-MM-DD,
    # tako da lahko delaš tudi svoje custom snapshote
    KEEP=$( date +"%Y-%m-%d" -d "$KEEP_SNAPSHOTS ago" )
    for SNAPSHOT in $( VBoxManage snapshot $VM list | \
                       grep -E "Name: [0-9]{4}-[0-9]{2}-[0-9]{2}" | \
                       sed -r "s/^\s*Name: ([0-9\-]+).*$/\1 $KEEP/" | \
                       awk '{if ($1 < $2) { print $1 }}' ); do
        VBoxManage snapshot $VM delete $SNAPSHOT
    done

    # briši stare backupe
    # za vsak slučaj upošteva samo datoteke
    # v obliki YYYY-MM-DD.ova
    KEEP=$( date +"%Y-%m-%d" -d "$KEEP_BACKUPS ago" )
    for BACKUP in $( find $BACKUP_DESTINATION/$VM -name *.ova | \
                     grep -E "[0-9]{4}-[0-9]{2}-[0-9]{2}\.ova$" | \
                     sed -r "s/^.*\/([0-9\-]+)\.ova$/\1 $KEEP \0/" | \
                     awk '{if ($1 <= $2) { print $3 }}' ); do
        rm $BACKUP
    done

    SNAPSHOT=$( date +"%Y-%m-%d" )
    BACKUP_DIR=$BACKUP_DESTINATION/$VM
    BACKUP_FILE=$BACKUP_DIR/$SNAPSHOT.ova

    # naredi snapshot
    VBoxManage snapshot $VM \
               take $SNAPSHOT
    # kloniraj VM iz snapshota
    VBoxManage clonevm $VM \
               --snapshot $SNAPSHOT \
               --name $VM-$SNAPSHOT \
               --register
    # kreiraj backup dir za VM,
    # če še ne obstaja
    mkdir -p $BACKUP_DIR
    # briši datoteko, če že obstaja
    if [ -f $BACKUP_FILE ]; then
        rm $BACKUP_FILE
    fi
    # exportaj kloniran VM
    VBoxManage export $VM-$SNAPSHOT \
               --output $BACKUP_FILE
    # briši kloniran VM
    VBoxManage unregistervm $VM-$SNAPSHOT \
               --delete
done

Nazadnje urejal Vini (28. okt ob 09:55) - dodana skripta za backup

Sem že hotel napisati, da bi mogoče šlo s kloniranjem snapshotov, pa si me prehitel :)
Tule je še en workaround:
https://www.howtoforge.com/virtualbox-creating-backups-and-clones-of-running-virtual-machines-no-downtime-with-lvm-snapshots –

Sem editiral odgovor z delujočo skripto –

Cool, thumbs up –

Yeah, proper! –

Hudo! –

3 3

Tole je relevantni del moje backup shell skripte.

#!/bin/sh

DEST='/tvoja/backups/mapa';

echo 'Exporting virtual boxes...';
echo '-----------------------------';
rm "$DEST/vb/win2012test.ova";
VBoxManage export "Win Server 2012 Test" -o "$DEST/vb/win2012test.ova";
rm "$DEST/vb/winxptest.ova";
VBoxManage export "winxp test" -o "$DEST/vb/winxptest.ova";

echo '-----------------------------';
echo 'All done!';

BTW. če v posamezni mašini uporabljaš kriptiran virtualni disk, se ta izvozi kot nekriptiran oz. brez nobene zaščite - vsak ga lahko importa v VB in vidi vse podatke.

Nazadnje urejal SlimDeluxe (26. okt ob 21:11)

Ali lahko exportam running virtual machines? –

Nisem v stanju za probat, verjetno pa ja, ampak ne v trenutnem stanju (state). Glej Vinijev odgovor :) –