हार्ड लिंक क्यों मौजूद हैं?


जवाबों:


56

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

मुझे यह देखने का सबसे अच्छा तरीका है:

$ ls -id .
1069765 ./
$ mkdir tmp ; cd tmp
$ ls -id ..
1069765 ../

इसे बनाने का -iविकल्प lsआपको फाइल का इनकोड नंबर देता है। सिस्टम पर जहां मैंने ऊपर उदाहरण तैयार किया है, मैं एक निर्देशिका में इनोड नंबर 1069765 के साथ हुआ, लेकिन विशिष्ट मूल्य कोई फर्क नहीं पड़ता। यह केवल एक विशिष्ट मूल्य है जो किसी विशेष फ़ाइल / निर्देशिका की पहचान करता है।

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

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

(इस पर अधिक जानकारी के लिए, देखें कि '/' में '..' प्रविष्टि क्यों है? )

यह एक ही निष्पादन योग्य द्वारा कई अलग-अलग कमांडों को लागू करने के लिए यूनिक्स प्रणालियों पर कुछ हद तक सामान्य है। यह लिनक्स पर किसी भी मामले में प्रतीत नहीं होता है, लेकिन उन प्रणालियों पर जो मैंने अतीत में इस्तेमाल किया था cp, mvऔर rmसभी एक ही निष्पादन योग्य थे। यदि आप इसके बारे में सोचते हैं तो यह समझ में आता है: जब आप वॉल्यूम के बीच किसी फ़ाइल को स्थानांतरित करते हैं, तो यह प्रभावी रूप से एक कॉपी है जिसके बाद इसे हटा दिया जाता है, इसलिए mvपहले से ही अन्य दो कमांड के कार्यों को लागू करना होगा। निष्पादन योग्य यह पता लगाने के लिए कि किस ऑपरेशन को प्रदान करना है क्योंकि यह उस नाम से पारित हो जाता है जिसे यह कहा जाता था।

एक और उदाहरण, एम्बेडेड लिनक्स में सामान्य, बिजीबॉक्स है , एक एकल निष्पादन योग्य है जो दर्जनों आदेशों को लागू करता है ।

मुझे ध्यान देना चाहिए कि अधिकांश फाइल सिस्टम पर, उपयोगकर्ताओं को निर्देशिकाओं के लिए हार्ड लिंक बनाने की अनुमति नहीं है। .और ..प्रविष्टियों को स्वचालित रूप से फाइल सिस्टम कोड है, जो आम तौर पर गिरी का हिस्सा है द्वारा प्रबंधित कर रहे हैं। प्रतिबंध मौजूद है क्योंकि यदि आप कैसे बनाते हैं और निर्देशिका हार्ड लिंक का उपयोग करते हैं, तो सावधानी बरतने के लिए गंभीर फाइलसिस्टम समस्याओं का कारण संभव है। यह कई कारणों में से एक है नरम लिंक मौजूद हैं; वे समान जोखिम नहीं उठाते।


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

मैं यह जोड़ूंगा कि कुछ एप्लिकेशन सॉफ्ट (सिम्पल) लिंक को हैंडल करना नहीं जानते हैं, और इस तरह हार्ड लिंक से बचने के लिए उपयोगी हो सकते हैं, जब उन्हें उसी डेटा / कॉन्फिगर फाइल में संदर्भित करके कॉन्फ़िगर किया जाए। एक उदाहरण ioquake3 है, जो सिम्क्लिनड pk3 फ़ाइलों का पालन नहीं कर सकता है, लेकिन हार्डकॉक्ड pk3 फ़ाइलों का पालन कर सकता है।
12

3
साथ ही, यदि आप किसी सिम्लिंक के लक्ष्य को हटाते हैं, तो फ़ाइल चली जाती है और सिमिलिंक टूट जाता है। एक मुद्दा जो एक कड़ी के साथ मौजूद नहीं है।
स्पेक्ट्रा्स

1
लेकिन हार्ड लिंक में जानकारी का एक टुकड़ा है - उनके नाम। इसलिए इसे जगह लेनी चाहिए थी।
जोसेफ क्लिमुक

39

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

इस स्पष्टीकरण को पढ़ने के लिए कुछ समय लें ।


12

यदि उस विकिपीडिया पृष्ठ को पढ़ने के बाद आपका प्रश्न "मैं कभी उनका उपयोग क्यों करूंगा" तो आप समझ नहीं पाते हैं कि क्या कड़ी हैं।

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

आप व्यक्तिगत रूप से कभी हार्ड लिंक का उपयोग नहीं कर सकते हैं, लेकिन वे आपके सिस्टम पर हैं। उदाहरण के लिए:

$ ls -li /bin | grep 53119771
53119771 -rwxr-xr-x 3 root root  26292 2010-08-18 10:15 bunzip2
53119771 -rwxr-xr-x 3 root root  26292 2010-08-18 10:15 bzcat
53119771 -rwxr-xr-x 3 root root  26292 2010-08-18 10:15 bzip2

आप देख सकते हैं bunzip2, bzcatऔर bzipसभी एक ही इनोड का उपयोग करते हैं। संक्षेप में, यह तीन नामों वाली एक फाइल है। आपके पास फ़ाइल की तीन प्रतियां हो सकती हैं, लेकिन क्यों? यह केवल डिस्क स्थान का अनावश्यक रूप से उपयोग करेगा।


12
लेकिन इसमें कई तरह की सहानुभूति भी है /bin, मुझे लगता है कि यह भ्रम के स्रोतों में से एक है। कभी-कभी निष्पादन योग्य लोगों को सहानुभूति क्यों दी जाती है और कभी-कभी हार्डलिंक?
दिमित्री पश्केविच

