हार्ड लिंक और प्रतीकात्मक लिंक में क्या अंतर है?

जैसा कि शीर्षक कहता है, मैं कमांड द्वारा बनाई गई हार्ड लिंक और सॉफ्ट लिंक के बीच अंतर जानना चाहूंगा ln. आदेश man ln जानकारी प्रदान करता है, लेकिन मेरे प्रश्न का पर्याप्त उत्तर नहीं देता है ।

साथ ही, यह अच्छा होगा यदि कोई ऐसी सेटिंग प्रदान कर सके जहां प्रतीकात्मक लिंक पर हार्ड लिंक बेहतर हो ।

"एक तस्वीर एक हजार शब्दों के लायक है । " Pictorial representation


और, " एक उदाहरण सौ पैराग्राफ के लायक है । .."

दो फाइलें बनाएं:

$ touch blah1   $ touch blah2

उनमें कुछ डेटा दर्ज करें:

$ echo "Cat" > blah1$ echo "Dog" > blah2

और उम्मीद के मुताबिक:

$cat blah1; cat blah2CatDog

आइए हार्ड और सॉफ्ट लिंक बनाएं:

$ ln blah1 blah1-hard$ ln -s blah2 blah2-soft

आइए देखें कि अभी क्या हुआ:

$ ls -lblah1blah1-hardblah2blah2-soft -> blah2

ब्लाह 1 का नाम बदलना कोई मायने नहीं रखता:

$ mv blah1 blah1-new$ cat blah1-hardCat

ब्लाह 1 - फ़ाइल के इनोड, सामग्री को हार्ड पॉइंट-जिसे बदला नहीं गया था ।

$ mv blah2 blah2-new$ ls blah2-softblah2-soft$ cat blah2-soft  cat: blah2-soft: No such file or directory

फ़ाइल की सामग्री नहीं मिल सकी क्योंकि सॉफ्ट लिंक नाम को इंगित करता है, जिसे बदल दिया गया था, और सामग्री को नहीं ।
इसी तरह, यदि ब्लाह 1 हटा दिया जाता है, तो ब्लाह 1-हार्ड अभी भी सामग्री रखता है; यदि ब्लाह 2 हटा दिया जाता है, तो ब्लाह 2-सॉफ्ट एक गैर-मौजूदा फ़ाइल का लिंक है ।


स्रोत: स्पष्ट रूप से इसे कॉपी करना स्टैक ओवरफ्लो!

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

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

लिनक्स / यूनिक्स में, शॉर्टकट को लिंक के रूप में जाना जाता है


लिंक दो प्रकार के होते हैं: सॉफ्ट लिंक (प्रतीकात्मक लिंक) या हार्ड लिंक ।

  1. सॉफ्ट लिंक्स (प्रतीकात्मक लिंक)

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

    अगर द असली कॉपी हटा दी गई है, लिंक काम नहीं करेगा.

  2. हार्ड लिंक

    हार्ड लिंक केवल फाइलों के लिए हैं; आप एक अलग विभाजन पर एक अलग इनोड नंबर के साथ एक फ़ाइल से लिंक नहीं कर सकते ।

    अगर द असली कॉपी हटा दी गई है, लिंक काम करेगा, क्योंकि यह अंतर्निहित डेटा तक पहुंचता है जिसे वास्तविक प्रतिलिपि एक्सेस कर रही थी ।


प्रश्न: मैं सॉफ्ट लिंक कैसे बनाऊं?

उत्तर: एक नरम लिंक के साथ बनाया जा सकता है ln -s; पहले आपको स्रोत को परिभाषित करना होगा और फिर आपको गंतव्य को परिभाषित करना होगा । (ध्यान रखें कि आपको स्रोत और गंतव्य दोनों के पूर्ण पथ को परिभाषित करने की आवश्यकता है; अन्यथा यह काम नहीं करेगा । )

 sudo ln -s /usr/lib/i386-linux-gnu/mesa/libGL.so.1 /usr/lib32/libGL.so.1             (----------Source-------)             ( Destination )

जैसा कि आप देख सकते हैं कि इसका एक अलग इनोड है और इसे एक अलग विभाजन पर बनाया जा सकता है ।


प्रश्न: मैं हार्ड लिंक कैसे बनाऊं?

उत्तर: एक हार्ड लिंक के साथ बनाया जा सकता ln; पहले आपको स्रोत को परिभाषित करना होगा और फिर आपको गंतव्य को परिभाषित करना होगा । (यह ध्यान रखें कि आपको स्रोत और गंतव्य दोनों के पूर्ण पथ को परिभाषित करने की आवश्यकता है; अन्यथा यह काम नहीं करेगा । )

मान लीजिए कि मेरे पास एक स्क्रिप्ट है /script नाम की निर्देशिका firefox.

 ls -i # Shows you the inode 5898242 firefox ln /scripts/firefox /scripts/on-fire       ( Source )    ( Destination )

enter image description here

जैसा कि आप देख सकते हैं, इसमें एक ही इनोड है । यदि मैं मूल फ़ाइल को हटाता हूं, तो लिंक अभी भी काम करेगा, और यह मूल के रूप में कार्य करेगा ।

enter image description here

ऊपर, मैं जांचता हूं कि लिंक काम कर रहा है, और फिर मूल फ़ायरफ़ॉक्स स्क्रिप्ट को हटा दें ।


प्रश्न: यह अच्छा होगा यदि कोई ऐसी सेटिंग प्रदान कर सके जहां एक प्रतीकात्मक लिंक पर एक हार्ड लिंक बेहतर हो ।

