2010-11-20 10 views
48

Recientemente he creado 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.inotify con NFS

-Utilizando 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 el script se ejecuta en el servidor NFS, se hace una notificación cuando se crean los archivos tanto de la máquina A y la máquina B.

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

Saludos,

Andrew

+2

¿Estás diciendo que solo se notifica la secuencia de comandos del servidor que posee el sistema de archivos o la computadora que realizó el cambio? Ese es el comportamiento que esperaría. – Gabe

+1

Informé una solicitud de función [aquí] (https://bugzilla.kernel.org/show_bug.cgi?id=53161). – HRJ

Respuesta

51

inotify requiere el apoyo del kernel para trabajar. 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 quiere 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.

Edit: Me parece extraño que NFS se debe a su falta de soporte para inotify.

Sistema de archivos de red (NFS) es un protocolo distribuido archivo del sistema desarrollado originalmente por Sun Microsystems en 1984, wikipedia article

Sin embargo:

Inotify (nodo-i notificar a) es una Subsistema del kernel de Linux que actúa para extender los sistemas de archivos a fin de 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,) [...]. wikipedia article

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

* énfasis mío en todos los casos


Otro problema con este; Supongamos que no estamos utilizando una red, sino un sistema de archivos local con buena compatibilidad con 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.

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 montado.

No hay una manera razonable de que uno pueda hacer 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 montaje 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 utilizar una cola de mensajes para notificaciones de red?

+11

Esto parece un error. Sí, el cambio se realiza en otro lugar, pero el hecho es que los clientes de NFS eventualmente descubren los archivos recién agregados. Incluso si el evento se aplazó, un cliente de NFS debería poder notificar a los oyentes cuando descubra recursos recién agregados/eliminados. –

+3

@JamesBlackburn: esto es probable por motivos de rendimiento. Los clientes de NFS probablemente solo descubran cambios de forma perezosa, previa solicitud. –

+4

Por supuesto, no se puede culpar a NFS por no admitir inotify. Pero, tu ejemplo es totalmente defectuoso. Una implementación de NFS podría admitir algo como inotify y podría mapear su (protocolo interno de NFS) cosas para inotificar cosas. No es asi. Así que es – Frunsi

5

Encontré una SGI FAM usando un supervisor daemon para supervisar la modificación del archivo. Es compatible con NFS y puede ver alguna descripción en wiki

+1

Parece que FAM necesita un servidor FAM ejecutándose en el FS remoto para funcionar. Dado que FAM es incluso más antiguo que inotify, me pregunto por qué el último no es compatible con FS remotos. – Wernight

0

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

Así que las cosas en los sistemas de archivos "reales" (en relación con el sistema, es decir) 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 pase al sistema de archivos. Los inconvenientes, por supuesto, son que está utilizando el espacio real del disco duro.

Cuestiones relacionadas