यही वजह है कि '।' यूनिक्स में एक कड़ी है?


51

मैंने कई स्पष्टीकरण देखे हैं कि यूनिक्स आधारित OSes में खाली निर्देशिका के लिए लिंक 1 के बजाय 2 क्यों है। वे सभी कहते हैं कि यह 'के कारण है।' निर्देशिका, जिसे हर निर्देशिका ने खुद को इंगित किया है। मैं समझता हूं कि 'की कुछ अवधारणा क्यों है।' रिश्तेदार रास्तों को निर्दिष्ट करने के लिए उपयोगी है, लेकिन फाइल सिस्टम स्तर पर इसे लागू करने से क्या हासिल होता है? सिर्फ गोले क्यों नहीं हैं या सिस्टम कॉल जो पथ लेते हैं वे जानते हैं कि इसकी व्याख्या कैसे करें?

यह '..' एक वास्तविक लिंक है जो मेरे लिए बहुत मायने रखता है - फाइलसिस्टम को एक अभिभावक की निर्देशिका में वापस भेजने के लिए एक पॉइंटर को स्टोर करना होगा। लेकिन मैं यह नहीं देखता कि 'क्यों।' एक वास्तविक लिंक होना आवश्यक है। यह भी ऐसा लगता है कि यह कार्यान्वयन में एक बदसूरत विशेष मामले की ओर जाता है - आपको लगता है कि आप केवल उन इनोडेस द्वारा उपयोग किए गए स्थान को मुक्त कर सकते हैं जिनकी लिंक 1 से कम है, लेकिन यदि वे निर्देशिकाएं हैं, तो आपको वास्तव में जांचने की आवश्यकता है एक लिंक कम से कम 2. क्यों विसंगति?


1
एक बार जब आप ..हार्डलिंक करते हैं तो आपके ट्री वॉकिंग सॉफ़्टवेयर को पहले से ही "मूल निर्देशिका लिंक पर निम्न चक्रों का पालन न करना" अपवादों की आवश्यकता होती है, इसलिए .लिंक को छोड़कर यह बहुत ही जटिल जटिलता है ।
dmckee

जवाबों:


37

एक दिलचस्प सवाल, वास्तव में। पहली नज़र में मुझे निम्नलिखित फायदे दिखाई देते हैं:

सबसे पहले आप यह कहते हैं कि .मौजूदा निर्देशिका के रूप में " " की व्याख्या शेल या सिस्टम कॉल द्वारा की जा सकती है। लेकिन निर्देशिका में डॉट-एंट्री होने से वास्तव में यह आवश्यकता दूर हो जाती है और निचले स्तर पर भी स्थिरता आ जाती है।

लेकिन मुझे नहीं लगता कि इस डिजाइन निर्णय के पीछे मूल विचार था।

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

यदि डॉट प्रविष्टि नहीं होगी, तो रूटीनों को मूल निर्देशिका में इस निर्देशिका के लिए प्रविष्टि पर इनकोड संख्या की खोज करनी होगी, जिससे फिर से निर्देशिका खोज होगी।

लेकिन सौभाग्य से वर्तमान निर्देशिका में डॉट प्रविष्टि है। वर्तमान निर्देशिका में एक फ़ाइल को जोड़ने या हटाने वाली दिनचर्या को केवल पहली प्रविष्टि (जहां डॉट-प्रविष्टि आमतौर पर रहती है) पर वापस कूदना पड़ता है और वर्तमान निर्देशिका के लिए तुरंत इनकोड संख्या मिली है।

डॉट प्रविष्टि के बारे में एक तीसरी अच्छी बात है:

जब fsckएक सड़े हुए फाइलसिस्टम की जाँच की जाती है और गैर-जुड़े ब्लॉकों से निपटना पड़ता है जो कि मुफ्त सूची में नहीं हैं, तो यह सत्यापित करना आसान है कि क्या डेटा ब्लॉक (जब निर्देशिका सूची के रूप में व्याख्या की गई है) में एक डॉट प्रविष्टि है जो एक एनोड की ओर इशारा कर रही है जो बदले में इस डेटा ब्लॉक को वापस इंगित करता है। यदि ऐसा है, तो इस डेटा ब्लॉक को एक खोई हुई निर्देशिका के रूप में माना जा सकता है जिसे फिर से जोड़ना होगा।


बहुत उपयोगी जवाब।
नवनीत केएन

