2010-11-20 45 views
48

J'ai récemment créé un système de boîte de dépôt utilisant inotify, en surveillant les fichiers créés dans un répertoire particulier. Le répertoire que je regarde est monté à partir d'un serveur NFS, et inotify se comporte différemment de ce à quoi je m'attendais. Considérez le scénario suivant dans lequel un script inotify est exécuté sur la machine A, en regardant/some/nfs/dir/aussi/visible/to/B. -À l'aide de la machine A pour créer un fichier dans/un/nfs/rep/aussi/visible/à/B, le script se comporte comme prévu. En utilisant la machine B pour effectuer la même action, le script n'est pas informé d'un nouveau fichier déposé dans le répertoire.
-Lorsque le script est exécuté sur le serveur NFS, il est notifié lorsque les fichiers sont créés à la fois la machine A et la machine B.inotify avec NFS

Est-ce un bogue dans le bogue dans le paquet que je utilise pour accéder inotofy, ou est ce comportement attendu?

Cordialement,

Andrew

+2

Ainsi, vous dites que seul le script sur le serveur qui possède le système de fichiers ou l'ordinateur qui a effectué la modification est averti? C'est le comportement que je m'attendrais. – Gabe

+1

J'ai signalé une demande de fonctionnalité [ici] (https://bugzilla.kernel.org/show_bug.cgi?id=53161). – HRJ

Répondre

51

inotify nécessite le soutien du noyau au travail. Lorsqu'une application suit un répertoire, elle demande au noyau de l'informer quand ces changements se produisent. Lorsque la modification se produit, en plus d'écrire ces modifications sur le disque, le noyau notifie également le processus de surveillance.

Sur une machine NFS distante, la modification n'est pas visible pour le noyau; cela arrive entièrement à distance. NFS est antérieur à inotify et il n'y a pas de support au niveau réseau dans NFS, ou quoi que ce soit d'équivalent. Si vous voulez contourner cela, vous pouvez exécuter un service sur le serveur de stockage (puisque ce noyau verra toujours les changements au système de fichiers) qui brokers inotify demandes pour les machines distantes, et transmettre les données aux clients distants.

Modifier: Il me semble étrange que NFS soit blâmé pour son manque de support pour inotify.

système de fichiers réseau (NFS) est un protocole de système de fichiers distribué initialement développé par Sun Microsystems en 1984, wikipedia article

Cependant:

Inotify (inode notification) est un Sous-système de noyau Linux qui agit pour étendre les systèmes de fichiers afin de remarquer les modifications apportées au système de fichiers. [...] Il a été inclus dans le noyau Linux principal à partir de la version 2.6.13 (18 juin) [...]. wikipedia article

Il est difficile d'attendre un protocole de réseau portable/application pour soutenir une fonction spécifique du noyau développé pour un autre système d'exploitation et qui est apparu plus de vingt ans plus tard. Même si incluait inclure des extensions, il ne serait pas disponible ou utile sur d'autres systèmes d'exploitation.

* Souligné par l'auteur dans tous les cas


Un autre problème avec cela; Supposons que nous n'utilisons pas du tout un réseau, mais plutôt un système de fichiers local avec un bon support inotify: ext3 (supposons qu'il soit monté à /mnt/foo). Mais au lieu d'un vrai disque, le système de fichiers est monté à partir d'un périphérique de bouclage; et le fichier sous-jacent est à son tour accessible à un emplacement différent dans le vfs (par exemple, /var/images/foo.img). Maintenant, vous n'êtes pas censé modifier les systèmes de fichiers ext3 montés, mais il est toujours raisonnablement sûr de le faire si le changement concerne le contenu des fichiers au lieu des métadonnées. Supposons donc qu'un utilisateur intelligent modifie l'image du système de fichiers (/var/images/foo.img) dans un éditeur hexadécimal, en remplaçant le contenu d'un fichier par d'autres données, tandis qu'une montre inotify observe le même fichier sur le système de fichiers monté.

Il n'y a pas de façon raisonnable de faire en sorte qu'inotify informe toujours le processus de surveillance de ce genre de changement. Bien qu'il y ait probablement quelques changements qui pourraient être pris pour rendre compte du changement et en tenir compte, rien de tout cela ne s'appliquerait, disons, au xfs drtiver, qui est par ailleurs assez similaire.

Il ne devrait pas non plus. Vous trichez!. inotify ne peut vous informer que des modifications survenues via vfs sur le point de montage réel surveillé. Si les changements se sont produits en dehors de ce VFS, en raison d'une modification des données sous-jacentes, inotify ne peut pas vous aider et n'est pas conçu pour résoudre ce problème.

Avez-vous envisagé d'utiliser une file d'attente de messages pour la notification réseau?

+11

Cela semble juste un bug. Oui, le changement est fait ailleurs, mais le fait est que les clients NFS finissent par découvrir les nouveaux fichiers ajoutés. Même si l'événement a été différé, un client NFS devrait pouvoir notifier les écouteurs inotify lorsqu'il découvre des ressources nouvellement ajoutées/supprimées. –

+3

@JamesBlackburn: ceci est probable pour des raisons de performances. Les clients NFS ne découvrent probablement les modifications que paresseusement, sur demande. –

+4

Bien sûr, NFS ne peut pas être blâmé de ne pas supporter inotify. Mais, votre exemple est totalement erroné. Une implémentation NFS pourrait prendre en charge quelque chose comme inotify et elle pourrait mapper son contenu (protocole interne NFS) pour inotifier des choses. Ce ne est pas. Donc c'est – Frunsi

5

J'ai trouvé un SGI FAM en utilisant un démon superviseur pour surveiller la modification de fichier. Il supporte NFS et vous pouvez voir une description sur wiki

+1

Il semble que FAM nécessite un serveur FAM fonctionnant sur le FS distant pour fonctionner. Étant donné que FAM est encore plus ancien qu'inotify, je me demande pourquoi ce dernier ne supporte pas FS distant. – Wernight

0

Je suis d'accord avec l'explication de SingleNegationElimination, et je voudrais ajouter que les cibles iSCSI fonctionneront puisqu'elles alertent le noyau. Donc, les choses sur les systèmes de fichiers «réels» (par rapport au système, c'est-à-dire) vont déclencher Inotify pour alerter. Comme Rsync'ing, net-catting quelque chose dans une partition montée.

Si vous devez recevoir des notifications via inotify (ou utiliser inotify), vous pouvez faire un cron to rsync -avz dans le système de fichiers. Inconvénients bien sûr que vous utilisez l'espace réel du système hdd.