Para entender o que está acontecendo aqui, primeiro você precisa entender que o BTRFS usa um alocador de dois estágios. O primeiro estágio aloca grandes blocos de espaço (na verdade chamados de 'pedaços' na maior parte da documentação) que são usados exatamente para um tipo de alocação, dados (usados apenas para dados em arquivos), metadados (coisas como nomes de arquivos, diretório estrutura, tempos de acesso, propriedade, permissões, etc), ou sistema (usado somente para armazenar dados sobre alocações de chunk). Uma vez que um pedaço tenha sido alocado, o espaço naquele pedaço só pode ser liberado movendo-se todos os dados dele.
Então, o que exatamente isso significa em termos de seu sistema de arquivos?
Bem, sua saída de btrfs filesystem df
mostra o seguinte:
Data, RAID1: total=446.12GiB, used=133.29GiB
System, RAID1: total=8.00MiB, used=80.00KiB
Metadata, RAID1: total=1.00GiB, used=609.05MiB
GlobalReserve, single: total=405.53MiB, used=0.00B
Os valores total
indicam quanto espaço foi alocado para esse tipo de bloco, enquanto o valor used
mostra quanto espaço está em uso nesses blocos. No seu caso, você tem 446,32 GB de espaço alocado para blocos de dados (quase todo o disco com base no% normaldf
e btrfs filesystem show
output), mas apenas 133,29 GB desse espaço estão realmente em uso. Dado isso e os sintomas descritos, o BTRFS está tentando alocar um fragmento de metadados, mas não tem espaço para isso (porque todo o espaço livre está dentro de blocos já alocados), então você está apenas recebendo um erro.
Para se recuperar disso, você terá que fazer um balanço. Um equilíbrio literalmente envia todos os dados de blocos selecionados (ou todos eles, se você não passar opções) pelo alocador, que tem o efeito líquido de liberar blocos vazios ou quase vazios, porque reúne as coisas em partes parcialmente cheias.
Eu começaria com:
btrfs balance start -dusage=0 /mnt/ssd
Isso removerá todos os fragmentos de dados que não contêm dados reais, o que pode ser suficiente para que as coisas funcionem novamente por enquanto, mas ainda o deixará vulnerável ao mesmo problema no futuro.
Para ajudar a compactar as coisas completamente, repita o comando acima com valores crescentes para a opção -dusage
. Eu costumo bater em 5 de cada vez até cerca de 50 (mais de 50, você geralmente está perdendo tempo). O filtro de uso (especificado acima para apenas processamento de blocos de dados) dirá equilíbrio para selecionar pedaços que estão no máximo com essa porcentagem cheia, então incrementando-o passo a passo, você pode compactar mais facilmente as coisas sem se deparar com outros problemas. / p>
Você pode ajudar a evitar problemas como esse no futuro executando algo como o seguinte regularmente (normalmente, ele é executado diariamente em meus sistemas):
btrfs balance start -dusage=25 -dlimit=10 -musage=25 -mlimit=10 /mnt/ssd
Isso equilibrará os 10 primeiros dados e blocos de metadados com menos de um quarto, que devem ser concluídos em alguns segundos na maioria dos casos.