NFS के ऊपर flock (2) बनाम fcntl (2)


19

पर्ल 5.x दस्तावेज़ीकरण में कहा गया है कि झुंड (..) का कार्यान्वयन निम्नलिखित मूल कॉलों में से एक का उपयोग करेगा, 1 से शुरू होकर 3 तक अनुपलब्ध होने पर काम करेगा:

  1. झुंड (2)
  2. fcntl (2)
  3. lockf (3)

कोई बात नहीं। हालाँकि, आपने उनके अस्वीकरण पर ध्यान दिया होगा कि झुंड (2) का उपयोग एनएफएस के ऊपर नहीं किया जाना चाहिए। डॉक्टर ने झुंड (2) का उपयोग करने के लिए पर्ल को मजबूर करने के लिए एक -Ud_flock ध्वज का उपयोग करने का सुझाव दिया। झुंड के आदमी पृष्ठ (2) (रेडहैट पर) एनएफएस मुद्दों के बारे में एक समान अस्वीकरण बताता है।

मेरा सवाल है, क्यों?!?! मुझे कोई गहन लेख या WHY झुंड (2) का स्पष्टीकरण एक एनएफएस से अधिक असुरक्षित नहीं लगता है।

मैंने सी और पर्ल में कई परीक्षण स्क्रिप्ट लिखी हैं, दोनों रेडहैट (जहां झुंड (2) का उपयोग किया जा रहा है) पर और सोलारिस (जहां fcntl (2) का उपयोग किया जा रहा है) पर)। मैं यह सुनिश्चित करने के लिए स्ट्रेस / ट्रस भाग गया कि पर्ल वास्तव में क्रमशः झुंड (2) और fcntl (2) का उपयोग कर रहा है। मैं किसी भी मुद्दे को दोहरा नहीं सकता था, जहां एक ताला को सम्मानित नहीं किया जा रहा था! क्या देता है??

जवाबों:


3

लेन्नर्ट पोइटरिंग ने हाल ही में लिनक्स फाइलसिस्टम लॉकिंग व्यवहार में कुछ खुदाई की है, जो एनएफएस पर लॉकिंग के लिए विशेष रूप से गुलाबी तस्वीर नहीं चित्रित करता है (विशेष रूप से अनुवर्ती वह पोस्ट के नीचे लिंक करता है)।

http://0pointer.de/blog/projects/locking.html


1
यह ठीक उसी प्रकार की जानकारी है जिसकी मुझे तलाश थी। धन्यवाद! कई हफ्तों की जांच के बाद, यह एक ऐसा ही संकल्प है जो मुझे आया था, लेकिन यह एक लेख पढ़ने के लिए बहुत अच्छा है जो मेरे संदेह की पुष्टि करता है (और दूसरों को सुझाव देता है)। : उस पृष्ठ की टिप्पणी से लिंक भी एक अच्छा संदर्भ है, और POSIX और उसके इतिहास के बारे में एक अच्छा लेख) था samba.org/samba/news/articles/low_point/tale_two_stds_os2.html
Jmoney38

15

मुझे पूरा यकीन है कि आप विरासत की चिंताओं को देख रहे हैं। स्मरण करो कि Perl5 मैनुअल को 1994 में जारी किया गया था और यह 1991 से Perl4 के मैनुअल का केवल एक संपादन था। उन दिनों में शायद नामांकित दुःस्वप्न फाइल सिस्टम के बारे में कहा जा सकता है कि "यह नहीं है कि भालू कितनी अच्छी तरह से है amazes, लेकिन है कि यह सब पर नृत्य "।

1991 के युग में NFS2 धीरे-धीरे सूर्य से अन्य प्लेटफार्मों में रेंग रहा था और अपेक्षाकृत क्रूड था। सुरक्षा मॉडल अनिवार्य रूप से गैर-मौजूद था (एक क्लाइंट मशीन पर रूट एक एनएफएस माउंट की पूरी सामग्री पढ़ सकता है) और लॉकिंग - nfs.lockd के माध्यम से - यह प्रायोगिक का पक्ष था। यदि आप दो अलग-अलग कथित तौर पर अंतर्संबंधीय कार्यान्वयनों के बीच ठीक से काम करने के लिए झुंड शब्दार्थों की अपेक्षा करना मूर्खतापूर्ण होगा। उस समय Coax प्रमुख ईथरनेट PHY था जिस पर कई नेटवर्क उपयोगकर्ताओं को कभी भी उपयोग करने की नाराजगी नहीं थी (इसका मतलब क्या है कि आप 50𝛀 समाप्ति रोकनेवाला डाल देना भूल गए?) यदि आप इंट्रानेट की स्थिति पर बेहतर पकड़ रखते हैं तो।

