Bonjour a tous,
Sauvegarde automatique des VMs sous Proxmox
Faire des sauvegardes ? De toutes nos petites VMs ?? Ah bah oui ! Et vous avez plutôt intérêt si vous avez une machine de sauvegarde. Moi, j’ai un QNAP. J’ai donc mis un petit programme en langage Bash dans mon QNAP qui s’occupe de sauvegarder toutes mes petites VMs en mode snapshot. Donc, sans interruption de service.
Evidemment, c’est un tout petit script, une bidouille. Il n’a pas l’intention de remplacer un proxmox backup server ou autre système de sauvegarde évolué.
Mais, il a l’avantage d’être simple et de sauvegarder mes VMs Proxmox à l’endroit désiré au fil des mois de l’année en cours. Même si je rajoute des VMs au fil du temps, elles seront prisent en compte par le script et sauvegardées chaque mois. Je n’aurai rien à faire.
Donc, vous êtes ainsi assuré d’avoir une sauvegarde de chaque VM de votre Proxmox, chaque mois de l’année en cours. Une sauvegarde pour janvier, une sauvegarde pour février etc.
L’année suivante, la sauvegarde de l’année précédente pour le mois en cours est écrasée. Votre répertoire de sauvegarde n’enfle donc pas comme un pop-corn au fil du temps.
C’était mon besoin, encore une fois. Avoir au moins une sauvegarde de chacune de mes VMs. Un minimum. Et avec un script bash car si un jour je change mon QNAP pour un autre système de sauvegarde sous Linux, il me suffira simplement de copier et d’executer ce petit script dans celui-ci. Je gagne ainsi du temps. Et surtout, je me prends pas le chou si je change de système de sauvegarde dans l’avenir.
Voici le script, livré tel qu’il est. A vous de l’adapter à votre besoin. Je l’ai un peu plus commenté pour l’occasion :
En crontab, sur votre serveur de sauvegarde, le script s’execute tout les premiers du mois à minuit :
0 0 1 * * /share/theo/scriptNAS/backupvm.sh
Le script :
#!/bin/bash
## Fonction Bash qui prends un répertoire avec des fichiers 100.conf, 101.conf, etc.
## et qui va retourner un tableau de nombres, 100,101,etc.
get_numbers_from_files() {
dir=$1
declare -a numbers
for file in "$dir"/*.conf
do
number=$(basename "$file" .conf)
numbers+=("$number")
done
echo "${numbers[@]}"
}
## La fonction Bash de backup avec ses 2 paramètres, $1, $2
backup_node() {
cd /root/
# Hostname de l'hyperviseur Proxmox
HYPERVISEUR="${1}"
# IP de l'hyperviseur Proxmox
CIBLE="${2}"
SYS="sys"
VMS="vms"
# Dossier partagé ou je vais sauvegarder mes VMs sur mon QNAP
SHARE="/share/backup"
DIRHYP="$SHARE/$HYPERVISEUR"
DIRSYS="$SHARE/$HYPERVISEUR/$SYS"
DIRVMS="$SHARE/$HYPERVISEUR/$VMS"
USER="root"
if [ -f "$SHARE/NOBACKUP" ]; then
exit 0
fi
if [ ! -d "$DIRSYS" ]; then
mkdir -p $DIRSYS
fi
if [ ! -d "$DIRVMS" ]; then
mkdir -p $DIRVMS
fi
ladate=$(date)
echo $ladate > $DIRHYP/debut.txt
mkdir -p /tmp/conf
# Je recupere l'ensemble des fichiers de configuration des VMs de mon hyperviseur Proxmox
/usr/bin/ssh $USER@$CIBLE "tar czf - /etc/pve/qemu-server/*.conf" | tar xzf - -C /tmp/conf
# Avec cet ensemble, je génère un tableau des numéros de mes VMs
tab=($(get_numbers_from_files "/tmp/conf/etc/pve/qemu-server"))
rm -Rf /tmp/conf
# Je prends soin ici de supprimer tout dump manuel que j'aurai pu faire
# Le premier du mois, tout vos dumps manuels ou programmés sur Proxmox
# sont détruits. On préserve ainsi l'espace disque de l'hyperviseur le plus simplement du monde.
/usr/bin/ssh $USER@$CIBLE "rm -f /srv/data/dump/*"
/usr/bin/scp $USER@$CIBLE:/etc/pve/qemu-server/*.conf $DIRVMS/
vmdate=$(date "+%d-%m")
cd $DIRHYP
rm -Rf $SYS/*
cd /root/
# Je sauve aussi sur mon serveur de sauvegarde toute la configuration de mon hyperviseur Proxmox.
/usr/bin/scp -r $USER@$CIBLE:/etc $DIRSYS/
if [ ! -f "$SHARE/NOBACKUPVM" ]; then
# Une boucle qui va me faire un snapshot de chaque VM par mois.
for novm in ${tab[*]}
do
# Je génère le snapshot de la VM novm
/usr/bin/ssh $USER@$CIBLE "vzdump $novm --compress zstd --mode snapshot --stdout > /var/lib/vz/dump/vzdump-qemu-$novm-$vmdate.vma.zst"
/usr/bin/ssh $USER@$CIBLE "rm -f /var/lib/vz/dump/*.log"
# Je rapatrie le snapshot de la VM sur mon serveur de sauvegarde
/usr/bin/scp $USER@$CIBLE:/var/lib/vz/dump/* $DIRVMS/
# J'efface les dumps au fur et à mesure pour ne pas saturer le disque de l'hyperviseur
/usr/bin/ssh $USER@$CIBLE "rm -f /var/lib/vz/dump/*"
done
fi
ladate=$(date)
echo $ladate > $DIRHYP/fin.txt
chmod -R 777 $DIRHYP
}
# PROGRAMME PRINCIPAL :
backup_node p1 192.168.2.2
# p1 étant le nom (hostname) de mon hyperviseur Proxmox
# et 192.168.2.2, sont IP sur le réseau
exit 0
Avec ce petit script, vous n’aurez plus besoin de le modifier si il vous prenait l’envie de créer des VMs supplémentaires sur votre Proxmox. Elles ne seront pas oubliées par ce script et seront sauvegardées le premier du mois suivant.
PS : Vous avez un Synology ? Ca devrait le faire aussi. Le Synology, c’est aussi du Linux. Vous avez un serveur de sauvegarde dont le système d’exploitation est Linux. Ce petit script devrait fonctionner sans problème avec les indications données ici.
Attention toutefois. les commandes sont indiquées avec leur chemin absolu.
Par exemple, la commande ssh
dans le script est indiqué via son chemin absolu /usr/bin/ssh
J’aurai donc dû ajouter pour plus de portabilité en début de mon script, pour chaque commande, ici pour la commande ssh
:
SSH=$(which ssh)
et pour chaque ligne contenant le chemin absolu de la commande ssh
:
/usr/bin/ssh $USER@$CIBLE "rm -f /srv/data/dump/*"
changer (ré-écrire) comme ceci :
$SSH $USER@$CIBLE "rm -f /srv/data/dump/*"
A faire également, pour la commande /usr/bin/scp, /bin/date, rm,
Mais bon, pas eu le temps de tester. Ce script est fonctionnel en l’état sur un système QNAP mais son écriture est à améliorer grandement !
La commande which
vous permet donc de connaitre le chemin absolu de la commande que vous lui indiquez en paramètre.
executer une commande avec son chemin absolu est parfois nécessaire quand cette commande est appelé via un script en crontab.
Donc, si il vous prenait l’idée d’utiliser ce petit script, pensez à vérifier le chemin absolu de chaque commande avec which
, sur votre système Linux
Euh, et le chemin absolu de which
sur mon système ?
Bah,
[~] # which which
/usr/bin/which
[~] #
Je n’ai pas variabilisé le répertoire /srv/data
qui est le répertoire ou se trouve entre autre les disques des VMs (sous la forme de fichiers) dans Proxmox. Et c’est pas bien !
L’espace disque sur mon Proxmox a la tête suivante :
root@p1:~# df -h
Filesystem Size Used Avail Use% Mounted on
udev 3.9G 0 3.9G 0% /dev
tmpfs 786M 1.3M 785M 1% /run
/dev/mapper/pve-root 94G 6.0G 84G 7% /
tmpfs 3.9G 40M 3.8G 2% /dev/shm
tmpfs 5.0M 0 5.0M 0% /run/lock
/dev/mapper/pve-data 393G 187G 187G 51% /srv/data
/dev/fuse 128M 28K 128M 1% /etc/pve
tmpfs 786M 0 786M 0% /run/user/0
root@p1:~#
Le répertoire /srv/data
est configuré ainsi dans l’interface WEB de Proxmox :
Et enfin, lorsque vous créez vos propres VMs, utilisez LVM à chaque fois que vous en avez la possibilité. Vous pourrez ainsi réduire ou augmenter vos disques virtuels assez facilement.
Alors, ces sauvegardes. Elles sont où ? J’indique que j’utilise ce petit script sous un serveur de sauvegarde de la marque QNAP.
Et bien, elles sont dans un répertoire partagé sous QNAP. Ce qui me permet de les avoir à disposition simplement sur mon Windows (pas taper la tête !).
Voilà donc. J’ai fait une petite bidouille de script pour mes propres besoins. Je partage ce que j’ai fait sans autres prétentions