क्या कोई फाइल सिस्टम है जिसके लिए `ln -d` सफल होता है?


11

के लिए मैनपेज से ln :

-d, -F, --directory
  allow the superuser to attempt to hard link directories (note: will 
  probably fail due to system restrictions, even for the superuser)

क्या कोई फाइल सिस्टम ड्राइवर है जो वास्तव में इसकी अनुमति देता है, या एकमात्र विकल्प है mount --bind <src> <dest>? या इस तरह का व्यवहार कर्नेल द्वारा अवरुद्ध किया जाता है इससे पहले कि यह फाइलसिस्टम-विशिष्ट ड्राइवर तक भी पहुंच जाए?

नोट: मैं वास्तव में किसी भी मशीन पर ऐसा करने की योजना नहीं बना रहा हूं, बस उत्सुक हूं।

जवाबों:


6

सबसे पहले एक नोट: lnआदेश जैसे विकल्प नहीं है -d, -F, --directory, यह एक गैर पोर्टेबल GNUism है।

आप जिस सुविधा की तलाश कर रहे हैं, वह link(1)कमांड द्वारा कार्यान्वित की जाती है ।

अपने मूल प्रश्न पर वापस जाएं:

एक विशिष्ट यूनिक्स प्रणाली पर निर्णय, चाहे निर्देशिकाओं पर कठिन लिंक संभव हो, फाइलसिस्टम चालक में बनाया जाता है।

Solaris UFS ड्राइवर निर्देशिकाओं पर हार्ड लिंक का समर्थन करता है, ZFS ड्राइवर नहीं करता है।

सोलारिस पर यूएफएस की कड़ी कड़ी का समर्थन करने का कारण यह है कि एटी एंड टी को इस सुविधा में दिलचस्पी थी - बीएसडी से यूएफएस हार्ड ड्राइव के लिए समर्थन नहीं करता है।

ZFS हार्डलिंकड डायरेक्टरी का समर्थन नहीं करने का कारण यह है कि जेफ बोनविक को यह सुविधा पसंद नहीं है।

लिनक्स के बारे में, मुझे लगता है कि लिनक्स ब्लॉक ऊपरी कर्नेल परतों में निर्देशिकाओं पर हार्ड लिंक बनाने का प्रयास करता है। इस धारणा का कारण यह है कि लिनुस टॉर्वाल्ड्स ने जीआईटी के लिए कोड लिखा था जो कि जब git cloneएक प्लेटफॉर्म पर रूट को हार्ड लिंक्ड निर्देशिकाओं का समर्थन करने वाले के रूप में कहा जाता था, तो उसने श्रेड निर्देशिकाएं कीं ।

ध्यान दें कि हार्ड लिंक्ड डायरेक्टरी बनाने के लिए समर्थन करने वाली फाइलसिस्टम unlink(1)को गैर-रिक्त निर्देशिका को रूट के रूप में निकालने के लिए भी समर्थन की आवश्यकता होती है।

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


3

ओपी के प्रश्न का उल्लेख है mount --bind। एक त्वरित जांच से पता चलता है कि यह उस निर्देशिका के लिए लिंक-गिनती को संशोधित नहीं करता है जो घुड़सवार है। हार्डलिंकिंग हमेशा लिंक-गिनती को संशोधित करता है, जिसे आप उपयोग करके देख सकते हैं ls -ld

आम तौर पर (अधिकांश यूनिक्स जैसी प्रणालियां), किसी निर्देशिका में हार्डलिंक की संख्या उस निर्देशिका से जुड़ी निर्देशिकाओं की संख्या होगी, जैसे,

  • ".." (मूल निर्देशिका)
  • "." (खुद निर्देशिका)
  • उपनिर्देशिका

यदि आप (आमतौर पर) अधिक जानकारीपूर्ण जानकारी पृष्ठ पढ़ते हैं , तो आपको पता चल सकता है कि अन्य लोगों ने क्या किया है:

Oh great, one spends hours tying to find what is wrong only to
discover,
$ info ln
On all existing implementations, you cannot make a hard link to a
directory, and hard links cannot cross filesystem boundaries.  (These
restrictions are not mandated by POSIX, however.)

Therefore, kindly say everywhere you say super-user only,
instead say "few systems, super-user only".

हालांकि वर्तमान में यह शब्द है

अधिकांश सिस्टम एक निर्देशिका के लिए एक कड़ी बनाने पर रोक लगाते हैं; उन पर जहां इसे अनुमति दी जाती है, केवल सुपर-उपयोगकर्ता ऐसा कर सकता है (और सावधानी के साथ, क्योंकि एक चक्र बनाने से कई अन्य उपयोगिताओं के लिए समस्याएं पैदा होंगी)। हार्ड लिंक फाइल सिस्टम सीमाओं को पार नहीं कर सकते हैं। (हालांकि, ये प्रतिबंध POSIX द्वारा अनिवार्य नहीं हैं।)

