Menu Chiudi

Proxmox – escludere uno o piu dischi virtuali durante la fase di backup delle macchine KVM

Problema/necessità: escludere dalle copie di backup alcuni dischi virtuali (dei queli non si intende mantenere una copia) per le macchine virtualizzate tramite KVM.

Un classico esempio: macchina virtuale utilizzata come proxy squid –> NON mi interessa effettuare il backup dei 16GB di cache (che si trovano su di un disco virtuale specifico) ma solo del disco virtuale su cui è stato installato il sistema operativo con le relative configurazioni.

Problema/necessità: escludere dalle copie di backup alcuni dischi virtuali (dei queli non si intende mantenere una copia) per le macchine virtualizzate tramite KVM.

Un classico esempio: macchina virtuale utilizzata come proxy squid –> NON mi interessa effettuare il backup dei 16GB di cache (che si trovano su di un disco virtuale specifico) ma solo del disco virtuale su cui è stato installato il sistema operativo con le relative configurazioni.

Premesse:
– il comando vzdump fornito con la versione di Proxmox 1.6  NON consente di escludere dalle copie di backup di una specifica macchina KVM specifici dischi virtuali
– nel caso specifico NON vengono mantenute le copie storiche dei file di backup (è solo una scelta ! eventualmente è possibile modificare lo script riportato sotto) o schedulare i backup a proprio piacimento
– ho preferito utilizzare il parametro –dumpdir per sganciarmi dalla gestione degli storage di Proxmox, la cartella /mnt/backup si trova fisicamente su di un server remoto connesso tramite sshfs
– nella cartella /mnt/backup è stata creata una specifica cartella per ogni macchina virtuale (es. 400, 500, 600)
– lo script riportato sotto l’ho scritto mentre imparavo a utilizzare la shell di conseguenza è senza dubbio migliorabile… se volete apportare delle modifiche fatelo pure modificando direttamente questa pagina 😉

Soluzione proposta.

Ho creato un apposito script bash che consente di escludere dal backup alcuni dischi virtuali (es. log del server squid). Lo script viene installato SOLO sul server che fa da master (ci pensa lui ad eseguire il backup di eventuali macchine virtuali installate sui nodi figli).

cat /usr/bin/backupmacchinevirtuali.sh

#!/bin/bash
# Backup di tutte le macchine virtuali presenti sul server
# - lo script viene lanciato solo di domenica per non impegnare troppe risorse
# - i backup dei file vengono gestiti da bagheera/backuppc che e' stato configurato per eseguire
# il backup giornalmente, non cambiando il file di backup NON andra' ad occupare ulteriore spazio su bagheera
# - alcuni dischi virtuali vengono esclusi dal backup (es. disco contenente la cache di squid e i file di log)
#
# i file di configurazione delle macchine virtuali Proxmox si trovano in /etc/qemu-server
# ogni file viene identificato tramite l'id della macchina virtuale
# i dischi virtuali connessi alla macchina virtuale vengono identificati direttamente nel file .conf
# es.
# virtio1: local:400/vm-400-disk-2.qcow2
#
# esempio di utilizzo:
# backupmacchinevirtuali.sh --id=400 --escludidisco=virtio1 --escludidisco=virtio2
#

PERCORSOQEMU="/etc/qemu-server"
PERCORSOBACKUP="/mnt/backup"

numeronodopermacchina ()
{
# recupero l'elenco dei nodi figli e il relativo indirizzo ip
# verifico se sul nodo specifico esiste la macchina virtuale con il relativo ID
# imposto il numero di nodo su cui e' configurata la relativa macchina virtuale

# verifico se la macchina ID si trova sul master
if [ "$( qm list | grep $ID )" != "" ]; then
NODOMACCHINA=1
else
NUMNODI=`cat /etc/pve/cluster.cfg | grep "maxcid" | tr -d [:alpha:] | tr -d [" "]`
NODO=1
NODOMACCHINA=0
while [ $NODO -lt $NUMNODI -a $NODOMACCHINA=0 ]; do
let NODO=NODO+1
IPNODO=`cat /etc/pve/cluster.cfg | grep "node $NODO" -A1 | tail -1 | tr -d [:alpha:] | tr -d [" "] | tr -d [":"]`
# verifico se la macchina ID si trova su NODO
if [ "$( ssh root@$IPNODO qm list | grep "$ID " )" != "" ]; then
NODOMACCHINA=$NODO
fi
done
fi
}


