Berapa banyak ruang yang akan dibebaskan dengan menghapus subvolume btrfs?

11

Apakah ada cara untuk menghitung berapa banyak ruang yang akan saya bebaskan jika saya akan menghapus satu (atau beberapa) subvolume pada disk Btrfs (tanpa benar-benar menghapusnya)? Saya tahu bahwa "saat ini tidak ada kode yang akan melakukan perhitungan untuk Anda" , tetapi bagaimana Anda melakukannya?

Saya juga bertanya-tanya mengapa mereka mengatakan bahwa ini akan sangat lambat? Keduanya benar-benar menghapus subvolume dan bertanya tentang ruang kosong sangat cepat dalam pengalaman saya, mengapa melakukan hal yang sama secara hipotesis jauh lebih lambat?

Hjulle
sumber
2
Saya harap Anda tahu, bahwa btrfs.wiki.kernel.org/index.php/Btrfs_mailing_list mungkin merupakan tempat yang lebih baik untuk mengajukan pertanyaan tentang cara kerja bagian dalam btrfs (atau komponen kernel lainnya). Jika Anda mendapatkan jawabannya, silakan kirim di sini juga. Saya ingin tahu tentang jawabannya sendiri.
Adam Ryczkowski
1
Anda mengatakan "Keduanya benar-benar menghapus subvolume dan bertanya tentang ruang kosong sangat cepat menurut pengalaman saya". Ketika Anda menghapus subvolume, itu benar-benar hanya menandai subvolume itu untuk dihapus, itu hanya benar-benar membebaskan blok-blok itu ketika ada waktu (yang artinya pesan 'tidak ada komitmen' ketika Anda melakukannya), jadi tidak, menghapus tidak tentu sangat cepat.
etskinner

Jawaban:

3

Anda harus melihat btrfs quotadan btrfs qgroups(grup kuota).

Pada dasarnya qgroupsmelakukan persis apa yang Anda minta, mereka melacak berapa banyak ruang yang dialokasikan oleh subvolume. Untuk mengaktifkan qgroupfungsionalitas untuk btrfssistem file, Anda harus melakukannya

# btrfs quota enable /path/to/btrfs/filesystem

Namun, sebelum Anda melakukan ini, diperingatkan bahwa ini memicu komputasi ulang qgroupdata yang lengkap yang akan memakan waktu terutama untuk sistem file besar dengan banyak subvolume. Proses ini berjalan secara tidak sinkron di latar belakang. Anda sudah dapat memeriksa status qgroupsdengan

# btrfs qgroup show /path/to/btrfs/filesystem

Ini akan memberi Anda beberapa output seperti ini:

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

(Peringatan di baris pertama ada selama proses pemindaian ulang masih berjalan.)

Btrfs secara otomatis membuat qgroupuntuk setiap subvolume. Dalam hal ini ada tiga subvolume dengan ID subvolume 4881, 7990, dan 8400. Bagian sebelum garis miring adalah tingkat qgroup. Setiap subvolume qgroupada di level 0. Selain itu ada khusus qgroupdi level 0 yang selalu memiliki ID 5 dan sesuai dengan root dari sistem file btrfs.

Untuk setiap qgroupoutput di atas menunjukkan berapa banyak ruang yang dirujuk olehnya. Itu berarti bahwa subvolume yang sesuai berisi file yang ukuran totalnya sama dengan angka yang ditunjukkan.

Namun, karena snapshot dan sifat copy-on-write subvolume btrfs dapat berbagi file. Ini berarti bahwa konten (atau sebenarnya luasan) file dapat dirujuk oleh lebih dari satu subvolume. Ini diungkapkan oleh angka kedua yang menunjukkan seberapa banyak ruang yang dialokasikan secara eksklusif oleh setiap subvolume dan tidak dibagi dengan subvolume lainnya. Jika Anda menghapus subvolume ini adalah ruang yang benar-benar akan dibebaskan.

Jika Anda ingin mengetahui berapa banyak ruang yang akan dibebaskan jika Anda menghapus beberapa subvolume, Anda dapat menggunakan level yang disebutkan di atas. qgroupsyang diselenggarakan dalam hirarki dan kelompok pada tingkat atas (lebih tinggi dari 0) mengumpulkan informasi dari tingkat yang lebih rendah.

Jadi, untuk mengetahui berapa banyak ruang yang akan dibebaskan jika subvolume 4881 dan 7990 (dalam contoh di atas) akan dihapus buat yang baru qgroup(sewenang-wenang dengan ID 0, tetapi Anda dapat memilih apa pun yang Anda suka di sini) pada level 1 dengan

# btrfs qgroup create 1/0 /path/to/btrfs/filesystem

Kemudian tetapkan yang baru dibuat qgroupsebagai induk ke qgroupssubvolume yang ingin Anda hapus

# btrfs qgroup assign 0/4881 1/0 /path/to/btrfs/filesystem
# btrfs qgroup assign 0/7990 1/0 /path/to/btrfs/filesystem

Ini akan memicu pemindaian ulang lain dari informasi kuota yang mungkin memakan waktu cukup lama. Jika sudah selesai dan Anda sekarang masalah

# btrfs qgroup show -p /path/to/btrfs/filesystem

Anda mendapatkan output seperti ini:

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 ---

(Saya menambahkan -pbendera untuk menambahkan parentkolom ke output yang menunjukkan hubungan induk / anak dari qgroups.)

Sekarang baris dengan qgroup 1/0memberi tahu Anda berapa banyak ruang yang direferensikan oleh kedua subvolume yang ingin Anda hapus dan, yang lebih penting, ia memberi tahu Anda berapa banyak ruang yang dialokasikan oleh mereka secara eksklusif . Ini adalah jumlah ruang yang akan dibebaskan jika Anda menghapus kedua subvolume.

Saya juga bertanya-tanya mengapa mereka mengatakan itu akan sangat lambat?

Ini karena sifat copy-on-write dari btrf bersama dengan snapshot. Jika Anda membuat snapshot dalam btrfs (biasanya) semua data aktual dalam subvolume yang baru dibuat yang berisi snapshot dibagi dengan sumber snapshot. Hanya ketika sebuah file diubah atau diganti dalam sumber yang menunjukkan konten yang berbeda (luasan). Ini membuatnya sangat sulit untuk menilai berapa banyak ruang sebenarnya akan dibebaskan jika subvolume dihapus karena Anda harus memperhitungkan semua ruang yang dibagi dengan subvolume lainnya.

Erki der Loony
sumber