Quanto spazio verrebbe liberato rimuovendo un sottovolume btrfs?


11

Esiste un modo per calcolare la quantità di spazio che vorrei liberare se rimuovessi uno (o più) sottovolumi su un disco Btrfs (senza rimuoverli effettivamente)? So che non esiste "attualmente nessun codice che farà il calcolo per te" , ma come lo faresti?

Mi chiedo anche perché stiano dicendo che sarebbe così lento? Entrambi, in realtà, rimuovere un sottovolume e chiedere spazio libero è molto veloce nella mia esperienza, perché fare la stessa cosa ipoteticamente sarebbe molto più lento?


2
Spero che tu sappia che btrfs.wiki.kernel.org/index.php/Btrfs_mailing_list potrebbe essere un posto migliore per porre domande sul funzionamento interno di btrfs (o qualsiasi altro componente del kernel). Se ricevi la risposta, ti preghiamo di pubblicarla anche qui. Sono curioso della risposta da solo.
Adam Ryczkowski,

1
Dici "In realtà, sia rimuovere un sottovolume sia chiedere spazio libero è molto veloce nella mia esperienza". Quando si elimina un sottovolume, in realtà viene semplicemente contrassegnato quel sottovolume per l'eliminazione, in realtà si liberano quei blocchi solo quando arriva il tempo (che è ciò che significa il messaggio "no-commit" quando lo si fa), quindi no, l'eliminazione non lo è necessariamente molto veloce.
etskinner,

Risposte:


3

Dovresti dare un'occhiata a btrfs quotae btrfs qgroups(gruppi di quote).

Fondamentalmente qgroupsfanno esattamente quello che hai richiesto, tengono traccia di quanto spazio è allocato dai sottovolumi. Per abilitare la qgroupfunzionalità per un btrfsfilesystem è necessario

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

Tuttavia, prima di farlo, tieni presente che ciò innesca un completo ricalcolo dei qgroupdati che richiederà del tempo, specialmente per i filesystem di grandi dimensioni con molti sottovolumi. Questo processo viene eseguito in modo asincrono in background. Puoi già controllare lo stato di qgroupscon

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

Questo ti darà un output come questo:

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

(L'avviso nella prima riga è presente fino a quando il rescan è ancora in esecuzione.)

Btrfs crea automaticamente a qgroupper ogni sottovolume. In questo caso ci sono tre sottovolumi con ID sottovolume 4881, 7990 e 8400. La parte prima della barra è il livello di qgroup. Ogni sottovolume si qgrouptrova al livello 0. Inoltre c'è uno speciale qgroupal livello 0 che ha sempre ID 5 e corrisponde alla radice del filesystem btrfs.

Per ognuno qgroupl'output sopra mostra quanto spazio fa riferimento a esso. Ciò significa che il sottovolume corrispondente contiene file la cui dimensione totale è uguale al numero mostrato.

Tuttavia, a causa di istantanee e la natura copia su scrittura dei sottovolumi btrfs possono condividere file. Ciò significa che il contenuto (o effettivamente l'estensione) dei file può essere referenziato da più sottovolumi. Questo è espresso dal secondo numero che mostra quanto spazio è allocato esclusivamente da ciascun sottovolume e non è condiviso con nessun altro sottovolume. Nel caso in cui si elimini un sottovolume questo è lo spazio che verrà effettivamente liberato.

Se vuoi scoprire quanto spazio verrebbe liberato se elimini più sottovolumi, puoi usare i livelli sopra menzionati. qgroupssono organizzati in una gerarchia e gruppi di livello superiore (superiore a 0) aggregano le informazioni di livello inferiore.

Quindi, per scoprire quanto spazio verrebbe liberato se i sottovolumi 4881 e 7990 (nell'esempio precedente) venissero eliminati creane uno nuovo qgroup(arbitrariamente con ID 0, ma puoi scegliere quello che ti piace qui) al livello 1 con

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

Quindi assegnare il nuovo creato qgroupcome genitore al qgroupssottovolume che si desidera eliminare

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

Ciò attiverà un'altra nuova scansione delle informazioni sulla quota che potrebbe richiedere del tempo. Se è finito e ora emetti

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

ottieni un output come questo:

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

(Ho aggiunto il -pflag per aggiungere la parentcolonna all'output che mostra la relazione padre / figlio del qgroups.)

Ora la linea con qgroup 1/0ti dice quanto spazio fa riferimento a entrambi i sottovolumi che vuoi eliminare e, cosa ancora più importante, ti dice quanto spazio è allocato da loro esclusivamente . Questa è la quantità di spazio che verrà liberata se si eliminano entrambi i volumi secondari.

Mi chiedo anche perché stiano dicendo che sarebbe così lento?

Ciò è dovuto alla natura copy-on-write di btrfs insieme alle istantanee. Se si crea un'istantanea in btrfs (normalmente) tutti i dati effettivi nel sottovolume appena creato che contiene l'istantanea vengono condivisi con l'origine dell'istantanea. Solo quando un file viene modificato o sostituito nell'origine punta a contenuti diversi (estensioni). Ciò rende molto difficile valutare la quantità di spazio che verrebbe effettivamente liberata se un sottovolume viene eliminato perché è necessario tenere conto di tutto lo spazio condiviso con altri sottovolumi.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.