La razón del problema
El problema resulta ser cómo XFS asigna los inodos. A diferencia de la mayoría de los sistemas de archivos, la asignación ocurre dinámicamente a medida que se crean nuevos archivos. Sin embargo, a menos que especifique lo contrario, los inodes están limitados a valores de 32 bits, lo que significa que deben caber dentro del primer terabyte de almacenamiento en el sistema de archivos. Entonces, si llena por completo ese primer terabyte y luego amplía el disco, aún no podrá crear nuevos archivos, ya que los inodos no se pueden crear en el nuevo espacio.
Solución 1 - cambiar las opciones de montaje
Una solución es volver a montar el sistema de archivos con la opción de montaje inode64
. Sin embargo, algunas aplicaciones se comportarán de manera extraña en esto (por ejemplo, MySQL), y NFS estará muy confundido. Entonces, si no está seguro de que su sistema funcionará con esta opción, puede pasar a la siguiente opción.
Solución 2 - mover archivos
La segunda solución es encontrar algunos de los archivos que están almacenados actualmente en el primer terabyte y moverlos a otra área del sistema de archivos.
Moviéndose por edad
En nuestro caso, esto fue fácil: el sistema de archivos había estado en uso durante años, por lo que simplemente podíamos encontrar los archivos más antiguos y alejarlos del sistema de archivos, y luego volver a moverlos. Esto se hizo fácilmente usando find:
find /extra -mindepth 3 -maxdepth 3 -type d -mtime +730 -exec du -sh {} \; > /tmp/olddirs.txt
nos dio una lista que contiene el tamaño y el nombre del directorio para todos los directorios en exactamente 3 niveles por debajo del punto de montaje, que tenían más de 2 años. Luego, podríamos ordenar la lista para encontrar los directorios más grandes y usarlos mv
para alejarlos a otro sistema de archivos y volver a ellos.
Moviéndose por grupo de asignación
Si no puede simplemente ir por edad, por ejemplo, cuando se crearon muchos archivos al mismo tiempo, aún puede encontrar los archivos correctos para mover, pero lleva un poco más de tiempo.
XFS tiene grupos de asignación (también conocidos como AG s), comenzando con 0. Puede verificar el tamaño de bloque y el número de bloques de cada AG para averiguar qué grupos están en el primer terabyte, utilizando xfs_info /path/to/mountpoint
. O simplemente puede verificar los primeros AG para ver cuáles están llenos y luego borrarlos.
- Comprobación del espacio libre en los primeros cuatro AG:
para ag en `seq 0 1 5`; hacer eco de espacio libre en AG $ ag; xfs_db -r -c "freesp -s -a $ ag" / dev / CACHE / CACHE; grep "total libre"; hecho
Si el espacio libre total en cualquier grupo es inferior a 40, no podrá crear nuevos archivos en él.
- Encuentra archivos en ese AG
Esto requiere verificar los metadatos para cada archivo en el sistema de archivos. Tomará mucho tiempo ... Aquí hay una sugerencia:
find / extra -mindepth 3 -type f -exec xfs_bmap -v {} \; > /tmp/agfilelist.txt
Luego puede grep para " 0 "
(que es un espacio, un cero y otro espacio) para encontrar todos los archivos en AG 0, grep para encontrar los archivos " 1 "
en AG 1, etc. Comience con AG 0, aleje los archivos más grandes (usando mv
, no cp
!) y luego de nuevo. Repita hasta que tenga una buena cantidad de espacio libre.
Salir
Una vez que habíamos movido suficientes archivos de / extra y luego de nuevo, había mucho espacio en AG 0 y una vez más era posible crear nuevos archivos.