2009-06-24 9 views
8

J'essaie d'écrire dans le fichier FIFO localiser sur le montage NFS et il bloque. Quel pourrait être le problème?Impossible d'écrire dans le fichier FIFO mouted via NFS

/etc/export:

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

ls/tmp/test sur le serveur NFS et le client est le même

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

et je vous écris en tant que root

Merci.

Répondre

5

C'est un fifo nommé, mais je suppose qu'il ne fonctionne que sur le système où le système de fichiers est monté. Avez-vous un lecteur sur ce fifo? L'auteur et le lecteur sont-ils sur le même système? Le fifo fonctionne comme ceci: quand un processus ouvre le fifo, le noyau crée le pipe. Si un autre processus ouvre le fifo, alors le noyau sait (du nom) qu'il s'agit du même canal que celui précédemment ouvert.

Cela ne peut pas fonctionner sur deux machines différentes. C'est-à-dire que si le processus A s'exécute sur client1 et que le processus B s'exécute sur client2, alors le processus A et le processus B ne peuvent pas communiquer via le fifo, car un fifo est créé sur chaque machine.

Le fifo n'existe pas jusqu'à ce qu'il soit ouvert, et il n'existe que localement, cela n'a aucun effet sur le contenu du système de fichiers.

+0

Oui, j'ai un lecteur à l'autre extrémité. Je pensais pouvoir accéder à n'importe quel fichier que je peux voir via NFS. – jackhab

0

Avez-vous un lecteur sur le FIFO? Les FIFO bloqueront jusqu'à ce que quelque chose soit lu à l'autre bout. (Les exceptions habituelles pour l'ouverture en mode non bloquant s'appliquent.)

7

Un FIFO est censé être un mécanisme de communication inter-processus. En essayant d'exporter la FIFO via NFS, vous demandez au noyau de traiter la communication inter-processus locale comme un mécanisme de communication réseau.

Un certain nombre de problèmes sont associés à cela, le plus évident étant que l'implémentation FIFO en lecture dans le noyau attend un tampon dans l'espace utilisateur pour copier les données. Un tel tampon n'est pas directement disponible dans NFS. Ainsi, le noyau ne supporte pas l'exportation de FIFO sur NFS.

Vous pouvez utiliser des sockets pour la communication réseau à la place.

6

Cette réponse est probablement trop tardive pour vous aider maintenant, mais il est à noter que vous pourriez obtenir un effet similaire en utilisant des pipes nommés et la commande "nc" (netcat). Netcat peut accepter une entrée provenant d'une entrée standard (ou d'un canal nommé) et l'envoyer par écho sur une socket vers une autre instance de netcat sur un autre hôte, éventuellement sur un canal nommé.

Donc, fondamentalement, votre configuration devrait ressembler à ceci:

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

Host2$ mkfifo Host2_named_pipe 
Host2$ nc Host1 1234 < Host2_named_pipe 

Maintenant, lorsque vous exécutez un programme sur Host2 et d'envoyer sa sortie à Host2_named_pipe, que la production sortira de Host1_named_pipe sur Host1.

ou 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 a été conçu comme un multi-OS, système de fichiers plus petit dénominateur commun.En tant que tel, il ne prend pas en charge pleine sémantique du système de fichiers Unix. En particulier, les FIFO/pipes nommés, s'ils sont disponibles, ne seront pas partagés entre les systèmes. (Deux processus sur le même hôte peuvent être en mesure de communiquer via une FIFO NFS, bien que je ne recommanderais pas de le faire).

Si vous voulez une sémantique Unix complète, vous devez utiliser quelque chose comme RFS. Notez que la complexité et la réduction des performances de RFS, par rapport à la portabilité et à la solution 95% de NFS, l'ont rendu fondamentalement obsolète. La solution recommandée pour la communication interprocessus entre hôtes consiste à utiliser des sockets de style BSD ou des flux de style T, en fonction de l'environnement de votre système d'exploitation. Pour Linux, utilisez des sockets.

Questions connexes