उत्तर: डिस्क विभाजन लेआउट के आधार पर, हार्ड लिंक सीमा है कि वे एक ही विभाजन (-1 बिंदु) पर होना चाहिए और केवल फ़ाइलों (-1 बिंदु) से लिंक कर सकते हैं, लेकिन यदि मूल हटा दिया जाता है, तो लिंक काम करेगा और यह मूल (+1 बिंदु) की तरह कार्य करता है ।

दूसरी ओर, एक सॉफ्ट लिंक निर्देशिकाओं या फ़ाइलों (+1 बिंदु) को इंगित कर सकते हैं और कोई विभाजन सीमा (+1 बिंदु) नहीं है, लेकिन यदि स्रोत हटा दिया गया है, तो लिंक काम नहीं करेगा (-1 बिंदु) ।

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

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

आप बता सकते हैं कि फ़ाइल के आउटपुट से कितने नाम हैं ls -l. फ़ाइल मोड के बाद पहला नंबर लिंक काउंट है । 1 से अधिक लिंक वाली फ़ाइल में कहीं अन्य नाम हैं, और इसके विपरीत, केवल 1 की लिंक गिनती वाली फ़ाइल में कोई(अन्य) हार्ड लिंक नहीं है ।

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

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

दूसरे धागे से उत्तर में से एक (अब आपकी पोस्ट के शीर्ष से जुड़ा हुआ है) उल्लेख करता है यह पृष्ठ जो मुझे लगता है कि एक काफी अच्छा मध्यम स्तर की व्याख्या है । यदि आप एएससीआईआई कला में खो रहे हैं, तो यहां टीएल;डीआर संस्करण है:

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

इसमें शामिल कर्नेल और फाइल सिस्टम पारदर्शी रूप से सब कुछ अनुवाद करते हैं ।

तो उस पर आधारित है:

  • हार्ड-लिंक केवल समान-फाइल सिस्टम लिंकिंग की अनुमति देते हैं । सिम्लिंक किसी भी पथ पर इंगित कर सकते हैं ।
  • हार्ड-लिंक (अनिवार्य रूप से) निरपेक्ष डेटा की ओर इशारा करते हैं । सिम्लिंक सापेक्ष पथ (जैसे) को इंगित कर सकते हैं ../parent.file)
  • विस्तार से, यदि आप हार्ड-लिंक के लक्ष्य सूचक को स्थानांतरित करते हैं (जो, याद रखें, स्वयं अनिवार्य रूप से केवल एक हार्ड-लिंक एक इनोड की ओर इशारा करता है), हार्ड-लिंक अभी भी काम करता है । सिमलिंक के लक्ष्य को आगे बढ़ाने से आमतौर पर सिमलिंक टूट जाता है ।
  • हार्ड-लिंक को हल करना तेज़ होगा लेकिन अथाह रूप से ऐसा होगा । गति का वह महत्वहीन हिस्सा एक अनम्य फाइल सिस्टम की कीमत पर आता है ।

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

हार्डलिंक जोड़ना केवल एक अतिरिक्त फाइल सिस्टम-आधारित पॉइंटर के साथ एक इनोड प्रदान करता है । क्या यह सही है?

सॉफ्ट लिंक का उपयोग कब करें:

फ़ाइल सिस्टम में लिंक करें: यदि आप फ़ाइल सिस्टम में फ़ाइलों को लिंक करना चाहते हैं, तो आप केवल सिम्लिंक/सॉफ्ट लिंक का उपयोग कर सकते हैं ।

निर्देशिका के लिए लिंक: यदि आप निर्देशिकाओं को लिंक करना चाहते हैं, तो आपको सॉफ्ट लिंक का उपयोग करना चाहिए, क्योंकि आप किसी निर्देशिका के लिए हार्ड लिंक नहीं बना सकते हैं ।

हार्ड लिंक का उपयोग कब करें:

भंडारण स्थान: हार्ड लिंक बहुत नगण्य मात्रा में स्थान लेते हैं, क्योंकि हार्ड लिंक बनाते समय कोई नया इनोड नहीं बनाया जाता है । सॉफ्ट लिंक में हम एक फाइल बनाते हैं जो स्पेस का उपभोग करता है (आमतौर पर 4 केबी, फाइल सिस्टम के आधार पर)

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

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

भ्रम तब होता है जब आप "फ़ाइल नाम" और हार्ड लिंक के बीच अंतर खोजने का प्रयास करते हैं क्योंकि कोई भी नहीं है ।

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

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

सिम्लिंक, जैसा कि पहले समझाया गया था ,बस आपको बताएं " नाम की एक फ़ाइल है <targetname> नाम के फोल्डर में <targetfolder>". वे हार्ड लिंक की ओर इशारा करते हैं । वे नहीं जानते कि डेटा कहां है । हार्ड लिंक जानता है कि ।

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

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

मैंने इसे फिर से खोल दिया है क्योंकि यह इस मुद्दे पर एक अच्छा सामान्य उत्तर का हकदार है (पिछले प्रश्न के विपरीत जो एक अस्पष्ट सी उदाहरण था) ।

सबसे अच्छा जवाब: MicroNuggets: Hard Links versus Soft Links Explained - YouTube

इसके अलावा काफी पूरा जवाब : unix - What is the difference between a symbolic link and a hard link? - Stack Overflow

@ अभिषेकभटिया वीडियो उपलब्ध नहीं है