Rsync

De ArchwikiFR


  • Traduction du Wiki
  • rsync est un utilitaire open source permettant des transferts de fichiers rapides et incrémentés.


Installation

  • Installer le paquet rsync
Note : pour un transfert à distance, rsync doit être présent sur les deux machines, source et destination


INTERFACES

  • Grsync — avec interface GTK+ .
http://www.opbyte.it/grsync/ || grsync
  • gutback — présentation de rsync en Shell.
https://github.com/gutenye/gutbackup || gutbackup
  • JotaSync — Application graphique en Java Swing avec planificateur intégré.
https://trixon.se/projects/jotasync/ || jotasync
  • luckyBackup — Interface Qt écrite en C++.
http://luckybackup.sourceforge.net/index.html || luckybackup


Alternative aux commandec cp/mv

  • rsync est aussi une alternative avancée aux commandes cp/mv , particulièrement en cas de de fichiers volumineux:
$ rsync -P source destination

L'option -P, soit --partial --progress garde l'affichage du nom du fichier en transfert avec indication de la progression en: octets, pourcentage, vitesse, temps...

Pour copier récursivement les sous-directoires l'option est -r --recursive .

  • Les fichiers peuvent être copiés localement comme avec la commande cp, mais le but essentiel de rsync est la copie à distance, c.a.d.. d'un hôte à un autre.

L'emplacement distant sera signifié par la syntaxe deux-points : , ex:

$ rsync source host:destination

ou

$ rsync host:source destination
  • Les transferts par le réseau utilisent le protocole SSH par défaut où host peut être un nom réel d'hôte existant ou un profil/alias prédéfini dans le fichier de configuration .ssh/config.

Qu'il s'agisse d'un transfert de fichiers en local ou à distance, Rsync exécute d'abord une vérification rapide et une liste avec indexation des fichiers source et destination avec leurs données (par défaut, taille du fichier et dernier horodatage de modification) qui sera ensuite utilisée pour déterminer si un fichier doit être re/construit. Pour chaque fichier à construire, une somme de contrôle faible et forte est trouvée pour tous les blocs de sorte que chaque bloc est de longueur S octets, sans chevauchement, et ait un décalage divisible par S. En utilisant cette information, rsync peut construire un fichier de grande taille sans avoir à le transférer en entier. Pour une explication pratique plus détaillée et une explication mathématique détaillée, reportez-vous respectivement au fonctionnement de rsync et à l'algorithme de rsync. Un simple changement d'attribut préservé (selon les options de la commande) serait effectué directement sur le fichier de destination si la vérification rapide a indiqué que les données du fichier n'ont pas besoin d'être mises à jour.

Pour raccourcir une commande en y incluant des options de sécurisation vous pouvez créer alias ou fonctions, ex:

fonction cpr :
cpr() {
 rsync --archive -hh --partial --info=stats1 --info=progress2 --modify-window=1 "$@"
} 
fonction mvr :
mvr() {
 rsync --archive -hh --partial --info=stats1 --info=progress2 --modify-window=1 --remove-source-files "$@"
}

Note : L'utilisation du terme checksum n'est pas superposable au comportement de l'option --checksum. L'option --checksum affecte l'heuristique de saut d'un fichier utilisée avant tout transfert. Indépendamment de --checksum, une somme de contrôle est toujours utilisée pour la construction de fichier par blocs qui est la façon dont rynsc transfère un fichier.


Mise en garde sur la barre oblique

Archlinux utilise par défaut la convention GNU de la commande cp (du paquet GNU coreutils). Tandis que rsync suit la convention BSD de cp, qui accorde un traitement spécial aux répertoires sources avec barre oblique "/" finale (trailing slash). Ainsi la commande:

$ rsync -r source destination

créera le répertoire "destination/source" avec le contenu de "source", alors que la commande:

$ rsync -r source/ destination

ne copie que les fichiers de "source/" directement dans "destination", sans créer le sous-directoire "destination/source" - comme si vous aviez lancé:

$ rsync -r source/. destination

Ce comportement est différent de celui de GNU/cp, qui traite "source" et "source/" de la même façon (mais non "source/."). De plus certains shells ajoutent automatiquement la barre oblique aux noms des répertoires en cas de complétion par touche <Tab>.

En conséquence cette somme de facteurs pourraient amener de nouveaux - ou occasionnels - utilisateurs de rsync, oubliant ce comportement différent, à désorganiser ou même écraser des dossiers importants par le maintien d'une barre oblique en fin de la <source> dans la commande.

Aussi il peut être prudent d'envelopper la commande par un script soustrayant automatiquement cette barre avant le lancement de rsync:

