RSYNC

RSYNC jmv

RSYNC

Description 

rsync est un logiciel qui permet de copier des fichiers et des répertoires d’une « source » à une « destination » et par la suite de les synchroniser.

La source peut être un ou des fichiers ou encore un ou des répertoires. La destination peut être un autre répertoire d’un même ordinateur, un disque externe ou un ordinateur distant d’un même réseau ou ailleurs sur la planète.

rsync est propre aux systèmes Linux/Unix et ne fonctionne bien qu’avec ces systèmes. Pour assurer la copie et la synchronisation d’un ordi Windows à un ordi Linux, par exemple, il est préférable de faire appel à un logiciel de sauvegarde (backup) fonctionnant sous Windows, d’installer Samba sur l’ordi Linux et de programmer le logiciel Windows en question pour qu’il fasse des sauvegardes à intervalles réguliers.

rsync fonctionne d’abord et avant tout en ligne de commande, mais il existe des interfaces graphiques basées sur ses fonctionnalités, tels que Grsync. Pour mes propres besoins, je n’utilise que la ligne de commande, parce que je travaille beaucoup avec des ordinateurs distants.

Installation

S’il n’est pas déjà présent par défaut, rsync s’installe de la façon suivante, selon la distribution. Quelques exemples :

$ sudo apt-get install rsync [Debian/Ubuntu & Mint] 

$ pacman -S rsync [Arch Linux]

$ emerge sys-apps/rsync [Gentoo]

$ sudo dnf install rsync [Fedora/CentOS/RHEL et Rocky Linux/AlmaLinux]

$ sudo zypper install rsync [OpenSUSE]


 

RSYNC -- Utilisation

RSYNC -- Utilisation jmv

Utilisation

La synchronisation entre deux répertoires appartenant au même ordinateur, par exemple d’un disque dur à un disque externe, n’a pas besoin de configuration. Il suffit simplement de donner la commande pour qu’elle s’exécute. La première fois que la commande est donnée, rsync ne fait que copier les fichiers et répertoires d’un dispositif à l’autre. Par la suite, il se contente de faire une synchronisation (ajout des nouveaux fichiers et répertoires, remplacement des fichiers qui ont changé, etc.)

La commande à exécuter est la suivante :

# rsync options source destination

Quelques unes des options les plus utilisées :

  • -v : mode « verbeux »
  • -r : copie récursive (répertoires et sous répertoires, mais sans conserver les permissions et la date de création).
  • -a : mode « archives » permettant la copie récursive et la préservation des liens symboliques, des permissions, des appartenances (utilisateur et groupe), ainsi que de la date de création.
  • -z : compression des fichiers (pour ménager la bande passante, notamment).
  • -h : affichage des chiffres dans un format lisible par les humains.
  • --progress : pour voir l’avancement du transfert


Pour la liste complète des options : man rsync ou http://www.delafond.org/traducmanfr/man/man1/rsync.1.html (35 pages!!!)

 

Quelques exemples de copie locale

Transfert d’un fichier dans un répertoire local :

jmv@linux2 ~ $ rsync -zvh allo /tmp/sauvegarde/

created directory /tmp/sauvegarde

allo


 

sent 145 bytes received 73 bytes 436.00 bytes/sec

total size is 107 speedup is 0.49


 


Transfert d’un répertoire dans un autre répertoire local :

Ici, étant donné que le répertoire /tmp/sauvegarde existe déjà, il n’a pas besoin d’être créé par rsync

jmv@linux2 ~ $ rsync -azvh lecture /tmp/sauvegarde/

sending incremental file list

lecture/

lecture/Hackers.epub

lecture/Hackers.pdf

lecture/La_Comédie_humaine.pdf

lecture/La_Curée.epub

lecture/La_Fortune_des_Rougon.epub

lecture/buildingdrupal6.epub

lecture/drupal7.epub

lecture/files.txt

