Rsync : les options les plus pratiques

Je vous présente les options les plus pratiques pour faire une sauvegarde synchronisée avec rsync entre deux dossiers. Je vous montre les options de bases à utilisées et les options un peu avancées comme : delete, sparse et inplace.

Préparation des clés SSH

Je vais faire un rsync en deux serveurs Linux. J’ai déjà créé les clés SSH pour me connecter automatiquement du serveur cible vers le serveur de sauvegardes pour ne pas avoir à entrer de mot de passe à chaque fois. Je vous invite à lire « Comment faire une sauvegarde incrémentale de WordPress : backup des fichiers » l’article sauvegarde-incremental-rsync-fichier où j’indique comment installer une clé SSH.

Préparation des fichiers à copier

Pour commencer, je vais sur la machine ns1380 et je récupère PhpMyAdmin qui va me servir de dossier d’exemple à sauvegarder. Je le récupère avec wget, je le décompresse avec tar et je le renomme phpMyadmin pour simplifier ce tuto.

root@ns1380:~#
cd /home
rm -rf phpMyAdmin
wget https://files.phpmyadmin.net/phpMyAdmin/4.8.5/phpMyAdmin-4.8.5-english.tar.gz
tar xfz phpMyAdmin-4.8.5-english.tar.gz
rm -f phpMyAdmin-4.8.5-english.tar.gz
mv phpMyAdmin-4.8.5-english phpMyAdmin

Copie synchronisée entre deux dossiers et l’option delete

Maintenant je vais sur la machine ns1358 qui va me servir de serveur de backup, et je vais lancer rsync avec les options suivantes (-avz) :
# -v, affiche les fichiers encours de traitements
# -z, compresse à la volée les données (beaucoup plus rapide si c’est du texte, mais prend plus de temps machine surtout si ce sont des fichiers images déjà compressées par exemple)

# -a, --archive -rlptgo (recursive,links,perms,times,group,owner) regroupe les options suivantes :
recursive (récursif : va dans tous les sous-dossiers tant que tu en trouves)
links (liens symboliques : conserve les liens symboliques, créé par ex. avec ln)
perms (permission : conserve les permissions « chmod »)
times (date : conserve la date d’origine)
group,owner (utilisateur et groupe : conserve user/group d’origine)*

* voir plus bas l’option --numeric-ids qui peut-être très utile, je l’utilise personnellement très souvent.

Et je regarde quelle taille il prend avec la fonction du.

root@ns1358:~#
rm -rf /home/phpMyAdmin
# -a, --archive   -rlptgo (recursive,links,perms,times,group,owner)
rsync -avz root@81.28.97.137:/home/phpMyAdmin /home/

du -sh /home/phpMyAdmin
29M     /home/phpMyAdmin

Je fais la même chose sur le serveur source. Ils font bien la même taille sur les deux serveurs. Puis, toujours sur cette machine source, je n’ai plus besoin du fichier doc, je vais donc le supprimer en récursif, puis je refais un du.

root@ns1380:~#
du -sh /home/phpMyAdmin
29M     /home/phpMyAdmin

rm -rf /home/phpMyAdmin/doc
du -sh /home/phpMyAdmin
26M     /home/phpMyAdmin

Je retourne sur la machine cible (backup), et je relance un rsync. On peut voir qu’il n’a pas tenu compte de la suppression du répertoire, et la taille fait toujours 29Mo. Je relance la copie mais cette fois en utilisant l’option --delete, on peut voir que cette fois, il a bien supprimé le dossier doc et que maintenant il a la bonne taille (26Mo).

root@ns1358:~#
rsync -avz root@81.28.97.137:/home/phpMyAdmin /home/
du -sh /home/phpMyAdmin
29M     /home/phpMyAdmin

rsync -avz --delete root@81.28.97.137:/home/phpMyAdmin /home/
du -sh /home/phpMyAdmin
26M     /home/phpMyAdmin

Exclure un dossier ou un fichier lors d’une copie avec exclude

Maintenant je veux exclure un dossier, je ne veux pas copier le dossier sql, il suffit d’utiliser dans ce cas l’option --exclude pour faire cela. Pas besoin d’indiquer le chemin absolu, car on l’a déjà renseigné le chemin /home/phpMyAdmin avec root@81.28.97.137:/home/phpMyAdmin.

rm -rf /home/phpMyAdmin
rsync -avz --exclude=sql root@81.28.97.137:/home/phpMyAdmin /home/

Récupérer une sauvegarde avec les bons utilisateurs et groupes en utilisant numeric-ids

Pour revenir sur l’option --numeric-ids que j’ai cité plus haut et le fonctionnement de rsync lors d’une copie, je vais créer sur la machine source un utilisateur tux, mais avec un ID spécifique (1500). Et j’attribue cet ID au dossier phpMyAdmin en récursif. Maintenant vous savez ce qu’est la notion de récursivité vu plus haut. Avec la fonction ls -dlah je peux voir rapidement que l’utilisateur tux a bien été attribué.

root@ns1380:~#
useradd -M -u 1500 tux -s /bin/false
chown -R tux.tux /home/phpMyAdmin
ls -dlah /home/phpMyAdmin
drwxr-xr-x 10 tux tux 4,0K avril  5 09:33 /home/phpMyAdmin

