2009-06-24 19 views
8

Sto provando a scrivere su file FIFO locate su mount NFS e blocca. Quale potrebbe essere il problema?Impossibile scrivere nel file FIFO mouted via NFS

mio/etc/export:

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

ls/tmp/test sul server e client NFS è lo stesso

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

e sto scrivendo come root

Grazie.

risposta

5

È un nome fifo, ma suppongo che funzioni solo sul sistema su cui è montato il filesystem. Hai un lettore su questo fifo? Lo scrittore e il lettore sono sullo stesso sistema?

Il fifo funziona in questo modo: quando un processo apre il fifo, il kernel crea il pipe. Se un altro processo apre la fifo, il kernel sa (dal nome) che è la stessa pipa di quella precedentemente aperta.

Questo non può funzionare su due macchine diverse. Cioè se il processo A viene eseguito su client1 e il processo B viene eseguito su client2, quindi il processo A e il processo B non possono comunicare attraverso il fifo, poiché viene creato un fifo su ciascuna macchina.

Il fifo non esiste finché non viene aperto e termina solo a livello locale, poiché non ha alcun effetto sul contenuto del file system.

+0

Sì, ho un lettore dall'altra parte. Ho pensato di poter accedere a qualsiasi file che posso vedere tramite NFS. – jackhab

0

Hai un lettore sulla FIFO? FIFO bloccherà finché non ci sarà qualcosa da leggere dall'altra parte. (Si applicano eccezioni usuali per l'apertura in modalità non bloccante.)

7

Un FIFO è pensato per essere un meccanismo di comunicazione tra processi. Provando ad esportare il FIFO tramite NFS, si chiede al kernel di considerare la comunicazione tra processi locale come un meccanismo di comunicazione di rete.

Ci sono un numero di problemi associati a questo, il più ovvio è che l'implementazione di lettura FIFO all'interno del kernel si aspetta un buffer nello userspace in cui copiare i dati. Tale buffer non è direttamente disponibile in NFS. Pertanto, il kernel non supporta l'esportazione di FIFO su NFS.

Si consiglia di utilizzare i socket per la comunicazione di rete.

6

Questa risposta è probabilmente troppo tardi per aiutarti ora, ma è da notare che è possibile ottenere un effetto simile usando named pipe e il comando "nc" (netcat). Netcat può accettare input dall'input standard (o una named pipe) ed echo su un socket su un'altra istanza di netcat su un altro host, opzionalmente su una named pipe.

Quindi, in pratica, la configurazione sarebbe simile a questa:

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

Host2$ mkfifo Host2_named_pipe 
Host2$ nc Host1 1234 < Host2_named_pipe 

Ora, quando si esegue un programma sul Host2 e inviare la sua uscita a Host2_named_pipe, che l'uscita uscirà di Host1_named_pipe su Host1.

o via 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 è stato progettato come un multi-OS, minimo comune denominatore filesystem.Come tale, lo standard non supporta la semantica completa del file system Unix. In particolare, le pipe FIFO/named, se disponibili, non saranno condivise tra i sistemi. (Due processi sullo stesso host potrebbero essere in grado di comunicare tramite una FIFO NFS, sebbene non consiglierei di farlo).

Se si desidera una semantica Unix completa, è necessario utilizzare qualcosa come RFS. Si noti che la complessità e le prestazioni ridotte di RFS, rispetto alla portabilità e alla soluzione al 95% di NFS, lo hanno reso sostanzialmente obsoleto. La soluzione consigliata per la comunicazione interprocesso cross-host consiste nell'utilizzare socket BSD o AT &, a seconda dell'ambiente del sistema operativo. Per Linux, usa i socket.

Problemi correlati