ฉันจะแสดงรายการบล็อกข้อมูลของไฟล์บน Linux ได้อย่างไร


13

ตามที่ฉันเข้าใจแล้วแต่ละไฟล์ในระบบปฏิบัติการที่คล้าย Unix จะมีหมายเลขไอโหนด (ซึ่งสามารถดูได้ด้วย "ls -i") และแต่ละไอโหนดคือรายการบล็อกดิสก์ที่มีข้อมูลจริงของไฟล์

มีคำสั่ง Linux ที่ใช้ชื่อไฟล์เป็นอาร์กิวเมนต์และพิมพ์รายการบล็อกดิสก์ที่ inode ของไฟล์ชี้ไปที่หรือไม่

PS ระบบไฟล์ที่เป็นปัญหาคือ ext3

คำตอบ:


17

คุณสามารถใช้เครื่องมือ "debugfs" เพื่อดูข้อมูลไฟล์บนบรรทัดคำสั่งหรือ interactivley ใช้อย่างใดอย่างหนึ่ง:

# 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

โปรดทราบว่าอาร์กิวเมนต์สำหรับ 'stat' อาจไม่ใช่ / path / to / file เสมอ การใช้ / path / to / file ใช้สำหรับไฟล์บนระบบไฟล์รูท (เมานต์ที่ /) แต่ไม่ใช่สำหรับพา ธ ที่ติดตั้งในระบบไฟล์อื่น File not found by ext2_lookupในกรณีดังกล่าวอาจได้รับข้อความแสดงข้อผิดพลาด ดังนั้นจะเป็นการดีกว่าถ้าใช้สัญกรณ์ไอโหนดสำหรับอาร์กิวเมนต์ของสถิติ ใช้ls -iเพื่อรับหมายเลข inode ของไฟล์จากนั้นเรียก debugfs ด้วยหมายเลขนั้นใน '<>' แทน / path / to / file ตัวอย่างเช่น:# debugfs -R "stat <1234567>" /dev/sda2
ElazarR

@ElazarR คุณช่วยอธิบายความคิดเห็นนั้นได้ไหม? ทำไมpath/to/fileไม่ทำงานในทุกกรณี? สิ่งที่ทำให้ฉันสับสนคือว่าdebugfs ..... /dev/fs_blockdevมีความเข้าใจของฉันผ่านทางระบบไฟล์เดียวที่เคยพิจารณาและไฟล์เหล่านั้นทั้งหมดในระบบนี้สามารถเข้าถึงได้ผ่านเส้นทางของพวกเขาหรือผ่านทาง inode thair สิ่งที่คุณต้องการแสดง?
humanityANDpeace

@humanityANDpeace, ในกรณีที่ไฟล์อยู่ในพาร์ติชั่น (ระบบไฟล์) ที่อยู่นอกระบบไฟล์รูท, เช่น, ที่เมาท์ ณ จุดเมานต์บางส่วนภายใต้รูทพาร์ติชั่น, การดำเนินการ ext2_lookup ดูเหมือนจะล้มเหลวในการค้นหาเส้นทางที่กำหนดภายใต้อุปกรณ์ที่กำหนด (พาร์ทิชัน) ซึ่งส่งผลให้เกิดข้อผิดพลาดที่ฉันพูดถึง ตัวอย่างเช่นหากโฟลเดอร์ / home ของคุณถูกเมาท์จาก / dev / sda5 บนระบบไฟล์รูdebugfs -R "stat /home/myuser/foo.txt" /dev/sda5ท แต่การเรียกใช้debugfs -R "stat /path/on/rootfs" /dev/sda3งาน
ElazarR

ฉันคิดว่าคุณต้องการsudoมิฉะนั้นข้อความที่ไม่ช่วยเหลือจะปรากฏขึ้น
Kedar Mhaswade

และคำถามสนทนา: เราจะทราบได้อย่างไรว่าไฟล์ใดใช้บล็อกที่กำหนด
Luis A. Florit

4

ดูไวยากรณ์สำหรับ "debugfs" และคำสั่ง "stat" โดยเฉพาะ ที่จะแสดงรายการบล็อกข้อมูลที่ใช้โดยไฟล์ คุณสามารถส่งพารามิเตอร์ไปที่ "debugfs" ด้วยอาร์กิวเมนต์ "-f" เพื่อเรียกใช้จากสคริปต์


4

วิธีง่าย ๆ ในการรับรายการบล็อก (โดยไม่ต้องอ่านจากพาร์ติชันเหมือนในdebugfsคำตอบ) คือการใช้FIBMAPioctl ฉันไม่ทราบคำสั่งใด ๆ ที่จะทำ แต่มันง่ายมากที่จะเขียนหนึ่ง; การค้นหาโดย Google อย่างรวดเร็วให้ฉันตัวอย่างของการใช้ FIBMAPซึ่งทำสิ่งที่คุณต้องการ ข้อดีอย่างหนึ่งคือมันจะทำงานกับระบบไฟล์ใด ๆ ที่รองรับการbmapดำเนินการไม่เพียง แต่ ext3

ทางเลือกที่ใหม่กว่า (และมีประสิทธิภาพมากกว่า) คือFIEMAPioctl ซึ่งสามารถส่งคืนข้อมูลโดยละเอียดเกี่ยวกับขอบเขต (มีประโยชน์สำหรับ ext4)


3
hdparm --fibmap /path/to/filename

ฉันจะไม่ทำงานกับ zfs แต่จะใช้กับ ext4, btrfs, (v) fat เป็นต้น

man 8 hdparm :

--fibmapเมื่อใช้แล้วจะต้องมีการตั้งค่าสถานะเดียวเท่านั้น มันต้องการพา ธ ไฟล์เป็นพารามิเตอร์และจะพิมพ์รายการส่วนขยายอุปกรณ์ (ช่วงเซกเตอร์) ที่ครอบครองโดยไฟล์นั้นบนดิสก์ หมายเลขเซ็กเตอร์ถูกกำหนดเป็นหมายเลข LBA สัมบูรณ์อ้างอิงจากเซกเตอร์ 0 ของอุปกรณ์ฟิสิคัล ( ไม่ใช่พาร์ติชันหรือระบบไฟล์) ข้อมูลนี้สามารถนำไปใช้เพื่อจุดประสงค์ที่หลากหลายเช่นการตรวจสอบระดับการแตกไฟล์ใหญ่หรือการกำหนดเซกเตอร์ที่เหมาะสมเพื่อให้เกิดความเสียหายโดยเจตนาระหว่างขั้นตอนการทดสอบการฉีดผิด


1

อย่างน้อยในเครื่อง Linux บางตัว ... "ls -s" อาจให้สิ่งที่คุณต้องการ

แก้ไข: ฉันไม่ดีฉันเห็นว่าคุณกำลังมองหารายชื่อของบล็อกตัวเองไม่นับพวกเขา


-s แสดงขนาดของไฟล์ในบล็อก - ฉันต้องการรายการจริงของหมายเลขบล็อก
ไมค์

-2

e2fsck -b 32768 / dev / hda1 ฉันรู้สึกว่าคุณสามารถลองนี้หรือถ้าคุณกำลังมองหา docx เพิ่มเติมในที่คุณสามารถตรวจสอบต่อไปนี้

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


คำสั่งนั้นเรียกใช้การตรวจสอบระบบไฟล์โดยใช้ 32768 เป็น superblock สำรอง นั่นไม่ใช่สิ่งที่เขาขอ
James Broadhead
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.