Auteur Sujet: Sauvegarde incrémentielle et différentielle d'un serveur  (Lu 3678 fois)

0 Membres et 1 Invité sur ce sujet

vivien

  • Administrateur
  • *
  • Messages: 39 735
    • Twitter LaFibre.info
Sauvegarde incrémentielle et différentielle d'un serveur
« le: 06 novembre 2021 à 14:01:14 »
Script bash pour faire une sauvegarde incrémentielle et différentielle d'un serveur ou d'un PC via le port SSH et garder plusieurs sauvegardes, en ne stockant que les différences entre deux sauvegardes.

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. Merci à Bad Max pour le script d'origine que j'ai adapté à mon besoin.

La sauvegarde peut se faire sur un autre serveur, mais je vais vous partager ma technique qui permet de consacrer peu d'argent pour avoir des sauvegarde chiffrées à domicile et même sur un autre site, en déplaçant les disques dur de sauvegarde.

Pour avoir une sauvegarde chiffrée, le plus simple est d'installer un système d'exploitation en mode chiffré : Sur chaque disque dur de sauvegarde, j'ai un Ubuntu (j'ai coché la case pour avoir une installation minimale) avec le disque qui est chiffré (il demande un mot de passe au début de la phase de boot). Pour le PC, c'est mon vieux PC qui sert à cette tache (Core 2 duo). C'est bien suffisant pour faire de la sauvegarde. Il est également possible d'utiliser un vieux PC portable avec des disques dur externes, connectés en USB.



Le script me sert aussi bien a sauvegarder des serveurs, des PC distant de ma famille, mais aussi mon PC local. Afin d'avoir toujours les données sur deux sites distincts, j'ai deux disque dur de sauvegarde pour le "PC Vivien" : J'emporte mon disque dur quand je vais voir ma famille et je rapporte celui qui était sur place. J'ai donc toujours une sauvegarde local et une sauvegarde sur un autre site. Pas besoin NAs qui tourne 24h/24 sur un autre site, je me contente de déplacer les disques dur.



Le script peut fonctionner avec des disque dur externe, mais dans mon cas, il est rapide et simple de changer de disque dur sur mon PC : Je me suis donc basé sur des disques internes que je change facilement. Chaque disque dur de sauvegarde a son système d'exploitation, je n'ai pas besoin d'un autre disque.



vivien

  • Administrateur
  • *
  • Messages: 39 735
    • Twitter LaFibre.info
Sauvegarde incrémentielle et différentielle d'un serveur
« Réponse #1 le: 06 novembre 2021 à 14:01:59 »
Tutoriel testé avec Ubuntu version 20.04 et Ubuntu 21.10

Pré-requis coté serveur à sauvegarder :
- Base: Installation et sécurisation d'un serveur Ubuntu
- L'utilisateur SSH du serrvuer doit avoir accès en lecture aux fichiers à sauvegarder. Un fichier lisible uniquement par root ne peut pas être sauvegardé par ce script.

Pré-requis coté PC de sauvegarde  : avoir un Linux (avec ou sans interface graphique peu importe)




1/ Coté PC qui fait la sauvegarde : Génération d'une clef publique / privée pour l'authentification par clé SSH

La clé publique n'a pas beaucoup d'importance, car, par définition, elle peut être rendue publique. La clés privée ne doit pas sortir du PC de sauvegarde. Je conseille de chiffrer le disque du PC de sauvegarde afin de limiter les risques.

$ ssh-keygen -t rsa : On génère une clé au format RSA avec la commande ssh-keygen. On doit exécuter cette commande avec l'utilisateur qui sera utilisé pour la sauvegarde (pas de sudo, on ne fera pas fonctionner le script avec les droits root)

ssh-keygen vous demande l'emplacement de la clef. Appuyer entrée pour accepter /home/[utilisateur]/.ssh/id_rsa

