Не удается записать в файл FIFO, отключенный через NFS

Я пытаюсь записать в файл FIFO, расположенный на монтировании NFS, и он блокируется. В чем может быть проблема?

Мой /etc/экспорт:

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

ls /tmp/test на сервере NFS и клиенте одинаков

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

и я пишу как root

Спасибо.


person jackhab    schedule 24.06.2009    source источник


Ответы (5)


Этот ответ, вероятно, слишком запоздал, чтобы помочь вам сейчас, но примечательно, что вы можете добиться аналогичного эффекта, используя именованные каналы и команду «nc» (netcat). Netcat может принимать ввод со стандартного ввода (или именованного канала) и выводить его через сокет в другой экземпляр netcat на другом хосте, при необходимости в именованный канал.

Итак, в основном ваша установка будет выглядеть так:

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

Host2$ mkfifo Host2_named_pipe
Host2$ nc Host1 1234 < Host2_named_pipe

Теперь, когда вы запускаете программу на Host2 и отправляете ее выходные данные на Host2_named_pipe, эти выходные данные будут поступать из Host1_named_pipe на Host1.

или по ssh:

Host1$ mknode Host1_named_pipe p
Host2$ mknode Host2_named_pipe p

Host1$ cat Host1_named_pipe | ssh Host2 'cat - > Host2_named_pipe'
person jeremytrimble    schedule 11.03.2010

FIFO предназначен для механизма межпроцессного взаимодействия. Пытаясь экспортировать FIFO через NFS, вы просите ядро ​​рассматривать локальное взаимодействие между процессами как механизм сетевого взаимодействия.

С этим связано несколько проблем, наиболее очевидной из которых является то, что реализация чтения FIFO внутри ядра ожидает буфер в пользовательском пространстве для копирования данных. Такой буфер напрямую не доступен в NFS. Таким образом, ядро ​​не поддерживает экспорт FIFO через NFS.

Вместо этого вы можете использовать сокеты для сетевого взаимодействия.

person Divye Kapoor    schedule 22.08.2009

Это именованный fifo, но я думаю, что он работает только в системе, где смонтирована файловая система. У вас есть читатель на этом fifo? Находятся ли писатель и читатель в одной системе?

Fifo работает следующим образом: когда процесс открывает fifo, ядро ​​создает канал. Если другой процесс открывает fifo, то ядро ​​знает (из имени), что это тот же канал, что и ранее открытый.

Это не может работать на двух разных машинах. Т.е. если процесс A выполняется на клиенте1, а процесс B выполняется на клиенте2, то процесс A и процесс B не могут обмениваться данными через fifo, потому что fifo создается на каждой машине.

Fifo не существует, пока он не будет открыт, и он выходит только локально, это не влияет на содержимое файловой системы.

person shodanex    schedule 24.06.2009
comment
Да, у меня есть считыватель на другом конце. Я думал, что могу получить доступ к любому файлу, который я вижу, через NFS. - person jackhab; 25.06.2009

У вас есть ридер на FIFO? FIFO будут блокироваться до тех пор, пока на другом конце не будет что-то читать. (Применяются обычные исключения для открытия в неблокирующем режиме.)

person Duck    schedule 24.06.2009

NFS была разработана как многооперационная файловая система с наименьшим общим знаменателем. Таким образом, он не поддерживает полную семантику файловой системы Unix. В частности, FIFO/именованные каналы, если они вообще доступны, не будут совместно использоваться системами. (Два процесса на одном хосте могут обмениваться данными через NFS FIFO, хотя я бы не рекомендовал этого делать).

Если вам нужна полная семантика Unix, вам придется использовать что-то вроде RFS. Обратите внимание, что сложность и пониженная производительность RFS по сравнению с переносимостью и 95-процентным решением NFS сделали ее практически устаревшей. Рекомендуемым решением для межпроцессного взаимодействия между хостами является использование сокетов в стиле BSD или потоков в стиле AT&T, в зависимости от среды вашей ОС. Для Linux используйте сокеты.

person mpez0    schedule 11.03.2010