O Btrfs é diferente dos sistemas de arquivos tradicionais. Não é apenas uma camada que converte nomes de arquivos em deslocamentos em um dispositivo de bloco, é mais uma camada que combina um sistema de arquivos tradicional com LVM e RAID. E como o LVM, ele tem o conceito de alocar espaço no dispositivo subjacente, mas não usá-lo para arquivos.
Um sistema de arquivos tradicional é dividido em arquivos e espaço livre. É fácil calcular quanto espaço é usado ou gratuito:
|--------files--------| |
|------------------------drive partition-------------------------------|
O Btrfs combina LVM, RAID e um sistema de arquivos. A unidade é dividida em subvolumes, cada um deles dimensionado e replicado dinamicamente:
|--files--| |--files--| |files| | |
|----@raid1----|------@raid1-------|-----@home-----|metadata| |
|------------------------drive partition-------------------------------|
O diagrama mostra a partição sendo dividida em dois subvolumes e metadados. Um dos subvolumes é duplicado (RAID1), portanto, há duas cópias de cada arquivo no dispositivo. Agora, não temos apenas o conceito de quanto espaço é livre na camada do sistema de arquivos, mas também quanto espaço é livre na camada de bloco (partição da unidade) abaixo dele. O espaço também é ocupado pelos metadados.
Ao considerar o espaço livre no Btrfs, precisamos esclarecer de qual espaço livre estamos falando - a camada de bloco ou a camada de arquivo? Na camada de bloco, os dados são alocados em blocos de 1 GB, portanto, os valores são bastante grosseiros e podem não ter qualquer relação com a quantidade de espaço que o usuário pode realmente usar. Na camada de arquivo, é impossível relatar a quantidade de espaço livre porque a quantidade de espaço depende de como ele é usado. No exemplo acima, um arquivo armazenado no subvolume replicado @ raid1 ocupará o dobro do espaço que o mesmo arquivo armazenado no subvolume @home . Os instantâneos armazenam apenas cópias de arquivos que foram modificados subseqüentemente. Não há mais um mapeamento 1-1 entre um arquivo como o usuário o vê e um arquivo armazenado na unidade.
Você pode verificar o espaço livre na camada de bloco com btrfs filesystem show /
e o espaço livre na camada de subvolume com btrfs filesystem df /
# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/sda4_crypt 38G 12G 13M 100% /
Para este subvolume montado, df informa uma unidade de tamanho total 38G, com 12G usado e 13M livre. 100% do espaço disponível foi usado. Lembre-se de que o tamanho total 38G é dividido entre diferentes subvolumes e metadados - não é exclusivo deste subvolume.
# btrfs filesystem df /
Data, single: total=9.47GiB, used=9.46GiB
System, DUP: total=8.00MiB, used=16.00KiB
System, single: total=4.00MiB, used=0.00
Metadata, DUP: total=13.88GiB, used=1.13GiB
Metadata, single: total=8.00MiB, used=0.00
Cada linha mostra o espaço total e o espaço usado para um tipo de dados e um tipo de replicação diferentes. Os valores mostrados são dados armazenados em vez de bytes brutos na unidade, portanto, se você estiver usando subvolumes RAID-1 ou RAID-10, a quantidade de armazenamento bruto usada será o dobro dos valores que você pode ver aqui.
A primeira coluna mostra o tipo de item que está sendo armazenado (Dados, Sistema, Metadados). A segunda coluna mostra se uma única cópia de cada item é armazenada (única) ou se duas cópias de cada item são armazenadas (DUP). Duas cópias são usadas para dados confidenciais, portanto, há um backup se uma cópia estiver corrompida. Para linhas DUP, o valor usado deve ser duplicado para obter a quantidade de espaço usado na unidade real (porque btrfs fs df informa os dados armazenados, não o espaço em disco usado) . A terceira e quarta colunas mostram o espaço total e usado. Não há nenhuma coluna livre , já que a quantidade de "espaço livre" depende de como ela é usada.
O que mais se destaca nessa unidade é que você tem 9,47GiB de espaço alocado para arquivos comuns dos quais você usou 9.46GiB - é por isso que você está obtendo erros Sem espaço no dispositivo . Você tem 13.88GiB de espaço alocado para metadados duplicados, dos quais você usou 1.13GiB. Como esse metadado é duplicado pelo DUP, significa que 27.76GiB de espaço foram alocados na unidade real, da qual você usou 2.26GiB. Daí 25.5GiB da unidade não está sendo usado, mas ao mesmo tempo não está disponível para arquivos para ser armazenado dentro Este é o "Btrfs enorme metadados alocados " problema. Para tentar corrigir isso, execute btrfs balance start -m /
. O parâmetro -m informa ao btrfs para reequilibrar apenas os metadados.
Um problema semelhante está ficando sem espaço de metadados. Se a saída mostrasse que os metadados estavam realmente cheios (o valor usado próximo do total ), a solução seria tentar liberar quase vazio (& lt; 5% blocos de dados usando o comando btrfs balance start -dusage=5 /
. Esses blocos livres podem ser reutilizados para armazenar metadados.
Para mais detalhes, veja as FAQs do Btrfs: