rsync

rsync (pour remote synchronization ou synchronisation à distance), est un logiciel 1) de synchronisation de fichiers. Il est fréquemment utilisé pour mettre en place des systèmes de sauvegarde distante.
rsync travaille de manière unidirectionnelle c'est-à-dire qu'il synchronise, copie ou actualise les données d'une source (locale ou distante) vers une destination (locale ou distante) en ne transférant que les octets des fichiers qui ont été modifiés.

La notion d’unidirectionnalité semble souvent mal comprise : elle signifie qu'en une commande, la synchronisation ne peut se faire que dans un sens. Rien n'empêche ensuite de relancer la commande une seconde fois dans l'autre sens !

D'un point de vue de l'entreprise, un serveur de synchronisation est utile pour centraliser les sauvegardes sur une même machine équipée accessoirement d'un enregistreur de bande.

Pour le particulier, il est intéressant (si vous avez plusieurs machines), d'avoir une sauvegarde simple et rapide de son Dossier Personnel.

Ici nous verrons son utilisation basique. Pour plus de détails, allez voir ce tutoriel : "Sauvegarder "/home" avec rsync".

Pour les personnes qui n’aiment pas la ligne de commande, il existe une interface graphique à rsync : Grsync !!

Comme l'indique le manuel :

"rsync est un programme très similaire à rcp, mais possède bien plus d'options et utilise le protocole de mise à jour à distance rsync afin d'accélérer significativement le transfert de fichiers lorsque le fichier de destination existe déjà."

L'appel de base :

rsync source/ destination/

L'intérêt est une utilisation à travers le réseau. rsync utilise SSH par défaut. Un exemple :

rsync -az source/ login@serveur.org:/destination/

où:

  • -a ou --archive : est un moyen rapide de dire que vous voulez la récursivité et préserver pratiquement tout. La seule exception est que si --files-from a été spécifiée alors -r n'est pas utilisée. Ceci est équivalent à -rlptgoD.
  • -z ou --compress : compresse les données lors du transfert. (Limite la bande passante mais augmente l'utilisation processeur et le temps de transfert : inutile en réseau local ou avec très bon débit)
Attention, il convient d'être vigilant dans l'utilisation ou non du slash (« / ») dans le chemin de la source. Ainsi, les deux commandes suivantes ne sont pas équivalentes :
rsync source destination/
rsync source/ destination/

En effet, la première commande va _créer_ le dossier source dans le dossier destination en ajoutant donc un niveau dans l'arborescence. La deuxième commande copie le _contenu_ du dossier source dans le dossier destination. Autrement dit, les deux commandes suivantes sont, elles, équivalentes* :

rsync source destination/
rsync source/ destination/source/

Enfin, il faut noter que l'utilisation ou non d'un slash final dans le chemin de la destination n'a aucune incidence. Les deux commandes suivantes sont donc équivalentes :

rsync source destination/
rsync source destination

* Sauf dans le cas ou source est un lien symbolique vers un répertoire, la première commande ne copie que le lien, tandis que la seconde travaille bien à l'intérieur du répertoire

Pour une gestion du port ssh, utiliser la syntaxe suivante:
rsync -avz source -e "ssh -p port" user@ip:"/chemin/de destination avec espaces/"

Créer un dossier miroir

Voici un exemple d'une commande, utilisant le protocole SSH, qui copie à l'identique le dossier <source> vers le dossier <destination>.

Copie du dossier source vers le serveur:

rsync -e ssh -avz --delete-after /home/source user@ip_du_serveur:/dossier/destination/

où :

  • --delete-after : à la fin du transfert, supprime les fichiers dans le dossier de destination ne se trouvant pas dans le dossier source.
  • -z : compresse les fichiers (Limite la bande passante mais augmente l'utilisation processeur et le temps de transfert : inutile en réseau locale ou avec très bon débit)
  • -v : verbeux
  • -e ssh : utilise le protocole SSH

Si les noms des chemins contiennent des espaces, on peut les écrire entre guillemet pour échapper les espaces :

rsync -e ssh -avz --delete-after "/home/source avec espace/" user@ip_du_serveur:"/dossier/destination avec espace/"

Avec l'option -n la commande liste ce qu'elle va faire sans l'exécuter:

rsync -e ssh -avzn --delete-after /home/mondossier_source user@ip_du_serveur:/dossier/destination/

Exclure des fichiers

On peut exclure des fichiers/dossiers selon beaucoup de schémas. C'est utile pour ne pas sauvegarder le cache, les fichiers temporaires, la corbeille, etc…

  • Liste dans la commande :
    rsync --exclude="nom_de_dossier" --exclude="- autre_nom_de_dossier" source/ destination/
  • Un fichier de règles d'exclusion
    rsync --exclude-from=ExclusionRSync source/ destination/ 


    Et le fichier ExclusionRSync dans le dossier courant sera de cette forme :

    tmp
    .Trash
    .cache
    .PlayOnLinux

    Vous pouvez consulter cette page très intéressante sur le sujet de l'exclusion par fichier de règles.

Inclure des fichiers

Dès lors qu'on exclut, il peut être nécessaire d'inclure.
Exemple, vous souhaitez ne synchroniser qu'un type de fichier, mettons des .csv, cela donne

rsync --include="*.csv" --exclude="*" source/ destination/
il faut respecter l'ordre include puis exclude

Interface graphique : Grsync (Gnome)

Dans les dépôts vous trouverez notamment le logiciel Grsync qui offre une interface graphique pour rsync: voir ce tutoriel sur Grsync.
Voir aussi la page sauvegarde pour trouver d'autres interfaces graphiques.

Sauvegarde distante du serveur web

Cas présenté :

  • un serveur distant s'exécutant sous le compte système www-data.
    • ce serveur est accessible via ssh
    • on a un compte utilisateur pour se connecter sur ce serveur
    • ce compte (ou un autre) a les droits d'administration de la machine
  • une machine sur laquelle sauvegarder les données
    • on a un compte utilisateur avec le droit sudo

Pour l'exemple qui suit :

  1. sur la machine locale, on devient www-data pour travailler avec les droits de ce dernier
  2. www-data exécute la commande rsync qui va établir une connexion via ssh au serveur distant avec le compte utilisateur (on peut avoir besoin de saisir le mot de passe de l'utilisateur distant si on n'a pas déposé de clef publique)
  3. sur le serveur distant, via ssh, utilisateur va lancer sudo pour devenir www-data
  4. www-data exécute la commande rsync qui échange les informations avec la machine locale

Sur le serveur distant :

  • Autoriser l'utilisateur à lancer la commande rsync sous le compte système www-data grace à sudo, sans mot de passe:
    sudo visudo
    utilisateurssh ALL=(www-data) NOPASSWD: /usr/bin/rsync
  • Optionnel : déposer une clef publique ssh au besoin pour l'utilisateur

Sur la machine locale :

  • Lancer une synchronisation en tant qu'utilisateur www-data grace à sudo
    sudo -u www-data rsync -a --progress -e ssh --rsync-path "sudo -u www-data rsync" utilisateur@serveur_distant:/var/www/ /var/www/

Source de ce tutoriel, adaptée pour le cas présenté


Contributeur : ostaquet, jahwork


1)
sous licence GNU GPL
  • rsync.txt
  • Dernière modification: Le 13/10/2019, 08:39
  • (modification externe)