btrfs, nenhum espaço em disco restante

2

Eu tenho um problema com o espaço em disco no volume btrfs. df mostra que há muito espaço em disco. Mas quando estou tentando copiar o sistema de arquivos de teste de 10GB, não digam espaço em disco neste dispositivo.

df -h | grep /mnt/ssd :

/dev/sda 448G 135G 313G 31% /mnt/ssd

O mesmo aqui:

btrfs filesystem df /mnt/ssd :

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

Eu não sei ler a saída desta:

sudo btrfs filesystem show :

Label: none  uuid: aba64e21-69d1-46c1-b3f2-dfda832b67fd
    Total devices 2 FS bytes used 133.88GiB
    devid    1 size 447.13GiB used 447.13GiB path /dev/sda
    devid    2 size 447.13GiB used 447.13GiB path /dev/sdb

Então, há 133.88GiB ou 447.13GiB usados? Muito confuso.

    
por Kristopher 29.01.2018 / 20:14

2 respostas

3

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.

    
por 29.01.2018 / 21:37
1

Eu nunca tive um problema deste tipo com um sistema de arquivos Btrfs em um disco rígido, mas tive o mesmo no meu SSD. O SSD não sabe quais blocos são realmente gratuitos, você precisa apará-lo.

Mas quando o problema acontece fstrim -v /mnt/ssd mostra quase nenhum espaço sendo cortado! Minha solução:

btrfs balance start /mnt/ssd
  #  you can monitor its progress by 'btrfs balance status /mnt/ssd'
fstrim -v /mnt/ssd

O segundo comando deve cortar muito espaço desta vez. Depois disso, meu espaço livre está realmente disponível para mim.

Note, no entanto: estou usando o Btrfs em um único SSD, não há no RAID no meu caso e não sei se faz alguma diferença (estou contando com o seu feedback).

Sobre a parte confusa: o Btrfs como um sistema de arquivos pode se ampliar ou encolher dentro de um dispositivo (ou dispositivos) atribuído a ele. Por enquanto, o seu sistema de arquivos está inchado. Ele usa todo o 447.13GiB em cada dispositivo. Eu acho que todo esse espaço está "em uso", desde que fstrim esteja preocupado. Dentro do sistema de arquivos 133.29GiB é usado por dados reais. Equilibrar o sistema de arquivos deve reduzi-lo e só então fstrim é capaz de fazer o seu trabalho.

O sistema de arquivos irá inchar novamente com o tempo. É por isso que aprendi a realizar a manutenção acima periodicamente, especialmente antes de apt-get upgrade .

    
por 29.01.2018 / 21:15

Tags