เหตุใด ext filesystems จึงไม่เติมเต็มทั้งอุปกรณ์


8

ฉันเพิ่งสังเกตเห็นว่ามีระบบไฟล์จำนวนมากเกิน {2,3,4} ตัวที่ฉันพยายามสร้างบน HDD 500G ไม่ได้ใช้พื้นที่ว่างทั้งหมด (466G) ฉันยังลอง reiser3, xfs, jfs, btrfs และแม้แต่ vfat พวกเขาทั้งหมดสร้าง fs ขนาด 466G (ตามที่แสดงโดยdf -h ) อย่างไรก็ตาม ext * สร้าง fs ของ 459G การปิดใช้งานบล็อกที่สงวนไว้จะเพิ่มพื้นที่ว่างให้กับผู้ใช้ แต่ขนาดของ fs ยังคงเป็น 459G

เช่นเดียวกับ HDD 1Tb: ผู้สร้างใหม่ 932G, 917G ext4

แล้วความแตกต่าง 1.5% นี้คืออะไร? ทำไมมันเกิดขึ้นและมีวิธีทำ ext เติมปริมาตรเต็ม?

UPD: การทดสอบทั้งหมดทำในเครื่องเดียวกันบน HDD เดียวกันและอื่น ๆ มันไม่สำคัญว่า 466G นั้นแตกต่างจากการตลาด 500G อย่างไร ปัญหามันแตกต่างกันสำหรับ FS ที่แตกต่างกัน

เกี่ยวกับ df - แสดงขนาดรวม FS, ขนาดที่ใช้และพื้นที่ว่าง ในกรณีนี้ฉันมี:

สำหรับ reiserfs:

/ dev / sda1 466G 33M 466G 1% / mnt

สำหรับ ext4:

/ dev / sda1 459G 198M 435G 1% / mnt

ถ้าฉันปิดการจองบล็อกรูท 435G จะเปลี่ยนเป็น 459G - ขนาดเต็มของ fs (ลบ 198M) แต่ fs นั้นยังคงเป็น 459G สำหรับ ext4 และ 466G สำหรับ reiser!

UPD2: การเติมวอลุ่มด้วยข้อมูลจริงผ่าน dd:

ReiserFS:

fs: ~ # dd if = / dev / zero of = / mnt / 1
dd: записьв« / mnt / 1 »: Наустройствекончилосьместо
975702649 + 0 записейсчитано
975702648 + 0 записейнаписано
 скопировано 499559755776 байт (500 GB), 8705,61 c, 57,4 MB / c

ปิด ext2 โดยปิดการจองบล็อก (mke2fs -m 0):

fs: ~ # dd if = / dev / zero of = / mnt / 1
dd: записьв« / mnt / 1 »: Наустройствекончилосьместо
960356153 + 0 записейсчитано
960356152 + 0 записейнаписано
 скопировано 491702349824 байта (492 GB), 8870,01 c, 55,4 MB / c

ขออภัยภาษารัสเซีย แต่ฉันเรียกใช้ในภาษาเริ่มต้นและทำซ้ำนานเกินไป มันไม่สำคัญว่า dd output นั้นชัดเจน

ดังนั้นปรากฎว่า mke2fs สร้างระบบไฟล์ที่เล็กกว่าจริงกว่า mkfs อื่น ๆ


2
มีค่าใช้จ่ายจำนวนหนึ่งกับ FS ทุกตัว ... ฉันไม่รู้ว่าจะให้คุณเข้าถึงพื้นที่ทางกายภาพทั้งหมดที่มีอยู่บนดิสก์ได้หรือไม่
prodigitalson

เราขอแนะนำให้คุณเปลี่ยนชื่อที่แสดงและใส่สิ่งที่ดูเหมือนจะเป็นบล็อกของคุณในฟิลด์เว็บไซต์ของโปรไฟล์ของคุณเพื่อให้โฆษณาน้อยลงอย่างโจ๋งครึ่ม
Hello71

1
สวัสดี 71 ขอบคุณสำหรับคำแนะนำ เว็บไซต์ไม่สำคัญจริงๆมันเป็นเพียงสำหรับ openid
Ineu

