พื้นที่ว่างจะถูกปลดปล่อยโดยลบ subvolume btrfs?


11

มีวิธีใดในการคำนวณว่าฉันจะเพิ่มพื้นที่ว่างถ้าฉันจะลบหนึ่งหรือหลาย ๆ เล่มย่อยบนดิสก์ Btrfs (โดยไม่ต้องลบออกจริง ๆ )? ฉันรู้ว่ามี"ปัจจุบันไม่มีรหัสที่จะทำการคำนวณให้คุณ"แต่คุณจะทำอย่างไร

ฉันยังสงสัยว่าทำไมพวกเขาถึงบอกว่ามันช้ามาก? ทั้งที่จริงแล้วการลบ subvolume และถามเกี่ยวกับพื้นที่ว่างนั้นเร็วมากในประสบการณ์ของฉันทำไมการทำสิ่งเดียวกันโดยสมมติฐานนั้นช้ากว่ามาก?


2
ฉันหวังว่าคุณจะรู้ว่าbtrfs.wiki.kernel.org/index.php/Btrfs_mailing_listอาจเป็นสถานที่ที่ดีกว่าในการถามคำถามเกี่ยวกับการทำงานภายในของ btrfs (หรือองค์ประกอบเคอร์เนลอื่น ๆ ) หากคุณได้รับคำตอบกรุณาโพสต์ไว้ที่นี่เช่นกัน ฉันอยากรู้เกี่ยวกับคำตอบเอง
Adam Ryczkowski

1
คุณพูดว่า "ทั้งสองลบ subvolume จริง ๆ และถามเกี่ยวกับพื้นที่ว่างนั้นเร็วมากในประสบการณ์ของฉัน" เมื่อคุณลบ subvolume มันเป็นแค่การทำเครื่องหมาย subvolume เพื่อลบมันเท่านั้นจริง ๆ แล้วปล่อยบล็อกเหล่านั้นเมื่อถึงเวลา (ซึ่งเป็นสิ่งที่ข้อความ 'ไม่กระทำ' หมายถึงเมื่อคุณทำ) ดังนั้นไม่ลบ จำเป็นต้องเร็วมาก
etskinner

คำตอบ:


3

คุณควรดู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 อื่น ๆ

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