Existe alguma maneira de calcular quanto espaço eu liberaria se removesse um (ou vários) subvolumes em um disco Btrfs (sem realmente removê-los)? Eu sei que "atualmente não há código que faça o cálculo para você" , mas como você faria isso?
Também me pergunto por que eles estão dizendo que seria tão lento? Tanto a remoção de um subvolume quanto a pergunta sobre espaço livre são muito rápidas na minha experiência, por que fazer a mesma coisa hipoteticamente seria muito mais lento?
Respostas:
Você deve dar uma olhada em
btrfs quota
ebtrfs qgroups
(grupos de cotas).Basicamente,
qgroups
faça exatamente o que você solicitou; eles rastreiam quanto espaço é alocado pelos subvolumes. Para habilitar aqgroup
funcionalidade de umbtrfs
sistema de arquivos, você precisaNo 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 doqgroups
comIsso lhe dará uma saída como esta:
(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 barraqgroup
. Cada subvolumeqgroup
está no nível 0. Além disso, há um especialqgroup
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 comEm seguida, atribua o recém-criado
qgroup
como pai aosqgroups
subvolumes que você deseja excluir comIsso acionará outra varredura das informações da cota, o que pode demorar um pouco. Se estiver concluído e você agora emitir
você obtém uma saída como esta:
(
-p
Adicionei o sinalizador para adicionar aparent
coluna à saída que mostra o relacionamento pai / filho doqgroups
.)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.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.
fonte