Rsync
<google uid="C01" position="left"></google>
rsync (remote synchronisation ou synchronisation à distance) est logiciel et un protocole réseau permettant de créer une copie d'une arborescence et/ou ses fichiers vers un serveur distant(ou non). Les données en transit entre les serveurs sont minimes puisque seule la différence est envoyée. Cette commande est fiable même sur des fichiers volumineux et est d'ailleurs présente sur toutes les plateformes (unixes, Windows, Mac, Android).
Avec la commande rsync, tous les fichiers dans dossier_source/ vont se trouver dans dossier_destination/ :
rsync dossier_source/ dossier_destination/
Ce tutorial rsync commence par des sauvegardes simples en ligne de commande puis aborde la sécurité et donne enfin des astuces. Prenez le temps de bien lancer les commandes en comprenant ce que vous faites (il existe des options vicieuses sisi alors man rsync, man).
Au fait, c'est rsync et non rsynch (jdcjdr mais y a des gonzes qui recherchent avec rsynch :/).
installation
Sous une daubian debian et dérivés :
sudo aptitude install rsync
rsync utilise par défaut le port 873 en TCP.
Préalable
La commande rsync est utilisée industriellement pour du backup serveur ou de la sauvegarde de données fiable et à moindre coût.
| Image logo indiquant une information importante | Attention : ce tutoriel est progressif en difficulté et n'aborde pas toutes les problématiques de sécurité des données (lancer rsync as root ou sudoer est à vos risques-et-périls. |
Entre deux machines, rsync sera employé à travers une transmission sécurisée (tunnel SSH par échange d'une clé) :
rsync -e ssh utilisateur_distant@serveur.principal.fr:dossier_source/ dossier_destination/local/
| Image logo indiquant une information importante | Attention : vous devez nettoyer vos *bashrc et *profile de tout affichage car cela entraine une erreur "protocol mismatch".
rsync -e ssh utilisateur_distant@serveur.principal.fr echo 2>/dev/null |
Les mains dans le cambouis : premier exemple
Ce premier exemple fait une copie d'un dossier provenant du serveur principal *depuis* le serveur miroir (vous vous trouvez sur le miroir ou backup et vous rapatriez vos données)
toto@miroir$ rsync -avz --delete -e ssh toto@serveur.principal.fr:/home/toto/www/ /home/toto/backup/
- -a : mode archive équivalent à -rlptgoD (récursif, préserve les liens symboliques, les permissions, la date et heure, le propriétaire/groupe, ...)
- -v : mode verbeux (rajoutez autant de 'v' pour plus d'informations)
- -z : compression
- --delete-after : efface (après transfert) sur la destination les fichiers n'existant plus sur la source (attention ça efface des trucs !)
- -e ssh : le shell distant ou rajouter dans son ~/.bashrc un : export RSYNC_RSH="ssh"
Limiter la bande passante
Il est parfois utile qu'une sauvegarde ne gène pas votre partie de call of duty en cours ou le visionnage d'un documentaire sur l'élevage de rennes en Laponie.
Avec l'option bwlimit :
- --bwlimit=50 : limite la bande passante bouffée à 50 kilo octets (plutôt indispensable si les backups se font en même temps qu'une partie de Tremulous)
Avec un pipe -ça fait leet- utilisez cstream (aucun rapport avec un fps de campeurs tristement célèbre) :
- | cstream -t -80k |
Reprendre en cas de problème de connexion, resume rsync
- --partial : garde les fichiers non complètement transféré et complète le transfert au prochain lancement. C'est utile pour des fichiers volumineux
Gros fichiers et problème de place
- --inplace : force rsync a n'utiliser que le fichier de destination pour la copie intermédiaire sinon rsync copie temporairement le fichier puis le renomme.
Pour des fichiers volumineux la taille est donc doublée sur le serveur distant. L'inconvénient par contre est qu'en cas de problème de déconnexion, avec --inplace, rsync recommencera le transfert du fichier depuis le début.
Alleger la ligne de commande
Marre de retaper toujours les memes paramètres ? Ou si vous êtes sûr d'utiliser toujours les mêmes paramètres, remplissez alors les variables d'environnements suivantes.
- rajoutez RSYNC_RSH dans votre shell rc :
ar exemple, toujours ssh et toujours le port 6666, dans ~/.bashrc :
export RSYNC_RSH="ssh -p 6666"
Connexion sécurisée entre les deux serveurs (avec SSH)
Après cette phase de test vous allez donner la clé publique du serveur miroir sur le serveur principal pour une connexion sécurisé sans demande interactive de mot-de-passe, gênante en cas d'automatisation.
Clé numérique SSH
Depuis le serveur miroir et si vous n'avez pas déjà une jeu de clé privée/publique, générez la paire de clé privée-publique sans saisir de passphrase.
Sécurité
| Image logo indiquant une information importante | Attention sans passphrase et sans restriction qu'à rsync(voir plus bas) cela peut compromettre votre miroir. Par contre avec passphrase il faut faudra la resaisir à chaque fois.
Il est aussi fortement conseillé d'attribuer une clé pour un serveur (utilisez -i avec la clé privée, aucun .pub) : $ ssh -i /home/toto/.ssh/cle_privee_pour_miroir toto@miroir: N'oubliez surtout pas de chiffrer votre clé privée puis de l'écrire au jus de citron sur un papier enfermé dans un coffre blindé que vous enterrerez au fond d'un puit, puis effacez le fichier de la clé privée de tout support numérique puis prévenez votre médecin traitant. On peut rajouter une restriction d'origine : miroir$ pwd /home/toto/.ssh $ sed -e '/toto@cle_pour_miroir/s\.*\from="*.my-box.zz &\' authorized_keys |
Pour vérifier qu'il n'y a pas déjà un jeu de clés :
$ cd $ ls .ssh ls: cannot access .ssh: No such file or directory
Si le dossier ~/.ssh/ existe il y a de fortes chances qu'il y ait les clés pub. et priv. (sautez alors à l'étape suivante : la copie) sinon générez les :
toto@miroir$ mkdir /root/rsync toto@miroir$ ssh-keygen -t rsa -b 2048 Generating public/private dsa key pair. Enter file in which to save the key (/home/toto/.ssh/id_dsa): Enter passphrase (empty for no passphrase): Enter same passphrase again: Your identification has been saved in /home/toto/.ssh/id_dsa. Your public key has been saved in /home/toto/.ssh/id_dsa.pub. The key fingerprint is: 62:71:0c:bf:01:d7:b4:41:76:04:84:1f:4a:aa:f4:26 toto@miroir
Copiez ensuite la *clé publique* sur le serveur principal :
toto@miroir$ scp ~/.ssh/id_dsa.pub toto@serveur.principal.fr:/home/toto/
Maintenant sur le serveur principal, ajoutez la clé fraichement copiée dans la liste de clés ssh du compte utilisateur.
Si ~/.ssh/authorized_keys n'existe pas créez les.
toto@serveur.principal.fr:~$ cd ~/.ssh/ toto@serveur.principal.fr:~/.ssh$ cat ~/id_dsa.pub >> authorized_keys
Vérifiez que la commande passe bien depuis le serveur miroir :
toto@miroir$ rsync -avz -e ssh toto@serveur.principal.fr:/home/toto/www/ /home/toto/backup/
| Image logo indiquant une information importante |
Attention aux droits sur le serveur principal, on empêche l'écriture au groupe et aux autres : toto@serveur.principal.fr:~/.ssh$ chmod go-w $HOME $HOME/.ssh $HOME/.ssh/authorized_keys |
Avec un port différent
Avec un port différent du défaut (le 22) mettez ssh entre quotes avec le parametre du port (ici 1337) :
toto@miroir$ rsync -avz -e "ssh -p 1337" toto@serveur.principal.fr:/home/toto/www/ /home/toto/backup/
Pour enregistrer définitivement le port pour décharger la ligne de commande :
toto@miroir$ echo -e "host serveur.principal.fr\n Port 1337" >> ~/.ssh/config
Ou dans la variable d'environnement RSYNC_RSH, rajouter dans ~/.bashrc :
export RSYNC_RSH="ssh -p 1337"
La commande devient :
toto@miroir$ rsync -avz toto@serveur.principal.fr:/home/toto/www/ /home/toto/backup/
Vérification source destination
C'est rassurant de pouvoir tester ce genre de commandes potentiellement risquée sans rien bousiller.
L'option --dry-run permet de tester la commande sans rien modifier :
toto@miroir$ rsync -avz --dry-run -e "ssh -p 1337" toto@serveur.principal.fr:/home/toto/www/ /home/toto/backup/ sending incremental file list ... sent 93 bytes received 13 bytes 70.67 bytes/sec total size is 2 speedup is 0.02 (DRY RUN)
L'option --itemize-changes (ou -i) affiche un résumé (codifié) des différences entre source et destination :
toto@miroir$ rsync -avzi -e "ssh -p 1337" toto@serveur.principal.fr:/home/toto/www/ /home/toto/backup/ sending incremental file list .d..t...... www/ <f.st...... www/plop.txt
La ligne commençant par :
- .d. indique une modification du dossier.
- >f montre une modif du fichier ou l'ajout d'un fichier
L'analyse de cette sortie de commande permet de déterminer les changements entre deux fichiers.
Automatisation périodique
Une automatisation périodique vous permettra de ne plus y penser et de faire des choses plus dangereuses, comme ranger des chaussettes sales par exemple.
crontab est la commande pour inscrire le lancement périodique de la sauvegarde.
Récupérez le chemin absolu vers rsync :
toto@miroir$ which rsync /usr/local/bin/rsync
Ajoutez la ligne de commande dans la crontab pour un lancement tous les deux jours à 4h00 par exemple :
toto@miroir$ crontab -e 0 4 */2 * * /usr/local/bin/rsync -avvvz --delete -e ssh toto@serveur.principal.fr:/home/toto/public_html/ /home/toto/sauvegarde/public_html/ >/dev/null 2>&1
Voilà, votre sauvegarde automatique est en place.
Pour des logs rajoutez :
--log-file=/var/log/rsync.log
ça devient :
0 4 */2 * * /usr/local/bin/rsync -avvvz --delete -e ssh --log-file=/var/log/rsync.log toto@serveur.principal.fr:/home/toto/public_html/ /home/toto/sauvegarde/public_html/ >/dev/null 2>&1
Restauration
Q : C'est bien beau de backuper, mais comment restaurer ce que j'ai sauvegardé ? R : Inversez la destination de la source.
Sécurité : restreindre qu'à la commande rsync
L'échange de la clé publique permet à l'utilisateur sur le miroir de lancer (en plus de rsync) n'importe quelle autre commande. C'est une faille de sécurité potentielle en cas de compromission du miroir, il nous faut donc n'autoriser que la commande rsync.
Sur le serveur principal, modifiez le fichier stockant les clés publiques pour indiquer la commande rsync :
toto@serveur.principal.fr:~$ vim ~/.ssh/authorized_keys
Ajoutez juste au début de la ligne de la clé publique du miroir :
no-port-forwarding,no-X11-forwarding,no-agent-forwarding,no-pty ssh-dss AB3NzaCc3M.....1cQ== toto@miroir
Refaites un essai rsync depuis le miroir pour contrôler qu'il n'y ait pas d'erreur :
toto@miroir$ rsync -avz --delete -e ssh toto@serveur.principal.fr:/home/toto/www/ /home/toto/backup/
Revenez sur le serveur principal et rajoutez alors cette ligne de commande juste au début de la ligne de la clé publique du miroir.
toto@serveur.principal.fr:~$ vim ~/.ssh/authorized_keys command="toto@miroir$ rsync -avz --delete -e ssh toto@serveur.principal.fr:/home/toto/www/ /home/toto/backup/" no-port-forwarding,no-X11-forwarding,no-agent-forwarding,no-pty ssh-dss AB3NzaCc3M.....1cQ== toto@miroir
Lors de la seconde guerre mondiale, les Francs tireurs et partisans (FTP) furent des résistants dont le fait d'arme le plus célèbre ... oups pardon je m'égare.
On va monter le FTP distant en local et synchroniser(priez pour nous) dans le dossier désiré (c'est celui où veut que tout arrive, "désiré" c'est pas son nom, parce qu'un dossier avec des accents ça laisse à désirer...<mp3>Rimshot.mp3</mp3>).
- rsync/ftp : rsync et ftp
- ftp#mirror : sauvegarde en CLI qu'avec ftp.
Ne synchroniser que l'arborescence
L'option --filter(-f) va aider ici pour ne copier que l'arbo sans les fichiers :
$ rsync -avz --filter="+ */" --filter="- *" dossier_source/ dossier_destination/
- --filter="+ */" : copie tous les dossiers
- --filter="- *" : ne copie pas le reste
On aurait pu rajouter l'exclusion de type de fichiers :
- --filter="- .svn/" : ignore les dossiers .svn
source : [1]
problème de droits
Si vous écrivez hors d'un dossier utilisateur, la gestion peut être compliquée, vous avez alors ces possibilités :
rsync en root de chaque coté
rsync lancé en root depuis la machine de destination
rsync en sudo grâce à --rsync-path
L'utilisateur distant (ici 'julian') doit etre sudoer sur la machine distante, cela permet de synchroniser les datas sans se connecter en root(mais on se connectera bien en route ^^). C'est bien pratique car la plupart des configs sshd interdisent de se connecter directement en root (çaymal).
rsync --rsync-path 'sudo rsync' julian@wikileaks.org:/home/wikileaks/www/ /home/wikileaks/backup
CLI, GUI, clicodromes pour plateformes Windows, Mac Os, Linux et *BSD
Linux
En cours de rédaction...
Windows
En cours de rédaction...
- Grsync
Mac
En cours de rédaction...
- RsyncX : http://www.egg-tech.com/mac_backup/
- Carbon Copy Cloner (pas encore testé)
*BSD
En cours de rédaction...
Trouvé deux applis : rsync4android par Michał Kowalczuk et BotSync qui utilise sftp.
rsync4android : rsync backup for Android
rsync4android permet la synchro entre un serveur et votre téléphone.
Les étapes sont en gros(les étapes détaillées avec captures sont dans cette traduction d'un article d'huanix.com) :
- après l'install, téléchargez le binaire rsync (la toute première popup)
- menu > generate keys (ce sera des DSS). Et là vous vous dites : Comment copier la clé publique sur mon serveur ? L'auteur a tout prévu et vous propose plusieurs méthodes (email, twitter, etc). J'ai personnellement échoué ici en me trompant dans l'email du coup je suis passé par dropbox pour m'envoyer le dss_key.pub qui se trouve à la racine de la sdcard (/mnt/sdcard ou le lien /sdcard)
- quittez le téléphone et allez sur votre serveur de backup :
- bcksrv$ cat dss_key.pub >> ~/.ssh/authorized_keys
- bcksrv$ mkdir -p backups/android
- revenez sur le téléphone et créez une nouvelle connexion
- menu > Add profile
- Dans le formulaire, remplissez comme suit :
Profile name : BACKUP BRICOSOFTROX Local file ... : /mnt/sdcard Username : utilisateur_distant Server : serveur.back.up (ou l'IP) Dropbear SSH private key ... : /sdcard/dss_key Remote file or dir... : ~/backups/android
- Choisit si tu veux envoyer sur le serveur ou recevoir.
- Tapotez sur Save
- Tapotez sur votre connexion "BRICOSOFTROX"
- et là plein d'erreurs (ou pas)
- coté serveur ~/backups/android doit etre bien rempli :
$ tree -d .
.
└── sdcard
├── 7digital
│ └── Cover
│ └── cache
├── albumart
├── Android
│ └── data
│ ├── com.dropbox.android
│ │ └── cache
│ │ └── tmp
│ ├── com.facebook.katana
│ │ └── cache
│ ├── com.google.android.apps.genie.geniewidget.news-content-cache
│ ├── com.google.android.apps.maps
│ │ ├── cache
│ │ ├── debug
│ │ └── testdata
│ │ └── voice
│ │ └── fr_FR.f27919fc
│ ├── com.motorola.blur.calendar.sync.activesync
│ │ └── files
│ ├── com.motorola.blur.home
│ │ └── files
│ ├── com.zinio.mobile.android.reader
│ │ └── cache
│ │ └── cachefu
│ │ └── image_cache
│ └── gov.nasa
│ └── cache
│ └── cachefu
│ └── image_cache
├── burstlyImageCache
├── cmp
│ └── thumbs
├── com.mictale.gpsessentials
│ ├── databases
│ └── images
├── com.zinio.mobile.android.reader
├── dcim
│ └── Camera
├── deezer
│ └── custo
├── download
├── dropbox
├── flickr
│ └── photos
│ ├── BIGPHOTO_ACCOUNT
│ ├── BIGPHOTO_OTHER
│ ├── BIGPHOTO_SEARCH
│ ├── PEOPLEICON_ACCOUNT
│ ├── PEOPLEICON_OTHER
│ ├── PEOPLEICON_SEARCH
│ ├── PHOTOICON_ACCOUNT
│ ├── PHOTOICON_OTHER
│ └── PHOTOICON_SEARCH
├── foursquare
│ └── cache
├── funtons
├── goweather
│ ├── config
│ │ ├── plugin_image
│ │ ├── plugin_theme_image
│ │ ├── plugin_widget_image
│ │ └── plugin_w_image
│ ├── nightbgs
│ ├── remastered
│ └── wallpaper
├── goweatherlog
├── jiwire
├── LOST.DIR
├── media
│ └── audio
│ └── notifications
├── Mydroid_Vault
│ ├── Encrypted_Data
│ └── Unencrypted_Data
├── Pictures
├── pulse
└── Yahoo!
└── flickr
└── Debug
81 directories
- Un appui long sur le profil puis Edit pour modifier (par exemple pour un restore).
Troubleshootings
- Ca me demande un password FFS !!!
- La clé publique a été mal copié, vérifie bien que ça tient sur *une ligne* dans ~/.ssh/authorized_keys. Utilise un autre moyen pour copier dss_key.pub, par exemple avec dropbox. Coté serveur un pb de clé affiche dans /var/log/auth.log :
Oct 17 12:59:01 b sshd[21682]: error: key_read: uudecode AAAAB3NzaC[...] Oct 17 12:59:01 b sshd[21682]: pam_unix(sshd:auth): authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=hotspot.du-vois.in user=utilisateur_distant Oct 17 12:59:03 b sshd[21682]: Failed password for utilisateur_distant from 88.88.88.88 port 62666 ssh2
Liens
BotSync SSH SFTP
En cours de rédaction
Dépannage
- L'erreur la plus commune concerne les droits sur le serveur principal :
toto@serveur.principal.fr:~/.ssh$ chmod go-w $HOME $HOME/.ssh $HOME/.ssh/authorized_keys
- Les deux versions de rsync entre les deux machines doit être proche voire identique
rsync --version
- Verifiez lors d'un simple login ssh que rien ne s'affiche comme fortune, un prompt trop verbeux ($PS1), etc
rsync recopie des fichiers qui n'ont pas changé ! FFS!!
Le timestamp d'un fichier est parfois moins précis d'un FS vers un autre, par exemple lors d'un backup entre FAT et ext3 (source). Rajoutez alors le paramètre modify-window qui réduit la précision de X secondes :
- --modify-window=1 : le backup se fera avec 1 seconde d'imprécision entre les timestamp source vs destination.
Sinon posez toujours la question en page de discussion
<inputbox> type=commenttitle default=Titre du message page=Discussion:Rsync buttonlabel=Ajouter un message width=18 hidden=true </inputbox>
Exemples
Exclure des fichiers
Ici le dossier PLOP et son contenu sera ignoré :
rsync -arvz --exclude=PLOP -e "ssh -p 666" ~/dossier_local_source/ utilisateur_distant@serveur.principal.fr:dossier_cible/
| Image logo indiquant une information importante |
--exclude a une syntaxe de filtre source : Le paramètre exclude de rsync |
Exclure les fichiers de contrôles divers comme .svn/
On peut exclure tout une tripotée de fichiers cachés comme le .svn avec l'option -C :
rsync -arvz -C -e "ssh -p 666" ~/dossier_local_source/
L'option -C(raccourcis de --cvs-exclude) exclue par défaut la liste des fichiers suivants :
RCS SCCS CVS CVS.adm RCSLOG cvslog.* tags TAGS .make.state .nse_depinfo *~ #* .#* ,* _$* *$ *.old *.bak *.BAK *.orig *.rej .del-* *.a *.olb *.o *.obj *.so *.exe *.Z *.elc *.ln core .svn/ .git/ .bzr/
rtfm pour avoir la liste complète à jour.
Pour info, svn permet cette copie sans les .svn avec :
svn export . dossier_temporaire/
Utiliser rsync à la place de scp
Vous pouvez remplacer ton scp tout triste par un rsync flamboyant qui offre :
- un pourcentage de progression : l'option --progress
- une relance de copie si ça a merdé : l'option --partial gère le téléchargement partiel, vous pouvez continuer le téléchargement si ça se passe mal
- une limite de bande passante : l'option --bwlimit limite la bande passante en Ko/s
- si ça déconne en ipv6 vous pouvez forcer --ipv4
rsync --progress --partial --rsh="ssh -p 666" --bwlimit=60 --ipv4 totoche@osef.be:~/videos/ mon_gros.mkv.tgz
Avec un alias pour bacheuh (dans ~/.bash_aliases ma c*uille):
alias scp_de_la_mort_qui_tue_la_vie='rsync -P --rsh="ssh -p 666" --bwlimit=60'
L'option -P regroupe --progress et --partial, martial.
$ scp_de_la_mort_qui_tue_la_vie mon_gros.mkv.tgz totoche@osef.be:
mon_gros.mkv.tgz
360448 22% 59.59kB/s 0:00:21
plop.
sauvegarde et restauration d'un ftp
L'article détaillé est rsync/ftp.
Vous pouvez faire un backup/restauration de ftp chez vous. Vous avez besoin de curlftpfs.
Dans ces exemples :
- le dossier de montage du ftp est : /tmp/ftpperso
- le dossier avec vos fichier à jour est : ~/zones/toto.free.fr/www
Dans le sens ftp vers local (sauvegarde) :
$ curlftpfs ftp://toto:m_d_p@ftpperso.free.fr /tmp/ftpperso/ && rsync -av /tmp/ftpperso/* ~/zones/toto.free.fr/www && umount /tmp/ftpperso
Dans le sens local vers ftp (restauration) :
$ curlftpfs ftp://toto:m_d_p@ftpperso.free.fr /tmp/ftpperso/ && rsync -av ~/zones/toto.free.fr/www /tmp/ftpperso/ && umount /tmp/ftpperso
Alias dans ~/.bash_aliases
Créez ces raccourcis pour lancer vos sauvegardes à la mano dès que cela vous chante : <source lang="bash"> alias sync-serveur-vers-ici='rsync -arvz --delete-after -e ssh utilisateur_distant@serveur.principal.fr:dossier_source/ ~/dossier_local_cible/' alias sync-ici-vers-serveur='rsync -arvz --delete-after -e ssh ~/dossier_local_source/ utilisateur_distant@serveur.principal.fr:dossier_cible/' </source>
Avec un port différent de 22 mettez ssh entre simple quotes avec le parametre du port (ici 666) : <source lang="bash"> alias sync-serveur-vers-ici="rsync -arvz --delete-after -e 'ssh -p 666' utilisateur_distant@serveur.principal.fr:dossier_source/ ~/dossier_local_cible/" alias sync-ici-vers-serveur="rsync -arvz --delete-after -e 'ssh -p 666' ~/dossier_local_source/ utilisateur_distant@serveur.principal.fr:dossier_cible/" </source>
Liens
- (en) d'autres exemples : http://rsync.samba.org/examples.html
- (fr) manpage
- (en) http://rsync.samba.org/
- (en) Liste de failles