คุณควรดูbtrfs quota
และbtrfs qgroups
(กลุ่มโควต้า)
โดยทั่วไปqgroups
ทำตามที่คุณร้องขอพวกเขาติดตามจำนวนพื้นที่ที่จัดสรรโดย subvolumes เพื่อเปิดใช้qgroup
งานฟังก์ชั่นสำหรับbtrfs
ระบบไฟล์ที่คุณต้องทำ
# btrfs quota enable /path/to/btrfs/filesystem
อย่างไรก็ตามก่อนที่คุณจะทำสิ่งนี้จะได้รับการเตือนว่าสิ่งนี้จะก่อให้เกิดการคำนวณใหม่อีกครั้งของqgroup
ข้อมูลซึ่งจะใช้เวลาพอสมควรโดยเฉพาะอย่างยิ่งสำหรับระบบไฟล์ขนาดใหญ่ที่มีไดรฟ์ย่อยมากมาย กระบวนการนี้ทำงานแบบอะซิงโครนัสในพื้นหลัง คุณสามารถตรวจสอบสถานะของqgroups
ด้วย
# btrfs qgroup show /path/to/btrfs/filesystem
สิ่งนี้จะให้ผลลัพธ์บางอย่างดังนี้:
WARNING: rescan is running, qgroup data may be incorrect
qgroupid rfer excl
-------- ---- ----
0/5 843.69GiB 61.91MiB
0/4881 811.06GiB 9.34GiB
0/7990 867.32GiB 329.91MiB
0/8400 867.17GiB 37.64MiB
(คำเตือนในบรรทัดแรกมีอยู่ตราบเท่าที่ rescan ยังทำงานอยู่)
Btrfs สร้าง a qgroup
สำหรับแต่ละ subvolume โดยอัตโนมัติ ในกรณีนี้มีสาม subvolumes มีรหัส subvolume 4881, 7990 และ 8400. qgroup
ส่วนที่ก่อนทับเป็นระดับของการที่ แต่ละ subvolume qgroup
อยู่ในระดับ 0 นอกจากนี้ยังมีความพิเศษqgroup
ในระดับ 0 ที่มักจะมี ID 5 และสอดคล้องกับรูทของระบบไฟล์ btrfs
สำหรับแต่ละqgroup
เอาต์พุตข้างต้นแสดงจำนวนพื้นที่ที่อ้างอิง นั่นหมายความว่า subvolume ที่สอดคล้องกันมีไฟล์ซึ่งขนาดทั้งหมดเท่ากับจำนวนที่แสดง
อย่างไรก็ตามเนื่องจากสแน็ปช็อตและลักษณะการคัดลอกเมื่อเขียนของไดรฟ์ย่อย btrfs อาจแชร์ไฟล์ ซึ่งหมายความว่าเนื้อหา (หรือที่จริงแล้วส่วนขยาย) ของไฟล์อาจถูกอ้างอิงโดยมากกว่าหนึ่งไดรฟ์ย่อย นี่คือตัวเลขที่สองซึ่งแสดงให้เห็นว่ามีการจัดสรรพื้นที่เฉพาะสำหรับแต่ละ subvolume และไม่ได้ใช้ร่วมกับ subvolume อื่น ๆ ในกรณีที่คุณลบ subvolume นี่เป็นพื้นที่ที่จะถูกปลดปล่อยอย่างแท้จริง
หากคุณต้องการทราบว่าจะมีพื้นที่ว่างเท่าใดหากคุณลบหลาย ๆ ไดรฟ์ย่อยคุณสามารถใช้ระดับดังกล่าวข้างต้น qgroups
ถูกจัดระเบียบในลำดับชั้นและกลุ่มในระดับบน (สูงกว่า 0) รวมข้อมูลของระดับล่าง
ดังนั้นเพื่อดูว่าจะมีพื้นที่ว่างเท่าใดถ้า subvolumes 4881 และ 7990 (ในตัวอย่างด้านบน) จะถูกลบสร้างใหม่qgroup
(โดยพลการด้วย ID 0 แต่คุณอาจเลือกสิ่งที่คุณต้องการที่นี่) ในระดับ 1 ด้วย
# btrfs qgroup create 1/0 /path/to/btrfs/filesystem
จากนั้นกำหนดค่าที่สร้างขึ้นใหม่qgroup
เป็นพาเรนต์ให้กับqgroups
ของไดรฟ์ย่อยที่คุณต้องการลบด้วย
# btrfs qgroup assign 0/4881 1/0 /path/to/btrfs/filesystem
# btrfs qgroup assign 0/7990 1/0 /path/to/btrfs/filesystem
วิธีนี้จะทริกเกอร์ข้อมูลโควต้าอีกครั้งซึ่งอาจใช้เวลาสักครู่ หากเสร็จแล้วและคุณออกตอนนี้
# btrfs qgroup show -p /path/to/btrfs/filesystem
คุณได้รับผลลัพธ์เช่นนี้:
qgroupid rfer excl parent
-------- ---- ---- ------
0/5 1.38TiB 2.51GiB ---
0/4881 1.11TiB 10.86GiB 1/0
0/7990 1.23TiB 502.41MiB 1/0
0/8400 1.34TiB 1.69GiB 1/0
1/0 1.51TiB 132.23GiB ---
(ฉันเพิ่ม-p
แฟล็กเพื่อเพิ่มparent
คอลัมน์ในเอาต์พุตซึ่งแสดงความสัมพันธ์พาเรนต์ / ลูกของqgroups
.)
ตอนนี้สอดคล้องกับqgroup
1/0
จะบอกคุณว่าพื้นที่มากถูกอ้างอิงโดย subvolumes ทั้งคุณต้องการลบและที่สำคัญกว่านั้นมันจะบอกคุณว่าพื้นที่ที่มีการจัดสรรโดยพวกเขาโดยเฉพาะ นี่คือจำนวนพื้นที่ที่จะเพิ่มถ้าคุณลบทั้งสองไดรฟ์ย่อย
ฉันยังสงสัยว่าทำไมพวกเขาถึงบอกว่ามันช้ามาก?
นี่เป็นเพราะลักษณะการคัดลอกเมื่อเขียนของ btrfs พร้อมกับสแน็ปช็อต หากคุณสร้างสแน็ปช็อตใน btrfs (โดยปกติ) ข้อมูลจริงทั้งหมดใน subvolume ที่สร้างขึ้นใหม่ที่มีสแน็ปช็อตจะถูกแชร์กับแหล่งที่มาของสแน็ปช็อต เฉพาะเมื่อไฟล์มีการเปลี่ยนแปลงหรือแทนที่ในแหล่งที่มันจะชี้ไปที่เนื้อหาที่แตกต่าง (ขอบเขต) สิ่งนี้ทำให้ยากมากที่จะประเมินว่าจะเพิ่มพื้นที่ว่างจริง ๆ เพียงใดถ้าลบ subvolume เนื่องจากคุณต้องคำนึงถึงพื้นที่ทั้งหมดที่แชร์กับ subvolumes อื่น ๆ