निर्देशिका में हार्डलिंक बनाना (हटाना) किसी निर्देशिका के अनलिंक किए जाने पर फ़ाइलों को खोने से बचाने के लिए प्रतिबंधित सुविधा है। क्योंकि सी ऑपरेटिंग सिस्टम इंटरफ़ेस में लिंक / अनलिंक ऑपरेशन सममित हैं , निर्देशिकाओं को जोड़ने का काम आम तौर पर केवल mkdir / rmdir कॉल में किया जाता है।

ध्यान रखें कि 20-30 साल पहले GNU कोरुटिल का बहुत कुछ लिखा (और प्रलेखित) किया गया था, जब कुछ वास्तविक संग्रहालय के टुकड़े अभी भी उपयोग में थे। जैसा कि हार्ड लिंक के संबंध में बताया गया है , मूल रूप से वहाँ कोई mddir / rmdir कॉल नहीं थे ; हार्ड लिंक का उपयोग करके निर्देशिकाएं (एक विशेषाधिकार प्राप्त ऑपरेशन के रूप में) बनाई गई थीं। बताई गई समस्याओं को हल करने के लिए सिस्टम कॉल को जोड़ने पर वे सभी चले गए। लेकिन प्रलेखन उनके रखरखाव की स्मृति अतीत इन प्रणालियों को संदर्भित करने के लिए जारी है। विकल्प जो पूछताछ की थी पूर्ववर्ती में था fileutils(जो के साथ संयुक्त किया गया था textutilsऔर shellutils1990 के मध्य में के रूप में coreutils)। चैंज से कुछ आइटम सुविधा की उत्पत्ति को स्पष्ट करने में मदद कर सकते हैं:

Mon Jul 23 16:57:44 1990  David J. MacKenzie  (djm at albert.ai.mit.edu)

        * cp.c (copy): Make +update operate silently, like +one-file-system.
        * ln.c: Add -F as synonym for -d, for SunOS compatibility.

Wed Feb 21 11:13:26 1990  David J. MacKenzie  (djm at albert.ai.mit.edu)

        * ln.c (error): New function.
        (main, do_link): Call error instead of fprintf and exit. 
        (main): Recognize new -d +directory option to allow superuser to
        make hard links to dirs, like the BSD ln -f option.
        (do_link): Don't allow hard links to dirs (they are hard to
        get rid of -- rmdir and unlink don't do it), unless -d was given.
        (usage): Mention -d +directory option.

तो आप उदाहरण के लिए देख सकते हैं कि इस सुविधा के लिए प्राचीन वस्तुओं में से एक SunOS था। इसी मैनुअल पेज ने यह कहा:

OPTIONS
       -f     Force a hard link to a directory -- this option is  only   avail-
              able to the super-user.

       -s     Create a symbolic link or links.

SYSTEM V OPTIONS
       -f     Force  files to be linked without displaying permissions, asking
              questions or reporting errors.

       -F     Force a hard link to a directory -- this option is  only  avail-
              able to the super-user.

       -s     Create a symbolic link or links.

जैसा कि दस्तावेज़ीकरण में उल्लेख किया गया है, यह सुविधा (और संबंधित विकल्प POSIX में नहीं है (और देखें कि राशन अनुभाग बताता है कि क्यों)। बल्कि, फीचर को एक नए कमांड में ले जाया गया था (जिसे GNU कोर्यूटिल्स द्वारा भी प्रदान किया गया है) linkका वर्णन। कमांड स्वयं अस्पष्ट है; आपको मानक से किसी भी उपयोग को प्राप्त करने के लिए फ़ंक्शन कॉल का विवरण पढ़ना होगा । हालांकि, मानक उन शर्तों को स्पष्ट नहीं करता है जिनमें कमांड काम करेगा, एक तरफ से आवश्यक विशेषाधिकारों के बारे में अस्वीकरण को आगे बढ़ाने से अलग है। उसके लिए, आपको मानक के बाहर सिस्टम-निर्भर सुविधाओं पर जाना होगा:

एक निर्देशिका को जोड़ना अधिकांश ऐतिहासिक कार्यान्वयन में सुपरयुसर तक सीमित है क्योंकि यह क्षमता फ़ाइल पदानुक्रम में लूप का उत्पादन कर सकती है या अन्यथा फ़ाइल सिस्टम को दूषित कर सकती है। POSIX.1-2008 की यह मात्रा निषिद्ध है link()और unlink()ऐसा करने से। अन्य कार्य इसे कर सकते हैं यदि कार्यान्वयनकर्ता ने इस तरह के विस्तार को डिजाइन किया है।

वहाँ रहे हैं प्रणाली है जो सामान्य संख्या (2 प्लस उपनिर्देशिका) परे निर्देशिका के लिए hardlinks का उपयोग करें।

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

आगे की पढाई:


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