Sauvegarder avec rsync

rsync est un outil utilisé pour sauvegarder et synchroniser vos fichiers. (Il peut être utilisé sur une variété de ports *nix ).

Une limitation de Rsync réside dans son INCAPACITÉ à copier des fichiers d'une machine distante à une autre machine distante. Pour ce faire, il vous faudrait copier la source sur votre système local en préalable, pour l'adresser ensuite à la seconde machine distante.

Avec aptosid vous avez le choix sur la façon d'initier le processus, par vous-mêle ou via un paquet deb dans Debian sid: luckybackup

Pour le paquet deb luckybackup:
apt-get install luckybackup

Page d'accueil de luckybackup.

Ce qui suit concerne la manipulation par vous-même de rsync

Ce qui suit vous apporte quelques connaissances pratiques sur ce que peut faire rsync et quelques exemples de codes utilisables dans vos propres scripts de sauvegarde.

rsync est un programme de sauvegarde de fichiers particulièrement facile à utiliser ; il permet des sauvegardes rapides des fichiers et répertoires. C'est possible grâce à l'utilisation de routines particulièrement astucieuses, vérifiant si les fichiers ont pu être modifiés, et sélectionnant pour le traitement et la copie, les seuls objets qui l'aient effectivement été. Rsync utilise aussi un outil de compression accélérant le processus de duplication (lorsqu'on lui adresse explicitement l'option -z). Voici quelques détails de son fonctionnement:

Le programme rsync détecte les fichiers et répertoires qu'il est nécessaire de copier en vérifiant si certains de leurs attributs ont changé (par exemple leur dernière date/heure de modification, ou leur taille), et si c'est le cas en déduit qu'il s'agit de quelque chose qui n'a pas été sauvegardé auparavant. Ce processus de sélection est particulièrement rapide.

Lorsque rsync a achevé la création de la liste à utiliser, la copie des fichiers/répertoires modifiés est réalisée très vite parce qu'une routine de compression s'exécute durant le processus de copie, avant l'envoi, et que c'est une fois les copies reçues à leur adresse de destination, qu'elles sont décompressées "à la volée".

rsync peut dupliquer des fichiers:
* d'un système local vers lui-même,
* d'un système local vers une machine distante,
* d'une machine distante vers une machine locale.

Il utilise indifférament le client ssh par défaut, ou un démon rsync activé sur chacune des machines utilisée, machine source et machine cible. Ses pages man précisent, que si vous êtes en mesure de vous connecter à un système en utilisant ssh, rsync le pourra aussi.

Une limitation de Rsync réside dans son INCAPACITÉ à copier des fichiers d'une machine distante à une autre machine distante. Pour ce faire, il vous faudrait copier la source sur votre système local en préalable, pour l'adresser ensuite à la seconde machine distante.

Pour fournir un exemple de cette logique, imaginons disposer de trois ordinateurs;

neo – notre système local
morpheus – une machine distante
trinity – une autre machine distante

Vous voulez utiliser rsync à copier, synchroniser les répertoires de données inclus dans /home/utilisateur/repertoire_de_donnees de plusieurs machines entre elles. Chaque système "appartient à" un utilisateur spécifique, en d'autres mots un utilisateur précis utilise tel ou tel système précis, qui est sensé être utilisé comme "source" pour les deux autres machines. Vous allez donc devoir lancer la commande rsync sur le système "local" de départ seulement, que nous avons appelé neo :

l'utilisateur principal de neo est cuddles
l'utilisateur principal de morpheus est tartie
l'utilisateur principal de trinity est taylar

Récapitulons : ce que nous voulons est sauvegarder et/ou synchroniser les données suivantes :

le contenu de /home/cuddles/repertoire_de_donnees de neo
 vers morpheus et trinity,
le contenu de /home/tartie/repertoire_de_donnees de morpheus
 vers neo et trinity,
le contenu de /home/taylar/repertoire_de_donnees de trinity
 vers neo et morpheus.

Le problème avec rsync, du fait de son impossibilité à synchroniser d'une machine distante à une autre, va se poser au moment de sauvegarder trinity vers morpheus ou morpheus vers trinity.

neo --> morpheus – c'est bon, local vers machine distante
neo --> trinity – c'est bon, local vers machine distante
morpheus --> neo – c'est bon, machine distante vers locale
trinity --> neo – c'est bon, machine distante vers locale
morpheus --> trinity – machine distante vers machine distante
				 – ne marchera pas
