Script bash simple pour faire une sauvegarde incrémentielle et différentielle d'un serveur et garder plusieurs sauvegardes, en ne stockant que les différentes entre-elles
Je pense que l'actualité va rappeler à beaucoup la nécessite de faire des sauvegardes à distance.
Pour un particulier ou une petite entreprise, c'est n'est pas forcément simple.
Voici le script que j'utilise depuis 10 ans, basé sur un script crée par Bad Max que j'ai adapté à mon besoin par exemple en vérifiant que le port SSH est ouvert avant de lance la sauvegarde, sans quoi cela fait une sauvegarde vide et la sauvegarde suivant est une sauvegarde intégrale.
Le principe se base sur des liens physique proposé par Linux : Cela permet de donner plusieurs noms/chemin d'accès à un même fichier en pointant sur un numéro de fichier. En interne, Linux enregistre les fichiers sur la base d'un numéro (appelé numéro d'index ou inode) et pas sur la base d'un nom. Un fichier peut donc avoir plusieurs noms, et existera tant qu'il est utilisé dans une des sauvegarde. Quand aucune sauvegarde n'utilise l'inode le fichier est supprimé. Contrairement aux liens symboliques, les liens physique ne peuvent pointer que vers un autre élément du même système de fichiers.
Donc chacune des sauvegarde appariait comme une sauvegarde complète et non une sauvegarde différentielle. Toutefois sur le disque dur la place occupée est celle d'une sauvegarde différentielle pour toutes les sauvegardes, sauf la plus ancienne qui prend la place d'une sauvegarde complète.
Le script bash :
#!/bin/bash
# Script de sauvegarde incrémentale d'un serveur ou PC Linux via SSH
# Version du 11/03/2021 pour Ubuntu / Debian / Raspbian / Linux Mint
# Dépendance à installer : sudo apt install tcptraceroute
# Pour ne pas demander de mot de passe, il faut une connexion SSH avec une clé au format RSA
# Créé par Olivier Bedouet (Bad Max) et Vivien Guéant
# Ce script est un logiciel libre que vous pouvez redistribuer ou modifier suivant la GNU GPLv3
#### Paramètres à personnaliser ####
DOMAINE=monserveur.fr # nom de domaine du serveur à sauvegarder
NB_INCR=7 # Nombre de sauvegardes incrémentiel à garder
PORT_SSH=2222 # port où le SSH du serveur écoute (22 par défaut)
DEBIT_MAX=9000 # limite de bande passante, en ko par seconde, pour que la sauvegarde ne sature pas le réseau
REP_SAV=/home/sauvegarde # dossier où placer la sauvegarde en local
REP_SRC='
monserveur.fr:/etc/apache2
monserveur.fr:/home/mondossier1
monserveur.fr:/home/mondossier2
monserveur.fr:/home/mondossier3
' # Liste des dossiers à sauvegarder sur le serveur distant
FILE_ERR=${REP_SAV}/${DOMAINE}/log-${DOMAINE}.err # Emplacement du fichier qui log les éventuelles erreurs
#### Étape N°1: Test de l'ouverture du port TCP utilisé par SSH ####
echo -n "Test de l'ouverture du port ${PORT_SSH} : "
ttr=`tcptraceroute -q 1 ${DOMAINE} ${PORT_SSH} 2>&1`
if echo "${ttr}" | egrep -i "\[open\]" >/dev/null 2>&1
then
echo "Port ${PORT_SSH} ouvert sur ${DOMAINE}"
else # Port SSH fermé, on quitte pour ne pas avoir une sauvegarde vide
echo "Port ${PORT_SSH} fermé sur ${DOMAINE} : pas de sauvegarde"
echo
echo "!!!! ÉCHEC DE LA SAUVEGARDE !!!!"
exit
fi
#### Étape N°2: Création du fichier de log des erreurs ####
if [ ! -d ${REP_SAV}/${DOMAINE} ]
then # le dossier pour le fichier de log manque, on le crée
mkdir ${REP_SAV}/${DOMAINE}
fi
rm -f ${FILE_ERR}
#### Étape N°3: Efface la sauvegarde la plus ancienne ####
if [ -d ${REP_SAV}/${DOMAINE}/sav.${NB_INCR} ]
then
echo -n "Efface derniere sauvegarde n-${NB_INCR} : "
rm -fr ${REP_SAV}/${DOMAINE}/sav.${NB_INCR} 2>${FILE_ERR}
cat ${FILE_ERR}
echo "terminé"
fi
#### Étape N°4: Décale les autres sauvegardes ####
i=${NB_INCR}
while [ $i -gt 0 ]
do
j=`expr $i - 1`
if [ -d ${REP_SAV}/${DOMAINE}/sav.$j ]
then
echo -n "Sauvegarde n-$j "
mv -v ${REP_SAV}/${DOMAINE}/sav.$j ${REP_SAV}/${DOMAINE}/sav.$i 2>>${FILE_ERR}
cat ${FILE_ERR}
fi
i=`expr $i - 1`
done
#### Étape N°5: Contrôle de la présence de sav.1 ####
if [ ! -d ${REP_SAV}/${DOMAINE}/sav.1 ]
then # sav.1 n’existe pas / plus, on le crée
mkdir ${REP_SAV}/${DOMAINE}/sav.1
fi
#### Étape N°6: Lancement de la sauvegarde avec rsync ####
echo "=================================================================================="
echo "${DOMAINE} -- Lancement de la sauvegarde incrémentale -- `date`"
/usr/bin/rsync --verbose -a -e "ssh -p ${PORT_SSH}" --delete \
--link-dest=${REP_SAV}/${DOMAINE}/sav.1 --stats --bwlimit=${DEBIT_MAX} ${REP_SRC} \
${REP_SAV}/${DOMAINE}/sav.0 2>>${FILE_ERR}
echo
echo "${DOMAINE} -- Fin de la sauvegarde incrémentale -- `date`"
#### Étape N°7: Affichage des éventuelles erreurs ####
if [ -s ${FILE_ERR} ] ; then
echo "=================================================================================="
echo "Attention, il y a eu des erreurs lors de la sauvegarde :"
cat ${FILE_ERR}
fi
Je rappelle que le script doit être rendu exécutable : (à adapter selon le nom et emplacement de votre script)
chmod +x /home/sauvegarde/sauvegarde-monserveur.sh