2010-05-11 13 views
8

में हार्ड लिंक और प्रतीकात्मक लिंक मैं सिर्फ यह स्पष्ट करना चाहता था कि एक हार्ड/प्रतीकात्मक लिंक वास्तव में एक फ़ाइल बनाई गई है ??यूनिक्स

मैं आदेश भागा:

ln source hardlink 
ln -s source softlink 

- ls कमांड एक फ़ाइल के रूप में यह 2 लिंक को दर्शाता है।

तो मेरी क्वेरी है, क्या ln/ln -s वास्तव में एक फ़ाइल बनाता है?

सादर, darkie15

उत्तर

13

हाँ, और कोई :-)

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

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

यह कठिन लिंक के लिए है।

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

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

सॉफ्ट लिंक में उस सीमा नहीं है क्योंकि वे लक्ष्य फ़ाइल के पथ को स्टोर करते हैं, न कि इसके इनोड में।

निम्नलिखित प्रतिलेख मदद मिल सकती है:

$ echo hello >f1 
$ ln f1 f2 
$ ln -s f1 f3 
$ ls -ial f* 
    7385 -rw-r--r-- 2 pax None 6 May 11 14:09 f1 
    7385 -rw-r--r-- 2 pax None 6 May 11 14:09 f2 
    4672 lrwxrwxrwx 1 pax None 6 May 11 14:09 f3 -> f1 
$ cat f1 
    hello 
$ cat f2 
    hello 
$ cat f3 
    hello 
$ rm f1 
$ ls -ial f* 
    7385 -rw-r--r-- 2 pax None 6 May 11 14:09 f2 
    4672 lrwxrwxrwx 1 pax None 6 May 11 14:09 f3 -> f1 
$ cat f1 
    cat: f1: No such file or directory 
$ cat f2 
    hello 
$ cat f3 
    cat: f3: No such file or directory 

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

हालांकि, क्योंकि f3f1 नाम को इसके इनोड के बजाए संदर्भित कर रहा है, तो आपको इसका उपयोग करने का प्रयास करने में त्रुटि मिलती है।


एक तरफ: तुम होगा इसे प्यार किया है जब यूनिक्स इस तरह आप के साथ खिलौने: एक फ़ाइल बुलाया अंतरिक्षबैकस्पेसएक्स और फिर बनाने के रूप में

$ ls f* 
    f2 f3 
$ cat f3 # What the ...? 
    cat: f3: No such file or directory 

लगभग के रूप में ज्यादा मज़ा किसी को इसे हटाने का प्रयास करें :-)

+0

'आरएम \ '? मैं नहीं देखता कि बैकस्पेस (^?) इसे और अधिक जटिल बना देगा :) – Unode

3

न तो एक फ़ाइल बनाता है।

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

एक प्रतीकात्मक कड़ी का अर्थ है "इस निर्देशिका कि जो कुछ भी inode इस अन्य फ़ाइलों अंक के लिए अंक में एक नया फ़ाइल नाम पैदा करते हैं।"

mangoman एक टिप्पणी में बताते हैं के रूप में, एक प्रतीकात्मक कड़ी लिंक लक्ष्य के नाम के साथ एक फ़ाइल पैदा करता है, लेकिन आप इसे करने के लिए ध्यान देना नहीं होना चाहिए। यह एक विशेष फाइल है जो आपके व्यवसाय में से कोई नहीं है।

+2

मुलायम लिंक के मामले में, फ़ाइल को गंतव्य के लिए पूर्ण पथ युक्त बनाया गया है। –