-
Mes solutions de backups et de synchronisations : rsync & cron
par Skreo, le 15 Mars 2008 à 15:03Après quelques déboires dûs à un rsync mal fait (à 7h du maths quand on vient de se réveiller, on a pas toujours le courage et le temps de tester d'abord une grosse synchro avec le flag -n), j'ai décidé de faire un peu plus sérieusement et régulièrement les backups de mes données. En effet, comme j'ai de nombreux fichiers importants qui changent souvent (les fichiers de mes sites par exemple), il est nécessaire d'en faire très souvent. Je détaillerai ici mes solutions uniquement pour Linux, désolé pour les windowsiens qui peuvent allez ici.La clé, c'est la combinaison de cron et de rsync. Ces deux commandes sont installées par défaut sur la plupart des distributions Linux. Cron sert à lancer des commandes à des dates précises, elle permet par exemple de lancer une commande toutes les nuits à 2h15, ou seulement les samedis aux heures impaires... Rsync permet de faire une synchronisation entre deux dossiers. L'avantage est que rsync peut utiliser le protocole ssh pour faire une synchro entre un dossier distant et un dossier local, pour par exemple faire une sauvegarde sur un ordinateur distant.
I. Création d'un fichier bash exécutant le rsync
Passons maintenant aux applications. Nous allons créer un bash, ce qui nous permettra de définir des variables et de tester l'existence des dossiers source et destination.
Supposons que l'on a un dossier Musiques dans notre dossier home/user, et qu'on veut en avoir une sauvegarde sur un disque dur externe. Notre disque dur, quand il est connecté, s'appelle ici HDD, son adresse est alors /media/HDD. Écrivons un fichier "backup_musiques.sh" dans le dosssier /home/user :
#!/bin/sh
# Source du backup
SRC=~/Musiques/
# Destination du backup
DST=/media/HDD/Musiques/
# Si la source existe
if test -d $SRC ; then
# Si la destination existe
if test -d $DST ; then
echo "Backup des musiques en cours..."
# Les deux dossiers existent, on faire alors le transfert
rsync -rtv --delete $SRC $DST
echo "Backup terminé"
# Sinon, la destination n existe pas
else
echo "Le disque de stockage n'est pas connecté, le backup ne peut pas être effectué."
fi
# Sinon, la source n existe pas
else
echo "La source n'exite pas, le backup ne peut pas être effectué."
fiOn utilise ici les options -rtv --delete de rsync :
- -r permet de copier le répertoire récursivement
- -t permet de préserver les dates de création et de modification des fichiers copiés
- -v active le mode "bavard" : une liste de toutes les actions effectuée s'affiche
- --delete supprime les fichiers du dossier de destination qui ne sont pas présents dans la source. Indispensable pour une copier conforme.
Pour être sûr de ne pas faire de bêtises, je vous conseille fortement de rajouter l'option -n (ce qui donnera rsync -rtvn ...) pour tester sans que le transfert ne se fasse vraiment.
Remarque : La présence ou non du slash "/" à la fin du nom du dossier source est très importante. S'il y a un slash, alors le contenu du dossier est synchronisé, s'il n'y en a pas, c'est le dossier lui même qui est synchronisé dans le dossier de destination. Par contre un slash à la fin du nom de dossier de destination n'a pas d'importance.
Pour lancer la synchro, il suffit ensuite de se place dans le dossier /home/user avec le terminal, et de taper :
./backup_musiques.shDans ce deuxième exemple, on va faire la sauvegarde de la config de Firefox et de Thunderbird (ainsi que tous les e-mails) et du dossier "Images" sur un ordinateur distant, et créer des sauvegardes de tous les fichiers modifiés ou supprimés dans des dossiers correspondant à leur date de modification. Pour ma part, je fais un backup sur mon serveur dédié.
Voici donc notre fichier ~/backup_pc.sh :#!/bin/sh
# Source du backup (dossier local contenant les dossier qu on va synchroniser)
SRC=~/
# Destination du backup (dossier distant)
DST=root@123.123.123.123:/home/user/backup/
# Date de la forme jour-mois-année
DATE=`date +%d-%m-%y`
# Dossier de backup des fichiers supprimés
BCK=/home/user/backups_del
# Rsync avec backup
/usr/bin/rsync -avz --delete --backup --backup-dir=$BCK --include=Images --include=.mozilla --include=.mozilla-thunderbird --exclude=/* $SRC $DSTOn utilise ici les options -avz --delete --backup --backup-dir --include --exclude de rsync :
- -a équivaut aux options -rlptgoD (récursivité, conservation des liens symboliques, des permissions, des dates, du groupe, du propriétaire, et des périphériques)
- -v active le mode "bavard" : une liste de toutes les actions effectuée s'affiche
- -z active la compression des données pour un transfert plus rapide (indispensable pour des transferts distants). Notez que seul l'envoi est compressé, les fichiers au final ne sont pas compressés.
- --delete supprime les fichiers du dossier de destination qui ne sont pas présents dans la source. Indispensable pour une copier conforme
- --backup active la sauvegarde séparée des fichiers supprimés
- --backup-dir=DIR spécifie dans quel dossier il faut faire la sauvegarde des fichiers supprimés
- --include=PATTERN spécifie un dossier à inclure dans la synchronisation
- --exclude=PATTERN spécifie un dossier à exclure de la synchronisation. Ici on exclut (/*) tout et on inclut les dossiers qui nous intéressent
Dans ce bash, on fait la sauvegarde dans le dossier /home/user/backup/ de l'utilisateur root à l'adresse 123.123.123.123, et bien sûr il faut avoir la permission de cet ordinateur pour lui envoyer des données. Pour cela, vous avez deux solutions :
- Soit vous installez openssh-server sur l'ordinateur distant (si ce n'est déjà fait, et vous exécutez cette commande pour que votre ordinateur puisse s'y connecter par ssh ou rsync sans avoir à entrer le mot de passe. Il faut d'abord générer la clé
:ssh-keygen -t dsa
On vous demandera où placer la clé, répondez par default. Et on vous demandera une passphrase pour crypter votre certificat, ne mettez rien, appuyez simplement sur Entrée.
Ensuite, pour copier la clé sur l'ordinateur distant :ssh-copy-id -i ~/.ssh/id_dsa.pub root@123.123.123.123
Cette commande ne fait qu’ajouter votre clé publique dans un fichier sur le serveur. Voici une commande équivalente :cat ~/.ssh/id_dsa.pub | ssh root@123.123.123.123 "cat - >> ~/.ssh/authorized_keys"
Voila, vous pouvez desormais vous identifier sur le serveur sans mot de passe. - Soit vous n'avez pas peur de stocker le mot de passe de l'ordinateur distant en clair, alors on peut faire plus simple : créez un fichier ~/.backup_password contenant uniquement le mot de passe de l'ordinateur distant, et ajoutez l'option "
--password-file=~/.backup_password" à rsync dans le bash.
Il est tout de même conseillé de ne donner les droits de lecture pour ce fichier qu'à vous. Pour cela :chmod 700 ~/.backup_password
Remarques : Ici, on se connecte avec l'utilisateur root à l'ordinateur distant, mais on peut prendre un autre utilisateur. De plus nous utilisons une ip (123.123.123.123 à remplacer par l'ip de l'ordinateur distant). Si elle est dynamique, il faut s'assurer qu'elle n'a pas changé avant de lancer le transfert. Vous pouvez aussi utiliser un dyndns.
II. Cron pour l'exécution automatique des bashs
Maintenant que l'on a tout ce qu'il faut pour faire ses synchros tranquillement, nous allons les automatiser. Eh oui, au début on pense à les faire, mais cela devient vite lassant de les faire manuellement. Vous allez voir, c'est très simple : pour modifier vos tâches automatisées, tapez simplement la commade :
crontab -eVotre fichier de configuration de cron s'ouvrira alors dans vim ou nano.
Nano est facile à utiliser, les commande sont décrites en bas de la fenêtre (Ctrl+X pour quitter...). Nano est en permanence en mode édition
Vim requiert un petit peu plus de connaissance, mais le principal à savoir est :- touche Inser pour activer le mode édition
- touche Ech pour revenir en mode commande (vim fonctionne par commandes)
- commande :q! pour quitter sans enregistrer
- commande :qw pour quitter en enregistrant
Une ligne du fichier correspond à une tâche automatisée. Vous pouvez en ajouter en vous plaçant en mode édition (Inser sous vim). Voici la syntaxe à respecter :
mm hh jj MMM JJJ tâche > logDans cette syntaxe :
- mm représente les minutes (de 0 à 59)
- hh représente l'heure (de 0 à 23)
- jj représente le numéro du jour du mois (de 1 à 31)
- MMM représente le numéro du mois (de 1 à 12) ou l'abréviation du nom du mois en anglais (jan, feb, mar, apr, ...)
- JJJ représente l'abréviation du nom du jour ou le chiffre correspondant au jour de la semaine (0 représente le dimanche, 1 représente le lundi, ...)
- tâche représente la commande ou le script shell à exécuter
- log représente le nom d'un fichier dans lequel stocker le journal des opérations. Si la clause "> log" n'est pas spécifiée, cron enverra automatiquement un courriel de confirmation. Pour éviter cela il suffit de spécifier > /dev/null
Pour chaque unité de temps (minute/heure/...) les notations sont possibles:
- * : a chaque unité de temps
- 2-5 : les unités de temps (2,3,4,5)
- */3 : toutes les 3 unités de temps (0,3,6,...)
- 5,8 : les unités de temps 5 et 8
Nous allons donc automatiser nos backups backup_musiques.sh et backup_pc.sh :# Synchro des fichiers tous les jours à 2h15 du matin avec création d un log :
15 2 * * * /home/user/backup_pc.sh > /home/user/backup_pc.log
# Synchro des musiques un jour sur deux à 20h :
0 20 */2 * * /home/user/backup_musiques.sh > /dev/nullNote : Pensez à remplacer tout au long de ce tuto "/home/user" par l'adresse de votre dossier perso.
Et voilà, vous savez -presque- tout ! Pour plus d'infos sur rsync ou cron, consultez les docs :
Manuel de rsync : http://man.developpez.com/man1/rsync.1.php
Méthode rsync par daemon : http://prendreuncafe.com/blog/post/2007/01/18/Synchro-...
Tuto ssh-copy-id : http://www.qth.fr/tag/ssh-copy-id
Partager cet article :

Tags : backup, rsync, cron
Suivre le flux RSS des commentaires de cet article
Revenir à la liste des articles
-
Commentaires
1divarvel
15 Mars 2008 à 17:49Mmmh, c'est assez complet... Faudra que je me bricole ça un de ces jours, quand j'aurai de l'espace disque ^^
Ajouter un commentaire
Haut de page
