Prérequis essenteils
Avant toute installation, assurez-vous que le démon rsync est correctement configuré. De plus, l'installation d'inotify-tools requiert que votre noyau Linux soit au minimum en version 2.6.13 et qu'il ait été compilé avec l'option CONFIG_INOTIFY activée. Vous pouvez vérifier ce dernier point via la commande ci-dessous.
Origine de la combinaison rsync et inotify
Rsync (remote sync) est un outil de synchronisation à distance qui permet d'effectuer des sauvegardes incrémentiellles vers un serveur distant. Cependant, rsync présente des limites : lors de la synchronisation, son algorithme principal compare les fichiers sur le serveur distant pour ne synchroniser que les différences. Imaginez un serveur contenant des millions de fichiers : cette comparaison devient extrêmement lente, d'autant plus que seule une infime partie des fichiers est généralement modifiée. C'est là qu'intervient inotify, qui permet de combler cette lacune en surveillant les changements au niveau du système de fichiers.
Côté client : rsync version 3.0.6, inotify-tools version 3.14
Compilation et installation
1) Vérification de la version du noyau
admin@serveur:~$ uname -r
4.15.0-76-generic
admin@serveur:~$ ls -l /proc/sys/fs/inotify/
total 0
-rw-r--r-- 1 root root 0 27 févr. 09:42 max_queued_events
-rw-r--r-- 1 root root 0 27 févr. 09:42 max_user_instances
-rw-r--r-- 1 root root 0 27 févr. 09:42 max_user_watches
# La présence de ces trois fichiers indique le support d'inotify.
2) Compilation et installation d'inotify-tools
admin@serveur:~$ cd inotify-tools-3.14/
admin@serveur:~/inotify-tools-3.14$ ./configure --prefix=/usr/local/inotify
admin@serveur:~/inotify-tools-3.14$ make
admin@serveur:~/inotify-tools-3.14$ sudo make install
3) Tests de fonctionnement local
Test de l'événement create :
admin@serveur:~$ /usr/local/inotify/bin/inotifywait -mrq --timefmt '%d/%m/%Y %H:%M' --format '%T %w%f' -e create /backup
27/02/2024 10:05 /backup/rapport.txt
27/02/2024 10:06 /backup/donnees
Test des événements create et delete :
admin@serveur:~$ /usr/local/inotify/bin/inotifywait -mrq --timefmt '%d/%m/%Y %H:%M' --format '%T %w%f' -e create,delete /backup
27/02/2024 10:08 /backup/ancien_fichier.log
27/02/2024 10:08 /backup/nouveau_fichier.dat
Test des événements create, delete et close_write (création d'un fichier peut générer deux entrées) :
admin@serveur:~$ /usr/local/inotify/bin/inotifywait -mrq --timefmt '%d/%m/%Y %H:%M' --format '%T %w%f' -e create,delete,close_write /backup
27/02/2024 10:10 /backup/document.pdf
27/02/2024 10:10 /backup/document.pdf
Sortie simplifiée sans horodatage :
admin@serveur:~$ /usr/local/inotify/bin/inotifywait -mrq --format '%w%f' -e create /backup
/backup/image.jpg
Explication des paramètres de inotifywait
| Paramètre | Description |
|---|---|
-r, --recursive |
Surveillance récursive des répertoires. |
-q, --quiet |
Affiche une sortie minimale, se limitant aux événements de surveillance. |
-m, --monitor |
Maintient le processus en écoute continue. |
--exclude |
Exclut des fichiers ou répertoires de la surveillance (insensible à la casse). |
--timefmt |
Spécifie le format de l'horodatage pour la sortie. |
--format |
Définit le format de sortie à l'aide d'une chaîne de caractères. |
-e, --event |
Définit les événements à surveiller (voir liste ci-dessous). |
Liste des événements disponibles avec -e
| Événement | Description |
|---|---|
access |
Lecture d'un fichier ou répertoire. |
modify |
Modification du contenu d'un fichier ou répertoire. |
attrib |
Changement des attributs d'un fichier ou répertoire. |
close |
Fermeture d'un fichier ou répertoire (après lecture ou écriture). |
open |
Ouverture d'un fichier ou répertoire. |
moved_to |
Déplacement d'un fichier ou répertoire vers un autre répertoire. |
move |
Déplacement d'un fichier ou répertoire (entrant ou sortant). |
create |
Création d'un fichier ou répertoire dans le répertoire surveillé. |
delete |
Suppression d'un fichier ou répertoire. |
umount |
Démontage du système de fichiers. |
Script de synchronisation en temps réel
Le script suivant surveille un répertoire source et déclenche une synchronisation via rsync vers un serveur distant dès qu'un fichier est créé, modifié ou supprimé.
#!/bin/bash
REPERTOIRE_CIBLE="/backup"
INOTIFY_CMD="/usr/local/inotify/bin/inotifywait"
MODULE_RSYNC="rsync_backup@192.168.222.140::oldboy"
FICHIER_MDP="/etc/rsync.password"
"$INOTIFY_CMD" -mrq --format '%w%f' -e create,close_write,delete "$REPERTOIRE_CIBLE" | while read CHEMIN_FICHIER
do
# Si le fichier n'existe plus (cas d'une suppression), on synchronise tout le répertoire.
if [ ! -e "$CHEMIN_FICHIER" ]; then
cd "$REPERTOIRE_CIBLE" && rsync -avz --delete ./ "$MODULE_RSYNC" --password-file="$FICHIER_MDP"
else
# Sinon, on ne synchronise que le fichier modifié.
rsync -avz --delete "$CHEMIN_FICHIER" "$MODULE_RSYNC" --password-file="$FICHIER_MDP"
fi
done
Optimisation des paramètres noyau
Les performances d'inotify sont régulées par trois paramètres dans /proc/sys/fs/inotify/ :
max_user_watches: Nombre maximal de fichiers/répertoires qu'un processus peut surveiller.max_user_instances: Nombre maximal d'instances inotify par utilisateur.max_queued_events: Taille maximale de la file d'événements en attente de traitement.
Pour une utilisation intensive, il est conseillé d'augmenter max_user_watches et max_queued_events.
admin@serveur:~$ cat /proc/sys/fs/inotify/max_user_watches
8192
admin@serveur:~$ sudo sysctl -w fs.inotify.max_user_watches=524288
admin@serveur:~$ sudo sysctl -w fs.inotify.max_queued_events=32768
# Pour rendre les changements permanents, ajoutez ces lignes à /etc/sysctl.conf :
# fs.inotify.max_user_watches=524288
# fs.inotify.max_queued_events=32768
admin@serveur:~$ sudo sysctl -p
Avantages et inconvénients d'inotify
Avantages : Permet une détection quasi instantanée des changements au niveau du système de fichiers, rendant possible une synchronisation véritablement en temps réel avec des outils comme rsync.
Inconvénients :
- Volume : La surveillanec peut devenir lente avec un très grand nombre de fichiers (des centaines de milliers) et des modifications fréquentes.
- Granularité : Un script simple, comme celui présenté, déclenche souvent la synchronisation d'un répertoire entier sur la modification d'un seul fichier, bien qu'une synchronisation incrémentielle soit possible avec une logique plus fine.
- Processus unique : L'appel à rsync est exécuté de manière séquentielle pour chaque événement. Pour une gestion concurrentielle à grande échelle, des outils comme sersync, qui implémentent un modèle multi-processus, peuvent être plus adaptés.
Référence
Pour plus de détails sur inotify-tools : https://github.com/rvoicilas/inotify-tools/wiki