फ़ाइल सहेजते समय मेटाडेटा कहाँ जाता है?


28

कहते हैं जॉनी एक EMPTY फ़ाइल बनाता है। इसे कहते हैं foobar.py। जब जॉनी इसे निष्पादित करने की अनुमति देता है, तो वह चलाता है chmod 755 foobar.py। फ़ाइल में अब मेटाडेटा है

-rw-r--r-- 1 johnny staff    0 Dec 27 22:53 foobar.py

वह सब मेटाडेटा उस फ़ाइल में कहाँ संग्रहीत है? फ़ाइल का आकार 0 है, इसलिए इसे किसी अन्य ड्राइव पर स्थानांतरित करने पर मेटाडेटा कैसे रखता है?


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

@barlop अनिवार्य रूप से सही है। दोनों सिस्टम रिकॉर्डिंग के लिए कुछ जगह का उपयोग करते हैं जहां फाइलें संग्रहीत की जाती हैं; NTFS में "मास्टर फाइल टेबल" मेटाडेटा को स्टोर करता है, ext2 में + यह "इनोड्स" में है।
pjc50

@ pjc50 धन्यवाद और मेटाडेटा एक तरफ, उस चीज़ का नाम क्या है जो विभाजन के बाहर है? मुझे लगता है कि यह निर्भर करता है कि वह चीज एमबीआर है या जीपीटी .. एमबीआर में चीज को एमबीआर कहा जाता है .. इसे जीपीटी में क्या कहा जाता है? (मुझे समझ में आता है कि GPT की विरासत MBR है, लेकिन क्या इसकी अपनी बात भी है, सभी विभाजनों के बाहर?)
barlop

संबंधित: (मूल रूप से एक ही बात, लेकिन सवाल विशेष रूप से विंडोज के बारे में है) फ़ाइल मेटाडेटा को विंडोज में कैसे संग्रहीत किया जाता है?
ग्रोनोस्तज

2
"chmod 755 ... फ़ाइल में अब ... -rw-r - r-- ..." का मेटाडेटा है - आपका मतलब है -rwxr-xr-x।
जोएल

जवाबों:


42

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

यही है, ज्यादातर ऑपरेटिंग सिस्टम में वास्तव में "मेटाडेटा के साथ कॉपी फ़ाइल" नहीं होती है। फ़ाइल-कॉपी प्रोग्राम सिर्फ नाम की एक नई फ़ाइल बनाता है foobar.py, पूरे 0 बाइट्स डेटा की प्रतिलिपि बनाता है , फिर इसके संशोधन समय को मूल के रूप में देखने के लिए utime () या SetFileTime () का उपयोग करता है । इसी तरह, फ़ाइल अनुमतियाँ chmod () का उपयोग करके या POSIX ACST विशेषता की प्रतिलिपि बनाकर उन्हें "कॉपी" किया जाएगा।

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

तुलना करें cp -a foo bar(जो प्रतियां मेटाडेटा) और cp foo bar(जो नहीं करता है):

$ स्ट्रेस -v सीपी फू बार
...
खुला ("फू", O_RDONLY) = 3
खुला ("बार", O_WRONLY | O_TRUNC) = 4
पढ़ें (3, "test \ n", 131072) = 5
लिखना (4, "test \ n", 5) = 5
पढ़ें (3, "", 131072) = 0
पास (४) = ०
पास (३) = ०
...
$ स्ट्रेस -v cp -a फू बार
...
 - मूल मेटाडेटा पुनर्प्राप्त किया जाता है
lstat ("फू", {st_dev = makedev (254, 0), st_ino = 60569468, st_mode = S_IFREG | 0644)
             st_nlink = 1, st_uid = 1000, st_gid = 1000, st_blksize = 4096, st_blocks = 8,
             st_size = 5, st_atime = 2016-12-28T09: 16: 59 + 0200.879714332,
             st_mtime = 2016-12-28T09: 16: 55 + ०,२००.८१,६३,६३,०९८,
             st_ctime = 2016-12-28T09: 16: 55 + 0200.816363098}) = 0
 - डेटा कॉपी किया जाता है
