2010-11-20 8 views
48

के साथ इनोटिफाइफा मैंने हाल ही में एक विशेष निर्देशिका में बनाई गई फ़ाइलों के लिए इनोटिफ़ाई का उपयोग करके एक ड्रॉपबॉक्स सिस्टम बनाया है। जिस निर्देशिका को मैं देख रहा हूं उसे एनएफएस सर्वर से आरोहित किया गया है, और इनोटिफ़ाई अपेक्षा से अलग व्यवहार कर रहा है। निम्न परिदृश्य पर विचार करें जिसमें मशीन ए पर एक inotify स्क्रिप्ट चलती है, देख/कुछ/nfs/dir/भी/दृश्य/टू/बी।एनएफएस

-मशीन मशीन का उपयोग करना/कुछ/nfs/dir///view/to/b में फ़ाइल बनाने के लिए, स्क्रिप्ट अपेक्षित व्यवहार करता है। एक ही कार्रवाई करने के लिए मशीन बी का उपयोग करके, स्क्रिप्ट को निर्देशिका में गिराए गए एक नई फ़ाइल के बारे में अधिसूचित नहीं किया जाता है।
-मुझे स्क्रिप्ट एनएफएस सर्वर पर चलाया जाता है, यह अधिसूचित हो जाता है जब फ़ाइलें दोनों मशीन एक और मशीन बी

इस पैकेज में बग में एक बग मैं inotofy तक पहुँचने के लिए उपयोग कर रहा हूँ है से बनाई गई हैं, या यह अपेक्षित व्यवहार है?

सादर,

एंड्रयू

+2

तो आप कह रहे हैं कि केवल उस सिस्टम पर स्क्रिप्ट है जो फाइल सिस्टम या कंप्यूटर के परिवर्तन को अधिसूचित करता है? यही वह व्यवहार है जिसे मैं उम्मीद करूंगा। – Gabe

+1

