Solution de sauvegarde locale et distante avec rsync

Qui n’a jamais perdu des fichiers lors d’un crash de disque dur ? ou de la machine tout entière ?
Dans cet article je vous expliquer quels sont les moyens que j’ai mis en œuvre pour sauvegarder les données qui se situent sur mon serveur de fichiers (qui contient mes documents personnels, ma musique, mes photos, etc..) dans mon appartement.
Rsync est un logiciel qui construit des sauvegardes incrémentales, c’est à dire qu’il transfert entre chaque sauvegarde que le delta observé entre les 2.
Les machines concernées sont sous Ubuntu Server 7.10 mais l’article reste valide pour toute Ubuntu ou Debian.

Sauvegarde locale

La sauvegarde locale consiste à sauvegarder certains répertoires d’un disque vers un autre disque, dans la même machine (mon serveur de fichiers en l’occurrence) de manière périodique (toutes les semaines).
En l’occurrence sur la partition /dev/hda1 j’ai les répertoires /home /var /etc à sauvegarder; pour cela j’ai la partition /dev/sda2 (sur un disque différent donc) qui est montée sur le pointe de montage /backup
Ainsi mon script cron (sauvegarde.sh, executable bien sûr) à lancer toutes les semaines est le suivant :

#!/bin/sh
#############################
# SAUVEGARDES LOCALES #
#############################
#sauvegarde du repertoire etc
rsync -avz –delete /etc /backup/
#sauvegarde du repertoire var
rsync -avz –delete /var /backup/
#sauvegarde du repertoire home
rsync -avz –delete /home /backup/

L’option « -avz » signifie que la sauvegarde (le transfert) des fichiers sera récursif; les fichiers seront tranférés en mode « archive » qui garantit que les les liens symboliques, les attributs,les permissions, les droits, etc… seront préservés lors du transfert; de plus une compression sera utilisée lors du tranfert (qui n’affectera pas vos fichiers)
l’option « –delete » signifie elle que lorsque l’on supprimera un fichier sur /etc par exemple, il devra être supprimé aussi de /backup/etc/ lors de la sauvegarde. (si vous ne mettez pas cette option, votre /backup risque de se remplir très rapidement !!!)

Mise en place du « job » cron

Pour appeler le script de sauvegarde sauvegarde.sh, il faut l’indiquer dans une table cron; pour cela je vous renvoie au tutoriel cron d’ubuntu-fr.org
En particulier, le script de sauvegarde doit être lancé par un utilisateur ayant accès à l’ensemble du système de fichiers.
Plutôt que d’utiliser root, nous allons créer un nouvel utilisateur , « sauvegarde » qui fera partie du groupe root, et autres groupes utilisateurs nécessaires pour qu’il puisse sauvegarder l’ensemble des répertoires spécifiés.
Son « home directory » sera /backup
% sudo useradd -d /backup -g root -G anthony sauvegarde
donnez lui l’appartenance de ce répertoire:
% sudo chown -R sauvegarde:root /backup
Ainsi, le script sauvegarde.sh doit être accessible et lancé par notre nouvel utilisateur sauvegarde; pour cela, créez une nouvelle crontab pour l’utilisateur sauvegarde :

% sudo crontab -u sauvegarde -e

Votre éditeur (vi ou emacs) se lance, insérez la ligne suivante :
@weekly /chemin_ou_situe/sauvegarde.sh #sauvegarde

çà y est !
votre sauvegarde locale est créée, vous être à l’abri du crash du disque contenant /home /etc et /var !!
Mais si votre machine est victime d’une surtension,et que tous les disques sont endommagés, vous perdrez tout !!!

Sauvegarde distante

Pour se prémunir d’un dégât, d’un vol, d’un incendie, il faut sauvegarder vos données vers une machine distante.
Si vous possédez un serveur dédié (ou si un ami ou autre personne de confiance vous donne accès à son serveur) vous pouvez alors mettre en place une solution de sauvegarde distante.
Pour cela, compléter le fichier sauvegarde.sh en y rajoutant ces lignes :

