Sauvegarde automatique des VMs sous Proxmox

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 :slight_smile: 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 :slight_smile:

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 ! :cry:

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 :slight_smile:

1 « J'aime »

Ohhh, vous avez un cluster Proxmox avec au moins 2 noeuds. Un noeud p1 comme moi mais aussi un noeud p2.

Il vous suffit dans la partie #PROGRAMME PRINCIPAL du script de rajouter votre noeud p2 à celui p1 déjà présent. Comme ceci :

# PROGRAMME PRINCIPAL :
backup_node p1 192.168.2.2
backup_node p2 192.168.2.3
1 « J'aime »

Tu peut aussi utiliser le système de backup par défauts de proxmox

Ou si tu veut des choses plus évoluer (backup full, incremental, etc…) installer backup proxmox server qui est disponible chez proxmox et gratuit

2 « J'aime »

oui. Merci à toi pour ta remarque pertinente. Mais je voulais que cela soit QNAP qui ordonne les snapshots sur Proxmox. Et qui les rapatrient ensuite sur son disque. Je ne souhaitais pas l’inverse. Proxmox n’est pas en mesure d’accéder au serveur QNAP. Mais QNAP a les droits pour accéder à PROXMOX. QNAP est un élément sensible … Donc l’idée d’un script m’est venu.

Lorsque dans le script je fais un /usr/bin/ssh ou un /usr/bin/scp, ce sont des commandes initiées sur la machine QNAP vers PROXMOX. Les règles de parefeu autorisent cela. QNAP vers PROXMOX donc. Pas l’inverse.

QNAP: Serveur de sauvegarde.
PROXMOX: Hyperviseur de machines virtuelles (VM)

Chacun voie midi à sa porte comme on dit

Mais je préfère utiliser l’outils fournie par l’éditeur de la solution puisque par exemple tu peut faire de la de duplication, compression etc… que tu ne peut gérez avec ton script

Mais si cette solution te conviens c’est tt bon :+1:

Bien sûr. Pour la duplication, il faudrait un système de fichier ZFS par exemple qui gère ce genre de chose. Ce que contient d’ailleurs Proxmox Backup Server.

Mais, mes VMs sont ridiculement petites. La plus grosse fait 32 Go et est HA OS. Donc la duplication n’est pas utile pour moi. 1 bonne demi-heure de sauvegarde pour mon cas, cela prends.

Mais tu as raison :slight_smile: , il vaut mieux utiliser l’outil de l’éditeur de la solution. Et Proxmox Backup Server est un super outil de sauvegarde pour Proxmox.

1 « J'aime »

Bonjour @anon49275192,
merci pour ce tuto.
N’oublie pas de commencer par un bonjour, quand tu créer un nouveau sujet.

Re bonjour @WarC0zes. Oui, je l’ajouterai quand ma limite de quota de modifications sera levée :blush:

1 « J'aime »

Allez! je te le rajoute :wink:
tu auras pas a attendre le quota.

3 « J'aime »

Salut super ton idée bravo
Je suis novice mais tu fais un autorun.sh pour ton script?