lecture/learningdrupal6dev.epub


sent 36.77M bytes received 191 bytes 24.51M bytes/sec

total size is 37.32M speedup is 1.02

 

Vérifions si tout s’est passé comme le programme le dit.

 

Copie entre ordis (linux) distants

 

Pour des ordis distants, le principe est un peu le même et la commande à donner est légèrement différente. Par exemple, d’un ordinateur local à un serveur :

 # rsync -options source utilisateur@serveur:répertoire/

Par exemple, on veut faire une sauvegarde du répertoire « lecture » de tantôt vers le serveur de fichiers familial, qui s’appelle « sf » et dont l’adresse figure dans le fichiers /etc/hosts :

jmv@linux2 ~ $ rsync -azvh lecture jmv@sf:

(jmv@sf) Password: 

sending incremental file list

lecture/

lecture/Hackers.epub

lecture/Hackers.pdf

lecture/La_Comédie_humaine.pdf

lecture/La_Curée.epub

lecture/La_Fortune_des_Rougon.epub

lecture/buildingdrupal6.epub

lecture/drupal7.epub

lecture/files.txt

lecture/learningdrupal6dev.epub


sent 36.77M bytes received 191 bytes 4.33M bytes/sec

total size is 37.32M speedup is 1.02

 

 

Comme on peut le voir, le serveur distant demande un mot de passe. La même opération peut également s’exécuter avec SSH pour assurer une sécurité de bout en bout. Il suffit d’ajouter l’option « e » et ssh à la commande :

jmv@linux2 ~ $ rsync -azvhe ssh lecture jmv@sf:

(jmv@sf) Password: 

sending incremental file list

lecture/

lecture/Hackers.epub

lecture/Hackers.pdf

lecture/La_Comédie_humaine.pdf

lecture/La_Curée.epub

lecture/La_Fortune_des_Rougon.epub

lecture/buildingdrupal6.epub

lecture/drupal7.epub

lecture/files.txt

lecture/learningdrupal6dev.epub


sent 36.77M bytes received 191 bytes 4.33M bytes/sec

total size is 37.32M speedup is 1.02

 

 

Encore une fois, un mot de passe est demandé, à moins qu’un échange de clés ait déjà été effectué entre les deux ordis.

RSYNC --Options "delete" et "exclude"

RSYNC --Options "delete" et "exclude" jmv

 

Options --delete et --exclude

 

Les options --delete et --exclude (à noter le double tiret) sont très utiles dans les cas où il existe déjà une copie de sauvegarde sur l’ordi de destination et si l’on procède à une synchronisation à intervalles réguliers.


L’option --delete supprime sur l’ordi de destination les fichiers et répertoires qui n’existent plus sur l’ordi source. Donc, si on a effacé un fichier dans un répertoire de l’ordi source faisant l’objet d’une synchronisation, il sera automatiquement effacé de l’ordi de destination. Pratique, mais aussi dangereux, car si on efface un fichier ou un répertoire par accident, il finira aussi par être effacé sur l’ordi de destination, à moins de pouvoir le récupérer AVANT la synchronisation!

L’option --exclude permet d’exclure des fichiers ou des répertoires de la synchronisation. Elle doit être mentionnée pour chaque élément différent à exclure. Par exemple, si on veut exclure les répertoires « Documents » et « Musique » et le fichier « linux.txt », il faudra procéder ainsi :

# rsync -avz --exclude ‘linux.txt’ --exclude ‘Documents’ --exclude ‘Musique’ source/ destination/

Si les répertoires et fichiers sont trop nombreux, rendant ainsi la lecture de la commande à exécuter un peu difficile, on peut utiliser l’option --exclude-from qui renvoit rsync à une liste de répertoires et/ou fichiers à exclure. Pour reprendre l’exemple ci-dessus, on pourrait créer un fichier texte appelé exclusions.txt contenant un élément par ligne (ici, on suppose que la source est le répertoire de l’utilisateur) :