#############################
# SAUVEGARDES DISTANTES #
#############################
serveur= »mon.serveur.dedie.fr »
#sauvegarde du repertoire home
rsync -avz –delete /backup/home $serveur:/backup/
#sauvegarde du repertoire etc
rsync -avz –delete /backup/etc $serveur:/backup/
#…

Comme vous pouvez le constater, avec rsync, une sauvegarde locale ou distante est traitée de la même manière, la syntaxe est identique, au $serveur: près.
Bien entendu pour que tout ceci fonctionne, vous devez, sur la machine distante, créer un utilisateur sauvegarde , avec pour « home directory » /backup (répertoire à créer sur la machine distante).
% sudo useradd -d /backup sauvegarde
donnez lui l’appartenance de ce répertoire:
% sudo chown -R sauvegarde:sauvegarde /backup
donnez à votre utilisateur sauvegarde un mot de passe (fort de préférence) :
% sudo passwd sauvegarde
Aussi, pour permettre à votre machine locale de se connecter à la machine distante, sans intervention de votre part (sans demander de mot de passe donc) vous devez créer un couple de clés DSA.
Sur la machine locale, logguez vous en utilisateur sauvegarde :
% sudo su sauvegarde
et créez votre couple de clés DSA :

$ ssh-keygen -t dsa
Generating public/private dsa key pair.
Enter file in which to save the key (/backup/.ssh/id_dsa):
Created directory ‘/backup/.ssh’.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /backup/.ssh/id_dsa.
Your public key has been saved in /backup/.ssh/id_dsa.pub.
The key fingerprint is:
XXXXXXXXXXXXX sauvegarde@machine

Acceptez l’emplacement par défaut pour la création des clefs, et appuyez sur entrée lorsque l’on vous demande une « passphrase » (comme çà, nul besoin de saisir de mot de passe pour utiliser la clef).
Il n’y a plus qu’à partager la clef publique générée avec la machine distante :
toujours loggué en utilisateur sauvegarde sur la machine locale :
ssh-copy-id -i ~/.ssh/id_dsa.pub sauvegarde@machine_distante
C’est fini, votre utilisateur sauvegarde, sur la machine locale, pouvant se logguer sur la machine distante, votre script cron, sauvegarde.sh, sera lancé toutes les semaines sans problème afin de sauvegarder localement et à distance vos données importantes.
Vos commentaires sont les bienvenus !

Références :
le site officiel de Rsync
Formation Debian : accès par ssh