Je retourne sur la machine cible (backup) je vais créer également un utilisateur tux, mais avec un autre ID spécifique (2000). Et je relance une copie. Notez que, à chaque fois, je lance un rm -rf /home/phpMyAdmin afin de repartir de zéro pour le tuto. On peut voir avec un ls qu’il a mappé le dossier phpMyAdmin vers l’utilisateur tux, bien que les ID soient différents (1500 et 2000) sur les deux machines Linux.

root@ns1358:~#
useradd -M -u 2000 tux -s /bin/false

rm -rf /home/phpMyAdmin
rsync -avz root@81.28.97.137:/home/phpMyAdmin /home/
ls -dlah /home/phpMyAdmin
# ID map
drwxr-xr-x 10 tux tux 4,0K mars  30 13:44 /home/phpMyAdmin

Le problème, c’est quand l’on fait une sauvegarde entre deux machines et que l’on veut récupérer cette sauvegarde, l’ID peut-être différent. Dans cas 2000, à la place de l‘ID 1500 sur la machine source d’origine. Pour garantir l’ID d’origine, j’utilise l’option --numeric-ids. Et là, on conserve bien le bon ID, soit 1500 comme sur la machine source.

rm -rf /home/phpMyAdmin
rsync -avz --numeric-ids root@81.28.97.137:/home/phpMyAdmin /home/
ls -dlah /home/phpMyAdmin
drwxr-xr-x 10 1500 1500 4,0K mars  30 13:44 /home/phpMyAdmin

Copier un gros fichier avec l’option sparse

Je voulais vous montrer aussi les options que l’on peut utiliser quand l’on copie des fichiers très grands. Typiquement une image disque, comme l’image disque d’une distribution. Pour l’exemple, je vais prendre une image disque d’une Debian 7 non compressée. Cette image fait 10Go. Mais si je fais un rsync sans indiquer d’option spécifique, il va me copier les 10Go à travers le réseau. Alors qu’en fait, l’image ne fait que 952Mo sur le disque. Je peux vérifier la taille réelle avec la fonction ls -s.
Dans ce cas je peux utiliser l’option --sparse qui va copier uniquement les données réellement sur le disque. Et l’option --progress est une barre de progression de la copie, utile quand il y a un gros fichier à copier. A la fin de la copie, sur le serveur de backup avec un ls, je peux bien constater qu’il n’a copié que les données utiles (952Mo).

ls -lh /home/image-debian7.raw
-rw-r--r-- 1 root root 10G juil.  8  2013 /home/image-debian7.raw
ls -sh /home/image-debian7.raw
952M /home/image-debian7.raw

rsync -avz --sparse --progress root@81.28.97.137:/home/image-debian7.raw /home/
ls -sh /home/image-debian7.raw
952M /home/image-debian7.raw

L’option inplace pour gagner de l’espace disque lors d’une copie

Ce que l’on peut faire aussi, une fois que l’on a utilisé l’option --sparse, et que le fichier est déjà copié, on peut utiliser l’option --inplace. Cette option permet de copier un fichier en modifiant directement le fichier source, sans utiliser de fichier temporaire. Très utile quand on a par exemple un très gros fichier de 100Go, cela évite d’avoir deux fichiers de 100Go pendant la copie.
Mais attention, s’il y a une interruption de la copie, votre fichier cible (la copie) est mort. À utiliser donc, avec prudence.

Mais attention, s’il y a une interruption de la copie, votre fichier cible (la copie) est mort. À utiliser donc, avec prudence.

Indiquer un port différent lors d’une copie via le réseau

Une dernière option pratique, c’est de pouvoir indiquer à rsync quel port il faut utiliser pour les copier via ssh. C’est d’utiliser l’option -e et d’indiquer le port à utiliser.

rsync -avz -e "ssh -p22" --sparse --progress root@81.28.97.137:/home/image-debian7.raw /home/

Un condensé du code utilisé dans ce tuto

Voilà, vous connaissez maintenant quelles options sont très utilisées avec rsync et que j’utilise également moi-même. Je vous mets, ci-dessous, un condensé du code source.

#!/bin/bash
# rsync.sh v1 rsync-rsync backup
# Backup synchronisé entre deux dossiers
# Les options les plus pratiques (useful options)

rsync -avz root@81.28.97.137:/home/phpMyAdmin /home/
rsync -avz --delete root@81.28.97.137:/home/phpMyAdmin /home/
rsync -avz --exclude=sql root@81.28.97.137:/home/phpMyAdmin /home/
useradd -M -u 1500 tux -s /bin/false
chown -R tux.tux /home/phpMyAdmin
ls -dlah /home/phpMyAdmin
rsync -avz --numeric-ids root@81.28.97.137:/home/phpMyAdmin /home/
rsync -avz --sparse --progress root@81.28.97.137:/home/image-debian7.raw /home/
# --inplace
rsync -avz -e "ssh -p22" --sparse --progress root@81.28.97.137:/home/image-debian7.raw /home/

One thought on “Rsync : les options les plus pratiques

  1. Dans ce dernier, saisissez par exemple –exclude= *.txt (pour exclure les fichiers avec une extension .txt), ou –exclude= maison* (pour exclure les fichiers commencant par maison ).

Comments are closed.