2013-06-04 10 views
8

प्रतीकात्मक लिंक यूनिक्स/लिनक्स सिस्टम द्वारा आंतरिक रूप से प्रबंधित कैसे होते हैं। यह ज्ञात है कि वास्तविक लक्ष्य फ़ाइल (डांगलिंग लिंक) के बिना भी एक प्रतीकात्मक लिंक मौजूद हो सकता है। तो वह क्या है जो आंतरिक रूप से प्रतीकात्मक लिंक का प्रतिनिधित्व करता है।प्रतीकात्मक लिंक के पीछे क्या है?

विंडोज में, उत्तर reparse point है।

सवाल:

जवाब यूनिक्स/लिनक्स में एक inode है?

यदि हां, तो क्या इनोड संख्या लक्ष्य और लिंक के लिए समान होगी?

यदि हां, क्या लिंक इनोड में लक्ष्य के इनोड (यदि कोई मौजूद है) से अलग अनुमति हो सकती है?

उत्तर

13

यह यूनिक्स/लिनक्स के बारे में नहीं है बल्कि फाइल सिस्टम कार्यान्वयन के बारे में है - लेकिन हाँ, यूनिक्स/लिनक्स कर्नेल स्तर पर इनोड्स का उपयोग करता है और फाइल सिस्टम कार्यान्वयन में इनोड (कम से कम आभासी वाले) होते हैं।

  • झंडाfile-type "आईनोड" उस व्यवस्था करने के लिए कहता है में इस फ़ाइल को एक है:

    सामान्य में, सांकेतिक लिंक बस फ़ाइलें (Btw, निर्देशिका फ़ाइलों को भी कर रहे हैं), होती है "प्रतीकात्मक लिंक"

  • फ़ाइल-सामग्री: लक्ष्य के लिए पथ - दूसरे शब्दों में: एक प्रतीकात्मक लिंक केवल एक फ़ाइल है जिसमें इनोड में ध्वज के साथ एक फ़ाइल नाम होता है।

वर्चुअल फाइल सिस्टम में प्रतीकात्मक लिंक भी हो सकते हैं, इसलिए, FUSE या कुछ अन्य फाइल सिस्टम कार्यान्वयन स्रोतों की जांच करें। (Ext2/ext3/ufs..etc)

तो,

जवाब यूनिक्स/लिनक्स में एक आइनोड है?

फाइल सिस्टम कार्यान्वयन पर निर्भर करता है, लेकिन हां, आम तौर पर इनोड में "फ़ाइल-प्रकार" (और मालिक, एक्सेस अधिकार, टाइमस्टैम्प, आकार, डेटा ब्लॉक पर पॉइंटर्स) होते हैं। ऐसे फाइल सिस्टम हैं जिनमें inode एस (भौतिक प्रत्यारोपण में) नहीं है लेकिन कर्नेल के साथ संगतता बनाए रखने के लिए केवल "वर्चुअल इनोड्स" हैं।

यदि हां, तो क्या इनोड संख्या लक्ष्य और लिंक के लिए समान होगी?

नहीं। आमतौर पर, सिमलिंक अपनी ही आईनोड के साथ एक फ़ाइल, (फ़ाइल प्रकार, स्वयं के डेटा ब्लॉक, आदि के साथ) है

हाँ, लिंक inode अनुमतियाँ लक्ष्य के नोड से अलग हो सकता है कर सकते हैं (यदि एक मौजूद है)?

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

हार्डलिंक्स और सिम्लिंक के बीच अंतर को समझें, आपको पहले निर्देशिकाएं समझनी चाहिए।

निर्देशिकाएं फाइलें हैं (इनोड में ध्वज द्वारा विभेदित) जो कर्नेल को बताती हैं, "इस फ़ाइल को file-name से inode_number के मानचित्र के रूप में संभालें"। हार्ड-लिंक बस फ़ाइल नाम होते हैं जो उसी inode पर मानचित्र होते हैं। तो अगर निर्देशिका फ़ाइल में शामिल हैं:

file_a: 1000 
file_b: 1001 
file_c: 1000 

ऊपर मतलब है, इस निर्देशिका में 3 फ़ाइलें हैं:

  • file_a inode द्वारा वर्णित 1000
  • file_b inode 1001 का वर्णन किया और
  • file_c फिर से इनोड 1000 द्वारा वर्णित (इसलिए यह file_a के साथ एक हार्डलिंक से file_a नहीं है - क्योंकि यह कहना असंभव है कि कौन सा फ़ाइल नाम पहले आया था - वाई समान हैं)।

यह सिमलिंक, जहां file_b (inode 1001) की inode सामग्री "file_a" और एक झंडा जिसका अर्थ है 'यह एक सिमलिंक है "हो सकता है करने के लिए मुख्य अंतर है। इस मामले में, file_bfile_a पर इंगित एक सिम्लिंक होगा।

2

तुम भी आसानी से अपने दम पर इस का पता लगाने कर सकते हैं:

$ touch a 
$ ln -s a b 
$ ln a c 
$ ls -li 
total 0 
95905 -rw-r--r-- 1 regnarg regnarg 0 Jun 19 19:01 a 
96990 lrwxrwxrwx 1 regnarg regnarg 1 Jun 19 19:01 b -> a 
95905 -rw-r--r-- 2 regnarg regnarg 0 Jun 19 19:01 c 

ls को -i विकल्प पहले कॉलम में आईनोड संख्या को दर्शाता है। आप देख सकते हैं कि सिम्लिंक में एक अलग इनोड संख्या है जबकि हार्डलिंक समान है। ,

$ stat a 
    File: 'a' 
    Size: 0   Blocks: 0   IO Block: 4096 regular empty file 
Device: 28h/40d Inode: 95905  Links: 2 
[...] 

$ stat b 
    File: 'b' -> 'a' 
    Size: 1   Blocks: 0   IO Block: 4096 symbolic link 
Device: 28h/40d Inode: 96990  Links: 1 
[...] 

आप इस प्रोग्राम के रूप में क्या करना चाहते हैं, तो आप lstat(2) सिस्टम कॉल का उपयोग कर सकते सिमलिंक ही (आइनोड संख्या आदि) के बारे में जानकारी प्राप्त करने के stat(2) के बारे में जानकारी से पता चलता है, जबकि: आप भी stat(1) आदेश का उपयोग कर सकते हैं symlink के लक्ष्य, यदि यह मौजूद है। अजगर में उदाहरण:

>>> import os 
>>> os.stat("b").st_ino 
95905 
>>> os.lstat("b").st_ino 
96990 
+0

और 'readlink()' तुम क्या किसी दिए गए सिमलिंक में पथ नाम के रूप में संग्रहीत किया जाता है पता लगाने के लिए अनुमति देता है - लेकिन जीवन वाकई दिलचस्प जब तत्वों में से एक एक सिमलिंक में पथ को पार करता है जो अपने आप हो जाता है है एक सिम्लिंक कर्नेल इसे एपलबॉम्ब से संभालता है; लोग जरूरी नहीं है। 'Realpath()' भी है जो किसी दिए गए फ़ाइल के लिए सिम्लिंक-मुक्त पूर्ण पथ निर्धारित करता है। –

संबंधित मुद्दे