• Mes solutions de backups et de synchronisations : rsync & cron

    Aprè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é."
    fi
    [code=bash]
    #!/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é."
    fi
    [/code]

    On 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.sh
    [code=bash]./backup_musiques.sh[/code]


    Dans 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 $DST
    [code=bash]
    #!/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 $DST
    [/code]

    On 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
      [code=bash]ssh-keygen -t dsa[/code]

      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
      [code=bash]ssh-copy-id -i ~/.ssh/id_dsa.pub root@123.123.123.123[/code]

      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"
      [code=bash]cat ~/.ssh/id_dsa.pub | ssh root@123.123.123.123 "cat - >> ~/.ssh/authorized_keys"[/code]


      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
      [code=bash]chmod 700 ~/.backup_password[/code]

    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 -e
    [code=bash]crontab -e[/code]

    Votre 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 > log
    [code=bash]mm hh jj MMM JJJ tâche > log[/code]

    Dans 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/null
    [code=bash]
    # 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/null
    [/code]

    Note : 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


    Tags Tags : , ,
  • Commentaires

    1
    Samedi 15 Mars 2008 à 17:49
    Mmmh, c'est assez complet... Faudra que je me bricole ça un de ces jours, quand j'aurai de l'espace disque ^^
    2
    Dimanche 16 Mars 2008 à 01:44
    J'avais déjà matté un peu, c'est vrai que c'est plutôt pratique... même si j'en ai pas besoin :)
    3
    Dimanche 16 Mars 2008 à 11:24
    Ah oui, voilà, tu parles pas du tout de rsync en mode daemon.

    Avec ça tu peux définir différents modules, ça te permet de centraliser tes synchro, et de changer rapidement les paramètres en éditant un seul fichier
    4
    Dimanche 16 Mars 2008 à 15:28
    Encore moi, a priori, ça marche aussi sous mac, non ?
    5
    Dimanche 16 Mars 2008 à 21:58
    Hmmm oui je pense. Enfin il doit y avoir quelques trucs à changer j'imagine
    6
    TheGodFather
    Vendredi 28 Mars 2008 à 03:16
    C'est noté!

    C'est très bien expliqué, en tout cas!
    Suivre le flux RSS des commentaires de cet article


    Ajouter un commentaire

    Nom / Pseudo :

    E-mail (facultatif) :

    Site Web (facultatif) :

    Commentaire :