# exclusions.txt

# Fichiers et répertoires à exclure de la synchronisation



 

linux.txt

Documents

Musique

La commande sera donc la suivante :

# rsync -avz --exclude-from ‘exclusions.txt’ source/ destination/

 

Avec l’option --delete, cela donnera :

rsync -avz --exclude-from ‘exclusions.txt’ --delete source/ destination/

 

RSYNC --Synchronisation sans mot de passe

RSYNC --Synchronisation sans mot de passe jmv

Synchronisation sans mot de passe

Comme on a pu le remarquer, chaque fois qu’on synchronise d’un ordinateur à l’autre, on se fait demander un mot de passe. Si l’on veut éviter de se faire demander le mot de passe à chaque exécution de la commande rsync, il faut recourir au fichier /etc/rsync.conf sur l’ordinateur source, qui, en quelque sorte, donne la permission à l’autre ordi de faire la synchronisation sans mot de passe. Cela peut également être pratique dans le cas de synchronisations à intervalles réguliers, comme on le verra plus loin.

Le contenu du fichier rsync.conf n’est pas très différent d’une distribution à l’autre. Certains offrent des commentaires ou des instructions de base, d’autres pas (mon serveur de courriel Ubuntu à Toronto, par exemple). Voici un fichier de base de Gentoo, la distribution que j’utilise à la maison :

 

# /etc/rsyncd.conf

# Minimal configuration file for rsync daemon

# See rsync(1) and rsyncd.conf(5) man pages for help

# This line is required by the /etc/init.d/rsyncd script

pid file = /run/rsyncd.pid

use chroot = yes

read only = yes

 

# Simple example for enabling your own local rsync server

#[gentoo-portage]

# path = /var/db/repos/gentoo

# comment = Gentoo ebuild repository

# exclude = /distfiles /packages

 

 

 

Et voici un extrait du fichier rsync.conf que j’utilise sur mon ordi principal (source) pour la synchronisation avec le serveur de fichier familial (destination) :

# /etc/rsyncd.conf

# Minimal configuration file for rsync daemon

# See rsync(1) and rsyncd.conf(5) man pages for help

 

# This line is required by the /etc/init.d/rsyncd script

pid file = /run/rsyncd.pid

use chroot = yes

read only = yes

log file = /var/log/rsync

 

# Simple example for enabling your own local rsync server

#[gentoo-portage]

# path = /var/db/repos/gentoo

# comment = Gentoo ebuild repository

# exclude = /distfiles /packages


###############################################

# Autoriser la sauvegarde des répertoires banque, factures,

# Antoine, Gabrielle et autres

###############################################

(…)

[gabrielle]

path = /home/jmv/gabrielle

comment = repertoire gabrielle

uid = jmv

gid = jmv

 


[antoine]

path = /home/jmv/antoine

comment = repertoire antoine

uid = jmv

gid = jmv


[disque_externe]

path = /home/jmv/sauvegarde

comment = repertoire sauvegarde qui se trouve sur le disque externe

uid = jmv

gid = jmv


(...)

 

 

 

Ceux qui ont l’oeil plus vif auront remarqué que j’ai ajouté la ligne « log file = /var/log/rsync » au fichier original, en plus des autres modules évidemment. Si jamais un problème de synchronisation survenait, j’aurai au moins une chance d’en retracer l’origine.

 

Le nom des modules est entre crochets […].

path = /chemin/du/répertoire/ou/du/fichier

comment = (facultatif)

uid = nom_de_l’utilisateur

gid = groupe_de_l’utilisateur

 

Les deux derniers éléments, uid et gid, permettent de conserver les permissions appartenant à l’utilisateur en question.

 

Donc, mon ordi principal (source) permet au serveur de fichiers familial (destination) de venir chercher les fichiers et répertoires à synchroniser et ce, sans mot de passe. La commande exécutée sur le serveur familial est la suivante pour le module [disque_externe] de mon ordi principal :

 

