King76 au Québec Des confidences, du Web, des logiciels libres et plus encore !

9jan/1123

Faites des backups avec Synology !

Un peu avant Noël j'ai eu un crash d'un de mes disques sur mon "Media Center" qui roule sous Mythtv et XBMC. Un disque dur qui avait 6 mois, d'une taille de 2TO, pratiquement plein à 90% ! J'ai perdu pas mal de choses, dont des mp3 que je classais, taguais, etc.. bref j'en prenais soin.

La raison de ce plantage peut provenir de deux choses :

  1. Soit un problème de ventilation, en effet le disque frôle les 46 degrés en permanence, alors qu'il devrait avoisiner les 35 degrés;
  2. C'était un modèle "Green Caviar" de marque Western Digital, non de code W20EARS, et depuis j'ai appris de plusieurs sources que ces disques ont un mode "écologique" qui fait en sorte que les têtes du disque dur sont souvent mises à l'arrêt plusieurs fois par heure. Sauf que sur un ordinateur allumé 24h/24h comme le mien ça n'est pas très recommandé.

J'ai donc décidé d'investir dans du lourd avec un nouveau disque dur de 1.5TO du même constructeur, c'est le modèle entreprise "Black Caviar" pas mal plus cher que la version Green "écolo" ou Blue "familiale". Malheureusement après remplacement il annonce toujours 46 degrés et malgré un ventilateur silencieux de 92mn que j'ai ajouté, ça n'a rien changé, il va falloir investir davantage je pense, mais je n'y connais rien.

Le père noël m'a également apporté aussi un clavier sans fil avec trakball de marque IOGEAR 100% compatible GNU/Linux même les boutons de raccourcis, ainsi qu'un NAS (Network Attached Storage). Avec le retour de mon disque de 2TO "Caviar Green" du SAV, j'ai maintenant un système de backup pour que mes problèmes n'arrivent plus ! Je vais donc vous parler de ce NAS et sa configuration.

Synology DS211j

J'ai donc opté pour un NAS de marque Synology DS211j sur conseil de Nicolas qui était venu nous parler du D-Link DNS323 lors d'une émission de "La voix du libre". C'est une belle machine pas trop cher (220$ environ) qui peut recevoir deux disques durs, avec un processeur de 1.2 ghz et 128Mo de mémoire. Le ventilateur a l'intérieur est vraiment silencieux et le disque dur de 2TO que j'ai mis dedans annonce 30 degrés. Contrairement à ce qui est indiqué sur le CD, l'installation et la configuration peuvent s'effectuer sous GNU/Linux, il y a un exécutable qui permet l'installation sur mon LinuxMint ! Une fois l'installation effectuée et la préparation du disque dur faites, la gestion courante s'effectue depuis une interface Web très jolie (technologie extJS ?).

J'ai trouvé un test en anglais ici de la bête : http://www.testfreaks.com/blog/review/review-of-synology-diskstation-ds211j/ et un autre en français d'un modèle précédent : http://www.justblogit.net/2010/10/test-du-serveur-domestique-synology.html

Préparation

Mais avant de vous en dire plus, il a fallu un peu de préparation sur le disque dur. Étant donné que je compte me servir de ce NAS pour faire un backup de mes autres ordinateurs, je n'ai pas regardé comment configurer le RAID, mais le NAS le supporte. Toutefois étant donné que je comptais y mettre le fameux disque dur Caviar Green tout neuf qui m'a été renvoyé, je devais régler ce problème d'économie d'énergie en le désactivant. Cette procédure s'effectue en gravant une image ISO de quelques méga-octets et qui va se charger de démarrer l'ordinateur dans une fenêtre DOS. Vous pouvez aussi consulter l'explication en français sur le forum francophone de la communauté Synology.

Donc après un coup de WDIDLE3.EXE /D (deux fois pour que ce soit pris en compte), mon disque n'allait plus m'embêter. Il me suffira de vérifier après coup avec l'outil smartmontools si la colonne "Load cycle count" (code 193) affiche encore un chiffre important ! (environ 60 arrêts/reprises par heure). D'ailleurs l'interface du Synology offre aussi l'accès à cet excellent outil qu'est Smartmontools.

