Rsync où comment transférer des fichiers

rsync est un outil de transfert de fichiers. On pourrait dire comme Filezilla. Voilà, tout est dit !

Pourtant c’est un outil incontournable de l’administration système. A tel point que je n’utilise que très rarement la commande cp (copy).

A l’origine rsync a été développé pour transférer des fichiers ou plutôt des arborescences sur des liaisons lentes. Voir http://rsync.samba.org On imagine le nombre d’utilisateurs qui se sont arrachés les cheveux en transférant une arborescence de site Web à l’époque des modems ADSL !

En effet, à chaque coupure de la liaison, on relançait la copie de l’arborescence même si la destination avait reçu 80% des fichiers.

D’ailleurs ce problème existe toujours pour les copies d’arborescences locales sur tous les outils de gestion de fichiers, comme l’Explorateur Windows, le Finder Mac ou les outils graphiques divers sous Linux. Si vous copiez une arborescence contenant des milliers de fichiers et qu’au bout d’une heure vous arrêtez le programme, car vous ne savez pas si la copie va durer toute la nuit, vous êtes bon pour refaire l’opération. Sauf que la première copie a laissé l’arborescence cible dans un certain état et vous ne connaissez pas le delta ! Donc, la seule manière simple de refaire la copie est de supprimer la destination et lancer la copie ensuite. Vous êtes reparti pour un tour ! (ou répondre que vous écrasez les fichiers identiques).

rsync répond parfaitement à la problématique des miroirs de l’Internet.

rsync permet de transférer des fichiers entre 2 machines ou sur
la même machine, selon la notation utilisée. C’est comme cp + rcp !

La puissance de rsync tient dans les points suivants :

  • respect des arborescences, des droits, des liens, des ACL, etc….
  • copie uniquement des fichiers modifiés entre 2 arborescences
  • transfert uniquement des morceaux (chunks) modifiés d’un fichier
  • possibilité de compresser les fichiers pour accélérer le transfert

Notez quand même, que selon les OS sur lesquels se trouvent la source et la destination (Unix/Windows, Windows/Mac, etc…), les droits et les ACL ou attributs ne vont pas pouvoir être transférés correctement.

La préservation des droits, etc… existe avec cp ou rcp. En local, c’est le « cp -a … ». Mais un deuxième « cp -a … » recopie tout une deuxième fois. Alors que l’équivalent « rsync -a … » lancé une deuxième fois ne transfère plus rien, car la source et la destination sont identiques !

Par défaut pour comparer les différences entre la source et la cible, rsync compare la taille et la date des fichiers. S’ils ces informations sont identique pour un fichier, il ne le transfère pas, car il considère qu’ils sont identiques. On peut forcer le contrôle en calculant les signatures des chunks (CRC) avec l’option -c (check). En fait, le CRC est calculé par morceaux de fichier de manière à trouver les différence à l’intérieur du fichier et ne transférer que ces morceaux.

D’autre part, pour reconstituer le fichier cible, il crée une copie du fichier cible.
Ainsi pour mettre à jour un fichier de 1Go, on a besoin d’1Go d’espace libre en plus du fichier cible, même s’il n’y a que quelques octets transférés. Ca veut dire que si vous transférez un unique fichier de 8Go et que le transfert est coupé, le fichier destination temporaire est effacé, et le rsync suivant va recommencer le transfert depuis le début.

C’est pour cette raison, qu’il vaut toujours mieux découper les gros fichiers en petits morceaux avec la commande split, transférer tous les morceaux avec rsync, puis les reconstruire avec cat !

Exemple :

L’option -n permet de lancer rsync sans effectuer les opérations (dry run). Avec l’option -v (verbose), on peut comparer deux arborescences pour « voir » les différences. Si on est pointilleux, on peut ajouter le -c, qu’on pourra utiliser pour comparer des arborescences suite à une intrusion….

Le dernier intérêt de rsync, c’est qu’il utilise un tuyau ssh pour pour les fichiers distants. Ainsi, lorsqu’on a une clé SSH sur l’ordinateur cible, pas besoin de saisie de mot de passe…. On peut lancer ses synchronisations d’arborescences dans des tâches planifiées (cron) !