A razão do problema
O problema está em como o XFS aloca inodes. Ao contrário da maioria dos sistemas de arquivos, a alocação acontece dinamicamente à medida que novos arquivos são criados. No entanto, a menos que você especifique o contrário, os inodes são limitados a valores de 32 bits, o que significa que eles devem caber dentro do primeiro terabyte de armazenamento no sistema de arquivos. Portanto, se você preencher completamente esse primeiro terabyte e ampliar o disco, ainda será incapaz de criar novos arquivos, já que os inodes não podem ser criados no novo espaço.
Solução 1 - alterar as opções de montagem
Uma solução é montar novamente o sistema de arquivos com a opção de montagem inode64
. No entanto, algumas aplicações irão se comportar estranhamente sobre isso (por exemplo, MySQL), e o NFS ficará muito confuso. Portanto, se você não tiver certeza de que seu sistema funcionará com essa opção, você poderá passar para a próxima opção.
Solução 2 - mover arquivos
A segunda solução é encontrar alguns dos arquivos atualmente armazenados no primeiro terabyte e movê-los para outra área do sistema de arquivos.
Movendo-se por idade
No nosso caso, isso foi fácil - o sistema de arquivos estava em uso há anos, então poderíamos simplesmente encontrar os arquivos mais antigos e movê-los para longe do sistema de arquivos, e então movê-los de volta. Isso foi feito facilmente usando o find:
find /extra -mindepth 3 -maxdepth 3 -type d -mtime +730 -exec du -sh {} \; > /tmp/olddirs.txt
nos deu uma lista contendo o tamanho e o nome do diretório para todos os diretórios em exatamente 3 níveis abaixo do ponto de montagem, que eram mais antigos que 2 anos. Poderíamos então classificar a lista para encontrar os maiores diretórios e usar mv
para movê-los para outro sistema de arquivos e vice-versa.
Movendo pelo grupo de alocação
Se você não puder simplesmente envelhecer, por exemplo, Quando muitos arquivos foram criados ao mesmo tempo, você ainda pode encontrar os arquivos certos para mover, mas isso leva um pouco mais de tempo.
O XFS tem grupos de alocação (aka AG s), começando com 0. Você pode verificar o tamanho do bloco e o número de blocos de cada AG para descobrir quais grupos estão no primeiro terabyte, usando% código%. Ou você pode apenas verificar os primeiros AGs para ver quais estão cheios e, depois, limpá-los.
- Verificando o espaço livre nos primeiros quatro AGs:
for ag in 'seq 0 1 5'; do echo freespace in AG $ag; xfs_db -r -c "freesp -s -a $ag" /dev/CACHE/CACHE ; grep "total free"; done
Se o espaço livre total em qualquer grupo for menor que 40, você não poderá criar novos arquivos.
- Encontrar arquivos nessa AG
Isso requer a verificação dos metadados para cada arquivo no sistema de arquivos. Isso levará um tempo longo ... Aqui está uma sugestão:
find /extra -mindepth 3 -type f -exec xfs_bmap -v {} \; > /tmp/agfilelist.txt
Você pode, então, grep para xfs_info /path/to/mountpoint
(espaço, zero e outro espaço) para encontrar todos os arquivos em AG 0, grep para " 0 "
para encontrar os arquivos em AG 1, etc ... Comece com AG 0, mova os arquivos maiores para fora (usando " 1 "
, não mv
!) E, em seguida, novamente. Repita até que você tenha uma boa quantidade de espaço livre.
Resultado
Depois de movermos arquivos suficientes para / extra e depois novamente, havia muito espaço em AG 0 e foi mais uma vez possível criar novos arquivos.