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/
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 ).