trinity --> morpheus – machine distante vers machine distante
				 – ne marchera pas

Pour résoudre cette limitation, il va falloir légèrement modifier le schéma de rsync. Nous allons réaliser ceci :

morpheus --> trinity – deviendra: morpheus --> neo & neo --> trinity
trinity --> morpheus – deviendra: trinity --> neo & neo --> morpheus

Nous créerons donc une étape supplémentaire qui, considérant que toute manière, nous voulons que l'intégralité des données soit bien présente sur la machine neo, ne revient qu'à un changement de source, sans incidence sur le résultat voulu. Cela va nous garantir que toutes nos sauvegardes soient bonnes et que rien n'y manque.

Prenez bien en compte cette limitation de rsync lorsque vous concevez vos procédures de sauvegardes et synchronisation avec cet outil.

Utiliser la syntaxe nom d'hôte à nom d'hôte avec rsync.

Comme il est décrit plus haut, utiliser neo, morpheus ou trinity en lieu et place de leurs adresses IP physiques, est une méthode propre et facile pour rendre les choses plus lisibles. Pouvoir utiliser la syntaxe nom d'hôte à nom d'hôte avec rsync s'obtient facilement.

Quand vous éditerez le fichier /etc/hosts, pour ajoûter aux adresses IP les noms d'hôtes qui y correspondent, vous écrirez dans les lignes supérieures du fichier ces traductions :

192.168.1.15	 neo
192.168.1.16	 morpheus
192.168.1.17	 trinity

La première ligne traduit l'adresse IP 192.168.1.15 en "neo", la deuxième 192.168.1.16 en “morpheus”, et la troisième 192.168.1.17 en “trinity”. Après l'édition et la sauvegarde du fichier /etc/hosts, vous allez ainsi pouvoir indifférament utiliser les IP ou les noms d'hôtes. Vous en comprendrez l'intérêt quand par exemple vous changerez l'IP d'une machine. Imaginons que vous changiez celle de neo de 192.168.1.15 en 192.168.1.25

Si tous vos scripts utilisent l'IP, vous devrez les localiser tous et y modifier l'adresse IP. Si vos scripts usent de noms d'hôtes, seuls les fichiers /etc/hosts nécessiteront d'être réédités, pour que tous vos scripts continuent à fonctionner. C'est particulièrement pratique lorsque vous gérez beaucoup de scripts utilisant des connexions distantes. Ceci d'autre part rend vos scripts bien plus lisibles.

rsync, et les deux façons de l'utiliser.

La première méthode avec rsync "pousse" les fichiers vers une cible, et la seconde les "tire" depuis une source. Chacune à ses avantages et ses inconvénients. Voyons ce qu'il en est pour chacune au travers d'une explication dans laquelle nous supposerons qu'une des machine est locale et l'autre distante, afin de rendre les choses plus explicites.

"pousser" - le système de fichiers local héberge les fichiers et répertoires sources, et la cible est une machine distante. La commande rsync est lancée depuis le système local, et pousse les données vers la machine distante.

Les avantages:
*Vous pouvez faire les sauvegardes de plusieurs systèmes vers une cible.
*Le processus de sauvegarde est réparti sur chaque machine et pas sur une seule qui l'assurerait à elle seule.
*Si un système est plus rapide qu'un autre, il peut finir rapidement et être opérationnel pour d'autres tâches.

Les inconvévients:
*Si vous utilisez un script programmé avec cron, vous allez devoir mettre-à-jour et changer les crontabs de tous les systèmes en jeu, ainsi que chacune des versions locales du script.
*Votre procédure de sauvegarde n'a aucun moyen de détecter si la partition cible du système distant est effectiment montée, et pourrait dans certains cas ne rien sauvegarder sur la cible.

"Tirer" - Le système distant héberge les fichiers et répertoires sources et la cible est la machine locale. La commande est lancée depuis la machine locale qui "tire" les données de la machine distante.

Les avantages:
*Un système unique est dédié au contrôle des sauvegardes de toutes les machines du réseau : il s'agit donc de sauvegarde dite centralisée.
*Si vous utilisez un script, il n'existe que sur une seule machine, et sa configuration, mise-à-jour et modification en sont d'autant plus simplifiées. Dans la même logique un seul fichier crontab contrôle la programmation chronologique de l'exécution du script.
*Le script dispose des moyens de vérifier et monter si c'est nécessaire, le système de fichiers de la partition cible.