สำหรับบันทึกย่อในอนาคตหากคุณต้องการให้โปรแกรมส่งออกเป็นภาษาอังกฤษอย่างรวดเร็วให้ใช้LANG=C fooหรือLC_ALL=C foo
Alan Pearce

อลันใช่แล้วขอบคุณ อาจเป็น LANG = หรือ LANG = POSIX แต่อย่างที่ฉันบอกว่ากระบวนการนี้ใช้เวลานานมากดังนั้นการรันใหม่ด้วยโลแคลที่ต่างกันเพียงสองบรรทัดนั้นไม่มีเหตุผล :) ในทั้งสองกรณีมันพิสูจน์ปัญหากับขนาด FS สำหรับ ext2 :(
Ineu

คำตอบ:


19

มีสองเหตุผลนี้เป็นจริง

ประการแรกด้วยเหตุผลบางอย่างหรือผู้เขียนระบบปฏิบัติการอื่นยังคงรายงานพื้นที่ว่างในแง่ของระบบฐาน 2 และผู้ผลิตฮาร์ดไดรฟ์รายงานพื้นที่ว่างในแง่ของระบบฐาน 10 ตัวอย่างเช่นตัวเขียนระบบปฏิบัติการจะเรียก 1024 ไบต์ (2 ^ 10 ไบต์) ต่อกิโลไบต์และการผลิตฮาร์ดไดรฟ์จะเรียก 1,000 ไบต์ต่อกิโลไบต์ ความแตกต่างนี้ค่อนข้างเล็กน้อยสำหรับกิโลไบต์ แต่เมื่อคุณสูงถึงเทราไบต์แล้วมันสำคัญมาก นักเขียนระบบปฏิบัติการจะโทรหา 1099511627776 ไบต์ (2 ^ 40 ไบต์) หนึ่งเทราไบต์และผู้ผลิตฮาร์ดไดรฟ์จะเรียก 1000000000000 ไบต์ต่อเทราไบต์

วิธีการพูดคุยเกี่ยวกับขนาดที่แตกต่างกันเหล่านี้มักนำไปสู่ความสับสนอย่างมาก

มีการสนับสนุน spottily เป็นคำนำหน้า ISO สำหรับขนาดไบนารี อินเทอร์เฟซผู้ใช้ที่ได้รับการออกแบบโดยคำนึงถึงคำนำหน้าใหม่จะแสดง TiB, GiB (หรือมากกว่าปกติ XiB) เมื่อแสดงขนาดด้วยระบบนำหน้าฐาน 2

ประการที่สอง df -h รายงานว่ามีพื้นที่ว่างสำหรับการใช้งานของคุณเท่าใด ระบบไฟล์ทั้งหมดต้องเขียนข้อมูลแม่บ้านเพื่อติดตามสิ่งต่าง ๆ สำหรับคุณ ข้อมูลนี้ใช้พื้นที่ว่างบนไดรฟ์ของคุณ โดยทั่วไปไม่มาก แต่บางคน นั่นก็อธิบายถึงการสูญเสียที่คุณเห็นอยู่

หลังจากที่คุณแก้ไขโพสต์ของคุณเพื่อให้ชัดเจนว่าไม่มีคำตอบของฉันตอบคำถามของคุณจริง ๆ ฉันจะรับแทงที่ตอบคำถามของคุณ ...

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

ตัวอย่างเช่น ext2 แบ่งดิสก์ขึ้นเป็นกลุ่มทรงกระบอก จากนั้นจะจัดสรรพื้นที่ในแต่ละกลุ่มทรงกระบอกล่วงหน้าสำหรับ inodes และแผนที่ว่าง ext3 ทำสิ่งเดียวกันเพราะโดยพื้นฐานแล้วมันคือ ext2 + การทำเจอร์นัล ext4 ก็ทำสิ่งเดียวกันนี้เหมือนกันเพราะมันเป็นการดัดแปลง ext3 ที่ตรงไปตรงมา และเนื่องจากค่าใช้จ่าย meta-data นี้ได้รับการแก้ไขในการสร้างระบบไฟล์หรือปรับขนาดจึงไม่มีการรายงานว่าเป็นพื้นที่ 'ใช้' ฉันสงสัยว่าเป็นเช่นนี้เพราะเมตาดาต้ากลุ่มไส้กุญแจอยู่ในตำแหน่งคงที่บนดิสก์ดังนั้นจึงบอกเป็นนัย ๆ ว่ามีการใช้งานและดังนั้นจึงไม่ได้ทำเครื่องหมายปิดหรือรวมอยู่ในแผนที่พื้นที่ว่าง

แต่ reiserfs ไม่ได้จัดสรรข้อมูลเมตาใด ๆ ล่วงหน้า มันไม่มีข้อ จำกัด inode ที่ถูกแก้ไขในการสร้างระบบไฟล์เพราะมันจะจัดสรร inode ทั้งหมดแบบ on-the-fly เช่นเดียวกับบล็อกข้อมูล อย่างน้อยที่สุดมันต้องการโครงสร้างบางอย่างที่อธิบายไดเรกทอรีรูทและแผนที่พื้นที่ว่างของบางประเภท ดังนั้นจึงใช้พื้นที่น้อยลงเมื่อไม่มีอะไรในนั้น

แต่นั่นหมายความว่า reiserfs จะใช้พื้นที่เพิ่มขึ้นเมื่อคุณเพิ่มไฟล์เพราะจะทำการจัดสรร meta-data (เช่น inodes) รวมถึงพื้นที่ข้อมูลจริงสำหรับไฟล์

ฉันไม่รู้ว่า jfs และ btrfs ติดตามการใช้พื้นที่ meta-data ได้อย่างไร แต่ฉันสงสัยว่าพวกเขาติดตามมากกว่าที่ reiserfs ทำ โดยเฉพาะอย่างยิ่ง vfat ไม่มีแนวคิด inode เลย แผนผังพื้นที่ว่าง (ขนาดของมันถูกแก้ไขที่ระบบไฟล์สร้าง (ตาราง FAT ที่น่าอับอาย)) เก็บข้อมูลส่วนใหญ่ที่ไอโหนดจะทำและรายการไดเรกทอรี (ซึ่งจัดสรรแบบไดนามิก) จะจัดเก็บส่วนที่เหลือ


2
มีมาตรฐาน ISO สำหรับสิ่งนั้น: en.wikipedia.org/wiki/Binary_prefix
Bobby

@Bobby - ใช่แล้วมันเริ่มปรากฏในจอแสดงผลแล้ว ฉันจะเพิ่มเข้าไปในคำตอบของฉัน ขอบคุณ!
Omnifarious

8

เช่นเดียวกับประเด็นที่ Omnifarious กล่าวถึงด้วย ext2 / 3/4 จะมีการสำรองพื้นที่จำนวนหนึ่งไว้สำหรับรูท - พื้นที่สงวนนี้จะไม่แสดงในเอาต์พุตของ df

ตัวอย่างเช่นการสร้างระบบไฟล์ขนาดเล็ก (~ 100mb) ด้วยตัวเลือกเริ่มต้นโดยใช้ ext2 แทนที่จะเป็น 3 หรือ 4 เพื่อละเว้นพื้นที่ที่จะถูกนำมาใช้โดยวารสาร:

swann:/tmp# dd if=/dev/zero of=./loop.fs bs=10240 count=10240
swann:/tmp# mkfs.ext2 loop.fs
swann:/tmp# mkdir loop
swann:/tmp# mount -text2 -oloop loop.fs loop
swann:/tmp# df loop
Filesystem           1K-blocks      Used Available Use% Mounted on
/tmp/loop.fs             99150      1550     92480   2% /tmp/loop

tweaking บล็อกลิขสิทธิ์ตัวเลือก ( tune2fs's -mตัวเลือกชุดบล็อกที่สงวนไว้เป็นเปอร์เซ็นต์และ-rตัวเลือกชุดบล็อกที่สงวนไว้เป็นจำนวนตรงของบล็อก):

swann:/tmp# umount loop
swann:/tmp# tune2fs -m 25 loop.fs
swann:/tmp# mount -text2 -oloop loop.fs loop
swann:/tmp# df loop
Filesystem           1K-blocks      Used Available Use% Mounted on
/tmp/loop.fs             99150      1550     72000   3% /tmp/loop

swann:/tmp# umount loop
swann:/tmp# tune2fs -m 0 loop.fs
swann:/tmp# mount -text2 -oloop loop.fs loop
swann:/tmp# df loop
Filesystem           1K-blocks      Used Available Use% Mounted on
/tmp/loop.fs             99150      1550     97600   2% /tmp/loop

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

โปรดทราบว่าtune2fsแม้ว่าชื่อจะเกี่ยวข้องกับระบบไฟล์ ext3 และ ext4 เช่นเดียวกับ ext2


ขอบคุณสำหรับคำตอบ. ไม่มันไม่เกี่ยวกับบล็อคที่สงวนไว้ อัปเดตคำถาม
Ineu

0

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

นี่คือคำอธิบายสำหรับ ext2และคุณอาจพบสิ่งที่คล้ายกันสำหรับ reiserfs แต่ฉันไม่เคยใช้มันเลยฉันไม่มีเลย


2
Reiserfs และ btrfs นั้นผิดปกติเพราะข้อมูลการทำบัญชีเกือบทั้งหมดได้รับการจัดสรรแบบไดนามิก เฉพาะสำเนา superblock และบิตแมปพื้นที่ว่างเท่านั้นที่จัดสรรไว้ในการตั้งค่าระบบไฟล์ แน่นอนนี่หมายความว่าปริมาณที่แท้จริงของพื้นที่ว่างสำหรับข้อมูลนั้นน้อยกว่าที่กำหนดสำหรับระบบไฟล์เหล่านี้
Omnifarious

@Omnifarious +1 - ดังนั้นถ้าฉันเข้าใจดีใน reiserfs และ btrfs พื้นที่ที่มีอยู่รายงานนั้นใหญ่กว่าตอนเริ่มต้น แต่จะใช้ทั้งกับข้อมูลและข้อมูลการทำบัญชีแทนข้อมูลเท่านั้นใช่ไหม?
เรน

@ laurent-rpnet - ใช่ถูกต้อง ในกรณีของ btrfs มันน่าสนใจยิ่งขึ้น btrfs สามารถใช้งาน RAID ในแต่ละไฟล์ได้ดังนั้นการรายงานพื้นที่ว่างที่มีอยู่นั้นทำได้ยากยิ่งขึ้นเนื่องจากไม่สามารถคิดได้ว่าจะมีพื้นที่เพิ่มเติมจำนวนหนึ่งที่ใช้ต่อบล็อกที่ใช้สำหรับข้อมูล นอกจากนี้ยังอนุญาตให้สำเนา COW ราคาถูกมากดังนั้นการเขียนบล็อกที่อยู่ตรงกลางของไฟล์ที่มีอยู่อาจจัดสรรพื้นที่
รอบรู้

แล้ว XFS, JFS และ VFAT ล่ะ? มันยากที่จะเชื่อ fs ดั้งเดิมเช่นนี้เนื่องจาก FAT32 นั้นมีไดนามิกมากกว่า ext4
Ineu

FAT32 ยังมีบล็อกที่สงวนไว้สำหรับองค์กร ความหมายของไดนามิกที่นี่คืออะไร? หากการจัดสรร Dynamyc นั้น FAT32 ไม่มีการจัดสรรแบบไดนามิกเช่นต่อและไม่แสดงบล็อกทั้งหมดบนดิสก์ที่มีอยู่สำหรับข้อมูล นอกจากนี้ยังมีข้อ จำกัด บางอย่างเกี่ยวกับระบบไฟล์ ext4 ที่ไม่มีระบบการอนุญาตขณะที่ ext4 มีสิทธิ์ POSIX และ ACLs และขนาดไฟล์สูงสุดคือ 4GB บน FAT32 และ 2TB ใน ext3 (ไม่แน่ใจเกี่ยวกับ ext4 แต่อย่างน้อยควรเหมือนกัน)
เรน
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.