rsync
1. Présentation RSYNC
[DEF-RSYNC]
rsync (pour remote synchronization ou synchronisation à distance).
Rsync est un logiciel de synchronisation de fichiers, il est fréquemment utilisé pour mettre en place des systèmes de sauvegarde distante ou des points de restauration du système.
La restauration du système ce fait avec le logiciel TIMESHISF restauration-système
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.
[Notes-Unidirectionnelle]
Signifie que la commande,
de 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.
Pour plus de details voir cette article: [Tuto-sauvegarde-home:] sauvegarde-home-rsync
Installation rsync
Cet outil est installé par défaut sur la plupart des distributions Linux. Mais si la distribution Linux que vous utilisez ne prend pas en charge l'outil Rsync par défaut, vous pouvez l'installer via le gestionnaire de paquets de votre distribution.
- Installez l'outil Rsync sur les distributions
Debian
etUbuntu
et leurs dérivés en exécutant ce qui suit:
sudo apt install rsync
- Vérifiriez l'installation de rsync
rsync -version
Utilisation rsync
"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à."
[commandes-de-base]
rsync source/ destination/
[Local]
En local, pour une copie ou synchro de votre répertoire
vidéo vers un disque dur externe (de sauvegarde)
monté dans /media/$USER/, cela donne :
Voici la commande:
rsync -av /home/$USER/Vidéos/ /media/$USER/film_music/Vidéos/
Le flag v affiche les fichiers sauvegardés au fur et à mesure. Le flag a lui est la variable d'environnement sustème qui permet d'accéder au nom de l'utilisateur de la session en cours.
Vous pouvez relancer cette commande à chaque nouvelle synchro, seuls les nouveaux fichiers seront synchronisés.
[remote-ssh]
rsync utilise SSH par défaut.
rsync -az source/ login@serveur:/destination/
Nous allons comprendre la commande.
-a
ou (-archive) est un moyen rapide de dire que vous voulez la recursivité et préserver pratiquement tout.-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 du slash (/) dans le chemin de la source. Par exemple: Ces deux commandes ne sont pas équivalentes:
- En effet, cette commande va créer le dossier source dans le dossier destination en ajoutant donc un niveau dans l'arborescence.
Exemple:
rsync source destination/
- La deuxième commande copie le contenu du dossier source dans le dossier destination. Autrement dit, les deux commandes suivantes sont, elles, équivalentes* :
Exemple:
rsync source/ destination/
- 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.
Exemple:
rsync source destination/
rsync source/ destination/source/
-
- 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
Exemple:
rsync source destination/
rsync source destination
[rsync-port-ssh]
Pour une gestion du port ssh, utiliser la syntaxe suivante:
rsync -avz chemin/source/ -e "ssh -p 22" user@ip:"/chemin/de destination avec espaces/"
Utilisation ssh rsync avec un dossier.
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/
Details d ela commande:
- --delete-after: à la fin du transfert, supprime les fichiers dans le dossier de destination ne se trouvant pas dans le dossier source.
- -z : compresse: compresse les fichiers (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)
- -v : verbeux
- -e ssh: Utilise le protocol 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/"
[Notes]: Attention à partir de la version 3.0, d'après le man, le caractère espace doivent être échappés pour être compris et le chemin doit être indiqué entre apostrophe.
rsync -avz chemin/source/ -e "ssh -p port" user@ip:'/chemin/de\ destination\ avec\ espaces/'
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.
[Avantage]
- C'est utile pour ne pas sauvegarder le cache
- les fichiers temporaires
- le répertoire .git
- la corbeille
L'exclusion d'un dossier est identique à l'exclusion d'un fichier : il suffit d'indiquer le chemin d'accès relatif au répertoire source.
rsync --exclude="nom_de_dossier" --exclude="- autre_nom_de_dossier" source/ destination/
Liste entre accolades. Les répertoires ou les fichiers sont traités de la même façon, par leur nom. Ici, .cache est un répertoire, mais .tmp est l'ensemble des fichiers temporaires (en cas d'appel de ce script via l'interpréteur, il faut ici utiliser bash -c au lieu de sh -c, car les accolades sont propres au bash)
rsync -av --exclude={'Musique','Vidéos','.cache','flatpak','Trash','*.tmp','Bureau'} 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 :
Vous pouvez consulter cette pageExclusionRSync pour en savoir plus sur lexclusion.
tmp
.Trash
.cache
.PlayOnLinux
Inclure des fichiers
Dès lors qu'on exclut, il peut être nécessaire d'inclure. Attention, –include ne s'utilise qu'avec –exclude, et n'est qu'une exception à ce dernier (qui doit toujours suivre le –include).
Exemple, vous souhaitez ne synchroniser qu'un type de fichier, mettons des .csv, cela donne :
- Cette commande se lit ainsi : exclure tout (c'est le caractère *) ce qui est dans source/ SAUF les fichiers .csv, qui seront donc les seuls à être copiés.
rsync --include="*.csv" --exclude="*" source/ destination/
- La commande suivante copie 3 répertoires (et leur contenu) depuis le répertoire /user/. les autres répertoires ou fichiers ne sont pas transférés.
Le caractère générique ***
(3 étoiles) est fondamental pour les répertoires dans le –include. Il indique que le –include ne vaut pas que pour le répertoire, mais aussi pour tout ce qu'il contient. Sans lui, c'est un répertoire vide qui est transféré.
rsync -av --include={'Documents/***','Images/***','snap/***'} --exclude=* /home/user/ destination/
Quelques options courantes utilisation
- -a : archive ⇒ préserve les dates, permissions, etc … des fichiers. Inclut l'option récursivité. Option à utiliser quand on veut transférer des répertoires entiers avec leurs sous-répertoires en préservant toutes les caractéristiques des fichiers.
- -r: la synchro est récursive (elle prend les sous-répertoires). Est inclus dans l'option -a
- -v : verbeux (affichage de ce que fait la commande pendant qu'elle le fait).
- -l : copie les liens symboliques comme liens symboliques. Est inclus dans l'option -a
- -L : remplace les liens symboliques par les fichiers référencés.
- --remove-sent-files : les fichiers envoyés sont supprimés de chez l'émetteur. Il ne s'agit donc plus de faire une synchro mais bien de faire un transfert.
- --delete : efface sur la cible les fichiers qui ont disparu du répertoire de départ. Option très importante qui permet d'être sûr que la copie est identique à l'original. Mais si on se trompe sur l'original, on perd la copie.
- --delete-after : idem option précédente, mais fait l'effacement à la fin du transfert. Surtout int éressant avec l'option -v ('verbeux') : les fichiers effacés sont plus clairement affichés à la fin, et pas dispersés dans l'ensemble des retours écran.
- --exclude=MOTIF : exclut de la synchro les fichiers correspondant au MOTIF (par exemple *.txt pour exclure les fichiers avec l'extension .txt).
- -z : comprime les fichiers pendant le transfert. N'a d’intérêt que pour des transferts à travers des réseaux, car sinon la compression / décompression fait perdre du temps.
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:
- sur la machine locale, on devient www-data pour travailler avec les droits de ce dernier
- 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)
- sur le serveur distant, via ssh, utilisateur va lancer sudo pour devenir www-data
- www-data exécute la commande rsync qui échange les informations avec la machine locale
[step1]
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
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/