16
यह लिंक नरम लिंक पर हार्ड लिंक का उपयोग करने के लिए कोई भी कारण प्रदान करने में विफल रहता है।
मार्क अमेरी

8

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

एक और उपयोग rsnapshot के भीतर होता है, जहां डिस्क स्थान की मात्रा को कम करने के लिए हार्ड-लिंक का उपयोग करके समय के साथ बैकअप लिया जाता है। यदि कोई फ़ाइल नहीं बदली गई है, तो फ़ाइल फ़ाइल के पुराने उदाहरणों से हार्ड-लिंक की गई है, जो फाइलें बदली गई हैं वे नए सिरे से कॉपी की गई हैं।

मैं उनका उपयोग सर्वर पर कॉन्फिग फाइलों को स्वैप करने के लिए भी करता हूं: rm file.cfg && ln ~/tmp/file.cfg file.cfgफिर ~ / tmp / * फाइलें सुरक्षित रूप से डिलीट की जा सकती हैं।


1
क्यों अलग lnऔर rmबदले में सिर्फ एक mv?
टॉमी

6

पहले से मौजूद कई अच्छी चर्चाओं को जोड़ने के लिए ...

  • जिस तरह से कार्यक्रमों के लिए संसाधन का उपयोग यूनिक्स में लागू किया गया है (यानी "सब कुछ एक फ़ाइल है" ), का अर्थ है कि ओएस के लिए एक फाइल में कई संदर्भों को संभालने के लिए बुनियादी ढाँचा काम करना आवश्यक है, इसलिए यहां कोई अतिरिक्त लागत नहीं है।
  • जिस तरह से निर्देशिका मूल यूनिक्स फ़ाइल सिस्टम में लागू किया गया (यानी की एक निश्चित प्रारूप सूची (inode, name)जोड़े का मतलब hardlinks (करने के लिए फाइल सिस्टम में पर कोई अतिरिक्त कीमत नहीं है कि अच्छी तरह से है, जब तक हम से निर्देशिका के लिए hardlinke अनुमति न देने (अन्य द्वारा चक्र को रोकने के रूप में .और ..(यह किसी और को लिस्प की तरह लग रहा है?))

इसलिए हम उन्हें मुफ्त में देते हैं।


2

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

मान लीजिए आपने एक हार्डलिंक /foo/myfileलिंकिंग से बनाया है /repo/myfile। दोनों एक ही फ़ाइल डेटा के संकेत हैं; एक को बदलो, दूसरे को बदलो। लेकिन मान लीजिए कि /repoएक गिट रिपॉजिटरी रखने के लिए होता है। यदि आप ऐसी शाखा की जांच करते हैं myfile, जिसमें वह नहीं है , तो उसे /repo/myfileहटा दिया जाता है। इस समय, की /foo/myfileएक सरल प्रतिलिपि बन जाती है /repo/myfile, क्योंकि यह उस समय था जब जोड़ी के दूसरे हिस्से को अनलिंक किया गया था। यह भी आसान नहीं है जब आप उन शाखाओं के बीच फ्लिप करते हैं जो प्रदर्शनों की सूची को बदल देती हैं, लेकिन, जब आप मूल शाखा की जांच करते हैं, तो एक नई फ़ाइल/repo/myfileGit द्वारा बनाया गया है। यदि आपने ध्यान नहीं दिया, तो आपको आश्चर्य होगा कि अब दोनों फाइलों में अलग-अलग सामग्री क्यों है, हालांकि यह करना आसान है, क्योंकि फाइलों के बीच की कड़ी लिंक का उनके नामों के बारे में कोई पता नहीं है। एक नरम लिंक, इसके विपरीत, इस नष्ट-चक्र के माध्यम से बच जाएगा।

दूसरी ओर, हार्ड लिंक का उपयोग करने वाला सॉफ्टवेयर इस बारे में पूरी तरह से जागरूक है, और Git इसका प्रमुख उदाहरण है। Git क्लोनिंग रिपॉजिटरी को उसी फाइल सिस्टम पर लगभग मुफ्त में क्लोन करता है, क्योंकि यह फाइलों को कॉपी करने के बजाय डिफ़ॉल्ट रूप से हार्ड लिंक का उपयोग करता है। Git के लिए हार्ड लिंक एक सही उपयोग का मामला है, क्योंकि इसकी ऑब्जेक्ट और पैक फाइल्स कभी नहीं बदलती हैं, इसलिए रिपॉजिटरी का एक क्लोन दूसरे को कभी भी संशोधित नहीं करेगा (Git हार्ड-लिंक मोडिफाइबल फाइल्स को नहीं जानता है), और कोई भी क्लोन हो सकता है बिना किसी एहतियात के नष्ट कर दिया गया: किसी को ट्रैक करने की आवश्यकता नहीं है कि कौन सा "मूल" है और वास्तव में फाइलें हैं: किसी भी हार्ड लिंक का एक समान भागीदार है और पूरी फाइल को "समाहित" करता है। सॉफ्ट लिंक सिर्फ यहाँ काम नहीं करेगा।

हार्ड लिंक का एक अन्य लाभ यह है कि किसी भी लिंक को फ़ाइल सामग्री तक पहुंच के बिना स्थानांतरित किया जा सकता है। मुलायम लिंक के साथ, मूल फ़ाइल को स्थानांतरित करने से यह लटकने वाले सभी नरम लिंक को प्रस्तुत करता है।

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

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

इसके अलावा, मुझे कहना होगा कि लाइब्रेरी कॉल जो एक फ़ाइल को हटा देती है, उसे unlink()एक कारण के लिए कहा जाता है ! हर निर्देशिका प्रविष्टि सिर्फ एक शुरुआत में अपनी कड़ी कड़ी कड़ी है।

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