#!/bin/zsh
new_args=();
for i in "$@"; do
    case $i in /) i=/;; */) i=${i%/};; esac
    new_args+=$i;
done
exec rsync "${(@)new_args}"

Ce script peut être placé dans un chemin reconnu par le shell (~/.local/bin/ par exemple) et permettre la création d'un alias à rsync dans le/les fichier/s initialisant le shell.

Attention : L'ablation de la barre finale peut être souhaitable pour copier un répertoire vers/depuis une machine distante, ou au contraire préjudiciable dans la synchronisation de répertoires éloignés mais du même nom


Note : La copie/synchronisation d'un dossier, avec ou sans trailing slash, implique l'option -r (ou -a qui, signifiant -rlptgoD, la contient). En l'absence ce cette option la copie ne se fera pas, avec, en retour, le message skipping directory

Utilitaire de Sauvegarde

Le protocole rsync est facile à utiliser pour les tâches de sauvegarde, ne transférant que les fichiers modifiés depuis la précédente sauvegarde. Ce paragraphe décrit une sauvegarde programmée très simple avec un script utilisant rsync, dans une utilisation typique de copie sur support amovible.


Sauvegardes Automatisées

  • Création d'un script avec les options de commande appropriées:
/etc/cron.daily/backup
#!/bin/bash
rsync -a --delete --quiet /folder/to/backup /location/of/backup
-a 
indique quels fichiers doivent être archivés, entendu que la plupart de leurs attributs soient préservés (mais non les ACLs, liens matériels (hard links), ni attributs étendus tels les capabilités.
--delete 
means files deleted on the source are to be deleted on the backup as well

Ici, /folder/to/backup sera remplacé par le chemin des données à sauvegarder (/home, par exemple) et /location/to/backup sera le chemin de destination de la sauvegarde (/media/disk, par exemple).

  • Terminer en rendant le script exécutable:
# chmod +x /etc/cron.daily/backup


Sauvegarde Automatique par SSH

  • Exemple de script suivant pour une Sauvegarde vers un hôte distant:
/etc/cron.daily/backup
#!/bin/bash
rsync -a --delete --quiet -e ssh /folder/to/backup remoteuser@remotehost:/location/of/backup
-e ssh 
indique à rsync d'utiliser SSH
remoteuser 
est le nom de l'hôte distant remotehost
-a 
l'option d'archive -a regroupe les options -rlptgoD (recursive, links, perms, times, group, owner, devices)(non -H,-A,-X)


Sauvegarde Automatique par NetworkManager

Ce script démarre une sauvegarde après connexion au réseau.

  • Création du script avec les options de commande appropriées:
/etc/NetworkManager/dispatcher.d/backup
#!/bin/bash

if [ x"$2" = "xup" ] ; then
        rsync --force --ignore-errors -a --delete --bwlimit=2000 --files-from=files.rsync /folder/to/backup /location/to/backup
fi
-a 
groupe toutes les options -rlptgoD recursive, links, perms, times, group, owner, devices
--files-from 
lit les chemins du/des dossier(s) à archiver dans un fichier, exemple /dir/vers/backup
--bwlimit 
limite I/O de bande passante; KBytes par seconde

De plus, le script doit avoir les permissions (root, bien sûr) d'écriture seulement (voir NetworkManager#Network services with NetworkManager dispatcher pour les détails).


Sauvegarde Automatique avec systemd et inotify

Note :
  • Vues les limitations de systemd et inotify (voir cette question et réponse), l'obtention d'un système de fichiers récursif n'est pas possible:

bien que vous puissiez accéder à un dossier et à son contenu, ce ne sera pas récursivement vers les sous-répertoires: vous ne pourrez voir le contenu de ceux-ci; vous devrez donc spécifier explicitement tous les répertoires à enregistrer, y compris les répertoires-fils d'un parent visible.

  • Au lieu d'exécuter des sauvegardes avec une programmation basée sur des intervalles temporels, comme avec cron, il est possible d'exécuter une sauvegarde à chaque modification d'un des fichiers à sauvegarder.

Les unités de chemin systemd. path utilisent inotify pour surveiller le système de fichiers, en conjonction avec des fichiers systemd. service pour démarrer n'importe quel processus (dans ce cas, votre sauvegarde rsync) basé alors sur un événement dans le système de fichiers.

  • Créer d'abord le fichier de l'unité de chemin systemd.path, fichier lançant la surveillance des fichiers à sauvegarder:
~/.config/systemd/user/backup.path
[Unit]
Description=Vérification dans les chemins de changements dans les dossiers à sauvegarder

[Path]
PathChanged=%h/documents
PathChanged=%h/music

[Install]
WantedBy=default.target
  • Puis le service avec un fichier systemd.service qui sera activé par toute modification. Par défaut on affecte le même nom au service à activer et à l'unité de chemin (dans ce cas backup.path)en dehors du suffixe, extension .service à la place de l'extension .path (donc dans ce cas backup.service).
Note : Si vous avez besoin de lancer plusieurs commandes rsync, utilisez Type=oneshot. ceci vous permettra de spécifier de multiples paramètres ExecStart=, un pour chaque commande rsync, qui sera exécutée. Alternativement, vous pouvez créer un script pour effectuer toutes vos sauvegardes, exactement comme un script cron.
~/.config/systemd/user/backup.service
[Unit]
Description=dossiers/fichiers à sauvegarder

[Service]
ExecStart=/usr/bin/rsync %h/./documents %h/./music -CERrltm --delete ubuntu:
  • Il ne vous reste qu'à démarrer et rendre automatique start/enable backup.path comme un service systemd habituel, et il démarrera le service de surveillance des fichiers pour lancer automatiquement le service backup.service.


Sauvegarde Differentielle sur une Semaine

  • Autre possibilité utile des option de rsync, la création et le maintien différentiel d'une sauvegarde complète chaque jour de la semaine.
  • Création du script avec options appropriées:
/etc/cron.daily/backup
#!/bin/bash

DAY=$(date +%A)

if [ -e /location/to/backup/incr/$DAY ] ; then
  rm -fr /location/to/backup/incr/$DAY
fi

rsync -a --delete --quiet --inplace --backup --backup-dir=/location/to/backup/incr/$DAY /folder/to/backup/ /location/to/backup/full/
--inplace 
qui implique --partial, mise à jour des fichiers en place dans le dossier de destination


Instantanés de Sauvegardes : "Snapshots"

La même démarche peut servir au maintien d'un arbre d'instantanés de vos fichiers. Autrement dit, un dossier avec des copies des fichiers rangées par date.

Ces copies seront faites par utilisation de liens matériels (hard links, attribution d'un seul i-nœud) ce qui signifie que seuls les fichiers modifiés occuperont un espace supplémentaire.

D'une manière générale, c'est l'idée qui sous-tend les TimeMachine d'Apple.

Ce script de base est facile à implémenter, il crée des snapshots incrémentaux rapides en utilisant l'option --link-dest pour lier des fichiers non modifiés:

/usr/local/bin/snapbackup.sh
#!/bin/bash

# Basic snapshot-style rsync backup script 

# Configurer
OPT="-aPh"
LINK="--link-dest=/snapshots/username/last/" 
SRC="/home/username/files/"
SNAP="/snapshots/username/"
LAST="/snapshots/username/last"
date=`date "+%Y-%b-%d:_%T"`

# Lancement de rsync pour créer un instantanét
rsync $OPT $LINK $SRC ${SNAP}$date

# Suppression du lien symbolique vers l'instantané précédent
rm -f $LAST

# Création d'un nouveau lien symbolique vers le dernier instantané pour le lien matériel vers la prochaine sauvegarde 
ln -s ${SNAP}$date $LAST

Il doit y avoir un lien symbolique vers une sauvegarde complète déjà existante en tant que cible pour --link-dest. En cas d'effacement du plus récent des instantanés il faut recréer un lien symbolique vers le plus récent suivant. Si --link-dest ne trouve pas de lien symbolique fonctionnel, rsync devrait re-copier la source entière au lieu des seuls fichiers modifiés.

Une version plus aboutie teste la présence d'un nombre donné de modifications pour lancer la sauvegarde et utilise cp -al pour créer des liens matériels vers les fichiers non modifiés:

/usr/local/bin/rsnapshot.sh
#!/bin/bash

## my own rsync-based snapshot-style backup procedure
## (cc) marcio rps AT gmail.com

# config vars

SRC="/home/username/files/" #ne PAS oublier la barre oblique finale !
SNAP="/snapshots/username"
OPTS="-rltgoi --delay-updates --delete --chmod=a-w"
MINCHANGES=20

# lancer le processus avec une priorité vraiment basse

ionice -c 3 -p $$
renice +12  -p $$

# synchronisation

rsync $OPTS $SRC $SNAP/latest >> $SNAP/rsync.log

# test d'un nombre suffisant de fichiers modifiés
# création d'une copie en lien matériel nommée avec la date

COUNT=$( wc -l $SNAP/rsync.log|cut -d" " -f1 )
if [ $COUNT -gt $MINCHANGES ] ; then
        DATETAG=$(date +%Y-%m-%d)
        if [ ! -e $SNAP/$DATETAG ] ; then
                cp -al $SNAP/latest $SNAP/$DATETAG
                chmod u+w $SNAP/$DATETAG
                mv $SNAP/rsync.log $SNAP/$DATETAG
               chmod u-w $SNAP/$DATETAG
         fi
fi

Pour faire très très simple ce script peut-être lancé depuis un Timer systemd/Timers.


Sauvegarde Système Complète

Cette section concerne l'utilisation de rsync pour transférer une copie de l'arborescence / entière, à l'exception de quelques dossiers sélectionnés. Cette approche est considérée comme meilleure que le clonage de disque avec dd car elle permet d'utiliser une taille, une table de partition et un système de fichiers différents, et meilleure que la copie avec cp -a également, car elle permet un meilleur contrôle des permissions de fichiers, des attributs, des listes de contrôle des accès et des attributs étendus.

rsync fonctionnera même lorsque le système est en cours d'exécution, mais les fichiers modifiés pendant le transfert peuvent ou non être transférés, ce qui peut entraîner un comportement indéfini de certains programmes utilisant les fichiers transférés.

Cette approche fonctionne bien pour migrer une installation existante vers un nouveau disque dur ou SSD.

Exécutez la commande suivante en tant que root pour vous assurer que rsync peut accéder à tous les fichiers système et en préserver la propriété :

Avec une seule commande

Cette commande dépend de l'expansion des accolades, disponible dans les shells bash et zsh. Si vous utilisez un autre shell, chaque motif --exclude doit être répété manuellement.

 # rsync -aAXv  --fake-super --delete --exclude={"/dev/*","/proc/*","/sys/*","/tmp/*","/run/*","/mnt/*","/media/*","/home/*","/lost+found"} / /path/to/backup/directory

Les options -aAX, définissent un transfert en mode archive avec conservation des liens symboliques, des périphériques rattachés, autorisations et propriétés, dates de modification, ACLs et attributs étendus (à condition que le système de fichiers cible prenne en charge ces fonctions - ce qui n'est pas le cas des partitions vfat ou ntfs.

L'option --fake-super doit être ajoutée à la fois à la création et à la restauration pour qu'une sauvegarde utilisable puisse être créée. Sinon, les erreurs de permissions poorraient empêcher la sauvegarde de démarrer.

L'option --delete, inutile pour une sauvegarde unique, est nécessaire dans une sauvegarde incrémentale, donc mise à jour d'une précédente sauvegarde avec prise en compte des modification sans réécriture complète.

L'option --exclude définit les fichiers à exclure, correspondant aux motifs définis. Les contenus de /dev, /proc, /sys, /tmp et /run sont exclus parce qu'ils sont peuplés au démarrage (bien que les dossiers eux-mêmes préexistent).

Le /home/ est à exclure dans le cas, habituel, d'une partition séparée montée sur /home et faisant l'objet de sauvegardes différentes.

Exclure de même /lost+found, spécifique au système de fichiers.

Créer des motifs d'exclusion évite l'expansion par le shell, ce qui est nécessaire, en particulier lors de la sauvegarde depuis une connexion SSH. Terminer les chemins exclus par l'astérisque * assurera de créer les répertoires eux-mêmes s'ils n'existaient pas.

Note :
   Si vous avez monté la partition de sauvegarde ailleurs que sur /mnt ou /media, n'oubliez pas d'ajouter ce point de montage à la liste des motifs d'exclusion pour éviter une boucle infinie.
   S'il y a des montages "bind" dans le système, ils doivent être exclus de même, pour que le contenu de la liaison montée ne soit copié qu'une seule fois.
   Si vous utilisez un fichier d'échange swap, assurez-vous de l'avoir exclu.
   Si vous voulez intégrer la sauvegarde du contenu du /home/ (et donc ne pas le garder dans la liste des motifs d'exclusion), considérez que, contenant vos données, il pourrait être beaucoup plus grand que les fichiers système. 
   Envisagez alors d'exclure des sous-répertoires sans importance tels  /home/*/.thumbnails/*, /home/*/.cache/mozilla/*, /home/*/.cache/chromium/*, /home/*/.local/share/*, /Trash/*, etc. 
Si GVFS est installé, /home/*/.gvfs doivent être exclus pour éviter les erreurs de rsync.
   Vous pouvez inclure d'autres options rsync, telles que (voir man rsync pour la liste complète) :
   -P = same as --partial --progress
  • Si vous êtes un gros utilisateur de hardlinks, vous pouvez envisager l'option -H, désactivée par défaut en raison du coût en mémoire, ce qui pose maintenant peu de problèmes sur les machines modernes. Le dossier /usr/ en particulier comporte beaucoup de tels liens dans le seul but d'économiser l'espace disque.
  • L'option --delete utilisée pour des sauvegardes incrémentales implique que le chemin source ne se termine pas avec /* , car cette option n'aurait d'effet que sur les fichiers des sous-répertoires du répertoire source, mais aucun effet sur ​​les fichiers résidant directement à l'intérieur du répertoire source.
  • Si vous utilisez des fichiers fragmentés, tels que les disques virtuels, les images Docker et similaire, vous devez ajouter l' option -S.
  • L'option --numeric-ids désactive le mappage des utilisateurs et des groupes noms, groupe numérique et les ID utilisateur sera transféré à la place. Ceci est utile lors de la sauvegarde sur SSH ou lors de l' utilisation d' un système direct de sauvegarde disque système différent.
  • Choisir l'option --info=progress2 au lieu de -v affichera la progression globale et la vitesse de transfert au lieu d'une interminable liste de fichiers.


   Remarque : l’option –exclude de rsync pourrait vous surprendre si vous l'utilisiez par exemple pour la synchronisation de vos données (/home/user/) :
   $ rsync -a --delete --info=progress2 --exclude="/home/user/ARCHIVES/*" /home/user/ /run/media/user/DDexterne/user/ 
   n'excluera pas le répertoire "ARCHIVES", utilisez :
   $ rsync -a --delete --info=progress2 --exclude="/ARCHIVES/*" /home/user/ /run/media/user/DDexterne/user/   
   car, pour rsync, la racine de /ARCHIVES n’est pas celle de votre système mais de votre dossier !

Restauration de la Sauvegarde

Si vous souhaitez restaurer la sauvegarde, utilisez la même commande rsync que précédemment, mais en inversant source et destination.

Clonage du Système de Fichiers

Rsync fournit le moyen de copier toutes les données d'un Système en préservant autant d'information que possible, y compris les metadata du système.

C'est une procédure de clonage de données d'un système de fichiers où les systèmes de fichiers source et destination n'ont pas besoin d'être du même type.

Il peut être utilisé pour la sauvegarde, la migration de systèmes de fichiers ou la récupération de données.

Le mode archive de rsync (option -a) est presque adapté à cette tâche, sauf qu'il ne sauvegarde pas les métadonnées spéciales du système de fichiers telles que les listes de contrôle d'accès, les attributs étendus ou les propriétés de fichiers éparses.

Pour un clonage réussi au niveau du système de fichiers, certaines options supplémentaires doivent être fournies:

rsync -qaHAXS SOURCE_DIR DESTINATION_DIR

Ce qui signifie (depuis le "man"):

-H, --hard-links      preserve hard links
-A, --acls            preserve ACLs (implies -p)
-X, --xattrs          preserve extended attributes
-S, --sparse          handle sparse files efficiently
-q, --quiet           suppress non-error messages 

La copie produite peut être simplement relue et vérifiée (par exemple après une tentative de récupération de données) au niveau du système de fichiers avec l'option récursive de diff:

diff -r SOURCE_DIR DESTINATION_DIR

Il est possible d'effectuer une migration réussie du système de fichiers en utilisant rsync comme décrit ici puis en mettant à jour les paramètres fstab et bootloader comme décrit dans Migrer une installation vers un nouveau matériel. Ceci fournit essentiellement un moyen de convertir n'importe quel système de fichiers racine à un autre.

rsync daemon

rsync peut-être lancé en tant que démon sur un Serveur, à l'écoute du port 873.

Editez le modèle /etc/rsyncd.conf, configurez un partage et lancez start le rsyncd.service.

Note : Comme depuis rsync-3.1.2-5 l'unité systemd rsyncd.service, incluse dans le paquet, ajoute la fonction de sécurité ProtectSystem=full, (ProtectHome=on a été annulée dans rsync-3.1.2-8) dans la section [Service]. Ceci rend les répertoires /boot/, /etc/ and /usr/ inaltérables. Si vous avez besoin que rsyncd écrive des répertoires système, vous pouvez editer l'unité et définir ProtectSystem=off dans la section [Service] du segment outre-passé.


Utilisation depuis le client, p. ex. contenu du serveur de liste:

$ rsync rsync://server/share

transférer le fichier du client au serveur:

$ rsync local-file rsync://server/share/

Penser à ouvrir le port 873 dans iptables et l'authentification utilisateur.

Note : Toutes les données transférées, y compris l'authentification de l'utilisateur, ne sont pas cryptées.

Voir aussi