Quanto espaço seria liberado pela remoção de um subvolume btrfs?

11

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?

Hjulle
fonte
2
Espero que você saiba que o btrfs.wiki.kernel.org/index.php/Btrfs_mailing_list pode ser um lugar melhor para fazer perguntas sobre o funcionamento interno do btrfs (ou qualquer outro componente do kernel). Se você receber a resposta, poste aqui também. Estou curioso sobre a resposta.
Adam Ryczkowski
1
Você diz que "remover um subvolume e perguntar sobre espaço livre é muito rápido na minha experiência". Quando você exclui um subvolume, na verdade, ele está apenas marcando esse subvolume para exclusão, na verdade, ele libera esses blocos apenas quando chega o tempo (que é o que a mensagem 'sem confirmação' significa quando você faz isso), então não, excluir não é necessariamente muito rápido.
Etskinner # 26/17

Respostas:

3

Você deve dar uma olhada em btrfs quotae btrfs qgroups(grupos de cotas).

Basicamente, qgroupsfaça exatamente o que você solicitou; eles rastreiam quanto espaço é alocado pelos subvolumes. Para habilitar a qgroupfuncionalidade de um btrfssistema 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 qgroupdados, 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 qgroupscom

# 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 qgrouppara 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 qgroupestá no nível 0. Além disso, há um especial qgroupno nível 0 que sempre possui o ID 5 e corresponde à raiz do sistema de arquivos btrfs.

Para cada uma, qgroupa 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. qgroupssã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 qgroupcomo pai aos qgroupssubvolumes 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 ---

( -pAdicionei o sinalizador para adicionar a parentcoluna à saída que mostra o relacionamento pai / filho do qgroups.)

Agora, a linha com qgroup 1/0informa 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.

Erki der Loony
fonte