ssh-keygen propose de mettre une "passphrase" : Enter passphrase (empty for no passphrase):
Appuyer pour entrer pour de pas rentrer de "passphrase" car elle sera demandé à chaque connexion.

Le répertoire de l’utilisateur contient maintenant un répertoire .ssh dans lequel :

  • id_rsa.pub contient la clé publique.
  • id_rsa contient la clef privée qui doit rester sur la machine.

Ligne de commande a exécuter coté PC de sauvegarde sans être root pour récupérer la clef publique : cat  ~/.ssh/id_rsa.pub



2/ Côté serveur sauvegardé : rajouter la clef publique du serveur de sauvegarde

cd ~/.ssh : Se rendre dans le répertoire .ssh du compte auquel vous souhaitez accéder pour faire la sauvegarde - cela ne doit pas être root (Si le dossier n'existe pas, il suffit de faire mkdir ~/.ssh pour le créer, puis cd ~/.ssh pour se mettre dedans).

nano authorized_keys On édite le fichier (créez-le s’il n’existe pas)
Copiez-y sur une nouvelle ligne le contenu du fichier id_rsa.pub du client récupéré sur le PC de sauvegarde.
Sauvegardez le fichier.

vivien

  • Administrateur
  • *
  • Messages: 39 735
    • Twitter LaFibre.info
Sauvegarde incrémentielle et différentielle d'un serveur
« Réponse #2 le: 06 novembre 2021 à 14:02:20 »
3/ Uniquement si la machine sauvegardé n'a pas de nom de domaine : modification du fichiers /etc/hosts

Faire la sauvegarde avec une IPv4 en dur dans le script n'est pas une bonne solution car le dossier de sauvegarde va porter comme nom l'IP et en cas de changement d'IP, cela va créer une seconde sauvegarde, comme si c'était une seconde machine à sauvegarder.

Je préconise d'utiliser un nom de domaine et si il n'y en a pas.
En cas de changement d'IPv4, je modifierait uniquement le fichier / etc/hosts, sans toucher au script de sauvegarde.

sudo nano /etc/hosts

On rajoute une nouvelle ligne avec en premier l'IPv4 du serveur a sauvegarder puis après un ou plusieurs espaces / tabulations, le nom de la machine à sauvegarder.

Exemple : Cette machine se nomme "Sauvegarde2", la machine à sauvegarder est "vivien1" et l'IPv4 de vivien1 est "192.168.0.20".


vivien

  • Administrateur
  • *
  • Messages: 39 735
    • Twitter LaFibre.info
Sauvegarde incrémentielle et différentielle d'un serveur
« Réponse #3 le: 06 novembre 2021 à 14:02:35 »
4/ Coté PC qui fait la sauvegarde : Test de l'authentification par clé SSH

Indispensable :
Il faut impérativement tenter une connexion SSH pour valider le key fingerprint.

ssh serveur.fr -p 2222

  • Remplacer serveur.fr par le nom de domaine du serveur à sauvegarder.
  • Remplacer 2222 par le port SSH écouté par le serveur à sauvegarder.

Si c'est la première connexion sur le serveur en SSH, ssh va vous demander de valider le "key fingerprint".
ECDSA key fingerprint is 3b:bb:2b:6b:3d:60:97:0a:8a:b8:34:8a:c1:be:c7:26.
Are you sure you want to continue connecting (yes/no)?
Répondre yes
Aucun mot de passe ne doit être demandé. Si un mot de passe est demandé, l'authentification par clé SSH est un échec. Vérifiez que vous n'avez pas inversé PC de sauvegarde et PC sauvegardé, vérifiez le fichier authorized_keys (il est bien dans le dossier .ssh ?),...

A la connexion suivante, le key fingerprint n'est pas demandé. La connexion se fera sans intervention de l'utilisateur, ce qui est nécessaire pour le script de sauvegarde.

vivien

  • Administrateur
  • *
  • Messages: 39 735
    • Twitter LaFibre.info
Sauvegarde incrémentielle et différentielle d'un serveur
« Réponse #4 le: 06 novembre 2021 à 14:03:12 »
5/ Côté PC qui fait la sauvegarde : Script bash de sauvegarde

sudo apt install tcptraceroute : Dépendance à installer. "tcptraceroute" est utilisé pour vérifier que le port de SSH répond avant de lancer la sauvegarde.
sudo mkdir /home/sav : Les sauvegardes seront dans le dossier /home/sav
sudo chown utilisateur:utilisateur /home/sav : Le script de sauvegarde ne va pas se lancer avec les droits root. Changer utilisateur par votre login.
cd /home/sav/ : On se place dans le dossier crée
nano sav-serveur.sh : Édition du script, remplacer serveur par le nom du serveur sauvegardé.

Copier / coller le texte ci-dessous dans le fichier :
#!/bin/bash
# Script de sauvegarde incrémentale d'un serveur ou PC Linux via SSH
# Version du 21/10/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 ####
SERVEUR=monserveur.fr # nom de SERVEUR 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/sav # dossier où placer la sauvegarde en local
REP_SRC="
${SERVEUR}:/home/MonDossier1
${SERVEUR}:/home/MonDossier2
${SERVEUR}:/home/MonDossier3
" # Liste des dossiers à sauvegarder sur le serveur distant
FILE_ERR=${REP_SAV}/${SERVEUR}/log-${SERVEUR}.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 ${SERVEUR} ${PORT_SSH} 2>&1`
if echo "${ttr}" | egrep -i "\[open\]" >/dev/null 2>&1
then
   echo "Port ${PORT_SSH} ouvert sur ${SERVEUR}"
else # Port SSH fermé, on quitte pour ne pas avoir une sauvegarde vide
   echo "Port ${PORT_SSH} fermé sur ${SERVEUR} : 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}/${SERVEUR} ]
then # le dossier pour le fichier de log manque, on le crée
   mkdir ${REP_SAV}/${SERVEUR}
fi
rm -f ${FILE_ERR}

#### Étape N°3: Efface la sauvegarde la plus ancienne ####
if [ -d ${REP_SAV}/${SERVEUR}/sav.${NB_INCR} ]
then
   echo -n "Efface derniere sauvegarde n-${NB_INCR} : "
   rm -fr ${REP_SAV}/${SERVEUR}/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}/${SERVEUR}/sav.$j ]
   then
      echo -n "Sauvegarde n-$j "
      mv -v ${REP_SAV}/${SERVEUR}/sav.$j ${REP_SAV}/${SERVEUR}/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}/${SERVEUR}/sav.1 ]
then # sav.1 n’existe pas / plus, on le crée
   mkdir ${REP_SAV}/${SERVEUR}/sav.1
fi

#### Étape N°6: Lancement de la sauvegarde avec rsync ####
echo "=================================================================================="
echo "${SERVEUR} -- Lancement de la sauvegarde incrémentale  -- `date`"
/usr/bin/rsync --verbose -a -e "ssh -p ${PORT_SSH}" --delete \
  --link-dest=${REP_SAV}/${SERVEUR}/sav.1 --stats --bwlimit=${DEBIT_MAX} ${REP_SRC} \
  ${REP_SAV}/${SERVEUR}/sav.0 2>>${FILE_ERR}
echo
echo "${SERVEUR} -- 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
Modifier les paramètres suivants :
  • SERVEUR=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.
  • DEBIT_MAX=9000 => limite de bande passante, en ko par seconde, pour que la sauvegarde ne sature pas le réseau.
  • ${SERVEUR}:/home/MonDossier1 : Premier dossier à sauvegarder. Il doit être accessible en lecture par l'utilisateur ssh utilisé.
  • ${SERVEUR}:/home/MonDossier2 : Second dossier à sauvegarder. Il doit être accessible en lecture par l'utilisateur ssh utilisé.
  • ${SERVEUR}:/home/MonDossier3 : ...

chmod +x sav-serveur.sh : On rend le script exécutable


Maintenant il vous suffit de lancer le script /home/sav/sav-serveur.sh pour lancer une sauvegarde.
La premier sauvegarde sera long car il devra sauvegarder l'intégralité.
Les sauvegardes suivantes seront rapides, car incrémentielles.

vivien

  • Administrateur
  • *
  • Messages: 39 735
    • Twitter LaFibre.info
Sauvegarde incrémentielle et différentielle d'un serveur
« Réponse #5 le: 06 novembre 2021 à 14:03:52 »
Exemple d'utilisation du script pour sauvegarder un PC bureautique :


vivien

  • Administrateur
  • *
  • Messages: 39 735
    • Twitter LaFibre.info
Sauvegarde incrémentielle et différentielle d'un serveur
« Réponse #6 le: 06 novembre 2021 à 14:04:10 »
6/ Optionnel : Côté PC qui fait la sauvegarde: Sauvegarde incrémentale automatique chaque nuit.

crontab -e : Optionnel si le PC de sauvegarde est allumé en permanence, programmer une sauvegarde incrémentale quotidienne dans la crontab :
Copier / coller les lignes ci-dessous en fin de crontab, en prenant soins de remplacer serveur par le nom du serveur sauvegardé.

# Sauvegarde à 3h01 :
01 3 * * * /home/sav/sav-serveur.sh

vivien

  • Administrateur
  • *
  • Messages: 39 735
    • Twitter LaFibre.info
Sauvegarde incrémentielle et différentielle d'un serveur
« Réponse #7 le: 06 novembre 2021 à 14:06:55 »
N'hésitez pas à faire vos commentaires ou suggestions ci-dessous !

vincent0

  • Client Orange adsl
  • *
  • Messages: 120
  • Montpellier
    • Twitter
Sauvegarde incrémentielle et différentielle d'un serveur
« Réponse #8 le: 06 novembre 2021 à 15:32:19 »
Article et script intéressants.

Une autre solution que j'aime beaucoup est restic : https://restic.net/

Utilitaire de backup standalone qui tourne sous Linux, windows et Mac et peut sauvegarder sur beaucoup de stockage cloud et aussi bien du sftp tout en chiffrant les backups.
La doc est aussi très bien faite.

letsar

  • Client Orange vdsl
  • *
  • Messages: 464
  • Ille-et-Vilaine - Accès à la fibre en 2023 - 2030
Sauvegarde incrémentielle et différentielle d'un serveur
« Réponse #9 le: 06 novembre 2021 à 17:43:52 »
Korben a fait un article sur Restic :

https://korben.info/comment-sauvegardez-vos-fichiers-avec-restic.html

ainsi qu'une vidéo :


Sn@ke

  • Officiel nPerf.com
  • Professionnel des télécoms
  • *
  • Messages: 433
  • FTTH OVH 1000/500 sur Lyon (69)
    • nPerf
Sauvegarde incrémentielle et différentielle d'un serveur
« Réponse #10 le: 06 novembre 2021 à 22:44:28 »
Sinon t'as ZFS ;)

kazyor

  • Expert SFR
  • Expert
  • *
  • Messages: 1 171
  • Lyon 7ème (69)
Sauvegarde incrémentielle et différentielle d'un serveur
« Réponse #11 le: 08 novembre 2021 à 17:37:03 »
sudo apt install tcptraceroute : Dépendance à installer. "tcptraceroute" est utilisé pour vérifier que le port de SSH répond avant de lancer la sauvegarde.


De mon côté, j'aime bien utiliser ncat avec un post traitement de l'exit (0 ou 1) :

kazyor:~$ ncat -w .1 -z 127.0.0.1 80
kazyor:~$ echo $?
0
kazyor:~$ ncat -w .1 -z 127.0.0.1 81
kazyor:~$ echo $?
1