inotify con NFS

Recientemente, creé un sistema de Dropbox usando inotify, buscando archivos creados en un directorio en particular. El directorio que estoy viendo se monta desde un servidor NFS, e inotify se comporta de forma diferente a lo esperado. Considere el siguiente escenario en el que se ejecuta un script de inotify en la máquina A, viendo / some / nfs / dir / también / visible / to / B.

-Utilizar la máquina A para crear un archivo en / alguna / nfs / dir / también / visible / a / B, la secuencia de comandos se comporta como se esperaba. Al usar la máquina B para llevar a cabo la misma acción, no se notifica a la secuencia de comandos acerca de un nuevo archivo eliminado en el directorio.
-Cuando la secuencia de comandos se ejecuta en el servidor NFS, recibe una notificación cuando se crean archivos desde la máquina A y la máquina B.

¿Es esto un error en el error en el paquete que estoy usando para acceder inotofia, o es este comportamiento esperado?

Saludos,

Andrés

inotify requiere soporte del kernel para funcionar. Cuando una aplicación rastrea un directorio, le pide al kernel que le informe cuándo ocurren esos cambios. Cuando se produce el cambio, además de escribir esos cambios en el disco, el kernel también notifica el proceso de observación.

En una máquina NFS remota, el cambio no es visible para el kernel; sucede completamente remotamente. NFS es anterior a inotify y no hay soporte de nivel de red para él en NFS, o algo equivalente.

Si desea evitar esto, puede ejecutar un servicio en el servidor de almacenamiento (ya que ese kernel siempre verá cambios en el sistema de archivos) que los intermediarios identifiquen las solicitudes de máquinas remotas y reenvíen los datos a los clientes remotos.

Editar: Me parece extraño que NFS sea ​​culpado por su falta de soporte para inotify.

Network File System (NFS) es un protocolo de sistema de archivos distribuido desarrollado originalmente por Sun Microsystems en 1984 , artículo de Wikipedia.

Sin embargo:

Inotify (inode notify) es un subsistema de kernel de Linux que actúa para extender los sistemas de archivos y detectar cambios en el sistema de archivos. […] Se ha incluido en el kernel principal de Linux desde la versión 2.6.13 (18 de junio de 2005 ) […]. Artículo de wikipedia

Es difícil esperar que una aplicación / protocolo de red portátil admita una función de kernel específica desarrollada para un sistema operativo diferente y que apareció más de veinte años después . Incluso si incluía extensiones para él, no estarían disponibles o serían útiles en otros sistemas operativos.

* énfasis mío en todos los casos


Otro problema con esto; Supongamos que no estamos utilizando una red, sino un sistema de archivos local con un buen soporte de inotify: ext3 (supongamos que está montado en /mnt/foo ). Pero en lugar de un disco real, el sistema de archivos se monta desde un dispositivo de retroalimentación; y el archivo subyacente es a su vez accesible en una ubicación diferente en el vfs (por ejemplo, /var/images/foo.img ).

Ahora, no se supone que modifiques los sistemas de archivos ext3 montados, pero aún es razonablemente seguro hacerlo si el cambio se realiza en contenido de archivos en lugar de metadatos.

Por lo tanto, supongamos que un usuario inteligente modifica la imagen del sistema de archivos ( /var/images/foo.img ) en un editor hexadecimal, reemplazando el contenido de un archivo con otros datos, mientras que al mismo tiempo un reloj inotify está observando el mismo archivo en el sistema de archivos

No hay una manera razonable en que uno pueda hacer arreglos para que inotify siempre informe el proceso de observación de este tipo de cambio. Aunque probablemente haya algunos giros que podrían tomarse para hacer que ext3 note y honrar el cambio, nada de eso se aplicaría, por ejemplo, al xfs drtiver, que de otra manera es bastante similar.

Tampoco debería. ¡Estás haciendo trampa!. inotify solo puede informarle de los cambios que ocurrieron a través del vfs en el punto de assembly real que se está mirando. Si los cambios ocurrieron fuera de ese VFS, debido a un cambio en los datos subyacentes, inotify no puede ayudarlo y no está diseñado para resolver ese problema.

¿Ha considerado usar una cola de mensajes para notificación de red?

Encontré una SGI FAM que usa un daemon supervisor para monitorear la modificación de archivos. Es compatible con NFS y puedes ver alguna descripción en wiki

Estoy de acuerdo con la explicación de SingleNegationElimination y me gustaría agregar que los objectives de iSCSI funcionarán, ya que alertan al kernel.

Así que las cosas en los sistemas de archivos “reales” (en relación con el sistema, eso es) activarán Inotify para alertar. Como Rsync’ing, atrapando algo en una partición montada.

Si tiene que recibir notificaciones a través de inotify (o tiene que usar inotify), puede hacer que un cron rsync -avz en el sistema de archivos. Los inconvenientes, por supuesto, son que está utilizando el espacio real del disco duro.

    Intereting Posts