11 réflexions sur « Solution de sauvegarde locale et distante avec rsync »

  1. Le billet que je cherchais pour sauvegarder mon pc de desktop (ubuntu) et mon serveur (debian) !

    Merci, Ron

  2. Bonjour et merci tout d’abord pour le tuto.

    J’ai suivi les etapes cité précédament, en lancant manuellement le script pour testé la parti sauvegarde distante qui m’interesse, je recois les erreurs suivantes:
    rsync: Failed to exec lete: No such file or directory (2)
    rsync error: error in IPC code (code 14) at pipe.c(84) [sender=3.0.3]
    rsync: writefd_unbuffered failed to write 4 bytes [sender]: Broken pipe (32)
    rsync error: error in IPC code (code 14) at io.c(1544) [sender=3.0.3]

    le script:
    #!/bin/sh
    serveur= »www.monserveur.com »
    #sauvegarde hebdomadaire du repertoire Publique sur serveur distant monserveur.com
    rsync -avz -delete /opt/lampp/htdocs/Publique $serveur:/backup/

    le repertoire a sauvegardé se trouve bien dans: /opt/lampp/htdocs/Publique et le réprtoire distant /backup existe bien je l’ai crée, j’ai méme retésté e donnant un chmod 777…

    Si qelqu’un peut identifié le souci!!
    Merci !

  3. Merci pour la réponse,
    mais il y est le -delete, c’est le tiré du 6 dans les claviers francophone? je vais essayé de faire un copier collé de ton tirré.
    et je te diré ce qui c passé.

    Merci encore

  4. j’ai jetté un coups d’oeuil dans le man, c’est plutot un double tiré qu’il faut mettre avant le delete. et non un sel tiré.
    il faut faire aussi attention a la double apostrophe du serveur c’est la double apostrophe de la touche 3 du clavier francophone et non les <<.
    je pensse que ca vient de l'encodage du blog que voustilisez, il doit changé les caractéres à la microsoft word.
    en tt cas remercie, pourle tuto, je continue les testes ;)

  5. en essayant de me connecter à partir du serveur locale vers le seveur ditant

    serveur:/root$ ssh ‘sauvegarde@monserverdistant.com’
    sauvegarde@monserverdistnt.com password:

    je continue a avoir un mot de passe demandé. est ce que c’est normal?

    j’a vérifié le contenue de la id_dsa.pub en local ainsi que le authorized_keys sur le disant, les clés sont pareil, mais le mot de passe continue à étre demandé quand j’essaye de me conncté manuellement(mais exécuter en root@serveur local, car en essayant le sudo su sauvegarde l’utilisateur sauvegarde n’a pas le droit de se loguer sur la machine local avec la commande fourni dans le tutoriel. )

  6. salut,
    *oui, c’etait double tiret, mais comme tu dis, y’a un pb d’encodage dans les articles du blog, faudra que j’améliore çà !
    *apparemment, lorsque tu as créé ton couple clef privée/clef publique, tu as fourni un mot de passe; c’est pour çà que rsync en as besoin

  7. j’ai pas fourni de pass phrase, je l’ai laissé vide comme conseillé dnsle tutoriel…
    pour ce que j’ai fait:
    J’ai créer 2 utilisateurs sauvegardes avec le méme login et mot de passe sur les deux machines, puis je les ai mis dans le groupe root et workgroup, en donnant le répertoire de sauvegarde ainsi que le épértoire à sauvegarder en temps que home pour le deux utilisateurs…

    Le contenu de mon fichier de sauvegarde:

    Code:

    #!/bin/sh
    serveur= »www.serveurdistant.net »
    #sauvegarde hebdomadaire du repertoire Publique sur serveur distant
    rsync -avz –delete /opt/lampp/htdocs/Publique $serveur:/backupsachant que /opt/lampp/htdocs/Publique c’st mon répértoire local a sauvegarder, et le /backup c’est ce lui du distant.

    j’ai generé les clés RSA en tapant la commande:

    Code:
    ssh-keygen -t ssh

    en evitant de mettre des passphrase et en ardantles répértoire de sauvegarde proposé par defaut.

    puis je l’ai transmis sur leserveur distant la clés publiqu à fin d’éviter de retapé le mot de passe a chaque fois que mon cron passe.

    Citation:
    scp ~/.ssh/id_rsa.pub http://www.monserveurdistant.net:.ssh/authorized_keys

    j’ai defini pas la suite ma tache cron normale.

    mon problémes est que l’authentification est refusé(méme si les clés publiques sont présentes des deux cotés) j’ai tésté en me connectant du serveur local vers le distant, le mot de passe continu a étre demandé… comment pourrai résoudre le souci??

    le contenu de mes logs:

    Code:

    Jan 28 14:40:01 ks308711 sshd[9666]: Authentication refused: bad ownership or modes for directory /backup
    Jan 28 14:40:01 ks308711 sshd[9666]: Failed password for sauvegarde from 82.241.32.238 port 40890 ssh2
    Jan 28 14:40:01 ks308711 sshd[9666]: Failed password for sauvegarde from 82.241.32.238 port 40890 ssh2
    Jan 28 14:40:01 ks308711 sshd[9666]: Failed password for sauvegarde from 82.241.32.238 port 40890 ssh2

    il me reste 3 questions:
    sur le serveur distant tu envoi ta clés publique ou privée?
    sur le serveur local pour t’authentifié, tu utilise la clés publique ou la privée?
    dans les deux cas si tout se passe avec la clés publique comme ce que j’ai vu dans le tutoriel, la privée elle sert a quoi?

    Merci encore pour ton aide.

  8. mon probléme a été résolu finalement, c’été une histoire de droits:

    chmod 755 /backup
    chmod 700 /backup/.ssh
    chmod 600 /backup/.ssh/*
    chown -R sauvegarde:sauvegarde /backup

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *