2009-06-24 12 views
8

के माध्यम से फीफो फ़ाइल को नहीं लिखा जा सकता है मैं एनएफएस माउंट पर स्थित फीफो फ़ाइल को लिखने की कोशिश कर रहा हूं और यह ब्लॉक करता है। क्या समस्या हो सकती है?एनएफएस

मेरे/etc/निर्यात: एनएफएस सर्वर और ग्राहक पर

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

ls/tmp/परीक्षण एक ही

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

है और मैं रूट के रूप में लिख रहा हूँ

धन्यवाद।

उत्तर

5

यह एक नामित फीफो है, लेकिन मुझे लगता है कि यह केवल उस सिस्टम पर काम करता है जहां फाइल सिस्टम लगाया जाता है। क्या आपके पास इस फीफो पर एक पाठक है? क्या लेखक और पाठक एक ही सिस्टम पर हैं?

फीफो इस तरह काम करता है: जब कोई प्रक्रिया फीफो खोलती है, तो कर्नेल पाइप बनाता है। यदि कोई अन्य प्रक्रिया फीफो खोलती है, तो कर्नेल को (नाम से) पता है कि यह एक ही पाइप है जिसे पहले खोला गया था।

यह दो अलग-अलग मशीनों पर काम नहीं कर सकता है। यदि प्रक्रिया ए क्लाइंट 1 पर चलता है और प्रक्रिया बी क्लाइंट 2 पर चलता है, तो प्रक्रिया ए और प्रक्रिया बी फीफो के माध्यम से संवाद नहीं कर सकती है, क्योंकि प्रत्येक मशीन पर एक फीफो बनाया जाता है।

फीफो तब तक अस्तित्व में नहीं है जब तक यह खोला नहीं जाता है, और यह केवल स्थानीय रूप से बाहर निकलता है, यह फाइल सिस्टम की सामग्री पर कोई प्रभाव नहीं पड़ता है।

+0

हाँ मेरे पास दूसरे छोर पर एक पाठक है। मैंने सोचा कि मैं किसी भी फाइल को एक्सेस कर सकता हूं जिसे मैं एनएफएस के माध्यम से देख सकता हूं। – jackhab

0

क्या आपके पास फीफो पर एक पाठक है? एफआईएफओ तब तक अवरुद्ध होंगे जब तक कि दूसरे छोर पर कुछ पढ़ा न जाए। (गैर-अवरुद्ध मोड में खोलने के लिए सामान्य अपवाद लागू होते हैं।)

7

एक फीफो एक अंतर-प्रक्रिया संचार तंत्र के रूप में है। एनएफएस के माध्यम से एफआईएफओ को निर्यात करने की कोशिश करके, आप कर्नेल से स्थानीय संचार प्रक्रिया के इलाज के लिए नेटवर्क संचार तंत्र के रूप में पूछ रहे हैं।

इसके साथ जुड़े कई मुद्दे हैं, सबसे स्पष्ट बात यह है कि एफआईएफओ कर्नेल के अंदर कार्यान्वयन को पढ़ने के लिए डेटास्पेस में डेटा को कॉपी करने के लिए एक बफर की अपेक्षा करता है। ऐसा बफर सीधे एनएफएस में उपलब्ध नहीं है। इस प्रकार, कर्नेल एनएफएस पर एफआईएफओ के निर्यात का समर्थन नहीं करता है।

आप इसके बजाय नेटवर्क संचार के लिए सॉकेट का उपयोग करना चाह सकते हैं।

6

यह प्रतिक्रिया शायद आपकी मदद करने में बहुत देर हो चुकी है, लेकिन यह उल्लेखनीय है कि आप नामित पाइप और "एनसी" (नेटकैट) कमांड का उपयोग करके एक समान प्रभाव प्राप्त कर सकते हैं। नेटकैट मानक इनपुट (या नामित पाइप) से इनपुट स्वीकार कर सकता है और किसी अन्य मेजबान पर वैकल्पिक रूप से नामित पाइप के लिए नेटकैट के दूसरे उदाहरण में सॉकेट पर इसे प्रतिबिंबित कर सकता है।

तो बुनियादी तौर पर, अपने स्थापना इस प्रकार दिखाई देगा:

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' 
0

एनएफएस एक बहु ओएस, सबसे कम आम विभाजक फाइल सिस्टम के रूप में डिजाइन किया गया था।इस प्रकार, यह पूर्ण यूनिक्स फ़ाइल सिस्टम अर्थशास्त्र का समर्थन करता है। विशेष रूप से, एफआईएफओ/नामित पाइप, यदि उपलब्ध हो, तो सिस्टम में साझा नहीं किए जाएंगे। (एक ही मेजबान पर दो प्रक्रियाएं एनएफएस फीफो के माध्यम से संवाद करने में सक्षम हो सकती हैं, हालांकि मैं ऐसा करने की अनुशंसा नहीं करता)।

यदि आप पूर्ण यूनिक्स अर्थशास्त्र चाहते हैं, तो आपको RFS जैसे कुछ उपयोग करना होगा। ध्यान दें कि पोर्टेबिलिटी और एनएफएस के 95% समाधान की तुलना में आरएफएस की जटिलता और कम प्रदर्शन ने इसे मूल रूप से अप्रचलित बना दिया है। क्रॉस-होस्ट इंटरप्रोसेस संचार के लिए अनुशंसित समाधान बीएसडी स्टाइल सॉकेट या AT & टी स्टाइल स्ट्रीम का उपयोग करना है, जो आपके ओएस पर्यावरण के आधार पर है। लिनक्स के लिए, सॉकेट का उपयोग करें।

संबंधित मुद्दे