รายละเอียดข้อมูลไฟล์กระจัดกระจายบน Linux


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การอ้างอิงจากไฟล์นั้น:

fiemap ioctl เป็นวิธีที่มีประสิทธิภาพสำหรับ userspace ในการรับการแมปขอบเขตไฟล์ แทนที่จะทำการแมปแบบบล็อกต่อบล็อก (เช่น bmap) fiemap จะส่งกลับรายการขอบเขต

เสียงแบบนี้เป็นข้อมูลที่คุณกำลังมองหา รองรับระบบไฟล์เป็นตัวเลือกอีกครั้ง:

ระบบไฟล์ที่ต้องการสนับสนุน fiemap ต้องใช้การ->fiemap เรียกกลับในinode_operationsโครงสร้าง

การสนับสนุนSEEK_DATAและSEEK_HOLEข้อโต้แย้งที่lseekคุณกล่าวถึงจาก Solarisถูกเพิ่มใน Linux 3.1 ตามหน้า manดังนั้นคุณอาจใช้สิ่งนั้นเช่นกัน fiemap ioctlไว้ดูจะเก่าดังนั้นจึงอาจจะพกพามากขึ้นทั่วรุ่นลินุกซ์ที่แตกต่างกันสำหรับตอนนี้ในขณะที่lseekอาจจะมีการพกพามากขึ้นในระบบปฏิบัติการ Solaris ถ้ามีเดียวกัน


2
คุณสามารถรับข้อมูล FIEMAP นี้โดยใช้ --fibmapของhdparmยูทิลิตี้ ดูคู่มือ
Totor

2

มีชุดของโปรแกรมหลามที่เรียกว่าsparseutilsที่ใช้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

ขึ้นอยู่กับระบบไฟล์ ฉันไม่เชื่อว่าพวกเขาคือการโทรซึ่งอาจเป็นสาเหตุที่เครื่องมือจำนวนมากไม่จัดการการคัดลอกไฟล์แบบกระจายได้ดี ห่วงโซ่เครื่องมือของ GNU ใช้การค้นหาบล็อกของเลขศูนย์ขนาดใหญ่เพื่อให้สามารถลบบล็อกที่จัดสรรที่ไม่ได้ใช้ เครื่องมือการทำสำเนาจำนวนมากจะแปลงไฟล์ที่กระจัดกระจายเป็นไฟล์ที่มีการจัดสรรบล็อคทั้งหมด

คุณอาจจะต้องเปิด inode และแยกผลลัพธ์ รูปแบบไอโหนดขึ้นอยู่กับระบบไฟล์ ระบบไฟล์บางระบบอาจมีส่วนหนึ่งของข้อมูลของคุณในไอโหนด


1
ต้องมีวิธีที่ไม่เชื่อเรื่องพระเจ้าของ FS เพื่อให้ได้ข้อมูลนี้ การอ่านโดยตรงจาก inode ไม่ใช่ทางเลือก ฉันกำลังมองหาสิ่งที่ต้องการSEEK_DATAและSEEK_HOLEพารามิเตอร์lseek()เช่นใน Solaris: opensolarisforum.org/man/man2/lseek.html
Juliano

@Juliano ตัวเลือก Linux lseek ไม่มีตัวเลือกเหล่านี้ Solaris สนับสนุนระบบไฟล์น้อยมากดังนั้นจึงค่อนข้างง่ายที่จะสนับสนุน Linux รองรับระบบไฟล์ที่หลากหลายซึ่งบางระบบไม่รองรับไฟล์แบบกระจาย การสนับสนุนสำหรับ SEEK_DATA / SEEK_HOLE จะกำหนดรหัสสนับสนุนสำหรับระบบไฟล์ทั้งหมด วิธีการเหล่านี้อาจไม่ทำในสิ่งที่คุณคาดหวัง ดูblogs.sun.com/bonwick/entry/seek_hole_and_seek_dataสำหรับข้อมูลเพิ่มเติมจากฝั่งซัน
BillThor

1
ระบบไฟล์ไม่จำเป็นต้องสนับสนุนอะไรกับอินเตอร์เฟส lseek () เคอร์เนล witelists โมดูลระบบไฟล์ที่รองรับ SEEK_DATA / SEEK_HOLE ผ่านคุณสมบัติโมดูล สิ่งนี้อยู่ใน manpage และบล็อกที่เชื่อมโยง: "สำหรับระบบไฟล์ที่ไม่ได้ให้ข้อมูลเกี่ยวกับช่องโหว่ไฟล์จะถูกแสดงเป็นพื้นที่ข้อมูลทั้งหมดหนึ่งส่วน"
Juliano

@Juliano ยังคงต้องใช้เคอร์เนล mods เช่นเดียวกับการเปลี่ยนแปลง lseek ตามรายการบล็อกนี้เป็นฟังก์ชันการทำงานที่ค่อนข้างใหม่ที่ Sun เพื่อให้สามารถใช้งานได้รหัสระบบไฟล์จำเป็นต้องได้รับการแก้ไขเช่นกัน แน่นอนว่ามันจะต้องมีการเปลี่ยนแปลงในทุกระบบไฟล์ที่สนับสนุนไฟล์กระจัดกระจายเพื่อให้เคอร์เนล hooks
BillThor
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.