लैरी वाल और क्रू के पास उस समय NFS ताले की शुद्धता के बारे में निराशावादी धारणाएं बनाने का हर कारण था, और यह रक्षात्मक प्रोग्रामिंग की तरह है जिसे भविष्य के कोड जॉकी को हटाने के लिए घृणा होती है क्योंकि यह एक दोष की अनुपस्थिति को साबित करने के लिए बहुत कठिन है। पुराने कोड को हटाना जो एक विरासत प्रणाली के साथ इंटरऑपरेबिलिटी में फिर से पेश किया गया है जिसे आपने कभी भी नहीं सुना है।

तब से, एनएफएस में काफी सुधार हुआ है, और लिनक्स 2.6 कर्नेल की एक सुविधा के लिए लॉकड ने समय के साथ माइग्रेट किया है। 2003+ सिस्टम के संग्रह के लिए, एनएफएस फ़ाइल लॉकिंग पर शायद भरोसा किया जा सकता है, खासकर अगर यह आपके द्वारा कई प्लेटफार्मों पर चल रहे एप्लिकेशन के भीतर अच्छी तरह से परीक्षण किया जाए।

उपरोक्त सभी मेमोरी से क्राइब किया गया था, और संभवतः शोध के माध्यम से इसकी पुष्टि की जा सकती है (उदाहरण http://nfs.sourceforge.net/ ) लेकिन प्रमाण - जैसा कि वे कहते हैं - लॉकिंग में है, और यदि आपने इसका परीक्षण नहीं किया है , यह टूटा हुआ माना जाता है।


यह एक महान विश्लेषण है। वास्तव में, मैं अब तक उसी निष्कर्ष पर आया हूं। आपके द्वारा उस लिंक को पोस्ट करने के बाद मैं nfs सोर्सफोर्ज पेज पर फिर से पढ़ता हूं, और आखिरकार मुझे वह मिल गया है जिसकी मुझे तलाश है! यहाँ घोड़े के मुंह से सीधे गहराई से विश्लेषण किया गया है!
Jmoney38

2
ओह, मैं एंट्री मारता हूं ... nfs.sourceforge.net पर जाएं , नीचे की ओर अनुभाग D10 इस मुद्दे पर विस्तार से चर्चा करता है।
Jmoney38

3

लिनक्स-एनएफएस एफएक्यू से एक और, सीधे: nfs.sf.net

मैं कई क्लाइंट्स पर उपयोग की गई फ़ाइलों को लॉक करने के लिए झुंड () / BSD ताले का उपयोग करने की कोशिश कर रहा हूं, लेकिन फाइलें दूषित हो जाती हैं। कैसे? ए। झुंड () / बीएसडी ताले 2.6.12 से पहले केवल लिनक्स एनएफएस ग्राहकों पर स्थानीय रूप से कार्य करते हैं। यह सुनिश्चित करने के लिए fcntl () / POSIX लॉक का उपयोग करें कि फ़ाइल लॉक अन्य क्लाइंट को दिखाई दे।

एनएफएस फ़ाइल तक पहुंच को अनुक्रमित करने के कुछ तरीके यहां दिए गए हैं।

Fcntl () / POSIX लॉकिंग API का उपयोग करें। इस प्रकार का लॉकिंग एनएलएम प्रोटोकॉल के माध्यम से या एनएफएसवी 4 के माध्यम से कई क्लाइंट्स पर बाइट-रेंज लॉकिंग प्रदान करता है। एक अलग लॉकफ़ाइल का उपयोग करें, और इसके लिए हार्ड लिंक बनाएं। प्राणी के O_EXCL अनुभाग (2) मैन पेज में विवरण देखें। यह ध्यान देने योग्य है कि 2.6 kernels तक, O_EXCL बनाता है लिनक्स एनएफएस ग्राहकों पर परमाणु नहीं थे। जब तक आप एक कर्नेल को 2.6.5 से नया नहीं चला रहे हैं, तब तक कई NFS क्लाइंट के बीच O_EXCL क्रिएट और परमाणु व्यवहार की अपेक्षा न करें।

यह एक ज्ञात समस्या है कि पर्ल डिफ़ॉल्ट रूप से झुंड () / बीएसडी लॉकिंग का उपयोग करता है। यह अन्य ऑपरेटिंग सिस्टम जैसे सोलारिस से पोर्ट किए गए प्रोग्राम को तोड़ सकता है, जो उम्मीद करता है कि पीओएस लॉक की तरह काम करने के लिए झुंड / बीएसडी लॉक।

लिनक्स पर, हार्ड लिंक के बजाय फाइल लॉकिंग का उपयोग करने से सर्वर के साथ क्लाइंट के कैश को चेकपॉइंट करने का अतिरिक्त लाभ होता है। जब एक फ़ाइल लॉक का अधिग्रहण किया जाता है, तो क्लाइंट उस फ़ाइल के लिए पेज कैश को फ्लश करेगा ताकि किसी भी बाद में पढ़ने वाले को सर्वर से नया डेटा मिल सके। जब कोई फ़ाइल लॉक रिलीज़ किया जाता है, तो उस क्लाइंट पर फ़ाइल में कोई भी परिवर्तन लॉक जारी होने से पहले सर्वर पर वापस भेज दिया जाता है, ताकि उस फ़ाइल को लॉक करने के लिए इंतजार कर रहे अन्य ग्राहक परिवर्तनों को देख सकें।

2.6.12 में NFS क्लाइंट, POSIX बाइट रेंज लॉक के संदर्भ में BSD- शैली के ताले का अनुकरण करके NFS फाइलों पर झुंड () / BSD ताले के लिए समर्थन प्रदान करता है। अन्य NFS क्लाइंट जो समान इम्यूलेशन मेकेनिज्म का उपयोग करते हैं, या जो fcntl () / POSIX लॉक का उपयोग करते हैं, फिर वही लॉक देखेंगे जो लिनक्स NFS क्लाइंट देखता है।

स्थानीय लिनक्स फाइल सिस्टम पर, POSIX ताले और BSD ताले एक दूसरे के लिए अदृश्य हैं। इस प्रकार, इस अनुकरण के कारण, लिनक्स एनएफएस सर्वर पर चलने वाले एप्लिकेशन अभी भी एनएफएस क्लाइंट द्वारा लॉक की गई फ़ाइलों को एक fcntl () / POSIX लॉक के साथ लॉक होने के रूप में देखेंगे, चाहे क्लाइंट पर एप्लिकेशन बीएसडी-शैली का उपयोग कर रहा हो या पॉसिक्स- शैली का ताला। यदि सर्वर एप्लिकेशन झुंड () बीएसडी ताले का उपयोग करता है, तो यह एनएफएस क्लाइंट के उपयोग के ताले को नहीं देखेगा।


तो दो NFS क्लाइंट कर्नेल 3.13 चला रहे हैं। * एक दूसरे के झुंड () देखें?
रिस्टोरियरपोस्ट

अगर मैं सही ढंग से समझ रहा हूं, तो जवाब नहीं है। जब तक मैं कुछ याद flockनहीं किया, नहीं किया है, नहीं करता है, और nfs mounts पर लॉक नहीं करेगा।
डैनियल फैरेल

यह कम से कम NFS4 पर करता है।
rjh

3

यह अभी पुराना है। NFS4 प्रोटोकॉल के अंदर लॉकिंग का समर्थन करता है (कोई लॉकड डेमॉन या आरपीसी कॉलबैक तंत्र की आवश्यकता नहीं है) और पर्ल का flock()तरीका ठीक काम करता है - हम इसे उत्पादन में उपयोग कर रहे हैं।

लागू किए गए कर्नेल flock(syscall) के बहुत पुराने संस्करणों को NFS में नो-ऑप के रूप में, और बाइट रेंज लॉकिंग जैसे अन्य सामान का ठीक से समर्थन नहीं किया गया था। यह वह जगह है जहां से उन्माद होता है।


संकेत के लिए बहुत बहुत धन्यवाद। NFS4 के साथ बढ़ते हुए मेरी समस्या हल हो गई। Fst कॉन्फ़िगरेशन सही पाने के लिए, access.redhat.com/documentation/en-us/red_hat_enterprise_linux/… का अनुसरण किया ।
maraspin
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.