eseguobackup ()
{

# eseguo il backup sul master o sul relativo nodo tramite ssh
if [ $NODOMACCHINA != "1" ]
then
# rimuovo i vecchi file di log e di backup
if [ "$( ssh root@$IPNODO ls $PERCORSOBACKUP/$ID )" != "" ]; then
ssh root@$IPNODO rm $PERCORSOBACKUP/$ID/*
fi
# avvio vzdump sul master
ssh root@$IPNODO vzdump --quiet --node $NODOMACCHINA --snapshot --compress --dumpdir /mnt/backup/$ID --ionice 7 $ID
# rinomino il file appena generato
ssh root@$IPNODO mv $PERCORSOBACKUP/$ID/vzdump-qemu-$ID*.log /mnt/backup/$ID/vzdump-qemu-$ID.log
ssh root@$IPNODO mv $PERCORSOBACKUP/$ID/vzdump-qemu-$ID*.tgz /mnt/backup/$ID/vzdump-qemu-$ID.tgz
else
# rimuovo i vecchi file di log e di backup
if [ "$( ls $PERCORSOBACKUP/$ID )" != "" ]; then
rm $PERCORSOBACKUP/$ID/*
fi
# avvio vzdump sulla macchina remota
vzdump --quiet --node $NODOMACCHINA --snapshot --compress --dumpdir /mnt/backup/$ID --ionice 7 $ID
# rinomino il file appena generato
mv $PERCORSOBACKUP/$ID/vzdump-qemu-$ID*.log /mnt/backup/$ID/vzdump-qemu-$ID.log
mv $PERCORSOBACKUP/$ID/vzdump-qemu-$ID*.tgz /mnt/backup/$ID/vzdump-qemu-$ID.tgz
fi

}


if [ "$1" = "" ]
then
echo "Sintassi: backupmacchinevirtuali.sh --id=IDMACCHINA --escludidisco=NOMEDISCO --escludidisco=NOMEDISCO"
else
# recupero l'id della macchina virtuale
POS=`echo "$1" | grep -c '\-\-id'`
if [ $POS -gt 0 ]
then
ID=${1:5}

# recupero il numero di nodo su cui e' configurata la macchina virtuale
numeronodopermacchina

# numero parametri compreso --id
NUMPAR=$#

# tolgo dal backup eventuali dischi da escludere
if [ $NUMPAR -gt 1 ]
then
for PARAMETRO in "$@"
do
POS=`echo "${PARAMETRO}" | grep -c '\-\-escludidisco'`
if [ $POS -gt 0 ]
then
DISCO=${PARAMETRO:15}
REGOLA=s/^$DISCO/\#$DISCO/
FILECONF=${PERCORSOQEMU}/${ID}.conf
if [ $NODOMACCHINA != "1" ]
then
ssh root@$IPNODO sed -i "$REGOLA" $FILECONF
else
sed -i "$REGOLA" $FILECONF
fi
fi
done
fi

# eseguo il backup della macchina ID
eseguobackup

# ripristino il file di configurazione con i dischi eventualmente esclusi dal backup
if [ $NUMPAR -gt 1 ]
then
for PARAMETRO in "$@"
do
POS=`echo "${PARAMETRO}" | grep -c '\-\-escludidisco'`
if [ $POS -gt 0 ]
then
DISCO=${PARAMETRO:15}
REGOLA=s/^\#$DISCO/$DISCO/
FILECONF=${PERCORSOQEMU}/${ID}.conf
if [ $NODOMACCHINA != "1" ]
then
ssh root@$IPNODO sed -i "$REGOLA" $FILECONF
else
sed -i "$REGOLA" $FILECONF
fi
fi
done
fi

else
echo "Sintassi: backupmacchinevirtuali.sh --id=IDMACCHINA --escludidisco=NOMEDISCO --escludidisco=NOMEDISCO"
fi
fi
exit 0

Lo script viene eseguito con cadenza settimanale direttamente dal server che fa da master

esempio di /etc/cron.weekly/macchinevirtuali

# documenti.comune.levico-terme.tn.it
backupmacchinevirtuali.sh --id=212

# srvsquid.levico.locale
backupmacchinevirtuali.sh --id=400 --nodo=1 --escludidisco=virtio1 --escludidisco=virtio2

exit 0

La sintassi per eseguire il backup di una specifica macchina virtuale è la seguente:

backupmacchinevirtuali.sh --id=IDMACCHINA --escludidisco=NOMEDISCO --escludidisco=NOMEDISCO
WordPress Appliance - Powered by TurnKey Linux