เกี่ยวกับขนาดไฟล์และการใช้งานดิสก์ใน ext3


3

ฉันมีไฟล์หลายชุด ไฟล์แต่ละไฟล์ใช้เวลา 2390170KiB ls -lk และ du --apparent-size -k.

ปัญหาคือว่า du -k รายงานขนาดแตกต่างกันสำหรับแต่ละสำเนา: 2389824, 2392512, 2392512 และ 2390336

ฉันคาดว่าการใช้งานดิสก์ควรเป็น 2390172KiB (ขนาดของจำนวนบล็อกขั้นต่ำ (597543) ที่ไฟล์พอดี

เหตุใดแต่ละไฟล์จึงมีการใช้ดิสก์ที่แตกต่างกัน

ฉันยังได้เห็นว่าหนึ่งในสำเนาใช้ 2389824KiB แต่ขนาดไฟล์ใหญ่กว่า 346KiB: 2390170 สิ่งนี้มีความหมายได้อย่างไร

PD: ไฟล์ทั้งหมดอยู่ในระบบไฟล์ ext3 เดียวกัน ขนาดบล็อกระบบไฟล์คือ 4096 ไฟล์ทั้งหมดมีแฮชเดียวกัน

ปรับปรุง: จากความคิดเห็นที่:

although the apparent size is usually smaller, it may be larger due to holes in ('sparse') files, internal fragmentation, indirect blocks, and the like

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

ฉันได้สังเกตเห็นว่า cp --sparse=always สามารถสร้างไฟล์แบบกระจายได้จากไฟล์แบบไม่กระจาย cp --sparse=always ผลลัพธ์ในไฟล์ที่ใช้ 2390336KiB cp --sparse=never ผลลัพธ์ในไฟล์ที่ใช้ 2392512KiB

ดังนั้นฉันจะเดาว่าการใช้ 2389824KiB จากหนึ่งในสำเนาเกิดจากการใช้อัลกอริทึมกระจัดกระจาย ...

ไฟล์ต้นฉบับถูกคัดลอกจากเครื่อง windows ผ่าน sftp หรือ samba และฉันคิดว่าไฟล์ 2389824KiB เป็นสำเนาของมัน แต่ฉันจำไม่ได้ว่าฉันทำมันไปได้อย่างไร (ฉันเดาด้วย cp แต่ฉันไม่ แน่นอน)

คำตอบ:


3

จาก man du:

--apparent ขนาด
พิมพ์ขนาดที่ชัดเจนมากกว่าการใช้ดิสก์ แม้ว่า                 ขนาดที่เห็นได้ชัดมักจะเล็กกว่ามันอาจจะใหญ่กว่าเนื่องจากรู                 ใน ('กระจัดกระจาย) ไฟล์, การกระจายตัวภายใน, บล็อกทางอ้อม,                 และไม่ชอบ

จาก info du:

'--apparent ขนาด'
พิมพ์ขนาดที่ชัดเจนมากกว่าการใช้ดิสก์ ขนาดที่ชัดเจน        ของไฟล์คือจำนวนไบต์ที่รายงานโดย wc -c ในปกติ        ไฟล์หรือมากกว่าโดยทั่วไป ls -l --block-size=1 หรือ stat --format=%s. ตัวอย่างเช่นไฟล์ที่มีคำว่า 'สวนสัตว์' ด้วย        แน่นอนว่าจะไม่มีการขึ้นบรรทัดใหม่มีขนาดที่ชัดเจนเป็น 3 เช่น        ไฟล์ขนาดเล็กอาจต้องการที่ใดก็ได้ตั้งแต่ 0 ถึง 16 KiB หรือมากกว่าของดิสก์        พื้นที่ขึ้นอยู่กับประเภทและการกำหนดค่าของระบบไฟล์        ไฟล์ที่อยู่ อย่างไรก็ตามไฟล์ที่กระจัดกระจายสร้างขึ้นด้วย        คำสั่งนี้:

      dd bs=1 seek=2GiB if=/dev/null of=big

มีขนาดที่ชัดเจนของ 2 GiB แต่ในระบบที่ทันสมัยที่สุดมัน        ใช้พื้นที่ดิสก์เกือบจะไม่มีจริง

[เน้นเหมือง]


1

มีสองสิ่งที่เกิดขึ้นที่นี่ - ไฟล์ที่มีขนาดใหญ่กว่าที่คุณคาดว่าจะเกิดขึ้นเนื่องจากข้อมูลเมตาของระบบไฟล์ที่จัดเก็บที่นับรวมขนาดของไฟล์ ไฟล์ที่มีขนาดเล็กกว่าที่คุณคาดว่าจะเกิดขึ้นเนื่องจากคุณสมบัติ UNIX ชื่อ "sparse files"

ไฟล์ขนาดใหญ่

สำหรับ ext2 / ext3 การใช้งานบนดิสก์ของไฟล์รวมถึงพื้นที่ที่ใช้โดยโครงสร้างระบบไฟล์ที่ติดตามตำแหน่งที่บล็อกข้อมูลอยู่บนดิสก์ ลองดูที่ โครงสร้างไอโหนด Ext2 - inode เป็นโครงสร้างข้อมูลที่คอยติดตามการอนุญาตขนาดไฟล์และอื่น ๆ รวมถึงตำแหน่งที่บล็อกข้อมูลอยู่บนดิสก์ ไอโหนดไม่นับรวมต่อการใช้งาน (มันถูกจัดสรรล่วงหน้าเมื่อสร้างระบบไฟล์) แต่บล็อกทางอ้อมคือ

การคำนวณ

ดังนั้นไฟล์ที่มีขนาด 2390172kB ของคุณจะใช้ข้อมูล 597543 บล็อกเหมือนที่คุณพูด ตำแหน่งของ 12 บล็อกเหล่านั้นจะถูกเก็บไว้ในไอโหนดดังนั้นมันจึงว่าง ตำแหน่งที่ 13 ที่เก็บไว้ใน inode สำหรับบล็อกทางอ้อม - บล็อกที่จัดสรรใหม่ที่เก็บตำแหน่งของ 1024 data block นั่นคือการเพิ่ม 1 บล็อกไปยังขนาดไฟล์ของคุณและปล่อยให้เรามี 596507 บล็อก

ตัวชี้ตำแหน่งที่ 14 ในไอโหนดนั้นมีไว้สำหรับบล็อกทางอ้อมสองเท่า - บล็อกที่จัดสรรซึ่งมีที่ว่างสำหรับตำแหน่งของบล็อกทางอ้อม 1024 บล็อก 596507/1024 ~ = 582.52 ดังนั้นเราจะต้องมีบล็อคทางอ้อม 583 อันในการเก็บบล็อคข้อมูลส่วนที่เหลือรวมกับบล็อกอีกสองทางอ้อม

ดังนั้น:

    1 (indirect from inode)
+   1 (doubly-indirect from inode)
+ 583 (indirect from doubly-indirect)
-----
= 585
= 598128 - 597543

และนั่นคือขนาด 2392512 (= 598128 * 4)

ไฟล์เล็กลง

ฉันสงสัยว่าไฟล์ที่เล็กกว่า (2389824kB) เป็นไฟล์แบบกระจายซึ่งหมายความว่าบางส่วนของบล็อกไม่เคยเขียนและไม่ได้ถูกจัดสรร - บล็อกที่ไม่ได้ถูกจัดสรรจะถูกกำหนดเป็นศูนย์ ดูคำตอบของ Dennis Williamson สำหรับการอ้างอิง ไฟล์ที่กระจัดกระจายสามารถเกิดขึ้นได้หากการเขียนโปรแกรมย้ายตัวชี้ไฟล์ไปรอบ ๆ และเขียนไปยังตำแหน่งต่าง ๆ ในไฟล์แทนที่จะเขียนไฟล์ตั้งแต่ต้นจนจบ สำหรับตัวอย่างสุดขีดของไฟล์แบบกระจายลองทำสิ่งต่อไปนี้:

du if=/dev/zero of=my_sparse_file bs=1000 count=1 seek=1000000

ถ้าคุณ ls ไฟล์ผลลัพธ์ขนาดที่ชัดเจนจะเท่ากับ 1000001000 อย่างไรก็ตามเนื่องจากมีการเขียนเพียง 1,000 ไบต์จึงใช้เพียงหนึ่งบล็อกข้อมูลเท่านั้นดังนั้นจึงมีการจัดสรรบล็อกข้อมูลเพียงหนึ่งบล็อกเท่านั้น du จะรายงาน 12kB ที่ใช้ - หนึ่งบล็อก 4k สำหรับข้อมูลหนึ่งบล็อกสำหรับบล็อกทวีคูณโดยอ้อมและบล็อกสำหรับบล็อกทางอ้อมบล็อกเดียวซึ่งบล็อกบล็อกที่ทำโดยอ้อมทวีคูณด้วยตัวชี้ที่ 976 ไม่มีการบล็อกส่วนที่เหลือของไฟล์ไม่ว่าจะเป็นข้อมูลหรือข้อมูลเมตา

เมื่อบล็อกทวีคูณทางอ้อมหมดระบบไฟล์จะเริ่มใช้บล็อกทางอ้อม triply ไฟล์ของคุณจะมีขนาดระบบไฟล์ ext3 สูงสุดที่เป็นไปได้ก่อนที่จะเต็มขนาดนั้น

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