Serveur NAS/ownCloud – RSYNC

Retour à l’article principal : https://www.inzecloud.net/index.php/2016/04/04/linuxhardkernel-nas-et-cloud-perso-avec-odroid-xu4-et-son-boitier-cloudshell/

J’effectue tous les jours une sauvegarde complète du disque de l’XU4 vers le second disque connecté sur le port USB2.0 de l’XU4 en utilisant Rsync.

J’ai donc programmé une tâche cron tous les jours à 00:00 qui va copier l’ensemble des données Samba et ownCloud vers le second disque et Rsync est l’outil parfait pour cela :

$ crontab -e
0 0 * * * /root/scripts/script_rsync.sh

Rsync est également capable de gérer une « Corbeille ». C’est à dire que si un fichier a été supprimé du disque source, Rsync va alors le supprimer du disque de destination mais va d’abord en faire une copie vers le répertoire désigné comme étant la corbeille. A vous de voir si vous souhaitez activer cette option (en commentaire dans le script).

Voici le script que j’ai en place dans ma configuration. Il est capable d’envoyer des mails lorsque la sauvegarde s’est bien terminée (ou non). Il exécute un deuxième script (optionnel) qu’on verra plus bas. Enfin, le script est logué et le log est envoyé à l’adresse mail si il y a des erreurs dans la sauvegarde. Donc c’est un peu plus qu’une simple commande rsync :

#!/bin/bash

# Initialisation de variables pour afficher de la couleur dans le terminal + emplacement du fichier de logs
set -u
ESC_SEQ="\x1b["
COL_RESET=$ESC_SEQ"39;49;00m"
COL_GREEN=$ESC_SEQ"32;01m"
COL_RED=$ESC_SEQ"31;01m"

DISK_SOURCE=/media/disque
DISK_CIBLE=/media/disque_sauvegarde
#CORBEILLE=/media/disque/Corbeille
LOG=/var/log/rsync.log


# Les parenthèses englobent tout ce qui sera reporté dans le fichier de logs
(
echo "Vérification des points de montage :"
sleep 2
if grep -qs $DISK_SOURCE /proc/mounts && grep -qs $DISK_CIBLE /proc/mounts; then
 echo -e "[$COL_GREEN OK $COL_RESET]"
 sleep 2
 echo "Démarrage de la sauvegarde"
 sleep 2


 # Les accolades forment un bloc de toutes les actions qui sont exécutées.
 # Si une de ces actions ne se termine pas correctement, on sort du bloc d'accollades et on rentre dans le suivant en bas du script.
 {
 # z : compresse les données lors du transfert
 # v : verbose, affiche ce qu'il se passe
 # r : récursif
 # u : incrémental
 # t : préserve les dates de création et de modification des fichiers copiés
 # --progress : affiche la progression à l'écran
 # --delete : supprime les fichiers dans la destination qui ne sont pas/plus présents dans la source. Ces fichiers sont tout de même
 # copiés dans une corbeille (option backup et backup-dir)
 # --backup : copie les fichiers supprimés par l'option delete dans backup-dir
 # rsync -zvrtpo --stats --progress --delete --backup --backup-dir=$CORBEILLE $DISK_SOURCE/ $DISK_CIBLE/ && (à décommenter si vous souhaitez utiliser une corbeille et commenter la suivante)
 rsync -zvrtpo --stats --progress --delete $DISK_SOURCE/ $DISK_CIBLE/ &&
 echo 'Copie RSYNC terminée' | mutt -s 'Copie RSYNC terminée' -e 'set content_type=text/html' mon_mail &&
 /root/scripts/script_check_taille_disques.sh

 } || {
 # Si une commande ne s est pas terminée correctement, le script s arrête et une alerte est envoyée :
 echo 'Copie RSYNC échouée' | mutt -s 'Copie RSYNC échouée, afficher les logs' -a $LOG -- mon_mail &&
 /root/scripts/script_check_taille_disques.sh

 }

# Si la première condition n'est pas remplie, alors il y a un soucis avec le point de montage
else
 echo -e "[$COL_RED NOK $COL_RESET]"
 echo "Un disque n'est pas monté sur le point de montage ou il est en erreur. Sauvegarde interrompue."
 echo "Un disque n'est pas monté sur le point de montage ou il est en erreur. Sauvegarde interrompue." | mutt -s "Sauvegarde échouée, afficher les détails" mon_mail
fi

) 2>&1 | tee $LOG

exit 0

