क्या स्लैश (/) लिनक्स रूट निर्देशिका के नाम का हिस्सा है?


46

क्या स्लैश ( /) वास्तव में लिनक्स रूट निर्देशिका के नाम का हिस्सा है? या यह इसके लिए सिर्फ एक प्रतीक है?

के बारे में /etcऔर इतने पर क्या?

अपडेट करें

मान लीजिए कि /dev/sda2लिनक्स रूट डायरेक्टरी का ब्लॉक डिवाइस है।

$ सूडो डिबगफ़्स / देव / sda2
डिबगफ़ 1.44.1 (24-मार्च-2018)
debugfs:   pwd
[pwd] INODE: 2 पथ:
[रूट] INODE: 2 पेट: /
डिबगफ़ेट्स:   स्टेट /
इनोड: 2    प्रकार: निर्देशिका     मोड: 0755 झंडे: 0x80000
पीढ़ी: 0 संस्करण: 0x00000000: 00000077
उपयोगकर्ता: 0 समूह: 0 परियोजना: 0 आकार: 4096
फ़ाइल ACL: 0
लिंक्स: 25 ब्लॉककाउंट: 8
टुकड़ा: पता: 0 नंबर: 0 आकार: 0
 ctime: 0x5b13c9f1: 3f017990 - सूर्य जून 3 15:28:57 2018
 atime: 0x5b13ca0f: 3b3ee380 - सूर्य जून 3 15:29:27 2018
 mtime: 0x5b13c9f1: 3f017990 - सूर्य जून 3 15:28:57 2018
crtime: 0x5aad1843: 00000000 - Sat Mar 17 16:59:39 2018
अतिरिक्त इनोड फ़ील्ड का आकार: 32
विस्तार:
(0): 9249

तो वहाँ एक निर्देशिका है, इनोड # 2, लेकिन यह एक नाम नहीं है।


1
अपने हाल के अद्यतन के बारे में कुछ debugfsआउटपुट दिखा रहा है । क्या आप स्पष्ट कर सकते हैं कि यह सवाल कैसे बदलता है?
Kusalananda

यह नहीं किया। मैं बस जवाब पूरा करना चाहता था। लेकिन मैं एक और जोड़ना चाहता था। इसलिए मैंने इसे अपडेट किया। अगर आप अपने उत्तर में thease line डाल सकते हैं तो उन्हें हटा देंगे
mlibre

जवाबों:


61

POSIX.1-2008 मानक कहता है

एक पथनाम एक एकल से मिलकर /प्रक्रिया की मूल निर्देशिका को हल करेगा। एक अशक्त मार्गनाम सफलतापूर्वक हल नहीं किया जाएगा।

मानक आगे filenames और pathnames के बीच एक अंतर बनाता है । /रूट निर्देशिका के पथ के लिए पथनाम है। डायरेक्टरी का नाम "रूट डाइरेक्टरी" है, लेकिन फाइलसिस्टम में यह नामहीन है, इसका कोई फ़ाइल नाम नहीं है। यदि इसका कोई फ़ाइल नाम है, तो वह नाम रूट डायरेक्टरी के ऊपर डायरेक्टरी में एक डायरेक्टरी एंट्री होगी, और ऐसी कोई डायरेक्टरी नहीं है।

चरित्र /कभी भी फ़ाइल नाम का हिस्सा नहीं हो सकता क्योंकि यह पथ विभाजक है।

स्पष्टता के लिए: रूट डायरेक्टरी का नाम/ नहीं है , लेकिन इसका पथ , इसका पथनाम है

/etcएक और पथनाम है। यह etcनिर्देशिका के लिए निरपेक्ष पथ का नाम है । उस पथ पर निर्देशिका का नाम है etc(इसका फ़ाइल नाम है etc)।

/usr/local/bin/curlcurlनिष्पादन योग्य फ़ाइल का पथनाम उसी तरह है /etcजो etcनिर्देशिका का पथनाम है ।


"यदि इसका फ़ाइल नाम था, तो वह नाम रूट डायरेक्टरी के ऊपर की डायरेक्टरी में एक डायरेक्टरी एंट्री होगी" यह दो चीजें होंगी, तकनीकी रूप से - इनोड नंबर और नाम (जिसे हम जानते हैं कि इनोड 2 है)। यह भी ध्यान रखना दिलचस्प है कि /..वापस इंगित करता है /, और /खुद के लिए निर्देशिका प्रविष्टि है - यह अच्छा पुराना है /.; वे सभी 3 चीजें एक ही इनोड की ओर इशारा कर रही हैं - 2.
सर्गी कोलोडाज़हनी

@SergiyKolodyazhnyy तकनीकी रूप से , रूट डायरेक्टरी "प्रति-प्रक्रिया" है, जो चिरोट वातावरण में मायने रखती है। एक कैरोट में, रूट डायरेक्टरी की इनोड संख्या एक विशेष संख्या नहीं होगी (यह चेरोट रूट का इनोड नंबर होगा)। इसके अलावा, मुझे लगता है कि नंबर 2 (गैर-विकृत स्थितियों में) का उपयोग की गई फाइल सिस्टम पर निर्भर है।
Kusalananda

