Combien d'espace serait libéré en supprimant un sous-volume btrfs?

11

Existe-t-il un moyen de calculer la quantité d'espace que je libérerais si je supprimais un (ou plusieurs) sous-volumes sur un disque Btrfs (sans les supprimer réellement)? Je sais qu'il n'y a "actuellement aucun code qui fera le calcul pour vous" , mais comment le feriez-vous?

Je me demande aussi pourquoi ils disent que ce serait si lent? En fait, supprimer un sous-volume et poser des questions sur l'espace libre est très rapide dans mon expérience, pourquoi la même chose serait-elle beaucoup plus lente?

Hjulle
la source
2
J'espère que vous savez, que btrfs.wiki.kernel.org/index.php/Btrfs_mailing_list pourrait être un meilleur endroit pour poser des questions sur le fonctionnement interne des btrfs (ou de tout autre composant du noyau). Si vous obtenez la réponse, veuillez également la poster ici. Je suis moi-même curieux de connaître la réponse.
Adam Ryczkowski
1
Vous dites que "supprimer un sous-volume et poser des questions sur l'espace libre est très rapide dans mon expérience". Lorsque vous supprimez un sous-volume, il s'agit simplement de marquer ce sous-volume pour suppression, cela ne libère en fait ces blocs que lorsque le temps le permet (ce que signifie le message `` sans engagement '' lorsque vous le faites), donc non, la suppression n'est pas nécessairement très rapide.
etskinner

Réponses:

3

Vous devriez jeter un œil à btrfs quotaet btrfs qgroups(groupes de quotas).

Fondamentalement, qgroupsfaites exactement ce que vous avez demandé, ils suivent la quantité d'espace allouée par les sous-volumes. Pour activer la qgroupfonctionnalité d'un btrfssystème de fichiers, vous devez

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

Cependant, avant de faire cela, soyez averti que cela déclenche un recalcul complet des qgroupdonnées, ce qui prendra un certain temps, en particulier pour les systèmes de fichiers volumineux avec de nombreux sous-volumes. Ce processus s'exécute de manière asynchrone en arrière-plan. Vous pouvez déjà vérifier le statut du qgroupsavec

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

Cela vous donnera une sortie comme celle-ci:

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'avertissement de la première ligne est présent tant que la nouvelle analyse est toujours en cours.)

Btrfs crée automatiquement un qgrouppour chaque sous-volume. Dans ce cas, il y a trois sous-volumes avec les ID de sous-volume 4881, 7990 et 8400. La partie avant la barre oblique est le niveau du qgroup. Chaque sous qgroup- volume est au niveau 0. De plus, il y a une spéciale qgroupau niveau 0 qui a toujours l'ID 5 et correspond à la racine du système de fichiers btrfs.

Pour chacun, qgroupla sortie ci-dessus montre combien d'espace est référencé par elle. Cela signifie que le sous-volume correspondant contient des fichiers dont la taille totale est égale au nombre indiqué.

Cependant, en raison des instantanés et de la nature de copie sur écriture des sous-volumes btrfs, il est possible que des fichiers soient partagés. Cela signifie que le contenu (ou en fait l'étendue) des fichiers peut être référencé par plusieurs sous-volumes. Ceci est exprimé par le deuxième chiffre qui montre combien d'espace est exclusivement alloué par chaque sous-volume et n'est partagé avec aucun autre sous-volume. Si vous supprimez un sous-volume, c'est l'espace qui sera réellement libéré.

Si vous souhaitez savoir combien d'espace serait libéré si vous supprimez plusieurs sous-volumes, vous pouvez utiliser les niveaux susmentionnés. qgroupssont organisés en une hiérarchie et des groupes aux niveaux supérieurs (supérieurs à 0) regroupent les informations des niveaux inférieurs.

Ainsi, pour savoir combien d'espace serait libéré si les sous-volumes 4881 et 7990 (dans l'exemple ci-dessus) étaient supprimés, créez un nouveau qgroup(arbitrairement avec l'ID 0, mais vous pouvez choisir ce que vous voulez ici) au niveau 1 avec

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

Attribuez ensuite le nouveau créé en qgrouptant que parent au qgroupssous-volume que vous souhaitez supprimer avec

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

Cela déclenchera une nouvelle analyse des informations de quota qui peut prendre un certain temps. S'il est terminé et que vous émettez maintenant

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

vous obtenez une sortie comme celle-ci:

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

(J'ai ajouté le -pdrapeau pour ajouter la parentcolonne à la sortie qui montre la relation parent / enfant du qgroups.)

Maintenant, la ligne avec qgroup 1/0vous indique combien d'espace est référencé par les deux sous-volumes que vous souhaitez supprimer et, plus important encore, elle vous indique combien d'espace est alloué par eux exclusivement . Il s'agit de la quantité d'espace qui sera libérée si vous supprimez les deux sous-volumes.

Je me demande aussi pourquoi ils disent que ce serait si lent?

Cela est dû à la nature de copie sur écriture des btrfs avec des instantanés. Si vous créez un instantané dans btrfs (normalement), toutes les données réelles du sous-volume nouvellement créé qui contient l'instantané sont partagées avec la source de l'instantané. Ce n'est que lorsqu'un fichier est modifié ou remplacé dans la source qu'il pointe vers un contenu différent (étendues). Il est donc très difficile d'évaluer la quantité d'espace qui serait réellement libérée si un sous-volume est supprimé car vous devez tenir compte de tout l'espace partagé avec d'autres sous-volumes.

Erki der Loony
la source