Você deve dar uma olhada em btrfs quota
e btrfs qgroups
(grupos de cotas).
Basicamente, qgroups
faça exatamente o que você solicitou; eles rastreiam quanto espaço é alocado pelos subvolumes. Para habilitar a qgroup
funcionalidade de um btrfs
sistema de arquivos, você precisa
# btrfs quota enable /path/to/btrfs/filesystem
No entanto, antes de fazer isso, esteja avisado de que isso desencadeia um recálculo completo dos qgroup
dados, o que levará algum tempo, especialmente para sistemas de arquivos grandes com muitos subvolumes. Esse processo é executado de forma assíncrona em segundo plano. Você já pode verificar o status do qgroups
com
# btrfs qgroup show /path/to/btrfs/filesystem
Isso lhe dará uma saída como esta:
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
(O aviso na primeira linha está presente enquanto a nova verificação ainda estiver em execução.)
O Btrfs cria automaticamente um qgroup
para cada subvolume. Nesse caso, existem três subvolumes com os IDs 4881, 7990 e 8400 do subvolume. A parte antes da barra é o nível da barra qgroup
. Cada subvolume qgroup
está no nível 0. Além disso, há um especial qgroup
no nível 0 que sempre possui o ID 5 e corresponde à raiz do sistema de arquivos btrfs.
Para cada uma, qgroup
a saída acima mostra quanto espaço é referenciado por ela. Isso significa que o subvolume correspondente contém arquivos cujo tamanho total é igual ao número mostrado.
No entanto, devido aos instantâneos e à natureza da cópia na gravação dos subvolumes btrfs, os arquivos podem ser compartilhados. Isso significa que o conteúdo (ou, na verdade, as extensões) dos arquivos pode ser referenciado por mais de um subvolume. Isso é expresso pelo segundo número que mostra quanto espaço é alocado exclusivamente por cada subvolume e não é compartilhado com nenhum outro subvolume. Caso você exclua um subvolume, este é o espaço que realmente será liberado.
Se você quiser descobrir quanto espaço seria liberado se excluir vários subvolumes, poderá usar os níveis mencionados acima. qgroups
são organizados em uma hierarquia e grupos nos níveis superiores (acima de 0) agregam as informações dos níveis inferiores.
Portanto, para descobrir quanto espaço seria liberado se os subvolumes 4881 e 7990 (no exemplo acima) fossem excluídos, crie um novo qgroup
(arbitrariamente com o ID 0, mas você pode escolher o que quiser aqui) no nível 1 com
# btrfs qgroup create 1/0 /path/to/btrfs/filesystem
Em seguida, atribua o recém-criado qgroup
como pai aos qgroups
subvolumes que você deseja excluir com
# btrfs qgroup assign 0/4881 1/0 /path/to/btrfs/filesystem
# btrfs qgroup assign 0/7990 1/0 /path/to/btrfs/filesystem
Isso acionará outra varredura das informações da cota, o que pode demorar um pouco. Se estiver concluído e você agora emitir
# btrfs qgroup show -p /path/to/btrfs/filesystem
você obtém uma saída como esta:
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
Adicionei o sinalizador para adicionar a parent
coluna à saída que mostra o relacionamento pai / filho do qgroups
.)
Agora, a linha com qgroup
1/0
informa quanto espaço é referenciado pelos dois subvolumes que você deseja excluir e, mais importante, informa quanto espaço é alocado exclusivamente por eles . Essa é a quantidade de espaço que será liberada se você excluir os dois subvolumes.
Também me pergunto por que eles estão dizendo que seria tão lento?
Isso ocorre devido à natureza de cópia na gravação do btrfs, juntamente com os instantâneos. Se você criar uma captura instantânea no btrfs (normalmente), todos os dados reais no subvolume recém-criado que contém a captura instantânea serão compartilhados com a fonte da captura instantânea. Somente quando um arquivo é alterado ou substituído na fonte, ele aponta para um conteúdo diferente (extensões). Isso torna muito difícil avaliar quanto espaço seria realmente liberado se um subvolume for excluído, porque você deve contabilizar todo o espaço compartilhado com outros subvolumes.