O Ubuntu acha que o disco Btrfs está cheio mas não está

6
$ cat /etc/fstab
# <file system> <mount point>   <type>  <options>       <dump>  <pass>
UUID=a168d1ac-4e13-4643-976d-6e47ea1732b1 /boot        ext2  defaults                                                                   0 1
/dev/mapper/sda4_crypt                    /            btrfs defaults,autodefrag,compress=lzo,inode_cache,space_cache,subvol=@          0 2
/dev/mapper/sda4_crypt                    /tmp         btrfs defaults,autodefrag,compress=lzo,inode_cache,space_cache,subvol=@tmp       0 2
/dev/mapper/sda4_crypt                    /run         btrfs defaults,autodefrag,compress=lzo,inode_cache,space_cache,subvol=@run       0 2
/dev/mapper/sda4_crypt                    /var/crash   btrfs defaults,autodefrag,compress=lzo,inode_cache,space_cache,subvol=@var-crash 0 2
/dev/mapper/sda4_crypt                    /var/tmp     btrfs defaults,autodefrag,compress=lzo,inode_cache,space_cache,subvol=@var-tmp   0 2
/dev/mapper/sda4_crypt                    /var/log     btrfs defaults,autodefrag,compress=lzo,inode_cache,space_cache,subvol=@var-log   0 2
/dev/mapper/sda4_crypt                    /var/spool   btrfs defaults,autodefrag,compress=lzo,inode_cache,space_cache,subvol=@var-spool 0 2
/dev/mapper/sda5_crypt                    /home        btrfs defaults,autodefrag,compress=lzo,inode_cache,space_cache,subvol=@home      0 3
/dev/mapper/750er                         /media/750er ext4  defaults                                                                   0 4
/dev/mapper/cswap                         none         swap  defaults                                                                   0 5
➜  ~  df -h         
Filesystem              Size  Used Avail Use% Mounted on
/dev/mapper/sda4_crypt   38G   12G   13M 100% /
none                    4,0K     0  4,0K   0% /sys/fs/cgroup
udev                    2,0G  4,0K  2,0G   1% /dev
tmpfs                   396M  1,3M  394M   1% /run
none                    5,0M     0  5,0M   0% /run/lock
none                    2,0G  208K  2,0G   1% /run/shm
none                    100M   36K  100M   1% /run/user
/dev/mapper/sda4_crypt   38G   12G   13M 100% /tmp
/dev/sda2               231M   44M  175M  21% /boot
/dev/mapper/sda4_crypt   38G   12G   13M 100% /var/crash
/dev/mapper/sda4_crypt   38G   12G   13M 100% /var/tmp
/dev/mapper/sda4_crypt   38G   12G   13M 100% /var/log
/dev/mapper/sda4_crypt   38G   12G   13M 100% /var/spool
/dev/mapper/sda5_crypt  3,7T  2,4T  1,2T  67% /home
/dev/mapper/750er       688G  276G  377G  43% /media/750er
/dev/mapper/2tb         1,8T  1,7T  141G  93% /media/2tb
➜  ~  sudo btrfs fi 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
➜  ~  

É uma partição de 40 GB com alguns instantâneos. Mas é comprimido, então acho que os 9,46 GB / 40 GB são precisos. Mas o meu Ubuntu falha porque diz que não tem espaço em disco. Eu tive apt-erros, não consigo instalar programas e meu servidor mysql falhou ao iniciar por causa disso.

E eu sei não contar com df que acabei de incluí-lo para completar.

Eu acho que o Ubuntu usa df , que é conhecido por reportar erroneamente com o Btrfs internamente e falhar por esse motivo. Isso faria sentido para o APT quando verifica o espaço. Mas, na verdade, não consegue gravar no disco.

$ sudo time dd if=/dev/zero of=large bs=2G count=1
dd: error writing ‘large’: No space left on device
0+1 records in
0+0 records out
11747328 bytes (12 MB) copied, 1,29706 s, 9,1 MB/s
Command exited with non-zero status 1
0.00user 1.40system 0:01.44elapsed 97%CPU (0avgtext+0avgdata 2098028maxresident)k
160inputs+23104outputs (0major+383008minor)pagefaults 0swaps
    
