A razão do problema
O problema é como o XFS aloca inodes. Diferentemente 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 no primeiro terabyte de armazenamento no sistema de arquivos. Portanto, se você preencheu completamente esse primeiro terabyte e ampliou o disco, ainda não conseguiu criar novos arquivos, pois os inodes não podem ser criados no novo espaço.
Solução 1 - altere as opções de montagem
Uma solução é montar novamente o sistema de arquivos com a opção de montagem inode64
. No entanto, alguns aplicativos se comportarão de maneira estranha nisso (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, para que pudéssemos simplesmente encontrar os arquivos mais antigos e afastá-los do sistema de arquivos e depois 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 exatamente 3 níveis abaixo do ponto de montagem, com mais de 2 anos. Poderíamos, então, classificar a lista para encontrar os maiores diretórios e usá mv
-los para movê-los para outro sistema de arquivos e vice-versa.
Movendo por grupo de alocação
Se você não pode simplesmente passar por idade, por exemplo, quando muitos arquivos foram criados ao mesmo tempo, ainda é possível encontrar os arquivos certos para mover, mas isso leva um pouco mais de tempo.
O XFS possui grupos de alocação (também conhecidos como AGs ), começando com 0. Você pode verificar o tamanho e o número de blocos de cada AG para descobrir quais grupos estão no primeiro terabyte usando xfs_info /path/to/mountpoint
. Ou você pode apenas verificar os primeiros AGs para ver quais estão cheios e depois limpá-los.
- Verificando o espaço livre nos quatro primeiros AGs:
para ag em `seq 0 1 5`; ecoa o espaço livre em AG $ ag; xfs_db -r -c "freesp -s -a $ ag" / dev / CACHE / CACHE; grep "total grátis"; feito
Se o espaço livre total em qualquer grupo for menor que 40, você não poderá criar novos arquivos nele.
- Encontre arquivos nesse AG
Isso requer a verificação dos metadados para cada arquivo no sistema de arquivos. Vai demorar muito tempo ... Aqui está uma sugestão:
find / extra -mindepth 3 -type f -exec xfs_bmap -v {} \; > /tmp/agfilelist.txt
Você pode então grep for " 0 "
(que é um espaço, um zero e outro espaço) para encontrar todos os arquivos no AG 0, grep para encontrar os arquivos " 1 "
no AG 1, etc ... Comece com AG 0, mova os arquivos maiores para longe (usando mv
, não cp
!) e depois novamente. Repita até que você tenha uma quantidade razoável de espaço livre.
Resultado
Depois que removemos arquivos suficientes de / extra e voltamos novamente, havia muito espaço no AG 0 e, mais uma vez, foi possível criar novos arquivos.