Passé cette étape, j'avais lancé quelques recherches dans la communauté francophone "Synology" (www.nas-forum.org) pour me rendre compte qu'une étape préparatoire du disque était nécessaire. Après quelques recherches le lien de référence trouvé (http://fredo.servehttp.com/html/Astu-19_2.htm#preparation), j'ai fini par m'orienter vers la ressource officielle de Synology qui indiquait que l'étape n'était plus nécessaire avec la dernière version du firmware le fameux DSM 3.0. Malgré cela je l'ai fait sur conseil de la communauté. En faite ceci consiste à faire une sorte de formatage bas niveau, j'ai choisi de le faire via un boot CD nommé "DBAN" et cela a duré 13h pour mon disque de 2TO. Cette procédure semble ne servir à rien pour un disque neuf, à vous de voir.

J'étais donc prêt pour passer enfin à du concret, c'est à dire installer le disque dur et le préparer, après quelques minutes le disque était disponible sur mon réseau local et accessible via un accès SSH (à activer depuis l'interface).

Comme je l'ai dit un peu plus haut, l'interface Web est vraiment conviviale, je m'en suis servi pour valider mon compte utilisateur et me créer des répertoires de stockage sur le disque dur. Pendant cette étape, il est également possible de gérer les accès à ces dossiers de partage soit via Samba (pour Windows) ou NFS (GNU/Linux).

Je vous passe en détail tout ce qu'il est possible, mais voici ce que j'ai retenu :

  • Configurer les notifications pour recevoir les courriels
  • Monitorer le taux d'occupation du CPU, mémoire ou réseau
  • Obtenir l'espace restant sur les disques durs
  • Naviguer dans le système de fichier
  • Configurer la partie multimédia (musique, photo, ..) => Y'a même des applications pour Android !

Voici une capture d'écran de l'interface complète :

Mon interface de contrôle du Synology

Prise des sauvegardes

Voici la partie la plus intéressante il me semble, celle qui consiste à trouver la meilleure solution pour réaliser les différentes sauvegardes de mes ordinateurs. En premier lieu ne trouvant rien dans les options du Synology pour réaliser les backups, je me suis retourné vers Google. En faite, les seules options disponibles sur le Synology ce sont celles permettant d'effectuer une copie de sauvegarde du NAS vers un autre NAS, un disque externe ou carrément sur le Web via les services offerts par Amazon S3.

Options de backup du Synology

Vous pouvez consulter la référence ici sur le wiki du constructeur : http://forum.synology.com/wiki/index.php/What_is_a_Backup%3F

J'étais un peu déçu et je me suis résigné à chercher des applications qu'il aurait fallu que j'installe sur chacune de mes machines. Applications basées sur la commande "rsync" puisque mes ordis sont tous sous GNU/Linux et qu'il est facile de gérer la synchronisation incrémentale avec cette commande. C'est à ce moment-là que je suis tombé sur le programme "LuckyBackup", solution vraiment conviviale pour configurer des copies sur des serveurs distants grâce à "rsync" et des "crons". Mais ça n'est pas cette solution que j'ai retenue, j'ai trouvé mieux en faîte !

Gérer ses clés privées/publics

Avant de vous donner ma recette, il a fallu que je règle un autre problème : Comment faire parler toutes mes machines via une commande "rsync" sans que je n'ai à passer le mot de passe en paramètre ou que j'ai à le saisir à chaque fois. Comme "rsync" est basé sur la commande SSH, il faut passer la gestion des clés privées/publics. Je suis donc parti de ce tutoriel qui explique la procédure finalement assez simple : http://www.k-tux.com/openssh-les-cles-de-la-connexion-automatique. Un autre tuto au cas ou : http://www.naschenweng.info/2008/07/26/nas-enable-scp-and-password-less-ssh-log

Une fois cette étape franchie, toutes vos machines vont pouvoir effectuer des connexions sans problème, les unes aux autres via ssh. À ce propos, le Synology ne gère pas la commande SCP mais gère en natif les commandes SSH et RSYNC. C'est important de préciser à ce moment là que cette machine est basé sur le système GNU/Linux, son nom de code "BusyBox". J'imagine que ceux qui voudraient avoir la commande SCP pourraient installer IPKG qui est une sorte d'équivalent de APT-GET, YUM, ... et qui permet d'installer plein d'autres programmes, mais je n'en suis pas encore là dans mon expérience je voulais juste le signaler au passage.

Créer ses propres scripts

Finalement, je suis tombé par hasard sur un message sur le forum de la communauté francophone de Synology qui vantait les mérites de LFTP, une autre solution pour gérer des synchros incrémentales et paraît-il simple à mettre en place et rapide. Sauf que je n'avais pas le goût d'installer un serveur ftp sur mes ordis puisque j'avais déjà SSH qui tournait. On s'entend pour dire que c'est redondant, sans oublier que "rsync" permet également de sauvegarder les droits sur les fichiers ! Mais un coup de Google mon ami, m'a quand même orienté vers cette ressource : http://www.cobestran.com/actualite/synology-sauvegarde-site-web-par-ftp-avec-lftp/

Je crois que c'est avec cette ressource que j'ai enfin compris comment fonctionnait un Synology : Gestion des crons, envois de courriels, tests, commandes, variables. Vous le comprendrez, je pars de loin, parce qu'avec ce genre de solutions, il faut avoir des connaissances en Bash et les miennes sont vieilles de 10 ans.

Je vais donc vous présenter ici ma solution pour mes trois ordinateurs à sauvegarder. Cette solution est basée sur la ressource citée plus haut avec LFTP, ainsi qu'un autre billets http://www.cobestran.com/actualite/synology-planification-de-scripts/ et plusieurs autres références que je vais vous citer un peu plus loin dans mon billet.

Présentation de mon réseau

À la maison, j'ai 4 ordinateurs :

  • Un ordinateur pour les enfants sous Windows XP (qui n'est pas pris en backup pour l'instant, mais cela pourrait se faire via le partage Samba au pire des cas);
  • Un ordinateur de type "media center" avec Mythtv, XBMC, Boxee, Torrent et autres bidules;
  • Mon laptop sous Linux-Mint;
  • L'ordinateur de ma blonde qui est sous Ubuntu depuis peu.

J'ai donc 3 ordinateurs à sauvegarder, mais tous ne sont pas connecté en permanence sur le réseau, seul le "media center" est allumé 24h/24h.

Voici donc la répartition des répertoires sur mon disque dur ou sont sauvegardés les données (qui se nomme "volume1" sur le NAS) :

  • manue : L'ordinateur de ma blonde avec des sous-répertoires
    • home : Son répertoire home de travail sous Ubuntu 10.10 (courriels, bureau, photos, mp3, ..)
    • video : Un autre disque dur ou l'on met un peu de tout qui contient surtout des trucs à graver comme des DIVX ou des jeux vidéos
  • media_center : L'ordinateur qui est branché sur la TV ou l'on y met plein de contenu multimédia
    • mythtv : Les enregistrements effectués depuis Mythtv à la TV
    • home : Le répertoire home qui contient toute la configuration des programmes : nvidia, mythtv, xbmc, ..
    • backup : Une partition sur un autre disque dur ou je fais des copies ou liens symboliques vers des ressources qui sont dans la partition système
    • temporaire : Le dossier qui me sert à stocker temporaire des films que je récupère sur torrent
  • NetBackup : C'est un répertoire qui était de base avec le système, je devrais le supprimer un jour
  • scripts : C'est un répertoire qui contient mes scripts bash dont je vais vous parler un peu plus tard
  • yannick : Le répertoire ou je stocke une sauvegarde de mon laptop
    • home : Mon home (très gros !)
    • musique : Une autre partition sur mon ordi qui me sert un peu pour mettre n'importe quoi mais qui devait contenir initialement Ubuntu Studio !

Répertoires sur mon NAS

J'ai fini par trouver cette organisation-là, en améliorant mon script jour après jour.

Regardons de plus près le contenu de mon répertoire "scripts" :

  • log_general.log : C'est un log que je génère à chaque copie de sauvegarde qui contient la date l'heure, quel répertoire a été sauvegardé et le temps que cela a pris
  • backup.sh : C'est le script principal qui permet d'effectuer les sauvegardes, que je vais décrire en détail un peu plus loin
  • crontab.backup : C'est un backup du crontab (faudrait que je le mette ailleurs, ça fait tache ici lol)
  • backup_inverse.sh : C'est à peu près la même chose que mon script principal, mais pour effectuer des sauvegardes du Synology vers un autre ordinateur. Un jour je ferais en sorte d'en avoir un seul pour tout faire.
  • exclude_home.txt : C'est un fichier qui contient les répertoires que je veux exclure lorsque je copie un répertoire "home" sous linux
  • restart-cron.sh : C'est un script qui permet de relancer le cron lorsque je modifie le crontab, et qui fait une copie automatique (dans le fichier crontab.backup) tel que pompé sur ce blogue.
  • exclude_vide.txt : Fichier qui contient tous les fichiers à exclure lors des sauvegarde. Il contient juste une seule ligne (lost+found) que j'utilise lorsque je veux copier un répertoire qui contient des vidéos par exemple
  • backup_manuel : Des fois j'effectue des copies manuelles de certains fichiers qui ont tendance à se faire écraser par je ne sais qui, genre le fichier "crontab" qui se trouve dans /etc/
  • Les autres répertoires "manue, yannick, media_center, backup" contiennent un fichier de configuration ainsi que les logs de chaque script qui est exécuté par le système
  • Le répertoire "synology" contient des scripts particuliers pour copier des données sur d'autres ordinateurs à partir de données qui sont sur mon NAS.

Contenu du répertoire des scripts

Regardons de plus près le contenu d'un répertoire de configuration, exemple l'ordinateur de ma blonde "manue":

Contenu du répertoire de Manue

Comme vous pouvez le voir, il y a plusieurs fichiers qui ont comme préfixe "home" ou "video". Pour chaque configuration possible, j'ai un fichier de configuration "home_config.txt", un fichier qui affiche le résultat de la commande "rsync" que j'ai appelé "home_execution.log" et un fichier "home_rsync.log" qui contient le log complet généré par la commande "rsync". Ce dernier liste tous les fichiers qui ont été modifié sur le serveur de destination que "rsync" a mis à jour ou supprimé. Et des fois je peux créer un fichier "video_exclude.txt" pour préciser certains fichiers ou répertoires à exclure lors de la prise de backup. Sinon je pointe vers un des fichiers génériques "exclude_home.txt" ou "exlude_vide.txt".

Je vais vous montrer le contenu du fichier "home_config.txt" :

###########################################
## Ordi a sauvegarder : Manue
## Partition : /home/manue/
###########################################

EXCLUDE='/volume1/scripts/exclude_home.txt'
SOURCE=/home/manue/
DESTINATION=/volume1/manue/home/
UTILISATEUR=root
IP=192.168.0.6

AVERTISSEMENT ! À partir de ce moment-là vous aller voir des lignes de code en "bash", je tiens à vous prévenir que je suis loin d'être un spécialiste de ce langage et que tout ce que j'ai codé à partir de là, je l'ai pompé ailleurs et trouvé grâce à Google, mais surtout testé jusqu'à ce que ça fonctionne. Soyez donc indulgent et proposez-moi des améliorations si vous voulez.

Ce ne sont en faite que des variables que je vais exploiter dans le script "backup.sh" qui se trouve à la racine du répertoire "scripts".

On y trouve :

  • EXCLUDE : Le chemin vers le fichier ou je peux indiquer tous les fichiers ou dossiers à ne pas copier sur le serveur SOURCE.
  • SOURCE : Le répertoire à copier sur le serveur sur lequel mon script va se connecter
  • DESTINATION : Le répertoire sur mon NAS ou le contenu va être copié et synchroniser (d'ailleurs actuellement mon script ne fait pas de sauvegarde incrémentale, il ne s'assure que d'avoir la dernière copie à jour)
  • UTILISATEUR : Avec quel utilisateur la connexion SSH doit s'effectuer (c'est dans le répertoire .ssh de l'utilisateur que vous devez gérer la clé public.
  • IP : L'adresse IP de la machine. Si vous configurer les adresses IP dans votre routeur à partir de l'adresse MAC cela ne devrait jamais changer dans le futur

Comme vous le voyez, une fois en place, c'est super simple de rajouter une nouvelle sauvegarde, de n'importe quelle machine et n'importe quel répertoire sur ladite machine.

Avant de voir le contenu du script "backup.sh", il faut savoir que ce script prend en compte des paramètres, deux en faite. En voici un exemple :

backup.sh manue home
  1. Le premier paramètre permet de définir dans quel répertoire (sur mon NAS) se trouve le fichier de configuration (ici le répertoire "manue")
  2. Le deuxième paramètre permet de définir quel fichier de configuration doit être importé dans mon script (ici le fichier home_config.txt)

Une fois qu'on a compris le principe, on est capable d'appeler les différentes prises de baclup depuis le fichier "crontab" pour que le tout se fasse de manière automatique. Voici le contenu du mien :

# minute  hour mday month  wday    who    command
#### Toutes les nuits #########################################################################
0     0    *    *    *    root  /usr/sbin/ntpdate -b pool.ntp.org
30    0    *    *    *    root  /volume1/scripts/backup_inverse.sh synology scripts > /dev/null
40    0    *    *    *    root  /volume1/scripts/backup_inverse.sh synology photos > /dev/null
0     1    *    *    *    root  /volume1/scripts/backup.sh media_center backup
10    1    *    *    *    root  /volume1/scripts/backup.sh media_center home
20    1    *    *    *    root  /volume1/scripts/backup.sh media_center mythtv
0     3    *    *    *    root  /volume1/scripts/backup.sh media_center temporaire && /sbin/poweroff
#### Tous les samedis (ou le dernier du mois ) ################################################
0    12    *    *    6    root  /volume1/scripts/backup.sh manue home
0    3     *    *    6    root  [ `/bin/date +\%d` -gt `/bin/date +\%d -d "6 day"` ] && /volume1/scripts/backup.sh manue video
#### Tous les dimanche #########################################################################
0    12    *    *    0    root  /volume1/scripts/backup.sh yannick home
0    1     *    *    0    root  /volume1/scripts/backup.sh yannick musique

Comme vous le voyez, chacun des scripts est appelé à des heures différentes. Comme il est possible de définir à quelle heure le NAS doit s'allumer (dans mon cas 23h50), j'ai tout programmé pour que les copies se fassent la nuit. En tout cas tout ce qui doit être fait sur ma MythBox et la fin de semaine pour les ordinateurs familiaux (samedi et dimanche). Faudrait que j'améliore le tout pour que les scripts du week-end puissent par eux même détecter la présence des ordinateurs sur le réseau et effectuer les copies, parce que si un des ordinateurs n'est pas allumé le samedi ou le dimanche, la copie ne s'effectuera que 7 jours plus tard.

On peut voir deux lignes au début qui appelle mon script "backup_inverse.sh", ce sont des scripts qui permettent de faire une copie de mon répertoire "scripts" (du NAS) sur une autre machine ainsi que copier les photos de famille sur ma MythBox. Eux n'ont pas de log ou de courriels d'envoyés pour l'instant.

J'ai ajouté aujourd'hui l'option à la fin d'une de mes lignes "&& /sbin/poweroff" pour que l'ordinateur puisse se fermer tout seul dans la nuit. En regardant toutes ces lignes, on pourrait imaginer qu'un seule suffise et qui ferait toutes les opérations les unes après les autres, cela éviterait peut-être que l'ordinateur se ferme vers 4-5h du matin si toutes les opérations ne s'effectuent qu'en quelques minutes. Je pense notamment à la copie du home ou des backups de ma MythBox, cela prend 1mn chacune.

Note : J'ai trouvé sur la page de Wikipedia l'astuce pour qu'un script se lance le dernier samedi du mois, je ne sais pas si ca va marcher : http://fr.wikipedia.org/wiki/Crontab

Contenu du script principal

Voici dès à présent le contenu de mon script "backup.sh". Le but de cette présentation en détail peut servir d'inspiration aux programmeurs "bash" en herbe qui tout comme moi veulent vraiment savoir ce qui se passe sur leur machine.

#!/bin/sh
## Temps d'execution du script
START=$(date +%s)

Ces premières lignes permettent de stocker en seconde l'heure de démarrage du script.

## Configuration du script general et courriels
EMPLACEMENT=/volume1/scripts
MAIL_FR=/usr/syno/synoman/webman/texts/fre/mails

Ici quelques variables, dont une qui indique ou se trouve le contenu des courriels qui doivent être envoyés lors des notifications.

# Inclure la configuration
source $EMPLACEMENT/$1/$2_config.txt

Ici je fais une inclusion du fichier de configuration basé en fonction des paramètres appelés par le script.

## Journalisation
LOG=$EMPLACEMENT/$1/$2_execution.log
LOG_RSYNC=$EMPLACEMENT/$1/$2_rsync.log
LOG_GENERAL=$EMPLACEMENT/log_general.log

J'indique ici ou se trouvent les différents fichiers de log pour chaque script appelé. Je pourrais les changer plus facilement le jour venu.

## Debut du script pour les logs
echo "##### Debut de la copie en date du $(date) #####" >> $LOG

Ici je décide ce que je veux mettre dans mon fichier de log "personnalisé", qui est différent de celui généré par la commande "rsync"

# Commande de synchronisation
RSYNC_RES=$(rsync -h --stats -r -z -p -E -l --delete -D --update --log-file=$LOG_RSYNC --exclude-from $EXCLUDE $EXTRA_OPTIONS -e "ssh" $UTILISATEUR@$IP:$SOURCE $DESTINATION)
echo $RSYNC_RES >> $LOG

Ici la commande "rsync" au complet qui permet d'avoir une copie exacte du répertoire distant et de ses sous-répertoires. Je stocke le résultat de cette commande dans une variable parce qu'en cas d'échec je m'envoie par courriel le résultat. Puis je rajoute le résultat dans mon log perso au passage. (Si quelqu'un peut le faire en une seule ligne qu'il me fasse signe héhé). On peut voir ici la variable $EXTRA_OPTIONS que j'utilise dans certains fichiers de configuration. Exemple avec un de mes scripts je demande à la commande "rsync" de transformer les liens symboliques en répertoire (EXTRA_OPTIONS=--copy-dirlinks), cela me permet de copier des fichiers de configuration qui se trouve dans la racine de mon système (/etc/lirc/ ou /etc/samba/ ...) plus facilement.

Pour en savoir plus sur les options de la commande "rsync" consulter l'aide officielle : http://samba.anu.edu.au/ftp/rsync/rsync.html

## Afficher le temps d'execution
STOP=$(date +%s)
RUNTIME=`expr $STOP - $START`

J'ai piqué ce truc là sur le net, je ne sais pas si c'est bien écrit, mais ça me permet d'avoir le temps d'exécution du script en secondes.

## Preparation du courriel
cp /usr/syno/synoman/webman/texts/fre/mails /usr/syno/synoman/webman/texts/fre/mails.orig
echo "
[BackupGood]
Subject:  : Reussite pour $1 ($2)
" >> $MAIL_FR
printf "Backup realise en %02d:%02d:%02d" $((RUNTIME/3600)) $((RUNTIME/60%60)) $((RUNTIME%60)) >> $MAIL_FR
echo " le $(date +"%d-%m-%Y a %H:%M")                                                                     

[BackupBad]
Subject:  : Echec pour $1 ($2)                                                                            

Voici le log d'erreur :                                                                                   

$RSYNC_RES" >> $MAIL_FR

Ouf, voici plusieurs lignes de code qui peuvent paraître inutile, mais détrompez-vous j'ai découvert cela aujourd'hui et je suis super content ! C'est une astuce qui permet de personnaliser à volonté l'envoi des courriels. Il faut savoir que les courriels envoyés par le système sont stockés dans le fichier "/usr/syno/synoman/webman/texts/fre/mails" sous cette forme :

[NomDeVotreVariable]
Subject : Titre du sujet de votre courriel

Texte de votre courriel

Vous pouvez lire ce sujet pour en savoir plus sur le fonctionnement de base.

Donc, quand on voit le nombre de scripts différents que j'ai, il faudrait que j'ajoute dans ce fichier, plusieurs variables toutes différentes et rattachées à chacun de mes scripts, de manière à avoir un courriel personnalisé du genre : Le répertoire HOME de la machine MYTHTV a été sauvegardé avec succès.

(Note : Je ne sais pas pourquoi, mais il m'est impossible d'écrire un accent dans l'environnement BusyBox... donc les courriels sont sans accents et les commentaires dans mon code aussi.)

Mais en cherchant sur Google, je suis tombé sur un message d'un forum allemand qui donne cette astuce. L'astuce consiste à rajouter temporairement le texte de notre courriel à la fin du fichier de configuration des mails du système, de faire notre envoi et ensuite de restaurer le fichier d'origine. Ainsi il est facile de générer un sujet et texte pour chaque envoi ! Elle n'est pas belle la vie ?

Je profite donc de cette astuce pour générer un courriel sur mesure lorsque la sauvegarde a été positive qui contient le temps d'exécution du script et le résultat de la commande "rsync" en cas d'échec.

## Envoi du courriel
if [ $? -eq 0 ]
 then {
 /usr/syno/bin/synomail BackupGood
 ETAT=Parfait
}
 else {
 /usr/syno/bin/synomail BackupBad
 ETAT=Erreur
}
fi

Un test sur la variable "$?" permet de vérifier si la commande "rsync" c'est executée avec succès ou non. Et d'envoyer le courriel avec le bon paramètre. Le paramètre ETAT est utilisé pour le log un peu plus loin.

## Restauration du fichier d'origine pour les courriels
sleep 3
cp /usr/syno/synoman/webman/texts/fre/mails.orig /usr/syno/synoman/webman/texts/fre/mails

Je restaure le fichier d'origine des courriels du système, mais j'ai été obligé de mettre une petite pause, parce que sinon l'envoi du courriel ne se fait pas assez rapidement et la copie est restauré trop tôt ;-(

## Fin du script de log
echo "=> Resultat : "$ETAT >> $LOG
printf "Temps d'execution : %02d:%02d:%02d\n" $((RUNTIME/3600)) $((RUNTIME/60%60)) $((RUNTIME%60)) >> $LOG
echo "##### Fin de la copie en date du $(date +"%d-%m-%Y a %H:%M") #####" >> $LOG

Je stocke dans le fichier de log du script quelques informations utiles.

## Stocker les infos dans un log general
printf "%s (%s) en %02d:%02d:%02d" $1 $2 $((RUNTIME/3600)) $((RUNTIME/60%60)) $((RUNTIME%60)) >> $LOG_GENERAL
echo " le $(date +"%d-%m-%Y a %H:%M")" >> $LOG_GENERAL

Je fais la même chose pour mon log général. On voit que j'ai une commande qui se répète plusieurs fois et qui permet d'avoir le temps d'exécution, j'imagine que y'a moyen d'économiser cela par une fonction en bash ?

Voici donc la fin de mon script. Je l'ai peaufiné pendant mes vacances pour y ajouter plusieurs options, j'espère qu'il pourra vous être utile pour faire votre propre script.

De mon côté, je compte améliorer l'ensemble :

  • Faire un script qui permettrait soit d'effectuer des sauvegardes distantes, soit de copier un répertoire qui est sur mon NAS vers un autre serveur, au lieu d'avoir à gérer deux scripts (backup.sh et backup_inverse.sh)
  • Trouver le moyen que les scripts puissent s'enchaîner les uns après les autres la nuit pour que le NAS reste le moins longtemps allumé;
  • Vérifier pour les ordinateurs qui ne sont pas allumés 24h/24h quand ils sont "ON" et effectuer une copie rapidement, au lieu d'attendre le samedi ou le dimanche et espérer qu'ils soient "ALLUMÉ";
  • N'envoyer qu'un seul courriel avec le récapitulatif de toutes les sauvegardes de la journée au lieu d'en recevoir 4-5 par jour;
  • Faire des scripts pour sauvegarder les bases de données MySQL distantes qui sont sur mon laptop;
  • Faire des sauvegardes incrémentielles de certaines données, parce que s'il m'arrivait de faire le con sur un de mes ordis je pourrais avoir des surprises en ne récupérant qu'une copie de la veille qui pourrait se retrouver effacée (la synchro avec "rsync" dans ma configuration supprime des données qui auraient été supprimées sur le serveur distant).

Je dois également faire des tests de restauration, parce que c'est bien beau de sauvegarder tout plein de fichiers avec les bonnes permissions, mais quand il va falloir restaurer un "home" un jour... sachant que je ne sauvegarde pas le système au complet, enfin c'est déjà mieux que rien !

Je suis déjà bien satisfait de mon petit système, et vous ?

Exemples de fichiers

Un log personnalisé :

##### Debut de la copie en date du Fri Jan  7 02:00:01 EST 2011 #####

Number of files: 37
Number of files transferred: 21
Total file size: 70.94G bytes
Total transferred file size: 31.20G bytes
Literal data: 31.20G bytes
Matched data: 0 bytes
File list size: 1.25K
File list generation time: 0.007 seconds
File list transfer time: 0.000 seconds
Total bytes sent: 1.08K
Total bytes received: 23.85G
sent 1.08K bytes  received 23.85G bytes  3.78M bytes/sec
total size is 70.94G  speedup is 2.97

=> Resultat : Parfait
Temps d'execution = 01:45:11

##### Fin de la copie en date du 07-01-2011 a 03:45 #####

Un log de la commande "rsync" :

2011/01/09 01:30:34 [13623] >f.sT...... .xbmc/temp/xbmc.log
2011/01/09 01:30:34 [13623] >f..T...... .xbmc/userdata/guisettings.xml
2011/01/09 01:30:34 [13623] >f..T...... .xbmc/userdata/profiles.xml
2011/01/09 01:30:34 [13623] >f.sT...... .xbmc/userdata/Database/Addons.db
2011/01/09 01:30:35 [13623] >f..T...... .xbmc/userdata/Database/MyVideos34.db
2011/01/09 01:30:35 [13623] >f+++++++++ .xbmc/userdata/Thumbnails/Video/0/auto-03c4d026.tbn
2011/01/09 01:30:35 [13623] >f+++++++++ .xbmc/userdata/Thumbnails/Video/0/auto-0881280c.tbn
2011/01/09 01:30:35 [13623] >f+++++++++ .xbmc/userdata/Thumbnails/Video/1/auto-144282f2.tbn
2011/01/09 01:30:35 [13623] >f+++++++++ .xbmc/userdata/Thumbnails/Video/1/auto-1cd2aa8b.tbn
2011/01/09 01:30:35 [13623] >f+++++++++ .xbmc/userdata/Thumbnails/Video/2/auto-20d84635.tbn
2011/01/09 01:30:35 [13623] >f+++++++++ .xbmc/userdata/Thumbnails/Video/2/auto-229f3fda.tbn
2011/01/09 01:30:35 [13623] >f+++++++++ .xbmc/userdata/Thumbnails/Video/2/auto-26641ea9.tbn

Le contenu du fichier "exclude_home.txt" :

lost+found
.local/share/Trash
Dropbox
.local/share/gvfs-metadata/
.gvfs
.zoteroIntegrationPipe
.adobe/Acrobat/9.0/Synchronizer/Commands
.adobe/Acrobat/9.0/Synchronizer/Notification
.beagle/socket
.config/google-chrome/SingletonSocket
.dropbox/command_socket
.dropbox/iface_socket

Exemple de contenu de mon fichier log général :

media_center (home) en 00:00:25 le 08-01-2011 a 01:30
media_center (mythtv) en 00:25:59 le 08-01-2011 a 02:26
manue (home) en 00:16:02 le 08-01-2011 a 13:38
yannick (musique) en 00:30:03 le 08-01-2011 a 14:45
media_center (temporaire) en 01:27:16 le 08-01-2011 a 21:16
media_center (temporaire) en 00:00:07 le 08-01-2011 a 22:11
yannick (musique) en 00:00:04 le 09-01-2011 a 01:00

Et enfin le script "backup.sh" à télécharger : Script de backup pour Synology

Commentaires (23) Trackbacks (1)
  1. bien.
    pour la sauvegarde avec rsync, le plus simple est d’utiliser l’option -a.
    la syntaxe que tu mets avec -e ssh est le plus souvent inutile, tous les rsync récents utilisent ssh par défaut.
    de ce fait, il est plus simple de mettre rsync user@machine:$SOURCE $DESTINATION.
    l’usage de la variable RSYNC_RES n’est probablement pas nécessaire, tu peux directement faire
    rsync (options) >> $LOG
    je te recommande d’ajouter –delete-after
    ce qui donnerait :
    rsync -a –log-file=$LOG_RSYNC –exclude-from $EXCLUDE $EXTRA_OPTIONS –delete –delete-after $UTILISATEUR@$IP:$SOURCE $DESTINATION >>$LOG

    mais le plus simple est de définir une variable $RSYNC_OPTIONS contenant –log-file=$LOG_RSYNC –exclude-from $EXCLUDE –delete –delete-after

    et ta ligne devient
    rsync -a $RSYNC_OPTIONS $EXTRA_OPTIONS $UTILISATEUR@$IP:$SOURCE $DESTINATION >>$LOG

    • Salut,

      Merci pour tes messages. J’avais vu l’option avec -a, mais quand j’ai débuté avec rsync, je préferais mettre toutes les options pour savoir exactement ce qui se passait, maintenant je peux optimiser en effet.

      Je vais essayer d’utiliser une autre variable $RSYNC_OPTIONS voir si ca marcherais… une variable qui contient d’autres variables ?

      Et en profiter pour ajouter –delete-after ;)

      Ah oui pour ta commande  » avec >>$LOG » c’est ce que j’avais au début, mais ca ne régle pas mon problème, c’est que je dois stocker le résultat de la commande pour l’envoyer par courriel par la suite et je n’ai pas trouvé mieux que de stocker dans une variable..

      Merci

      • toto= »contenu de toto »
        tata= »${toto} texte en plus »
        echo $tata
        contenu de toto texte en plus

        quand au résultat de rsync, je ne comprend pas pourquoi tu veux l’envoyer par mail. En général on ne teste que la réussite de la commande (retour 0) ou l’échec (différent de 0), mais le code d’erreur est contenu dans la variable $? après la commande.

        exemple : pour envoyer un mail en cas de réussite :
        rsync (liste de paramètres) && nail -s « sauvegarde réussie » ton@adresse

        ou d’échec
        rsync (liste de paramètres) ||nail -s « échec sauvegarde – code d’erreur $? » ton@adresse

        • Ouais c’est vrai tu as peut être pas tord, mais je crois que quand y’a une erreur le système en dit plus qu’un code erreur, je me disais que ca pourrait être intéressant de recevoir par courriel le détail.

          • le code d’erreur c’est le code d’erreur, je pense que ce qui t’intéresse c’est la sortie d’erreur, ce n’est pas la même chose ! la sortie d’erreur est sur le descripteur de fichier 2, tu peux la récupérer en la redirigeant vers un fichier, comme cela :
            rsync (liste d’options) 2>erreurrsync
            ou avec un pipe dans une commande (par exemple pour le texte du mail)
            rsync (liste d’options) 2|nail -s « erreur rsync $? » ton@adresse
            (le mail contiendra le texte de l’erreur, le sujet le code de l’erreur)

  2. suite…
    et pour les mails, c’est bien compliqué d’utiliser le système de synology.
    tu peux installer nail (ipkg install nail) et tu peux envoyer un mail avec la commande nail
    par exemple
    nail -s « sujet du mail » -a « pièce jointe » adresse@mail <fichier_texte_du_mail

    et sans installer nail, en utilisant un petit script perl comme celui-ci que j'ai écrit pour mon syno

    #!/usr/bin/perl -w
    use Net::SMTP;
    $fichier=shift;

    open FICHIER,"$fichier" or die ("fichier non trouvé");
    @data=;
    close FICHIER;

    $addr=shift @data;
    chomp $addr;
    $sujet=shift @data;
    $smtp = Net::SMTP->new(‘localhost’,Hello => ‘lenomdetonserveur’);

    $smtp->mail(‘nom_expediteur’);
    $smtp->to(« $addr »);
    $smtp->bcc(‘postmaster@tondomaine’);
    $smtp->data();
    $smtp->datasend(« Subject: $sujet »);
    $smtp->datasend(« X-Mailer: CricX Simple Mailing Script\n »);
    $smtp->datasend(« MIME-Version: 1.0\n »);
    $smtp->datasend(« Content-Type: text/plain;charset=iso-8859-1\n »);
    $smtp->datasend(« Content-Disposition: inline\n »);
    $smtp->datasend(« Content-Transfer-Encoding: 8bit\n »);
    $smtp->datasend(« To: $addr\n »);
    $smtp->datasend(« \n »);
    for (@data){$smtp->datasend(« $_ »);};
    $smtp->dataend();
    $smtp->quit;

    et tu appelle ce script en lui fournissant en paramètre le nom d’un fichier contenant sur la première ligne l’adresse d’envoi, sur la seconde le sujet, les autres lignes constituant le corps du message.

  3. oh le vilain wordpress qui supprime certains caractères…
    la ligne @data=; contient
    signe inférieur FICHIER signe supérieur entre le égal et le point-virgule

  4. T’écris pas souvent.. mais quand t’écris, t’écris ! :)

    Super intéressant l’article ! J’ai débuter une application dans le même genre… Elle s’appelle Backupator. Elle est fait en PHP-CLI et utilise aussi rsync. L’avantage c’est que tu bénéficie de tout ce que PHP tu permet aussi. Est-ce que IPKG permet l’installation de PHP-CLI ?

    Ciao !

    • Ouais là je me suis gavé lol

      Je n’ai pas encore installé IPKG sur mon NAS, parce que c’est pas dispo de base, faut bidouiller un « boot strap machin chose.. ». Mais d’après ce que j’ai vu on peut installer le paquet PHP et PHP-CLI est disponible dedans. Donc ca devrait marcher.

      Envoi moi à l’occasion ton script que je regarde ca

      A+ Sylvain

  5. Ok Pour la sortie d’erreur « cricx », ca me rappel des souvenirs. Je crois que je vais installer NAIL finalement avec une seule commande.. ca va aller vite fait..

    Merci pour ces nouvelles informations, je vais améliorer mon script et peut être en faire une section « Projets » sur mon blogue à partir.

  6. Salut,

    Tombé sur cet article lors d’une recherche, je dois dire que c’est un bon article :) Il regroupe tout ce que j’ai fais pour mettre en place une sauvegarde entre deux NAS.

    J’aurai une question au rédacteur/lecteurs :

    Je souhaiterai pour ma part, faire évoluer un peu le mail de retour. Un truc joli et propre en HTML.

    Par contre, SynoMail envoi du « text/plain »… Peut on modifier cela ?

    Et sinon, je comptais me rabattre sur l’utilisation d’un script PHP pour seulement découper les données du journal Rsync + formatage du mail + envoi du mail. Comment récupérer les paramètres des utilisateurs à notifier ? (bien pratique quand on veut changer des adresses mails que de pouvoir faire cela depuis l’IHM du Syno)

    Qu’en pensez vous ?

    • Luc1an0,

      Je ne sais pas si mon blogue est la meilleure place pour cela. Pourquoi ne pas aller poster ta question sur le forum http://www.nas-forum.com/, il y a beaucoup de monde compétent et d’expérience à aller chercher.

      Pour du HTML, peut être installer NAIL ? Finalement je ne l’ai pas installé, mon truc marche plutôt bien et j’ai même refait complètement le script.

      Pour du PHP, cela s’installer sur ce NAS, donc si tu arrives a avoir un interpréteur PHP dessus tu devrais pouvoir appeler tes scripts. Pour les paramètres utilisateurs désolé je ne sais pas.

      Bonne chance

  7. Salut,
    Bon pour résumer moi je n’arrive a rien (j’ai presque les boules…) ;-)
    je t’explique j’ai un NAS syno DS211J que j’utilisais a la maison avec mon MAC simplement le top…
    mais ma boite m’envoie en expatriation (USA) pour deux ans, je ne te raconte pas le stress de la famille ici (PLUS DE SUPPORT INFORMATIQUE ARRFFFF ET MES DONNEES COMMENT JE FAIS POUR LES SAUVEGARDER….)
    je me suis donc dis dans ma tete pourquoi ne pas installer mon NAS en france pour faire les sauvegarder authomatiquement les data de la famille, et en cas de problème pris a distance du contrôle.
    l’idée etait au top…
    Après des recherches je tombe sur ton post et SUPER (d’ailleurs un grand merci). donc je me lance :
    Installation du NAS sur le reseau
    mise en place des rep

    test avec mon mac

    et la me voila bien dans un gros mais un très gros paquet de Mer… cela ne marche pas.
    ce que je souhaite c comme toi lancer la sauvegarde automatique a partir du NAS d’un PC sous windows seven
    et pour resumer le script tombe en erreur sur rsync pour un raison deja le fichier EXCLUDE il le trouve pas (peut etre le format), et deux il n’arrive pas a ce connecter au PC histoire de port 22…

    je sais pas si tu peux ou comment tu peux m’aider
    mais je suis super da la merdouille
    par avance merci
    Fred

    • Fred,

      Chanceux.. USA.. c’est cool, enfin moi c’est Québec pas loin ;)

      Essaye de régler les problèmes les uns après les autres. Installer ce qu’il faut sur ton MAC pour effectuer une connexion via SSH et tester un rsync manuellement depuis ton NAS. Si tu arrives à faire cela manuellement tu pourra voir pour l’automatiser non ?

      a+

  8. BOnjour,

    Sympa ton article. AS-tu un retour d’expérience sur des plateforme de stockage pas trop cher compatible rsync ?

    Merci
    A+

    • Hmmm de l’hébergement en ligne ? aucune idée. J’ai un abonnement chez HostGator et rsync fonctionne, la place est illimité je crois mais le nombre de inode est limité je crois à 250.000

  9. Bonjour,

    Vous l’avez certainement remarqué mais synomail (/usr/syno/bin/synomail) a dégagé avec la dernière mise à jour du DSM…
    Je l’utilisais également afin d’envoyer des notif par mail, j’avais pas besoin d’un truc trop compliqué et ca me suffisait amplement…
    Auriez-vous trouvé par quoi le remplacer ?

    Merci
    ++

  10. Bonjour,

    Le résultat semble très tentant… Petite question de débutant : est-il nécessaire de faire exécuter le script avec root ? (obligatoire en utilisant cron ? autre utilité ?…)

    Merci par avance.

  11. Bonjour,

    Après des essais infructeux pour essayer d’appliquer cette méthode pour des postes Windows (fonctionne pour Mac), je me rabats vers DeltaCopy qui pilotera sur chaque poste Windows de la maison la planification et la sauvegarde des fichiers. Dommage, car une gestion centralisée aurait eu de nombreux intérêts.

    Merci tout de même pour ce riche article.

  12. Salut John,

    Effectivement j’ai eu une surprise en vérifiant mon script dernièrement avec la dernière version de DSM… l’envoi de courriel ne fonctionne pas. J’avais prévu de faire une mise à jour du script avec un autre système d’envoi. A vrai dire je ne me souviens plus par quoi je voulais le remplacer, mais sur le forum francophone plusieurs membres parlaient d’une application à installer depuis DSM qui permettrait d’envoyer des courriels donc ce n’est pas perdu.

    Johann,

    Pour les postes Windows, je n’ai jamais fait de test, mais je vais devoir le faire un moment donné car je remplace un de mes ordis linux par Windows.

    Je ne sais pas quand je vais mettre à jour le tout, désolé.


Laisser un commentaire