Pregunta:
Tenemos un servidor Linux con un sistema de archivos de 4 TB, que se utiliza para almacenar repositorios de subversión. Hay muchos repositorios, varios de los cuales se han utilizado durante varios años.
El disco tenía originalmente alrededor de 1 TB, pero comenzamos a quedarnos sin espacio y lo aumentamos a 4 TB hace aproximadamente un año. Ahora, las personas informan que no pueden registrar archivos en sus repositorios. El mensaje de error es No space left on device
.
El disco tiene aproximadamente 1,5 TB libres y también informa que tiene inodos libres y, sin embargo, no es posible crear un nuevo archivo en él. Todavía es posible actualizar archivos antiguos y, de forma intermitente, se actualizarán algunos repositorios, pero el mismo repositorio puede fallar en el próximo intento.
Respuesta:
El motivo del problema
El problema resulta estar en cómo XFS asigna inodos. A diferencia de la mayoría de los sistemas de archivos, la asignación se realiza de forma dinámica a medida que se crean nuevos archivos. Sin embargo, a menos que especifique lo contrario, los inodos 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 llenó completamente ese primer terabyte y luego agranda el disco, aún no podrá crear nuevos archivos, ya que los inodos no se pueden crear en el nuevo espacio.
Solución 1: cambie 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 se confundirá mucho. Entonces, si no está seguro de que su sistema funcione 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 sacarlos 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 usar mv
para moverlos a otro sistema de archivos y viceversa.
Mover 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), que comienzan con 0. Puede verificar el tamaño del bloque y el número de bloques de cada AG para averiguar qué grupos están en el primer terabyte, usando 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:
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
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 de cada archivo en el sistema de archivos. Tomará mucho tiempo … Aquí tienes 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 " 1 "
para encontrar los de AG 1, etc … Comience con AG 0, mueva los archivos más grandes de distancia (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 regreso, había mucho espacio en AG 0 y una vez más fue posible crear nuevos archivos.