लिनक्स पर विस्तृत विरल फ़ाइल जानकारी


11

मेरे पास एक विरल फ़ाइल है, जिसमें केवल कुछ ब्लॉक आवंटित किए गए हैं:

~% du -h --apparent-size example
100K    example
~% du -h example
52K     example

मैं जानना चाहूंगा कि फाइल के कौन से ब्लॉक वास्तव में आवंटित किए गए हैं। क्या कोई सिस्टम कॉल या कर्नेल इंटरफ़ेस है जिसका उपयोग आवंटन या फ़ाइल के छेद की सूची प्राप्त करने के लिए किया जा सकता है?

बस ज़ीरो के लंबे स्ट्रिंग के लिए जाँच करना (GNU cp, rsync, आदि द्वारा उपयोग किया जाने वाला तरीका) सही तरीके से काम नहीं करता है:

~% cp example example1  
~% du -h example1 
32K     example1

इसने शून्य के अन्य दृश्यों का पता लगाया जो वास्तव में आवंटित किए गए थे।

जवाबों:


7

नहीं है अतः पर एक समान प्रश्नवर्तमान में स्वीकार जवाब द्वारा @ephemient एक का उपयोग कर पता चलता है ioctlकहा जाता fiemapहै, जिसमें से प्रलेखित है linux/Documentation/filesystems/fiemap.txt। उस फ़ाइल से उद्धरण:

फ़ाइल लेप मैपिंग प्राप्त करने के लिए यूजरस्पेस के लिए फिएम ioctl एक प्रभावी तरीका है। ब्लॉक-बाय-ब्लॉक मैपिंग (जैसे bmap) के बजाय, Fiemap extents की सूची देता है।

इस तरह की जानकारी आप के लिए देख रहे हैं की तरह है। फाइल सिस्टम द्वारा समर्थन फिर से वैकल्पिक है:

फ़ाइल सिस्टम जो फ़िएट का समर्थन करना चाहते हैं, उन्हें ->fiemap अपनी inode_operationsसंरचना पर कॉलबैक लागू करना होगा ।

के लिए समर्थन SEEK_DATAऔर SEEK_HOLEतर्कों को lseekआप सोलारिस से उल्लेख के अनुसार लिनक्स 3.1 में जोड़ा गया है आदमी पेज है, तो आप का उपयोग करने वाले के रूप में अच्छी तरह से हो सकता है। fiemap ioctlप्रकट होता है उससे अधिक होनी है, इसलिए यह अब के लिए विभिन्न लिनक्स संस्करणों में अधिक पोर्टेबल हो सकता है, जबकि lseekऑपरेटिंग सिस्टम अगर सोलारिस एक ही है भर में अधिक पोर्टेबल हो सकता है।


2
आप का उपयोग करके इस FIEMAP जानकारी प्राप्त कर सकते --fibmapकी hdparmउपयोगिता। मैनुअल देखें।
टॉटर

2

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

 $ echo hole,data,hole | mksparse --hole-size 4096 --data-size 4096 example
 $ du -sh example
 4.0K   example

sparsemapकार्यक्रम के लिए stdout लेआउट मुद्रित करने के लिए इस्तेमाल किया जा सकता:

 $ sparsemap example
 HOLE 4096
 DATA 4096
 HOLE 4096

1

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

आपको संभवतः इनोड को खोलना होगा, और परिणाम को पार्स करना होगा। इनकोड प्रारूप फाइल सिस्टम पर निर्भर है। कुछ फाइल सिस्टम आपके डेटा का हिस्सा इनकोड में ही कर सकते हैं।


1
यह जानकारी रखने के लिए कुछ एफएस-अज्ञेयवादी तरीका होना चाहिए। इनोड से सीधे पढ़ना निश्चित रूप से एक विकल्प नहीं है। मैं जैसे कुछ SEEK_DATAऔर SEEK_HOLEमापदंडों की तलाश कर रहा था lseek(), जैसे कि सोलारिस में हैं: openolarisforum.org/man/man2/lseek.html
जूलियानो

@ जूलियानो लिनक्स लेज़ेक ऑप्शन पर एक नज़र इन विकल्पों पर नहीं है। सोलारिस बहुत कम फ़ाइल सिस्टम का समर्थन करता है, इसलिए इसका समर्थन करना अपेक्षाकृत आसान होगा। लिनक्स कई तरह के फाइल सिस्टम का समर्थन करता है, जिनमें से कुछ विरल फाइलों का समर्थन नहीं करते हैं। SEEK_DATA / SEEK_HOLE के लिए समर्थन सभी फ़ाइल सिस्टम के लिए कोड में समर्थन लागू करेगा। ये विधियाँ वह नहीं कर सकती हैं जो आप अपेक्षा करते हैं। सूर्य की ओर से अधिक डेटा के लिए blogs.sun.com/bonwick/entry/seek_hole_and_seek_data देखें ।
बिलचोर

1
फ़ाइलसिस्टम को lseek () इंटरफ़ेस के साथ कुछ भी समर्थन करने की आवश्यकता नहीं है, कर्नेल फ़ाइल सिस्टम मॉड्यूल को स्कैन करता है जो मॉड्यूल प्रॉपर्टी के माध्यम से SEEK_DATA / SEEK_HOLE का समर्थन करता है। यह स्वयं और संबंधित ब्लॉग के मैनपेज में है: "फाइलसिस्टम जो छेद के बारे में जानकारी की आपूर्ति नहीं करते हैं, उनके लिए फाइल को पूरे डेटा क्षेत्र के रूप में दर्शाया जाएगा।"
जुलियानो

@ जूलियानो को अभी भी कर्नेल मॉड की आवश्यकता है और साथ ही लेसेक में परिवर्तन की भी। ब्लॉग प्रविष्टि के अनुसार यह सूर्य पर काफी नई कार्यक्षमता है। यह काम करने के लिए फाइल सिस्टम कोड को संशोधित करने की आवश्यकता है। यह निश्चित रूप से कर्नेल हुक प्रदान करने के लिए विरल फ़ाइलों का समर्थन करने वाले सभी फ़ाइल सिस्टम में परिवर्तन की आवश्यकता होगी।
बिलचोर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.