2009-06-24 14 views
8

Estoy tratando de escribir en el archivo FIFO localizar en el montaje NFS y bloquea. ¿Cual podría ser el problema?No puedo escribir en el archivo FIFO mouted a través de NFS

Mi/etc/exportación:

/tmp/test/ 10.0.0.0/24(rw,no_root_squash,async) 

ls/tmp/test en el servidor NFS y el cliente es el mismo

prw--w--w- 1 root root 0 2009-06-24 17:28 ui-input 

y estoy escribiendo como root

Gracias.

Respuesta

5

Es un fifo con nombre, pero supongo que solo funciona en el sistema donde está montado el sistema de archivos. ¿Tienes un lector en este fifo? ¿El escritor y el lector están en el mismo sistema?

El fifo funciona así: cuando un proceso abre el fifo, el kernel crea el conducto. Si otro proceso abre el fifo, entonces el núcleo sabe (por el nombre) que es el mismo conducto que el que se abrió anteriormente.

Esto no puede funcionar en dos máquinas diferentes. Es decir, si el proceso A se ejecuta en el cliente1 y el proceso B se ejecuta en el cliente2, entonces el proceso A y el proceso B no pueden comunicarse a través de la fifo, porque se crea una fifo en cada máquina.

La fifo no existe hasta que se abre, y solo sale a nivel local, ya que no tiene efecto sobre el contenido del sistema de archivos.

+0

Sí, tengo un lector en el otro extremo. Pensé que podía acceder a cualquier archivo que pudiera ver a través de NFS. – jackhab

0

¿Tiene un lector en la FIFO? Los FIFO se bloquearán hasta que haya algo leyendo en el otro extremo. (Se aplican las excepciones habituales para la apertura en modo sin bloqueo.)

7

Una FIFO debe ser un mecanismo de comunicación entre procesos. Al intentar exportar FIFO a través de NFS, le está pidiendo al kernel que trate la comunicación entre procesos local como un mecanismo de comunicación de red más.

Hay una serie de problemas asociados con eso, el más obvio es que la implementación de lectura FIFO dentro del kernel espera un búfer en el espacio de usuario para copiar los datos. Tal búfer no está directamente disponible en NFS. Por lo tanto, Kernel no admite la exportación de FIFO en NFS.

Es posible que desee utilizar sockets para la comunicación de red.

6

Probablemente esta respuesta sea demasiado tarde para ayudarlo ahora, pero es notable que podría lograr un efecto similar utilizando named pipes y el comando "nc" (netcat). Netcat puede aceptar la entrada de la entrada estándar (o una canalización con nombre) y repetirla en un socket a otra instancia de netcat en otro host, opcionalmente a una canalización con nombre.

Así que, básicamente, su configuración se vería así:

Host1$ mkfifo Host1_named_pipe 
Host1$ nc -l 1234 > Host1_named_pipe 

Host2$ mkfifo Host2_named_pipe 
Host2$ nc Host1 1234 < Host2_named_pipe 

Ahora, cuando se ejecuta un programa en Host2 y envía su salida a Host2_named_pipe, que la producción saldrá de Host1_named_pipe en el Host1.

oa través de SSH:

Host1$ mknode Host1_named_pipe p 
Host2$ mknode Host2_named_pipe p 

Host1$ cat Host1_named_pipe | ssh Host2 'cat - > Host2_named_pipe' 
0

NFS fue diseñado como un multi-OS, sistema de ficheros mínimo común denominador.Como tal, hace no admite la semántica completa del sistema de archivos Unix. En particular, los FIFO/conductos con nombre, si están disponibles, no se compartirán en los sistemas. (Dos procesos en el mismo host pueden comunicarse a través de un NFS FIFO, aunque no recomendaría hacer esto).

Si quiere una semántica completa de Unix, tendría que usar algo como RFS. Tenga en cuenta que la complejidad y el rendimiento reducido de RFS, en comparación con la portabilidad y la solución del 95% de NFS, lo han vuelto básicamente obsoleto. La solución recomendada para la comunicación entre procesos entre hosts es usar conectores de estilo BSD o flujos de estilo T de AT &, dependiendo de su entorno de sistema operativo. Para Linux, use conectores.

Cuestiones relacionadas