Que la sauvegarde se soit terminée correctement ou non, ce script fait appel à un second script « script_check_taille_disques.sh » dont la fonction est de calculer les espaces libres et utilisés des différents disques et répertoires afin de permettre de les comparer dans un rapport envoyé par mail sous forme de tableau. Bien pratique pour s’assurer que rsync a fonctionné correctement car à priori si les répertoires samba et data sont identiques sur les deux disques, c’est que la sauvegarde est OK (après il faudrait comparer le nombre de fichiers pour être sur mais bon…) :

rapport_taille_disques

Ce script fonctionne en l’état, il vous suffit juste d’adapter les deux premières variables (chemins des disques) et si vous utilisez une corbeille, de dé-commenter les lignes concernant cette dernière et les adapter. L’exécution de ce script peut prendre plusieurs minutes en fonction de la taille de vos disques :

#!/bin/bash

## Vérification des différences entre les disques source et cible et envoi d'un rapport

# Initialisation de variables pour afficher de la couleur dans le terminal + emplacement du fichier de logs
set -u
SOURCE=/media/disque
CIBLE=/media/disque_sauvegarde
#CORBEILLE=/media/disque/Corbeille

# Taille total des disques source et cible
taille_source=$(df -h $SOURCE | awk 'END {print $2}')
taille_cible=$(df -h $CIBLE | awk 'END {print $2}')

# Espace total utilisé sur les disques source et cible
utilise_source_total=$(du -h $SOURCE | awk 'END {print $1}')
utilise_cible_total=$(du -h $CIBLE | awk 'END {print $1}')

# Espace utilisé par samba sur les disques source et cible
utilise_source_samba=$(du -h $SOURCE/samba/ | awk 'END {print $1}')
utilise_cible_samba=$(du -h $CIBLE/samba/ | awk 'END {print $1}')

# Espace utilisé par data sur les disques source et cible
utilise_source_data=$(du -h $SOURCE/data/ | awk 'END {print $1}')
utilise_cible_data=$(du -h $CIBLE/data/ | awk 'END {print $1}')

# Espace total libre sur les disques source et cible
libre_source=$(df -h $SOURCE | awk 'END {print $4}')
libre_cible=$(df -h $CIBLE | awk 'END {print $4}')

# Espace utilisé par la Corbeille (à décommenter si corbeille utilisée)
#utilise_corbeille=$(du -h $CORBEILLE | awk 'END {print $1}')

# Nombre de fichiers dans la Corbeille (à décommenter si corbeille utilisée)
#fichiers_corbeille=$(find $CORBEILLE -type f | wc -l)

echo " <!DOCTYPE html>\
        <html>\
        <head>\
        <meta charset='utf-8' />\
        </head>\
        <body>\
        <style>\
        table {\
        border: 1px solid black;\
        border-radius: 6px;\
        text-align: center;\
        font-family: Calibri;\
        border-collapse:collapse;\
        }\
        th {\
        border: 1px solid black;\
        padding: 10px;\
        background-color:#5F8CA3;\
        width: 150px;\
        height: 30px;\
        color: white;\
        }\
        td {\
    border: 1px solid black;\
        padding: 10px;\
        box-shadow:\
                0px 1px 1px 0px rgba(0, 0, 0, 0.5) inset,\
                0px 2px 2px 0px rgba(255, 255, 255, 0.2);\
        }\
        </style>\
        <center>\
        <table>\
                <tr>\
                        <th></th>\
                        <th>Disque source</th>\
                        <th>Disque cible</th>\
                </tr>\
                <tr>\
                        <th>Taille totale</th>\
                        <td>" $taille_source "</td>\
                        <td>" $taille_cible "</td>\
                </tr>\
                <tr>\
                    <th>Espace utilisé</th>\
                        <td>" $utilise_source_total "</td>\
                        <td>" $utilise_cible_total "</td>\
                </tr>\
                <tr>\
                        <th>/samba</th>\
                        <td>" $utilise_source_samba "</td>\
                        <td>" $utilise_cible_samba "</td>\
                </tr>\
                <tr>\
                        <th>/data</th>\
                        <td>" $utilise_source_data "</td>\
                        <td>" $utilise_cible_data "</td>\
                </tr>\
                <tr>\
                        <th>Espace libre</th>\
                        <td>" $libre_source "</td>\
                        <td>" $libre_cible "</td>\
#                <tr>\ (à décommenter si corbeille utilisée)
#                       <th>Corbeille</th>\
#                       <td colspan='2'>$utilise_corbeille | $fichiers_corbeille fichier(s)</td>\
#                </tr>\
    </table>\
        </center>\
        </body>\
        </html>" | mutt -s 'Taille disques' -e "set content_type=text/html" mon_mail

 

%d blogueurs aiment cette page :