6
निर्देशिका इनोड के लिए खोज करने वाली दिनचर्या के बारे में टिप्पणी फर्जी है। कर्नेल दिनचर्या को .वर्तमान निर्देशिका में देखने की कोई आवश्यकता नहीं है । जब तक आप एक कर्नेल नहीं पा सकते हैं, जहां यह वास्तव में इस तरह से काम करता है (मुझे संदेह है ...)
डिट्रिच एप्प

1
मैं @DietrichEpp से सहमत हूं; पहली बार निर्देशिका प्रविष्टियों को देखने के लिए सिस्टम के लिए , यह पहले से ही इनोड के बारे में पता होना चाहिए - क्योंकि यह कैसे निर्देशिका प्रविष्टियों वाले डेटा ब्लॉकों में जाता है।
लैक्वेर्विग

10

(हम्म: निम्नलिखित अब एक महाकाव्य का एक सा है ...)

यूनिक्स फाइलसिस्टम पर निर्देशिका का डिज़ाइन (जो, पांडित्यपूर्ण होने के लिए, आमतौर पर यूनिक्स ओएस से जुड़ा नहीं होता है) एक अद्भुत अंतर्दृष्टि का प्रतिनिधित्व करता है, जो वास्तव में आवश्यक विशेष मामलों की संख्या को कम करता है।

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

केवल विशेष inode आइनोड संख्या 2 (नहीं 0 या 1, परंपरा के कारणों के लिए) है; इनकोड 2 एक निर्देशिका फ़ाइल है: रूट निर्देशिका । जब सिस्टम फाइलसिस्टम को मापता है, तो यह 'पता है' कि यह खुद को आरंभ करने के लिए इनकोड 2 इनकोड है।

एक निर्देशिका फ़ाइल सिर्फ एक फाइल है, जिसमें आंतरिक संरचना होती है जिसे ओपेंडिर (3) और दोस्तों द्वारा पढ़ा जाना चाहिए। आप dir (5) (अपने OS के आधार पर) में प्रलेखित इसकी आंतरिक संरचना देख सकते हैं; यदि आप उस पर गौर करते हैं, तो आप देखेंगे कि निर्देशिका फ़ाइल प्रविष्टि में फ़ाइल के बारे में लगभग कोई जानकारी नहीं है - यह फ़ाइल इनोड में है। इस फ़ाइल के बारे में कुछ चीजों में से एक यह है कि यदि आप एक मोड के साथ एक निर्देशिका फ़ाइल को खोलने की कोशिश करते हैं जो लेखन की अनुमति देता है तो खुले (2) फ़ंक्शन को एक त्रुटि दी जाएगी। विभिन्न अन्य कमांड (सिर्फ एक उदाहरण लेने के लिए hexdump) , निर्देशिका फ़ाइलों के साथ सामान्य तरीके से कार्य करने से इंकार कर देंगे, सिर्फ इसलिए कि आप शायद ऐसा नहीं करना चाहते (लेकिन यह उनका विशेष मामला है, फाइलसिस्टम का नहीं)।

एक हार्ड लिंक एक निर्देशिका फ़ाइल के नक्शे में एक प्रविष्टि से अधिक और न ही कम है। आपके पास ऐसे नक्शे में दो (या अधिक) प्रविष्टियाँ हो सकती हैं जो दोनों एक ही इनोड संख्या में मैप करती हैं: इसलिए इनोड में दो (या अधिक) हार्ड लिंक हैं। यह भी बताता है कि क्यों हर फ़ाइल में कम से कम एक 'हार्ड लिंक' होता है। इनकोड में एक संदर्भ गणना होती है, जो यह बताती है कि फाइल सिस्टम में कहीं-कहीं निर्देशिका फ़ाइल में इनकोड का उल्लेख किया गया है (यह वह संख्या है जिसे आप करते समय देखते हैं ls -l)।

ठीक है: हम अब बात कर रहे हैं।

डायरेक्टरी फाइल स्ट्रिंग्स ('फाइलनाम') से लेकर नंबर्स (इनोड नंबर) तक का मैप है। वे इनोड संख्या उन फाइलों के इनोड की संख्या है जो उस निर्देशिका में 'इन' हैं। वे फाइलें जो उस निर्देशिका में 'इन' हैं, उनमें अन्य निर्देशिका फाइलें शामिल हो सकती हैं, इसलिए उनकी इनोड संख्या निर्देशिका में सूचीबद्ध लोगों के बीच होगी। इस प्रकार, यदि आपके पास कोई फ़ाइल है /tmp/foo/bar, तो निर्देशिका फ़ाइल fooमें एक प्रविष्टि शामिल है bar, जो उस स्ट्रिंग को उस फ़ाइल के लिए इनोड में मैप कर रही है। निर्देशिका फ़ाइल के लिए निर्देशिका फ़ाइल में एक प्रविष्टि भी है /tmp, fooजो निर्देशिका में 'इन' है /tmp