por redanimalwar 10.05.2014 / 23:31

4 respostas

14

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:

por bain 11.05.2014 / 03:18
3

Resposta curta:  Os metadados da partição Btrfs são mostrados como 'usados' por utilitários de disco padrão, como o df.

  1. verifique o volume do problema. por exemplo: /

    btrfs subvolume list /
    
  2. Os instantâneos mais prováveis estão preenchendo o volume. Exclua o instantâneo que você não precisa. manter um da última data você tem certeza de que o sistema estava funcionando ok.

    btrfs subvolume delete <path> 
    

    Onde path é da lista de subvolume do comando anterior que diz "snapshot".

  3. Reinicie e você está pronto

O motivo do problema pode ser sua distro ou gerenciador de pacotes que faz snaphots toda vez que você atualiza o sistema.

NB: o comando balance falha se o disco estiver cheio, pois não há espaço livre para o blance.

    
por Michael Holopainen 05.02.2015 / 10:38
2

No meu caso, o uso do disco não diminuiria mesmo quando eu excluísse arquivos e instantâneos.

O saldo do btrfs (dados e metadados) não funcionou com o erro "não há mais espaço no dispositivo"

btrfs balance start -m /
ERROR: error during balancing '/': No space left on device
There may be more info in syslog - try dmesg | tail

O RAID1 mostrou uso total em ambos os discos, embora o uso real de dados tenha sido menor que um terço disso.

# btrfs fi sh
Label: none  uuid: 61a20f1a-c133-11e6-964b-d3bac0c48bbd
    Total devices 2 FS bytes used 153.94GiB
    devid    1 size 455.76GiB used 455.76GiB path /dev/sda2
    devid    2 size 455.76GiB used 455.76GiB path /dev/sdb2


# btrfs filesystem df /
Data, RAID1: total=452.73GiB, used=151.51GiB
System, RAID1: total=32.00MiB, used=80.00KiB
Metadata, RAID1: total=3.00GiB, used=2.42GiB
GlobalReserve, single: total=512.00MiB, used=0.00B

Solução: descartar blocos vazios , não precisa de espaço adicional:

btrfs balance start -dusage=0 /

btrfs balance start -musage=0 /

Fonte: link

Alternativa: Minha solução foi reduzir os discos Veja: link

btrfs filesystem resize 1:430g /
btrfs filesystem resize 2:430g /

(os comandos levam tempo, verifique o syslog para ver os blocos de realocação)

depois disso, redimensione:

btrfs filesystem resize 1:450g /
btrfs filesystem resize 2:450g /

Depois disso, o equilíbrio (metadados) do btrfs funcionou novamente:

btrfs balance -m /

Em seguida, o equilíbrio dos dados do btrfs (realocar blocos de dados com uso menor que 33%):

btrfs balance -dusage=33 /
    
por phiphi 13.12.2016 / 13:52
1

O crédito vai para @ignis e @bain. Só para ter uma resposta simples e direta, responda aqui sem toda a palestra e compartilhe o que eu realmente fiz para que o sistema funcionasse novamente.

btrfs balance start -m /mountpoint

É a linha mágica para resolver problemas como este.

Eu me deparei com alguns problemas que eu não quero entediá-lo e eu não sei o que era necessário para executar isso a partir de um CD ao vivo, mas o que eu fiz no final depois que o sistema foi confuso não inicializar foi rodando o btrfsck nos dispositivos (mappers crypto desbloqueado) e ele realmente encontrou erros, então montou o sistema de arquivos root btrfs sem nenhuma opção para /mnt , ao contrário do meu sistema instalado onde / é o único @ montado subvolume. Então eu tive todos os instantâneos e outros subvolumes também lá. Eu não sei disso faz diferença.

btrfs balance start -m /mnt

Eu tenho os metadados de

Metadata, DUP: total=13.88GiB, used=1.13GiB

para

Metadata, DUP: total=1.38GiB, used=1.05GiB

E um refrescante:

$ sudo df -h /
Filesystem              Size  Used Avail Use% Mounted on
/dev/mapper/sda4_crypt   38G   12G   26G  31% /

Então, acho que está tudo bem agora.

    
por redanimalwar 11.05.2014 / 23:08