Synchro entre portable et réseau local

Introduction

Lors de l'acquisition de mon portable il y a quelques années, tout de suite s'est fait ressentir le besoin de synchroniser les données entre le portable et mon LAN, et ce que ce soit du texte ou du binaire. CVS n'étant pas très adapté au binaire, je me suis tourné vers rsync. Mais seul, rsync n'était pas suffisant : il a fallu mettre en oeuvre toute l'infrastructure permettant la synchronisation rapide et automatique des données.

Les éléments

La solution retenue est celle du montage de répertoires NFS (et en particulier le home du LAN) et une synchronisation de fichiers et répertoires spécifiés dans un fichier de configuration par utilisateur.
Ainsi chaque utilisateur possède un fichier dans lequel se trouve la liste des fichiers et répertoires à synchroniser. Évidemment il a aussi un répertoire personnel monté par NFS ainsi qu'un répertoire local sur le portable.
Il est à noter que les outils de synchro ne sont nécessaire que sur le portable.

La synchronisation se fait de façons différentes, le principal étant le script de synchronisation lui-même. Celui-ci peut être appelé depuis la ligne de commande, soit par un utilisateur, soit par root afin de faire la synchro de tous les utilisateurs automatiquement.
Elle peut se faire à n'importe quel moment tant que les 2 éléments à synchroniser sont accessibles en même temps : à l'insertion de la carte PCMCIA (via la config PCMCIA), à la connexion au réseau, au login, etc...
Personnellement j'utilise la détection PCMCIA en conjonction avec DHCP afin de permettre une configuration dépendante du réseau sur lequel le portable se trouve (il ne sert à rien de tenter de synchroniser avec le /home du LAN si on ne se trouve pas sur ce LAN, ou il peut être utile de ne pas synchroniser de la même façon des éléments sur 2 LANs différents.

La synchronisation

Le script permettant la synchronisation est utilisable dans tous les cas. Son principal défaut est qu'il synchronise les fichiers et répertoires sans destruction. Ce qui signifie que les suppressions de fichiers ne seront pas effectuées et les fichiers effacés seront remis à moins d'être effacés des 2 côtés (LAN et portable).

La synchronisation s'effectue par la commande rsync -Caqu sur chacun des éléments (fichier ou répertoire) du fichier de config :
rsync -Caqu /home/$USER/fich-ou-rep $HOMENFSMNT/$USER/fich-ou-rep
rsync -Caqu $HOMENFSMNT/$USER/fich-ou-rep /home/$USER/fich-ou-rep

Le script est disponible ici.
Les options de ce script sont les suivantes :

Les utilisations

System-wide au boot

Le script de synchronisation peut s'utiliser dans les scripts de boot par root. Suivant la distribution, on peut y faire appel à partir du moment où le répertoire home-NFS est monté, par exemple en rajoutant un script style System V (pour les distro style Debian, RedHat, Mandrake) ou quelques lignes dans un des scripts existants (toutes distros confondues). Ces lignes (qui sont les mêmes pour le script) sont les suivantes :

for LOCAL_USER in `ls /home --ignore=lost+found`; do
    /usr/local/bin/filesync -u $LOCAL_USER
done

PCMCIA

Le réseau n'étant pas forcément en marche au moment du boot, il peut être utile d'utiliser ces lignes dans la configuration PCMCIA si on utilise une telle carte réseau.
Sur une Debian, la configuration PCMCIA se trouve dans /etc/pcmcia/ et le fichier concerné (/etc/pcmcia/network.opts) permet de configurer 2 fonctions pré-inscriptes. Les fonctions initialement codées de la façons suivante :

    start_fn () { return; }
    stop_fn () { return; }
peuvent être modifiées de la façon suivante :
    start_fn () { /path/to/detect start; return; }
    stop_fn () { /path/to/detect stop; return; }
en remplaçant /path/to/ par le chemin complet de l'accès au script contenant les 3 lignes indiquées plus haut insérées à la suite des montages NFS.

Personnellement j'ai même rajouté 2 fonctions (resume_fn et suspend_fn) afin de pouvoir utiliser les modes suspend et resume du PCMCIA, mais peu de rapport avec la synchro...

Script de connexion

Pour les portables ayant une interface ethernet intégrée, alors la configuration de l'interface et de la connexion doit se faire soit automatiquement au boot ce qui revient au premier paragraphe, soit à la demande. Dans ce cas, il suffit de modifier le script de connexion qui effectue la configuration (que ce soit manuellement ou par DHCP, les montages NFS, etc.) afin de lui adjoindre les 3 lignes de synchro.

DHCP

DHCP n'a pas grand chose à voir avec la synchro. Si j'en parle ici c'est que c'est un moyen très pratique de pouvoir gérer la synchronisation en fonction du réseau sur lequel on se branche en se basant sur le nom de domaine et en laissant la configuration de la carte réseau non pas à PCMCIA, mais au client DHCP.
Dans mon cas, ça revient à faire appel à /etc/dhcpc/detect qui contient les lignes nécessaires à la différenciation des réseaux (pour l'instant il n'y en a qu'un seul).
Le script de détection complet est ici.

Ce script est adapté pour prendre en compte les modes suspend et resume du PCMCIA dont j'ai parlé plus haut.

Synchronisation à la session

Il est enfin possible de faire une synchro spécifique par utilisateur en insérant la commande filesync dans les scripts de login ou de logout du shell utilisé ou encore dans le script .xsession ou .xinitrc pour le mode graphique.

Conclusion

La mise en oeuvre de ce système est très simple et ne se base que sur des outils standards des unix actuels (rsync, grep, awk, etc.). Elle est de plus assez efficace lorsqu'il s'agit de modifications simples (modifications non-destructives de fichiers et création de fichiers).
Les fichiers de configuration des éléments à maintenir synchronisés (dont voici un exemple) sont de simples fichiers textes dans lesquels les lignes vides et celles commençant par # ne sont pas prises en compte. ATTENTION : les répertoires doivent impérativement avoir un / à la fin.


Thomas Nemeth
Last modified: Wed Sep 17 14:42:50 CET 2003