मैंने यह भी देखा कि /प्रति-प्रक्रिया रूट के संदर्भ में परिभाषित किया गया है, लेकिन मुझे नहीं पता था कि इनोड chrootजरूरी नहीं है 2. बहुत दिलचस्प तथ्य। यह एक सवाल भी उठाता है कि /विशेषाधिकार प्राप्त कर्नेल प्रक्रियाओं के लिए निर्देशिका क्या है । क्या इसका मतलब केवल उपयोगकर्ता-अंतरिक्ष प्रक्रियाएं हैं /जिनके साथ वे संबद्ध हैं?
सर्गी कोलोडाज़हनी

37

स्लैश एक विभाजक है ; निर्देशिका नामों में विभाजक शामिल नहीं हैं, लेकिन पूर्ण पथनामों में विभाजक शामिल हैं।

तो "रूट-लेवल" / का कोई नाम नहीं है । अधिकांश यूनिक्स जैसी प्रणालियों पर, इसे एक विशेष मामले के रूप में माना जाता है .और ..(हालांकि निश्चित रूप से दोनों के बीच कोई अंतर नहीं है)।

नामकरण अलग-अलग हो सकता है। POSIX.1-2017, उदाहरण के लिए, कुछ आमतौर पर इस्तेमाल की जाने वाली परिभाषाओं को सूचीबद्ध करता है :

  • 3.2 पूर्ण पथ

    एक एकल या दो से अधिक <slash>वर्णों के साथ शुरू होने वाला एक मार्गनाम ; Pathname भी देखें ।

  • 3.271 पथनाम

    एक स्ट्रिंग जो एक फ़ाइल की पहचान करने के लिए उपयोग की जाती है। POSIX.1-2008 के संदर्भ में, एक पाथनेम {PATH_MAX} बाइट्स तक सीमित हो सकता है, जिसमें शून्य बाइट समाप्त करना भी शामिल है। इसमें वैकल्पिक शुरुआत <slash>वर्ण हैं, इसके बाद <slash>वर्णों द्वारा अलग शून्य या अधिक फ़ाइल नाम हैं । पथनाम में वैकल्पिक रूप से एक या अधिक अनुगामी <slash>अक्षर हो सकते हैं। क्रमिक रूप से एकाधिक <slash>वर्णों को एक जैसा माना जाता है <slash>, केवल दो प्रमुख <slash>पात्रों के मामले को छोड़कर ।

    नोट: यदि किसी पथनाम में पोर्टेबल फ़ाइल नाम वर्ण सेट से वर्णों के अनुरूप केवल बाइट्स होते हैं ( पोर्टेबल फ़ाइल नाम वर्ण सेट देखें ), <slash>वर्ण, और एक एकल समाप्ति<NUL>चरित्र, pathname सभी समर्थित स्थानों में एक चरित्र स्ट्रिंग के रूप में प्रयोग करने योग्य होगा; अन्यथा, पथनाम केवल एक स्ट्रिंग हो सकता है (वर्ण स्ट्रिंग के बजाय)। इसके अतिरिक्त, चूँकि <slash>चरित्र की एकल-बाइट एन्कोडिंग को सभी स्थानों पर समान होना आवश्यक है और मल्टी-बाइट वर्ण के भीतर नहीं होने के लिए, <slash>पथनाम के भीतर वर्ण का संदर्भ अच्छी तरह से परिभाषित किया जाता है, जब पथनाम वर्ण नहीं होता है स्ट्रिंग। हालाँकि, यह गुण आवश्यक रूप से पोर्टेबल फ़ाइल नाम वर्ण सेट के भीतर शेष वर्णों के लिए नहीं है।

  • 3.272 Pathname घटक

    फाइलन में फाइलनाम देखें ।

  • 3.170 फाइलनाम

    {NAME_MAX}फ़ाइल को नाम देने के लिए 1 बाइट्स वाले बाइट्स का एक क्रम । नाम लिखने वाले बाइट्स में वर्ण <NUL>या <slash>अक्षर नहीं होंगे । एक पाथनाम के संदर्भ में, प्रत्येक फ़ाइल नाम के बाद <slash>या एक <NUL>चरित्र होगा; कहीं और, एक <NUL>चरित्र के बाद एक फ़ाइल नाम एक स्ट्रिंग बनाता है (लेकिन जरूरी नहीं कि एक चरित्र स्ट्रिंग)। फ़ाइलनाम डॉट और dot-dotइसका विशेष अर्थ है। एक फ़ाइलनाम को कभी-कभी "पाथनाम घटक" के रूप में संदर्भित किया जाता है। Pathname भी देखें ।

इसलिए ... यदि आप स्पष्टीकरण की तलाश कर रहे हैं , तो यह आपका पहला पड़ाव नहीं हो सकता है। इस यूनिक्स कॉन्सेप्ट पेज जैसे ट्यूटोरियल मददगार होते हैं, उदाहरण के लिए, "पूर्ण पथनाम" "निरपेक्ष" पथनाम "का पर्यायवाची है।