Syntaxe de rsync, telle que décrite dans ses pages man:
       rsync [OPTION]... SRC [SRC]... DEST

       rsync [OPTION]... SRC [SRC]... [USER@]HOST:DEST

       rsync [OPTION]... SRC [SRC]... [USER@]HOST::DEST

       rsync [OPTION]... SRC [SRC]... rsync://[USER@]HOST[:PORT]/DEST

       rsync [OPTION]... SRC

       rsync [OPTION]... [USER@]HOST:SRC [DEST]

       rsync [OPTION]... [USER@]HOST::SRC [DEST]

       rsync [OPTION]... rsync://[USER@]HOST[:PORT]/SRC [DEST]
Exemple opérationnel de commandes rsync:
rsync -agEvz --delete-after --exclude=”*~” morpheus:/home/tartie /media/sda7/SysBackups/morpheus/home

Voyons ensemble des parties de cette commande:

le chemin des fichiers sources est: morpheus:/home/tartie
et celui de la cible: /media/sda7/SysBackups/morpheus/home

tout le contenu de /home/tartie... va être sauvegardé dans /media/sda7/SysBackups/morpheus/home, donnant un résultat comme ceci :

/media/sda7/SysBackups/morpheus/home/tartie...

il est à noter que la seule raison qui place /tartie dans /home provienne de la syntaxe de désignation de la CIBLE et non de celle de la SOURCE. la "source" ne sélectionne que d'où viennent les données et pas où elles vont aller. C'est la "cible" qui désigne à rsync où copier, les données qu'il récupère de la "source". Voyens cet exemple :

rsync [...] /home/user/data/files /media/sda7/SysBackups/neo

Dans la commande ci-dessus, seul le répertoire source /files et ce qu'il contient, sera copié sous le répertoire cible /neo, et nous n'obtiendrons pas /media/sda7/SysBackups/neo/home/user/data/files

Soyez attentif à ces considérations lorsque vous créez vos commandes de sauvegarde avec rsync.

Explications sur les options:
-a est utilisé pour mode archive. Dans les pages man, l'option est expliquée “en termes simples, une façon de sauvegarder en mode récursif, et de préserver 'pratiquement' tout. Il est mentionné que cette option ne préserve pas les liens durs en raison de la complexité du processus.
L'option -a est considérée comme un équivalent à : -rlptgoD qui signifie:
-r = recursif – traite les sous-répertoires et fichiers trouvés dans la source.
-l = liens – quand des liens symboliques sont rencontrés, les re-crée sur la cible.
-p = permissions – commande à rsync de fixer les mêmes permissions que celles de la source.
-t = temps – commande à rsync de régler l'heure de la cible en fonction de celle de la source.
-q = quiet=silencieux – commande à rsync d'afficher le minimum de texte. L'option pour le mode verbeux est -v.
-o = owner=propriétaire – commande à rsync, que bien qu'il soit lancé par root, il doive fixer aux données de la cible les mêmes propriétaires qu'à ceux de la source.
-D = équivaut à l'addition de ces deux commandes: --devices --specials
 --devices = fait en sorte que rsync transfère les caractères et fichiers de périphériques bloc du système distant en sorte de pouvoir recréer ces périphériques. Malheureusement, si vous n'utilisez pas également l'option  --super dans la même commande, cela sera sans effet.
 --specials = fait en sorte que rsync transfère les fichiers spéciaux comme les noms de sockets et fifos.
-g est utilisé pour préserver les permissions de “groupe” de la source vers la cible.
-E est utilisé pour préserver les permissions d'"exécution" de la source vers la cible.
-v est utilisé pour accroître la loquacité de ce qui sera affiché durant l'opération. Après s'être assuré de bien sauvegarder ce que nous voulons, on pourra enlever ce "v". Il est mentionné ici, car s'il on lance ce processus à partir d'un cron, il est souvent utile de "voir" ce qui se fait. Ce sera à vous de décider s'il faut oui ou non, utiliser cette option.
-z est utilisé pour compresser les données à transférer ou copier, rendant le processus de copie plus rapide puisqu'influant sur le volume du transfert.
--delete-after=effacer-après = les fichiers/répertoires qui ne seraient plus dans la source sont effacés après le transfert, et pas avant. Ce "after" est utilisé en cas de crash ou de problèmes, et "effacer" est utilisé pour prévenir que des fichiers n'existant plus sur le système source ne viennent corrompre la cible.
--exclude = une syntaxe qui permet d'exclure certains fichiers ou répertoire du processus. par exemple, --exclude=“*~” excluerait TOUT fichier ou répertoire dont le nom se terminerait par un tilde du processus de sauvegarde. Un seul et unique schéma d'exclusion est admissible avec l'option --exclude, et donc si vous voulez en utiliser plusieurs, il vous faudra ajoûter autant de lignes --exclude que nécessaires dans votre commande.