खुला ("फू", O_RDONLY | O_NOFOLLOW) = 3
खुला ("बार", O_WRONLY | O_TRUNC) = 4
पढ़ें (3, "test \ n", 131072) = 5
लिखना (4, "test \ n", 5) = 5
पढ़ें (3, "", 131072) = 0
 - मोडिफिकेशन टाइम कॉपी किया जाता है
utimensat (4, NULL, [{tv_sec = 1482909419, tv_nsec = 879714332},
                    {tv_sec = 1482909415, tv_nsec = 816363098}], 0) = 0
 - स्वामित्व की प्रतिलिपि बनाई जाती है (केवल 'sudo [strace] cp') के साथ)
fchown (4, 1000, 1000) = 0
 - विस्तारित विशेषताओं की प्रतिलिपि बनाई गई है (xdg.origin.url ब्राउज़र, wget द्वारा सेट की गई है)
flistxattr (3, NULL, 0) = 0
flistxattr (3, "user.xdg.origin.url \ 0", 20) = 20
fgetxattr (3, "user.xdg.origin.url", "https://superuser.com/", 22) = 22
fsetxattr (4, "user.xdg.origin.url", "https://superuser.com/", 22, 0) = 0
 - POSIX ACL मौजूद नहीं है, इसलिए एक मूल ACL को st_mode से बनाया गया है
 - (इस मामले में, एक साधारण fchmod () भी काम करेगा)
fgetxattr (3, "system.posix_acl_access", 0x7ffc87a50be0, 132) = -1 ENODATA (कोई डेटा उपलब्ध नहीं)
fsetxattr (4, "system.posix_acl_access", "\ 2 \ 0 \ 0 \ 0 \ 1 \ \ 0 \ 6 \ 0 \ 377 \ 377 \ 377 \ 377 \ 377 \ 4 \ 0 \ 4 \ 0 \ 377 \ 377 \ 377 \ 377 \" 377 \ 0 \ 4 \ 0 \ 377 \ 377 \ 377 \ 377 ", 28, 0) = 0
पास (४) = ०
पास (३) = ०
...