जब आप mkdir (2) के साथ एक निर्देशिका बनाते हैं, तो वह कार्य करता है

  1. सही आंतरिक संरचना के साथ एक निर्देशिका फ़ाइल (कुछ इनोड संख्या के साथ) बनाता है,
  2. मूल निर्देशिका में एक प्रविष्टि जोड़ता है, नई निर्देशिका का नाम इस नए इनोड में मैप करता है (जो किसी एक लिंक के लिए खाता है),
  3. नई निर्देशिका में एक प्रविष्टि जोड़ता है, स्ट्रिंग मैपिंग '।' समान इनोड (यह अन्य लिंक के लिए खाता है), और
  4. नई निर्देशिका में एक और प्रविष्टि जोड़ता है, स्ट्रिंग को मैप करते हुए .. '' डायरेक्टरी फाइल के इनोड में इसे चरण (2) में संशोधित किया जाता है (यह उन बड़ी लिंक की बड़ी संख्या के लिए है जो आप निर्देशिका फ़ाइलों पर देखेंगे जो उपनिर्देशिकाएँ हैं। )।

अंतिम परिणाम यह है कि (लगभग) केवल विशेष मामले हैं:

  • खुला (2) फ़ंक्शन आपको लिखने के लिए निर्देशिका फ़ाइलों को खोलने से रोककर, अपने आप को पैर में गोली मारने के लिए कठिन बनाने की कोशिश करता है।
  • Mkdir (2) फ़ंक्शन नई निर्देशिका फ़ाइल में कुछ अतिरिक्त प्रविष्टियों (''। 'और' .. ') को जोड़कर चीजों को अच्छा और आसान बनाता है, विशुद्ध रूप से इसे फाइलसिस्टम के चारों ओर स्थानांतरित करने के लिए सुविधाजनक बनाता है। मुझे संदेह है कि फाइलसिस्टम बिना पूरी तरह से काम करेगा '।' और '..', लेकिन उपयोग करने के लिए एक दर्द होगा।
  • निर्देशिका फ़ाइल कुछ प्रकार की फ़ाइलों में से एक है, जिन्हें 'विशेष' के रूप में चिह्नित किया जाता है - यह वास्तव में है जो खुली (2) जैसी चीजों को थोड़ा अलग तरीके से व्यवहार करने के लिए कहती है। st_modeस्टेट में देखें (2)।

(स्टैकओवरफ्लो मूल प्रश्न, 2011-10-20 से कॉपी किया गया)


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

1
नहीं, मैं ब्लॉकों को इनोड्स के साथ भ्रमित नहीं कर रहा हूं। इनोड्स एक अमूर्त खंडों के ऊपर बैठे होते हैं, और इस पोस्टिंग का बिंदु फाइलों और निर्देशिकाओं के बीच संबंध और उनकी सामग्री का वर्णन करना था: सभी फाइल सिस्टम संरचना निर्देशिका फ़ाइलों से आती है। यह लंबे समय से पर्याप्त पहले से ही इनोड कार्यान्वयन में फंस गया था! (उस ने कहा, मैं संभवतः पहले दो पैराग्राफ को और अधिक स्पष्ट रूप से लिख सकता हूं)। इसके अलावा, जैसा कि आप देखते हैं, मैं स्पष्ट रूप से बताता हूं कि फ़ाइल के बारे में सभी जानकारी (इसके नाम को छोड़कर) इनोड में है, और निर्देशिका फ़ाइल में नहीं।
नॉर्मन ग्रे

@ नोर्मनग्रे: यहां तक ​​कि जब आप अपना बचाव करते हैं, तो आप खुद को पैर में गोली मार लेते हैं। आपने कहा, "फाइलसिस्टम की सभी वास्तविक सामग्री इनोडेस में है ...." यह गलत है।  किसी फ़ाइल के गुण / गुण (जैसे, स्वामी, अनुमतियाँ, संशोधन समय, आदि) इनोड में संचित होते हैं। एक साधारण फ़ाइल की सामग्री को डेटा ब्लॉक में संग्रहीत किया जाता है। यदि आप इनोड कार्यान्वयन में फंसना नहीं चाहते हैं, तो न करें, लेकिन कृपया या तो भ्रामक ओवरसिलेशन न करें।
जी-मैन ने कहा कि 'मोनिका'
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.