मैं लिनक्स पर किसी फ़ाइल के डेटा ब्लॉक को कैसे सूचीबद्ध करूं?


13

जैसा कि मैं इसे समझता हूं, यूनिक्स जैसे ऑपरेटिंग सिस्टम की प्रत्येक फाइल में एक इनोड नंबर होता है (जिसे "ls -i" के साथ देखा जा सकता है), और प्रत्येक इनकोड डिस्क ब्लॉक की एक सूची होती है, जिसमें फाइल का वास्तविक डेटा होता है।

क्या एक लिनक्स कमांड है जो अपने तर्क के रूप में एक फ़ाइल नाम लेता है और डिस्क ब्लॉक की सूची को प्रिंट करता है जो फ़ाइल के इनोड बिंदुओं को इंगित करता है?

PS विचाराधीन फाइलसिस्टम ext3 है।

जवाबों:


17

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

# debugfs /dev/<spartition>
# stat /path/to/file

या

# debugfs -R "stat /path/to/file" /dev/<partition>

उदाहरण के लिए:

# debugfs -R "stat /etc/passwd"  /dev/sda5
Inode: 435914   Type: regular    Mode:  0644   Flags: 0x0
Generation: 979004472    Version: 0x00000000
User:     0   Group:     0   Size: 1577
File ACL: 0    Directory ACL: 0
Links: 1   Blockcount: 8
Fragment:  Address: 0    Number: 0    Size: 0
ctime: 0x4a2d6f78 -- Mon Jun  8 23:07:20 2009
atime: 0x4a2d6f79 -- Mon Jun  8 23:07:21 2009
mtime: 0x4a2d6f78 -- Mon Jun  8 23:07:20 2009
Size of extra inode fields: 4
BLOCKS:
(0):1767438
TOTAL: 1

ध्यान दें कि 'स्टेट' के लिए तर्क हमेशा / पथ / / से फ़ाइल नहीं है। रूट फाइल सिस्टम पर फाइलों के लिए / पाथ / टू / फाइल का उपयोग करना (घुड़सवार / /) लेकिन अन्य फाइल सिस्टम में माउंट किए गए रास्तों के लिए नहीं। उन मामलों में किसी को त्रुटि संदेश मिल सकता है File not found by ext2_lookup। इसलिए स्टेट के तर्क के लिए इनोड नोटेशन का उपयोग करना बेहतर है। ls -iकिसी फ़ाइल की इनकोड संख्या प्राप्त करने के लिए उपयोग करें , फिर उस नंबर के साथ '<>' के बजाय / पथ / फ़ाइल में डीबगफ़ करें। उदाहरण के लिए:# debugfs -R "stat <1234567>" /dev/sda2
एलाज़ार

@ElazarR क्या आप उस टिप्पणी की व्याख्या कर सकते हैं? path/to/fileसभी मामलों में काम क्यों नहीं होना चाहिए ? मेरे लिए जो भ्रामक बात है, वह यह है कि debugfs ..... /dev/fs_blockdevमेरी समझ में कभी भी केवल एक ही फाइल सिस्टम है, और इस प्रणाली के अंदर की सभी फाइलों को उनके रास्ते या थायर इनोड के माध्यम से एक्सेस किया जा सकता है, आप क्या व्यक्त करना चाहते हैं?
मानवतावाद

@humanityANDpeace, उस मामले में जहां एक फाइल एक पार्टीशन (फाइलसिस्टम) में होती है, जो रूट फाइलसिस्टम के बाहर होता है, यानी, रूट विभाजन के तहत कुछ माउंट पॉइंट पर लगा होता है, ext2_lookup ऑपरेशन दिए गए डिवाइस के तहत दिए गए फाइंडिंग को खोजने में विफल होता है। (विभाजन)। यह त्रुटि मैंने उल्लेख किया है। उदाहरण के लिए, यदि आपका / होम फोल्डर रूट फाइलसिस्टम (जो कि एक अन्य परिसीमन, जैसे, / देव / sda3 पर है) पर / dev / sda5 से आरोहित होता है, तो debugfs -R "stat /home/myuser/foo.txt" /dev/sda5एक त्रुटि होती है। लेकिन debugfs -R "stat /path/on/rootfs" /dev/sda3काम करता है।
एलाज़ार आर

मुझे लगता है कि आपको आवश्यकता है sudo, अन्यथा कुछ अनपेक्षित संदेश प्रदर्शित किया जाएगा।
केदार म्हसवडे 3

और सवाल: हम कैसे पता लगा सकते हैं कि कौन सी फाइल किसी दिए गए ब्लॉक का उपयोग करती है?
लुइस ए। फ्लोरिट

4

"डीबगफ़" और विशेष रूप से "स्टेट" कमांड के लिए सिंटैक्स को देखें। यह आपको एक फ़ाइल द्वारा उपयोग किए जाने वाले डेटा ब्लॉक की एक सूची दिखाएगा। आप स्क्रिप्ट से इसे कॉल करने के लिए "-f" तर्क के साथ "डीबगफ़" के लिए पैरामीटर पास कर सकते हैं।


4

ब्लॉक की सूची प्राप्त करने का एक सरल तरीका ( debugfsजवाबों में विभाजन से पढ़ने के बिना ) FIBMAPioctl का उपयोग करना है । मुझे ऐसा करने के लिए किसी भी आदेश का पता नहीं है, लेकिन इसे लिखना बहुत सरल है; एक त्वरित Google खोज ने मुझे FIBMAP उपयोग का एक उदाहरण दिया , जो वास्तव में आप चाहते हैं। एक फायदा यह है कि यह किसी भी फाइलसिस्टम पर काम करेगा जो bmapऑपरेशन का समर्थन करता है , न कि केवल एक्स 3।

एक नया (और अधिक कुशल) विकल्प FIEMAPioctl है, जो extents (ext4 के लिए उपयोगी) के बारे में विस्तृत जानकारी भी लौटा सकता है।


3
hdparm --fibmap /path/to/filename

मैं zfs पर काम नहीं करूंगा, लेकिन ext4, btrfs, (v) वसा आदि पर काम करूंगा

man 8 hdparm :

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


1

कम से कम कुछ लिनक्स मशीनों पर ... "ls -s" वह प्रदान कर सकता है जो आप खोज रहे हैं।

संपादित करें: मेरा बुरा, मैं देख रहा हूं कि आप स्वयं ब्लॉकों की एक सूची देख रहे हैं, उनकी कोई गिनती नहीं।


-s ब्लॉक में फ़ाइल का आकार दिखाता है - मुझे ब्लॉक संख्या की वास्तविक सूची चाहिए।
माइक

-2

e2fsck -b 32768 / dev / hda1 मुझे लगता है कि आप इसे आज़मा सकते हैं या यदि आप एक ही u पर अधिक docx देख रहे हैं, तो आप निम्नलिखित की जांच कर सकते हैं

http://www.linux-tutorial.info/modules.php?name=MContent&pageid=97


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