Activité Sauvegarder et synchroniser le répertoire projets

Consigne

  1. Avant de commencer l’activité :
    • Lire la mise en situation, prendre connaissance des objectifs, du résultat attendu, et des ressources à disposition.
    • Lire une première fois en entier la section Mise en route.
  2. Effectuez le travail décrit dans la section Mise en route et effectuez les tâches demandées dans la section Tâches.

Mise en situation

Même si l’on utilise un système de gestion de version et un système de sauvegarde pour les données qui se trouvent dans les machines gérées par l’entreprise, il est nécessaire d’effectuer régulièrement une sauvegarde des données de nos ordinateurs ou de nos serveurs personnels.

Il peut également être intéressant de pouvoir synchroniser deux répertoires qui se trouvent sur des machines distantes.

Dans les deux cas, la commande scp n’est pas satisfaisante, car elle ne permet de «synchroniser» que dans un seul sens et doit à chaque fois effectuer une copie complète.

Après avoir exploré les solutions existantes, vous décidez d’explorer l’utilitaire rsync.

Objectifs

À la fin de ce travail, vous devez :

Résultat attendu

  • Connaître la commande rsync et être capable de l’utiliser.

Ressources

Matériel :

  • Un serveur Linux (Ubuntu 20.04 LTS) : svr-m122-$NUM.lab.epai-ict.ch. La variable « $NUM » est le numéro de votre réseau tel qu’il apparait dans les informations d’identification que vous avez reçues par courriel.

Mise en route

Installation de rsync sur votre PC

Sous Linux, rsync est souvent préinstallé. Si ce n’est pas le cas, le plus simple est de l’installer avec le gestionnaire de paquets de votre distribution.

Sous Windows, si vous avez installé WSL (Windows Subsystem for Linux), vous pouvez utiliser rsync directement dans la distribution Linux que vous avez choisi, après l’avoir installé, si nécessaire, avec le gestionnaire de paquet de cette distribution.

Sous Windows sans WSL, vous pouvez installer rsync avec cygwin en utilisant le gestionnaire de paquets chocolatey dans une fenêtre de terminal avec des privilèges d’administration :

1
choco install rsync

Sous macOS, si rsync n’est pas installé par défaut, vous pouvez le faire avec le gestionnaire de packet HomeBrew.

1
brew install rsync

Tâches

Synchroniser le répertoire de projet avec un autre répertoire

Pour commencer, nous allons synchroniser le répertoire de projet avec un répertoire de sauvegarde sur le serveur. Pour cela, connectez-vous à votre serveur avec ssh, rendez-vous dans votre répertoire personnel, puis créez la structure de répertoires backup/projects (souvenez-vous mkdir -p). Lancez ensuite la commande suivante :

1
rsync -a -v -n /home/admin/projects /home/admin/backup/projects

Cette commande peut également s’écrire :

1
rsync -avn /home/admin/projects /home/admin/backup/projects

Comme indiqué dans l’aide, la structure de base de la commande est rsync [OPTION]... SRC [SRC]... DEST. Ici, les options sont -a, -v et -n (que l’on peut aussi écrire -avn), la source est le répertoire /home/admin/projects et la destination est le répertoire /home/admin/backup

L’option -v (verbose) indique que la commande doit être affichée ce qu’elle fait, l’option -a qui est équivalente aux options -rlptgoD. Voyons ce qu’elles signifient :

  • -r : indique que la commande doit être appliquée récursivement à toute la hiérarchie de répertoire à partir du répertoire source.
  • -l : indique que les liens (symlink) sont copiés comme des liens (les fichiers liés ne sont pas copiés)
  • -p : indique que les permissions sont conservées
  • -t : indique que les temps (création, modification, etc.) sont conservés
  • -o et -g : indique que le propriétaire et le groupe sont conservés
  • -D : indique que le type de fichier est conservé (device, special)

Enfin, l’option -n permet d’exécuter la commande à blanc (dry run) sans effectuer de changement. Cela permet de vérifier ce que la commande va faire avant de l’exécuter effectivement.

Avant de poursuivre, relevez la sortie de la commande. Voyons maintenant une subtilité importante. Dans la commande que nous avons exécutée, le chemin de la source se termine avec le nom du répertoire. Cela signifie que nous voulons copier le répertoire lui-même. Comme nous avons déjà un répertoire projects dans backup, nous voudrions plutôt copier le contenu du répertoire. Pour cela, il faut terminer le chemin par un slash (/).

Pour vous en rendre compte, lancez la commande suivante et comparez la sortie avec la sortie précédente :

1
rsync -avn /home/admin/projects/ /home/admin/backup/projects

Maintenant que nous sommes sûrs de notre syntaxe, nous pouvons lancer une nouvelle fois la commande sans l’option -n :

