Diferentemente da maioria dos sistemas de arquivos convencionais, o BTRFS usa um alocador de dois estágios. O primeiro estágio aloca grandes regiões de espaço conhecidas como trechos para tipos específicos de dados, e o segundo estágio aloca blocos como um sistema de arquivos regular dentro dessas regiões maiores. Existem três tipos diferentes de partes:
-
Data Chunks: armazenam dados de arquivos regulares.
-
Metadados Chunks: armazenam metadados sobre arquivos, incluindo, entre outros, registros de data e hora, somas de verificação, nomes de arquivos, propriedade, permissões e atributos estendidos.
-
System Chunks: Esses são um tipo especial de chunk que armazena dados sobre onde todos os outros chunks estão localizados.
Apenas o tipo de dados para o qual o bloco é alocado pode ser armazenado nesse fragmento. O caso mais comum hoje em dia quando você recebe um erro -ENOSPC no BTRFS é que o sistema de arquivos ficou sem espaço para dados ou metadados em partes existentes e não pode alocar um novo pedaço. Você pode verificar que esse é o caso executando btrfs fi df
no sistema de arquivos que gerou o erro. Se a linha Dados ou Metadados mostrar um valor Total significativamente diferente do valor Usado, provavelmente esta é a causa.
O que o btrfs balance
faz é enviar as coisas de volta através do alocador, o que resulta no uso de espaço nos fragmentos sendo compactados. Por exemplo, se você tiver dois fragmentos de metadados com 40% de participação, um saldo resultará em um bloco de metadados com 80% de participação. Ao compactar o uso do espaço dessa maneira, a operação de balanceamento pode então excluir os blocos agora vazios e, assim, liberar espaço para a alocação de novos blocos. Se você executar novamente btrfs fi df
depois de executar o saldo, verá que os valores Total e Usado estão muito mais próximos, já que o saldo excluía os fragmentos que não eram mais necessários.