3
इस उत्तर के पूरक के लिए आपको उल्लेख करना चाहिए: - जब किसी अन्य ड्राइव पर कॉपी किया जाता है: मेटाडेटा स्रोत से पढ़ा जाता है, और लक्ष्य पर पुन: उत्पन्न किया जाता है यदि एप्रॉप्रिट सेटिंग्स (या विकल्प) (पूर्व के लिए: तिथि रखें, अधिकार रखें, या यहां तक ​​कि "रखें" सब कुछ ") का उपयोग किया गया था (जैसा कि आपने उल्लेख किया है)। 2) एक विकल्प यह है कि सबसे पहले फाइलों का एक आर्काइव (.zip, .tar इत्यादि) करें, और इस आर्काइव से लक्ष्य पर निकालें, एक बार फिर मेटाडेटा खोजने के लिए प्रोग्राम को कुछ जगह (आर्काइव फॉर्मेट में) दें, और विशिष्ट विकल्प / सेटिंग्स उन मेटाडेटा को रखने (या नहीं) की अनुमति देते हैं।
ओलिवियर दुलैक 12

दूसरे पैराग्राफ के लिए: स्टेट (2) के बारे में क्या?
बिल्ली

मुझे इस एक प्रश्न का विस्तृत उत्तर देने के लिए धन्यवाद, जिसके बारे में मैंने विचार किया है।
जूनियर राइबिस्ट

11

यह आमतौर पर फाइलसिस्टम से फाइलसिस्टम में भिन्न होता है जहां मेटाडेटा संग्रहीत होता है। फाइलसिस्टम के ext2-family पर, आपके द्वारा उल्लिखित मेटाडेटा (स्वामी, समूह, अनुमतियां, समय) इनोड में संग्रहीत हैं । इनकोड भी स्टोर करता है (इंगित करता है) डिस्क पर फ़ाइल को रखता है। इनकोड फ़ाइलनाम को संग्रहीत नहीं करता है ।

आप इस डेटा को statसिस्टम कॉल ( man 2 stat) के साथ एक्सेस कर सकते हैं , और statइसे प्रिंट करने के लिए टूल का उपयोग कर सकते हैं ( man stat)। इनोड फ़ील्ड का विस्तृत विवरण linux/include/linux/fs.hकर्नेल स्रोत में पाया जा सकता है ।

अन्य प्रकार के मेटाडेटा (जैसे ACL अनुमतियां ) हैं जो विभिन्न स्थानों में संग्रहीत हैं।

जब आप फ़ाइल को कॉपी करते हैं तो मेटाडेटा डिफ़ॉल्ट रूप से कॉपी नहीं किया जाता है। इसके बजाय, डिफ़ॉल्ट मेटाडेटा मानों के साथ एक नई फ़ाइल बनाई जाती है। cp( मेटाबॉलिज्म) के विभिन्न विकल्प हैं -p, --preserveजो cpपुराने मेटाडेटा को पढ़ने statऔर उसके अनुसार नए मेटाडेटा को संशोधित करके मेटाडेटा की प्रतिलिपि बनाने का भी निर्देश देते हैं ।


4

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

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

कुछ फ़ाइल सिस्टम निर्देशिका प्रविष्टियों में किसी अन्य की तरह फ़ाइलें हैं, लेकिन दृश्य से छिपी हुई हैं। एफएटी और एफएटी 32 ऐसे फाइलसिस्टम हैं (एफएटी की मूल निर्देशिका हालांकि "विशेष" है)। जब आप एक फ़ाइल बनाते हैं, तो आप उस फ़ाइल में एक प्रविष्टि जोड़ / संपादित करते हैं जो उस फ़ोल्डर का वर्णन करती है जहाँ फ़ाइल रहती है। प्रत्येक प्रविष्टि फ़ाइल आकार, नाम और दिनांक को संग्रहीत करने के लिए पर्याप्त बड़ी है, और कुछ नहीं (लंबे समय तक कई प्रविष्टियों पर कब्जा करने वाले नाम; 32 बाइट्स का डिफ़ॉल्ट प्रविष्टि आकार पुराने 8 + 3 वर्ण प्रारूप में एक ही नाम रख सकता है। यह सब, ज़ाहिर है। यह मानते हुए कि मेरी स्मृति काम कर रही है)। एक्सट्रीम सिस्टम समान है, लेकिन निर्देशिका प्रविष्टि गतिशील रूप से आकार और केवल नाम और इनोड पॉइंटर रखती है; अन्य सभी जानकारी इनोड में है। इस तरह, दो प्रविष्टियाँ एक ही फ़ाइल को इंगित कर सकती हैं, जो डुप्लिकेट फ़ाइलों को प्रबंधित करने के लिए उपयोगी है।

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

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

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


2
फ़ाइल नाम फ़ाइल के साथ संग्रहीत नहीं हैं, वे निर्देशिका इनोड का हिस्सा हैं। इसलिए हार्ड लिंक काम करते हैं
सोब्रीक

यह उत्तर डर्कट के साथ संघर्ष करता है जहां फ़ाइलनाम संग्रहीत हैं, मुझे आश्चर्य है कि जो सही है
बिल्ली

क्षमा करें, मैंने चीजों को मिलाया, और @dirkt को इसका अधिकार है । जवाब तय करना।
एलसर्नी

वे निर्देशिका का हिस्सा हैं , लेकिन आमतौर पर निर्देशिका के इनोड का हिस्सा नहीं हैं । यह एफएस-विशिष्ट है, लेकिन यदि आप एक निर्देशिका को एक विशेष फ़ाइल के रूप में सोचते हैं, तो इसकी सामग्री फ़ाइलों (नामों और उनके इनोड्स) की सूची होगी।
grawity
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.