1
sudo rsync -av /home/admin/projects/ /home/admin/backup/projects

L’utilisation de la commande sudo n’aurait pas été nécessaire ici, mais elle permet de vérifier que les permissions, le propriétaire et le groupe des fichiers ont bien été conservés malgré le fait que la copie ait été effectuée par le compte root.

Affichez le contenu du répertoire ~/backup/projects avec la commande ls -al et vérifiez que c’est effectivement le cas.

Pour nous en convaincre, voyons ce qu’il se passe si on effectue la même opération avec seulement l’option -r. Créez un répertoire ~/backup/projects2, et lancez la commande suivante :

1
sudo rsync -rv /home/admin/projects/ /home/admin/backup/projects2

Affichez le contenu du répertoire ~/backup/projects2 et observez le nom du compte et du groupe propriétaire.

Voyons maintenant ce qu’il se passe si nous lançons une nouvelle fois la commande de synchronisation dans le répertoire ~/backup/project. Pour cela, lancez une nouvelle fois la commande suivante :

1
sudo rsync -av /home/admin/projects/ /home/admin/backup/projects

On remarque qu’aucun fichier n’a été copié. En effet, rsync commence par effectuer une comparaison du répertoire source et du répertoire de destination et n’effectue que les changements nécessaires.

Commencez par ajouter ou modifier un ou plusieurs fichiers (ne supprimez rien) et relancez la commande pour voir l’effet.

Maintenant, supprimez un fichier et relancez une nouvelle fois la commande. Rendez-vous dans le répertoire ~/backup/projects pour vérifier que le fichier est effectivement supprimé. Que remarquez-vous ?

Par défaut, rsync ne supprime pas les fichiers supprimés dans le répertoire source. Si vous souhaitez qu’il le fasse, vous devez ajouter l’option --delete :

1
sudo rsync -av --delete /home/admin/projects/ /home/admin/backup/projects

Synchroniser un répertoire du PC avec le répertoire du projet du serveur

Le r de rsync signifie remote, l’utilitaire permet donc la synchronisation à distance. Pour communiquer avec la machine distante, on peut utiliser le démon ryncd ou le protocole ssh. Comme nous avons déjà configuré notre PC pour communiquer en ssh de manière sécurisée, nous opterons pour ce protocole.

Pour cela, sous Linux, macOS et WSL (mais pas sous Windows, voir plus bas), ouvrez une fenêtre de terminal, rendez-vous dans votre répertoire personnel et créez un répertoire backup/svr-m122-projects et lancez la commande suivante :

1
rsync -avzP admin@svr-m122-##.lab.epai-ict.ch:/home/admin/projects/ backup/svr-m122-projects

Sous Windows, le paquet rsync de Chocolatey install rsync pour cygwin (cwrsyncs). Cette version de rsync n’est pas compatible avec la distribution OpenSSH de Windows. Pour que rsync fonctionne, nous devons utiliser l’option -e (voir ci-après) pour indiquer à rsync d’utilsier le programme ssh fournit avec le paquet.

Pour exécuter synchroniser votre répertoire sous Windows, ouvrez une fenêtre de terminal sans priviliègres et lancez la commande suivante :

1
rsync -avzP -e "$env:ChocolateyInstall\lib\rsync\tools\bin\ssh.exe" admin@svr-m122-##.lab.epai-ict.ch:/home/admin/projects/ backup/svr-m122-projects

De manière générale, l’option -e permet de définir la ligne de commande que rsync doit utiliser pour établir la connexion avec la machine distante. Comme le plus souvent, on utilise pour cela la commande ssh, l’option -e est généralement utilisée pour personnaliser les options de ssh. Par exemple :

1
rsync -avzP -e "ssh -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null" admin@svr-m122-##.lab.epai-ict.ch:/home/admin/projects/ backup/svr-m122-projects

L’option -P permet d’afficher des informations sur la progression du transfert, ce qui est particulièrement utile lors de la copie de gros fichier. L’option -z permet d’activer la compression des données lors du transfert.

Enfin, vous pouvez également utiliser l’option --delete si vous le souhaitez.

Synchronisation bidirectionnelle

L’utilitaire rsync est puissant, mais il effectue une synchronisation à l’unidirectionnelle. Il est bien sûr possible de simuler une synchronisation bidirectionnelle en lançant plusieurs fois la commande, mais ce n’est pas aussi simple qu’il y parait.

Pour effectuer une synchronisation bidirectionnelle, on peut utiliser l’utilitaire Unison qui existe pour Linux, macOS et Windows.

Si vous avez terminé votre travail avec rsync, installez Unison sur votre système en utilisant votre gestionnaire de paquets, et essayez de mettre en place une synchronisation bidirectionnelle avec cet outil.