2009-06-24 16 views
8

Tôi đang cố ghi vào tệp FIFO định vị trên NFS và nó chặn. Điều gì có thể là vấn đề?Không thể ghi vào tệp FIFO được chào hàng qua NFS

My/etc/xuất khẩu:

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

ls/tmp/test trên NFS server và client là như nhau

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

và tôi đang viết như là người chủ

Cảm ơn.

Trả lời

5

Đó là tên là fifo, nhưng tôi đoán nó chỉ hoạt động trên hệ thống nơi hệ thống tập tin được gắn kết. Bạn có người đọc trên fifo này không? Nhà văn và người đọc trên cùng một hệ thống?

Nămo hoạt động như sau: khi một quá trình mở nămo, hạt nhân tạo ra đường ống. Nếu một tiến trình khác mở nămo, thì hạt nhân biết (từ tên) rằng nó giống với đường ống đã được mở trước đó.

Điều này không thể hoạt động trên hai máy khác nhau. Tức là nếu tiến trình A chạy trên client1 và tiến trình B chạy trên client2, thì tiến trình A và tiến trình B không thể giao tiếp thông qua FIFO, bởi vì một FIFO được tạo trên mỗi máy.

Năm mươi không tồn tại cho đến khi nó được mở ra, và nó chỉ thoát ra tại địa phương, nó không ảnh hưởng đến nội dung của hệ thống tập tin.

+0

Có Tôi có người đọc ở đầu bên kia. Tôi nghĩ rằng tôi có thể truy cập bất kỳ tập tin tôi có thể nhìn thấy thông qua NFS. – jackhab

0

Bạn có người đọc trên FIFO không? FIFO sẽ chặn cho đến khi có cái gì đó đọc ở đầu bên kia. (Các trường hợp ngoại lệ thông thường khi mở ở chế độ không chặn được áp dụng.)

7

FIFO có nghĩa là cơ chế giao tiếp giữa các quá trình. Bằng cách cố gắng xuất FIFO qua NFS, bạn đang yêu cầu hạt nhân xử lý giao tiếp giữa các quá trình cục bộ như nhiều cơ chế truyền thông mạng.

Có một số vấn đề liên quan đến điều đó, rõ ràng nhất là việc thực thi đọc FIFO bên trong hạt nhân mong đợi một bộ đệm trong không gian người dùng sao chép dữ liệu vào. Bộ đệm như vậy không có sẵn trực tiếp trong NFS. Do đó, hạt nhân không hỗ trợ xuất khẩu FIFO trên NFS.

Thay vào đó, bạn có thể muốn sử dụng ổ cắm để liên lạc mạng.

6

Phản hồi này có thể đã quá muộn để trợ giúp bạn, nhưng đáng chú ý là bạn có thể đạt được hiệu ứng tương tự bằng cách sử dụng các đường ống có tên và lệnh "nc" (netcat). Netcat có thể chấp nhận đầu vào từ đầu vào tiêu chuẩn (hoặc một đường ống có tên) và lặp lại nó trên một socket đến một thể hiện khác của netcat trên một máy chủ khác, tùy ý đến một đường ống có tên.

Vì vậy, về cơ bản, thiết lập của bạn sẽ trông như thế này:

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

Host2$ mkfifo Host2_named_pipe 
Host2$ nc Host1 1234 < Host2_named_pipe 

Bây giờ, khi bạn chạy một chương trình trên HOST2 và gửi sản lượng của nó để Host2_named_pipe, sản lượng sẽ đi ra khỏi Host1_named_pipe trên HOST1.

hoặc thông qua 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 được thiết kế như một đa hệ điều hành, phổ biến thấp nhất mẫu số hệ thống tập tin.Như vậy, nó không hỗ trợ đầy đủ ngữ nghĩa hệ thống tệp Unix. Đặc biệt, các ống FIFO/có tên, nếu có, sẽ không được chia sẻ trên các hệ thống. (Hai quy trình trên cùng một máy chủ có thể giao tiếp thông qua một NFS FIFO, mặc dù tôi sẽ không khuyên bạn nên làm điều này).

Nếu bạn muốn ngữ nghĩa Unix đầy đủ, bạn phải sử dụng một cái gì đó như RFS. Lưu ý rằng độ phức tạp và hiệu suất giảm của RFS, so với tính di động và giải pháp 95% của NFS, đã làm cho nó về cơ bản đã lỗi thời. Giải pháp được khuyến nghị cho liên lạc giữa các máy chủ chéo là sử dụng các ổ cắm kiểu BSD hoặc AT & Dòng kiểu T, tùy thuộc vào môi trường hệ điều hành của bạn. Đối với Linux, hãy sử dụng ổ cắm.