मैंने एक फीचर अनुरोध की सूचना दी [यहां] (https://bugzilla.kernel.org/show_bug.cgi?id=53161)। – HRJ

उत्तर

51

inotify गिरी काम करने से समर्थन की आवश्यकता है। जब कोई एप्लिकेशन किसी निर्देशिका को ट्रैक करता है, तो यह कर्नेल को यह सूचित करने के लिए कहता है कि ये परिवर्तन कब होते हैं। जब परिवर्तन होता है, डिस्क में उन परिवर्तनों को लिखने के अलावा, कर्नेल भी देखने की प्रक्रिया को सूचित करता है।

रिमोट एनएफएस मशीन पर, परिवर्तन कर्नेल को दिखाई नहीं देता है; यह पूरी तरह से दूरस्थ रूप से होता है। एनएफएस इनोटिफाइटी की भविष्यवाणी करता है और इसके लिए एनएफएस, या समकक्ष कुछ भी नेटवर्क स्तर का समर्थन नहीं है।

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

संपादित करें: यह मेरे लिए अजीब है कि NFS inotify के लिए समर्थन की कमी के लिए दोषी ठहराया जाना चाहिए लगता है।

Inotify (inode सूचित) एक है:

नेटवर्क फ़ाइल सिस्टम (NFS) मूल रूप से 1984 में सन माइक्रोसिस्टम्स द्वारा विकसित एक वितरित फ़ाइल प्रणाली प्रोटोकॉल, wikipedia article

हालांकि है लिनक्स कर्नेल सबसिस्टम जो फाइल सिस्टम में परिवर्तनों को नोटिस करने के लिए फाइल सिस्टम का विस्तार करने के लिए कार्य करता है। [...] इसे रिलीज 2.6.13 (जून 18,) से मेनलाइन लिनक्स कर्नेल में शामिल किया गया है [...]। wikipedia article

यह एक पोर्टेबल नेटवर्क प्रोटोकॉल/आवेदन एक अलग ऑपरेटिंग सिस्टम के लिए विकसित किया गया एक विशिष्ट कर्नेल सुविधा का समर्थन करने की उम्मीद करना मुश्किल है और उस बीस से अधिक वर्षों बाद में दिखाई दिया। भले ही में इसके लिए एक्सटेंशन शामिल हों, वे अन्य ऑपरेटिंग सिस्टम पर उपलब्ध या उपयोगी नहीं होंगे।

* सभी मामलों में जोर मेरा


इस साथ एक और समस्या; आइए मान लीजिए कि हम नेटवर्क का उपयोग नहीं कर रहे हैं, बल्कि स्थानीय इनपुट सिस्टम को अच्छे इनोटिफी समर्थन के साथ नहीं कर रहे हैं: ext3 (मान लीजिए कि यह /mnt/foo पर आरोहित है)। लेकिन वास्तविक डिस्क के बजाय, फाइल सिस्टम को लूपबैक डिवाइस से आरोहित किया जाता है; और अंतर्निहित फ़ाइल बदले में vfs में एक अलग स्थान पर पहुंच योग्य है (कहें, /var/images/foo.img)।

अब, आप आरोहित ext3 फाइल सिस्टम को संशोधित नहीं करना चाहते हैं, लेकिन यह अभी भी उचित रूप से सुरक्षित है यदि परिवर्तन मेटाडेटा के बजाय सामग्री को फ़ाइल करना है।

तो, एक चतुर उपयोगकर्ता एक हेक्स संपादक में फाइल सिस्टम छवि (/var/images/foo.img) को संशोधित करता है लगता है, कुछ अन्य डेटा के साथ एक फ़ाइल की सामग्री की जगह है, जबकि एक ही समय में एक inotify घड़ी घुड़सवार फाइल सिस्टम पर एक ही फाइल को देख रहा है।

इस तरह के परिवर्तन की देखने की प्रक्रिया को हमेशा सूचित करने के लिए कोई भी उचित तरीका नहीं है। यद्यपि शायद कुछ gyrations हैं जो ext3 नोटिस बनाने और परिवर्तन का सम्मान करने के लिए ले जा सकते हैं, इनमें से कोई भी, xfs drtiver कहने के लिए लागू नहीं होगा, जो अन्यथा काफी समान है।

और इसे भी नहीं करना चाहिए। तुम धोखा दे रहे हो!। inotify केवल वास्तविक माउंटपॉइंट पर देखे गए vfs के माध्यम से होने वाले परिवर्तनों के बारे में सूचित कर सकता है। यदि अंतर्निहित डेटा में परिवर्तन की वजह से वीएफएस के बाहर होने वाले परिवर्तन, इनोटिफ़ाई आपकी मदद नहीं कर सकता है और उस समस्या को हल करने के लिए डिज़ाइन नहीं किया गया है।

क्या आपने नेटवर्क अधिसूचना के लिए संदेश कतार का उपयोग करने पर विचार किया है?

+11

यह सिर्फ एक बग लगता है। हां परिवर्तन कहीं और किया गया है, लेकिन तथ्य यह है कि एनएफएस क्लाइंट अंततः नई जुड़ी फाइलों को खोजते हैं। यहां तक ​​कि अगर कार्यक्रम स्थगित कर दिया गया था, तो एनएफएस क्लाइंट के लिए श्रोताओं को सूचित करने के लिए यह संभव होना चाहिए जब यह नए जोड़े गए/हटाए गए संसाधनों को खोजता है। –

+3

@ जेम्स ब्लैकबर्न: यह प्रदर्शन कारणों से संभव है। अनुरोध पर एनएफएस क्लाइंट शायद आलसी परिवर्तनों को ही खोजते हैं। –

+4

बेशक, एनएफएस को इनोटिफ़ाई का समर्थन न करने के लिए दोषी नहीं ठहराया जा सकता है। लेकिन, आप उदाहरण पूरी तरह से त्रुटिपूर्ण है। एक एनएफएस कार्यान्वयन कुछ अंतर्निहित समर्थन का समर्थन कर सकता है और यह सामान (एनएफएस आंतरिक प्रोटोकॉल) सामान को मूर्त रूप देने के लिए मैप कर सकता है। ऐसा नहीं होता। तो यह – Frunsi

5

मुझे फ़ाइल संशोधन की निगरानी के लिए पर्यवेक्षक डिमन का उपयोग करके एक एसजीआई FAM मिला। यह एनएफएस का समर्थन करता है और आप wiki

+1

ऐसा लगता है कि काम करने के लिए एफएएम को दूरस्थ एफएस पर चलने वाले एक एफएएम सर्वर की आवश्यकता है। यह देखते हुए कि एफएएम इनोटिफी से भी बड़ा है, मुझे आश्चर्य है कि बाद में रिमोट एफएस का समर्थन क्यों नहीं करता है। – Wernight

0

पर कुछ विवरण देख सकते हैं। मैं सिंगलनेजेशन एलिमिनेशन स्पष्टीकरण से सहमत हूं, और यह जोड़ना चाहता हूं कि आईएससीएसआई लक्ष्य काम करेंगे, क्योंकि वे कर्नेल को सतर्क करते हैं।

तो "असली" फ़ाइल सिस्टम (सिस्टम के सापेक्ष, जो) पर चीजें सतर्क करने के लिए इनोटिफ़ी को ट्रिगर कर देगी। रुनकिंग की तरह, घुड़सवार विभाजन में कुछ नेट-कैटिंग।

यदि आपको इनोटिफ़ाई (या इनोटिफ़ाई का उपयोग करना है) के माध्यम से अधिसूचनाएं प्राप्त करनी होंगी तो आप फ़ाइल सिस्टम पर rsync -avz पर क्रॉन कर सकते हैं। पाठ्यक्रम की कमी यह है कि आप असली सिस्टम एचडीडी स्पेस का उपयोग कर रहे हैं।

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