rsync -avh --delete 192.168.1.6::disque_externe /mnt/serveur/jmv/sauvegarde

À noter que l’option « z » n’est pas utilisée étant donné que les deux ordis sont sur le réseau interne et que ça ne nuit pas à la bande passante. Si certains fichiers ont été modifiés sur le disque externe, ils remplaceront ceux qui existent déjà sur la cible, c’est-à-dire le serveur de fichiers. L’option --delete effacera sur la destination les fichiers et répertoires qui ne figurent plus sur le disque externe.

Mais en réalité, il y a sur le disque externe trois répertoires qui ne changent jamais et qui n’ont pas besoin d’être synchronisés à chaque fois. La commande est donc la suivante :

rsync -avh --exclude 'linux2' --exclude 'linux3' --exclude 'myth' --delete 192.168.1.6::disque_externe /mnt/serveur/jmv/sauvegarde

 Synchronisation à intervalles réguliers

Lorsqu’on veut procéder à une copie de sauvegarde automatisée de fichiers et de répertoires à intervalles réguliers, il est plus pratique de recourir à rsync avec le fichier rsync.conf et crontab, ce dernier permettant d’effectuer des tâches à des moments précis. Nous n’entrerons pas dans les détails de crontab, mais le petit tableau suivant donne une bonne idée de son utilisation :

# Exemple de définition d’une tâche à exécuter :

# .---------------- minute (0 - 59)

# | .------------- heure (0 - 23)

# | | .---------- jour du mois (1 - 31)

# | | | .------- mois (1 - 12) OU jan,feb,mar,apr ...(en anglais seulement)

# | | | | .---- jour de la semaine (0 - 6) (dimanche=0 ou 7) OU sun,mon,tue,wed,thu,fri,sat

# | | | | |

# * * * * * nom_d’utilisateur commande à exécuter

 

À noter que si on laisse un astérisque (*) dans l’une des colonnes, cela signifie tous (toutes) les minutes, heures, jours, etc.

 

Pour revenir à l’exemple du disque externe de mon ordi principal, voici la commande que j’utilise dans crontab en tant que superutilisateur (crontab -e) :

7 0 * * * rsync -av --exclude 'linux2' --exclude 'linux3' --exclude 'myth' --delete 192.168.1.6::disque_externe /mnt/serveur/jmv/sauvegarde

 

Explication : à minuit 7 minutes (7e minute de l’heure 0), tous les jours du mois, tous les mois et tous les jours de la semaine la commande s’exécute. Étant donné que mon disque externe est monté dans un répertoire appelé « sauvegarde », tous les fichiers et répertoires du disque en question sont sauvegardés dans un répertoire qui porte le même nom sur le serveur de fichier familial (/mnt/serveur/jmv/sauvegarde). De plus, comme il existe un fichier rsync.conf comprenant le module [disque_externe] sur l’ordinateur source, le serveur de fichiers destination n’a pas besoin de mot de passe pour accéder aux fichiers et répertoires de son vis-à-vis.

 

L’option « h » utilisée dans les précédentes commandes est devenue inutile puisque la commande s’exécute automatiquement et que personne ne « surveille » le déroulement de la synchronisation.

Conclusion

rsync est un outil très puissant et polyvalent. Il permet de faire la copie, la suppression et la synchronisation de fichiers et de répertoires localement et à distance, manuellement ou de manière automatisée. Avec une configuration adéquate, nul besoin d’un logiciel de sauvegarde!

 

Références :


Article de Techmint (en anglais) : https://www.tecmint.com/rsync-local-remote-file-synchronization-commands/

Article de The Geek Stuff (en anglais) : https://www.thegeekstuff.com/2011/01/rsync-exclude-files-and-folders/

Page de manuel : http://www.delafond.org/traducmanfr/man/man1/rsync.1.html