En complément, voici quelques autres options de commandes utiles:

-c – ajoûte un nouveau niveau de vérification des sources, au moment de leur comparaison à la copie sur la cible après l'achèvement du processus ; ceci conduit le processus de copie à prendre plus de temps, et rsync opérant systématiquement des vérifications, il s'agit d'une forme de redondance, conduisant à ne pas recourir a priori à cette option.
--super – comme la page man le décrit, la machine receptrice tentera des opérations d'administration réservées au super-utilisateur
--dry-run – littéralement "lancement à sec", autrement dit, vous retournera ce qui aurait été transféré en cas de commande effective, comme le font par exemple les commandes apt-get install ou apt-get dist-upgrade, quand on leur adresse l'option -s.

Notre commande se termine systématiquement par l'adresse du répertoire source que suit celle du répertoire cible.

Exemples de commandes:
rsync -agEvz --delete-after --exclude=”*~” morpheus:/home/tartie /media/sda7/SysBackups/morpheus/home

Cette commande va sauvegarder tous les fichiers répertoires inclus dans /home/tartie vers le système dont le nom d'hôte est "morpheus", pour les disposer dans le répertoire /media/sda7/SysBackups/morpheus/home – préservant la structure d'arborescence du répertoire source /tartie.

rsync -agEvz --delete-after --exclude=”*~” /home/tartie neo:/media/sda7/SysBackups/morpheus/home

Cette commande est l'équivalent en mode "pousser" de la commande précédente. Elle va pousser tous les fichiers répertoires inclus dans /home/tartie vers la machine neo et dans le même répertoire. Notez qu'un système est considéré "distant" dès lors que son chemin est précédé du signe “:”.

rsync -agEvz --delete-after --exclude=”*~” /home/cuddles /media/sda7/SysBackups/neo/home

Cette commande réalise une synchronisation de réperoire local à répertoire local puisqu'aucun chemin n'est précédé de “:”. Elle sauvegardera la zone /home/cuddles vers le répertoire /media/sda7/SysBackups/neo/home de la même machine.

Voyons maintenant ce que l'usage de multiples options d'exclusion peut donner:

rsync -agEvz --delete-after --exclude=”*~” --exclude=”*.c” --exclude=”*.o” "/*" /media/sda7/SysBackups/neo

La commande ci-dessus va sauvegarder TOUT les fichiers et répertoires situés sous racine de la machine locale vers /media/sda7/SysBackups/neo – sauf que cette sauvegarde excluera tout fichier ou répertoire se terminant par un “~”, ou un “.c”, ou un “.o”.

Ci-dessous figure un exemple de commande rsync à éviter et qui retournerait des erreurs. Un exemple de commande rsync forcément inopérante puisque de machine distante à machine distante:

rsync -agEvz --delete-after --exclude=”*~” morpheus:/home/tartie trinity:/home

Comme il est spécifié plus haut : ça ne marche pas avec rsync !

Pour finir et pour la route, voyons ce qu'une commande rsync de machine distante à locale donnerait en remplaçant les noms d'hôte par les IP.

La même commande est ici successivement écrite en utilisant les noms d'hôte puis les IP.

rsync -agEvz --delete-after --exclude=”*~” morpheus:/home/tartie /media/sda7/SysBackups/morpheus/home
rsync -agEvz --delete-after --exclude=”*~” 192.168.1.16:/home/tartie /media/sda7/SysBackups/morpheus/home

Certes, vous n'êtes pas obligés d'utiliser les noms d'hôtes, mais vous conviendrez que ce soit un tantinet plus simple.

Vous devriez à présent être en mesure de concevoir une commande simple pour rsync, en vous inspirant des exemples fournis, jusqu'à obtenir les formes qui correspondront à vos besoins.

Dernière Révision le 14/08/2010 0100 UTC