La raison du problème
Le problème se trouve dans la façon dont XFS alloue les inodes. Contrairement à la plupart des systèmes de fichiers, l'allocation se fait dynamiquement à mesure que de nouveaux fichiers sont créés. Cependant, sauf indication contraire, les inodes sont limités à des valeurs 32 bits, ce qui signifie qu'ils doivent tenir dans le premier téraoctet de stockage du système de fichiers. Donc, si vous remplissez complètement ce premier téraoctet, puis que vous agrandissez le disque, vous ne pourrez toujours pas créer de nouveaux fichiers, car les inodes ne peuvent pas être créés sur le nouvel espace.
Solution 1 - Modifier les options de montage
Une solution consiste à remonter le système de fichiers avec l'option de montage inode64
. Cependant, certaines applications se comporteront bizarrement sur ce sujet (par exemple MySQL), et NFS sera très confus. Donc, si vous n'êtes pas sûr que votre système fonctionnera avec cette option, vous pouvez passer à l'option suivante.
Solution 2 - déplacer des fichiers
La deuxième solution consiste à rechercher certains des fichiers actuellement stockés dans le premier téraoctet et à les déplacer vers une autre zone du système de fichiers.
Se déplacer selon l'âge
Dans notre cas, c'était facile - le système de fichiers était utilisé depuis des années, donc nous pouvions simplement trouver les fichiers les plus anciens et les éloigner du système de fichiers, puis les reculer. Cela a été facilement fait en utilisant find:
find /extra -mindepth 3 -maxdepth 3 -type d -mtime +730 -exec du -sh {} \; > /tmp/olddirs.txt
nous a donné une liste contenant la taille et le nom du répertoire pour tous les répertoires à exactement 3 niveaux en dessous du point de montage, qui étaient âgés de plus de 2 ans. Nous pourrions alors trier la liste pour trouver les plus grands répertoires et les utiliser mv
pour les déplacer vers un autre système de fichiers et inversement.
Déplacement par groupe d'allocation
Si vous ne pouvez pas simplement vous baser sur l'âge, par exemple lorsque de nombreux fichiers ont été créés en même temps, vous pouvez toujours trouver les bons fichiers à déplacer, mais cela prend un peu plus de temps.
XFS a des groupes d'allocation (alias AG ), commençant par 0. Vous pouvez vérifier la taille de bloc et le nombre de blocs de chaque AG pour déterminer quels groupes se trouvent sur le premier téraoctet à l'aide de xfs_info /path/to/mountpoint
. Ou vous pouvez simplement vérifier les premiers AG pour voir lesquels sont pleins, puis les effacer.
- Vérification de l'espace libre dans les quatre premiers AG:
pour ag dans «seq 0 1 5»; faire écho espace libre dans AG $ ag; xfs_db -r -c "freesp -s -a $ ag" / dev / CACHE / CACHE; grep "total gratuit"; terminé
Si l'espace libre total dans un groupe est inférieur à 40, vous ne pourrez pas y créer de nouveaux fichiers.
- Rechercher des fichiers dans cette AG
Cela nécessite de vérifier les métadonnées de chaque fichier du système de fichiers. Cela prendra beaucoup de temps ... Voici une suggestion:
find / extra -mindepth 3 -type f -exec xfs_bmap -v {} \; > /tmp/agfilelist.txt
Vous pouvez ensuite grep pour " 0 "
(c'est un espace, un zéro et un autre espace) pour trouver tous les fichiers sur AG 0, grep pour " 1 "
trouver ceux sur AG 1, etc ... Commencez par AG 0, éloignez les plus gros fichiers (en utilisant mv
, non cp
!) puis de nouveau. Répétez jusqu'à ce que vous ayez une bonne quantité d'espace libre.
Résultat
Une fois que nous avions éloigné suffisamment de fichiers de / extra, puis à nouveau, il y avait beaucoup d'espace dans AG 0 et il était à nouveau possible de créer de nouveaux fichiers.