3
नाइटपिक: डॉट और डॉट-डॉट फिल्नाम हैं, न कि पैथनाम। दरअसल, POSIX मानक में जिज्ञासु सूत्रीकरण है "एक विशेष मामले के रूप में, रूट निर्देशिका में, डॉट-डॉट स्वयं रूट निर्देशिका को संदर्भित कर सकता है।" (मेरा जोर)।
Kusalananda

इसलिए, पत्र को विनिर्देश पढ़ना, /एक मान्य फ़ाइल नाम या pathname घटक नहीं है, और यह एक स्ट्रिंग नहीं है जिसमें ऐसे घटक होते हैं लेकिन यह अभी भी एक निश्चित निर्देशिका के लिए पूरी तरह से मान्य pathname है। जिसका अस्तित्व है, हालांकि जो हिस्सा मांगता है, वह इसके "नाम" का उल्लेख नहीं करता है। किसी तरह, मुझे यह थोड़ा मनोरंजक लगता है।
इलकाचू

इसका जवाब POSIX में दिया गया है : इसमें वैकल्पिक शुरुआत वर्ण हैं, इसके बाद वर्णों द्वारा अलग शून्य या अधिक फ़ाइल नाम हैं।
थॉमस डिके

@ कुसलानंद अपने जोर के लिए युक्ति तर्क की समीक्षा करें। मई कल्पना परिभाषित करता है में कार्यान्वयन परीक्षण के संबंध में प्रतिभू का एक स्पष्ट बयान है। जहां हो सकता है प्रयोग किया जाता है, कल्पना भरोसा दिलाते हैं किसी भी परिभाषित व्यवहार के पक्षपाती नवोदित। दूसरे शब्दों में, किसी भी कार्यान्वयन हो सकता है पर भरोसा करते हैं ..पर /जोड़ने /
mikeserv

19

यूनिक्स में, फाइलें (और निर्देशिकाएं सिर्फ फाइलें हैं) में "नाम" नहीं हैं। लिंक में नाम होते हैं, लिंक एक निर्देशिका में प्रविष्टियां होती हैं जो फ़ाइलों के नाम मैप करती हैं।

आप कह सकते हैं, कि लिंक फ़ाइलों को नाम देते हैं , लेकिन ध्यान दें: इसका मतलब है कि एक फ़ाइल में एक से अधिक नाम हो सकते हैं, क्योंकि इसमें एक से अधिक लिंक हो सकते हैं।

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

तो, मूल रूप से, रूट निर्देशिका का कोई नाम नहीं है, क्योंकि इसके ऊपर कोई निर्देशिका नहीं है जिसके भीतर हम नाम रिकॉर्ड कर सकते हैं।

जैसा कि अन्य उत्तरों में बताया गया था, हमें एक नाम और एक पथ (नाम) के बीच अंतर करने की आवश्यकता है। रूट निर्देशिका को पथ (नाम) के माध्यम से संदर्भित किया जा सकता है /


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

1
मुझे यह पसंद है कि इसका कोई नाम नहीं है क्योंकि उस नाम को रिकॉर्ड करने के लिए कोई उच्च निर्देशिका नहीं है। यह अवधारणा को स्पष्ट करता है।
जो

7

"नाम" शब्द का उपयोग थोड़ा लचीला है; यह "पूरी तरह से योग्य पथ नाम" का उल्लेख कर सकता है; यह "निर्देशिका प्रविष्टि" को संदर्भित कर सकता है; यह "फ़ाइल नाम" का उल्लेख विभिन्न कार्यों या दिनचर्या के लिए किया जा सकता है।

तो, उदाहरण के लिए, /etc/fooऔर /var/tmp/../../etc/fooऔर /tmp/../../../../../../fooएक ही फाइल की चर्चा करते हुए के सभी तरीके हैं; वे सभी मान्य नाम हैं , जैसा fooकि /etcनिर्देशिका में है।

तो आइए मूल बातों पर लौटते हैं।

यूनिक्स में एक फ़ाइलनाम निर्देशिका विभाजक द्वारा अलग किए गए घटकों से बना है /। घटकों पर बहुत अधिक प्रतिबंध केवल इतना है कि वे /या NUL वर्ण शामिल नहीं कर सकते हैं ; और कुछ भी अनुमति है।

तो "पूरी तरह से योग्य पथ नाम" /etcपूर्ण स्ट्रिंग है /etc:। इसका मतलब है कि यह etcरूट डायरेक्टरी में घटक है।

इसी तरह निर्देशिका में घटक /x/y/z/fooहोगा ।foo/x/y/z

अब रूट डायरेक्टरी इस मायने में अनूठी है कि इसमें पैरेंट डायरेक्टरी का कोई कंपोनेंट नहीं है; यह केवल अपने नाम के रूप में पूर्ण पथ नाम है: /

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.