Liberar espacio en disco – Taller Linux
En ocasiones nos encontramos con que los servicios de nuestro servidor han dejado de responder o lo hacen mal. Un causa bastante común de esto es que el disco duro se ha quedado sin espacio, y esto hace que por ejemplo mysql deje de servir consultas, con lo que ya la tenemos liada.
Lo primero que debemos hacer al detectar un problema de funcionamiento en un servidor Linux remoto es ver si podemos acceder por SSH y comprobar como se encuentran la cpu, memoria y disco con los comandos top, df y demás. Con df, si alguna de las particiones está llena lo veremos en seguida:
[root@server ~]# df -h S.ficheros Tamaño Usado Disp Uso% Montado en /dev/sda1 20G 8,6G 11G 46% / /dev/sda2 904G 63G 797G 8% /var tmpfs 997M 0 997M 0% /dev/shm
Dependiendo de como esté hecho el particionamiento podremos ver diferentes entradas en esta lista, una para cada partición, existente en el disco duro o virtual. El parámetro -h nos permite visualizar los tamaños en formato “humano” más legible, si no se presentaría en kbytes.
También, existe la posibilidad de que no se haya agotado el espacio en disco, pero si los inodos. Dado que solo puede haber un fichero por inodo se podría bloquear la escritura en el disco aun cuando quedase mucho espacio libre. Para averiguar el numero de inodos ocupados y disponibles de un sistema podemos añadir el parámetro “i” a nuestra búsqueda con “df”:
[root@server ~]# df -hi S.ficheros Nodos-i NUsados NLibres NUso% Montado en /dev/sda1 1,3M 107K 1,2M 9% / /dev/sda2 57M 315K 57M 1% /var tmpfs 250K 1 250K 1% /dev/shm
Como veis los sistemas de ficheros normalmente tienen una gran cantidad de inodos disponibles, pero aunque parezca imposible en según que circunstancias es posible llenarlos, al final de la entrada explicaremos una de las maneras de que esto ocurra.
Volviendo al espacio que es lo más común, cuando una partición está llena aparece de esta forma:
S.ficheros Tamaño Usado Disp Uso% Montado en /dev/sda2 904G 904G 0G 100% /var
Como se aprecia no queda espacio disponible en la partición sda2, está el 100% ocupado. Una vez detectado la causa de la parada del servicio, lo que nos queda es determinar donde están esos datos extra, liberar espacio en disco y tratar de configurar el sistema para que no vuelva a ocurrir.
Para encontrar donde se encuentran los ficheros una manera sencilla es utilizar el comando “du”. Este comando muestra lo que ocupan las carpetas y directorios, aceptando paramentos como -sch, la “s” para que no muestre subdirectorios, la “c” para que nos ofrezca el total al final, y la “h” para que lo haga “human readable”.
Al poner este comando hay que especificar una ruta donde mirar. Si la ruta acaba en “/ruta/*”, nos mostrará detalladamente lo que ocupan las carpetas de dentro de “ruta”, si acaba así “/ruta” o “/ruta/” solo mostrará el total de esa carpeta.
Por tanto para descubrir que ocupa cada subcarpeta de /var habría que poner:
[root@server ~]# du -sch /var/* 4,0K /var/account 12K /var/aquota.user 33G /var/backup 268M /var/cache 12K /var/db 8,0K /var/drweb 16K /var/empty 4,0K /var/games 1,2G /var/lib 4,0K /var/local 32K /var/lock 991M /var/log 16K /var/lost+found 0 /var/mail 240K /var/named 4,0K /var/nis 14M /var/opt 8,0K /var/parallels 4,0K /var/PMMtmp 4,0K /var/preserve 16K /var/proftpd.delay 473M /var/qmail 4,0K /var/racoon 708K /var/run 60K /var/spool 4,0K /var/tmp 27G /var/www 4,0K /var/yp 62G total
Como veis se muestra cada subcarpeta o fichero y su respectivo tamaño look these up. Esto, si la lista es muy larga puede hacer que nos cueste ver donde están los que más ocupan, un truco para solo visualizar las carpetas que superen el Giga es usar el comando grep y filtrar por “G” de Gigas. Solo mostrará cuando haya alguna carpeta que contenga la “G” mayúscula:
[root@server ~]# du -sch /var/* |grep "G" 33G /var/backup 1,2G /var/lib 27G /var/www 62G total
Una vez detectada la carpeta que puede tener un exceso de tamaño podemos volver a repetir la operación añadiéndola a la ruta que hemos usado antes:
[root@server ~]# du -sch /var/backup/* |grep "G" 33G /var/backup/custom 33G total
Lo que nos mostrará otra lista de carpetas con su respectivo tamaño. Una vez hayamos encontrado los ficheros que han ocasionado el problema será necesario moverlos, eliminarlos o reducirlos, según de que se trate, y tomar las medidas necesarias impedir que vuelva a ocurrir lo mismo.
Una vez eliminados podemos utilizar de nuevo el comando “df -h” para ver si el sistema de ficheros ya nos muestra tamaño disponible, y acto seguido recomendamos reiniciar todos los servicios afectados.
A veces después de eliminar los ficheros, si estos estaban siendo utilizados de alguna forma por el sistema, es posible que aunque el fichero ya no se muestre, el espacio siga estando ocupado y nuestro servidor seguirá sin funcionar correctamente.
Para determinar cuales son estos ficheros y liberar el espacio podemos utilizar el comando “lsof +L1” que nos mostrará los ficheros abiertos pero que ya no están enlazados al sistema, es decir que han sido marcados como borrados pero aun hay alguna aplicación que los está utilizando.
[root@server ~]# lsof +L1 COMMAND PID USER FD TYPE DEVICE SIZE NLINK NODE NAME mysqld 4432 mysql 4u REG 8,1 0 0 376834 /tmp/ibwZB0zu (deleted) mysqld 4432 mysql 5u REG 8,1 607 0 376844 /tmp/ibgjSOHT (deleted) mysqld 4432 mysql 6u REG 8,1 0 0 376845 /tmp/ibQLmDPi (deleted) mysqld 4432 mysql 7u REG 8,1 0 0 376846 /tmp/ibOXpa96 (deleted) mysqld 4432 mysql 11u REG 8,1 0 0 376847 /tmp/ib43kKjz (deleted) smartd 4813 root txt REG 8,1 2384848 0 180658 /usr/sbin/smartd (deleted) sw-engine 31645 psaadm 3u REG 8,1 0 0 655362 /tmp/.apc.l2a6sN (deleted) sw-engine 31645 psaadm 4u REG 8,1 0 0 655363 /tmp/.apc.a1EXf4 (deleted) sw-engine 31645 psaadm 5r REG 8,1 0 0 655364 /tmp/.apc.9IfP2k (deleted) sw-engine 31645 psaadm 6u REG 8,1 0 0 655365 /tmp/.apc.2NuHPB (deleted) sw-engine 31645 psaadm 7r REG 8,1 0 0 655366 /tmp/.apc.DASzCS (deleted) sw-engine 31645 psaadm 8u REG 8,1 1 0 655367 /tmp/sw-engine-fcgi-accept-stamp.6TYYs9 (deleted)
En la columna “SIZE” se nos informa del tamaño de dicho fichero, y a través del “COMMAND”, el “USER” y el “PID” podremos determinar que servicio es el que los tiene retenidos.
Si necesitamos urgentemente liberar ese espacio en disco podemos hacerlo de dos maneras, una matando el proceso que lo tiene abierto o reiniciando el sistema, o dos si no es posible hacer esto pues podemos vaciarlo manualmente de la forma siguiente:
1. Buscamos la ruta real del fichero, es la última columna, para el ejemplo utilizaremos “/tmp/ibgjSOHT” que ocupa 607. Para ello usaremos el PID y el FD de la lista sacada por el lsof, en este formato “/proc/PID/fd/FD”, y comprobamos que es así con un “ls -l”:
[root@server ~]# ls -l /proc/4432/fd/5 lrwx------ 1 root root 64 feb 6 10:42 /proc/4432/fd/5 -> /tmp/ibgjSOHT (deleted)
El destino del enlace debe corresponder con el fichero mostrado del lsof, y ademas ya nos indica que el fichero está marcado como “deleted”.
2. Machacaremos el fichero con la salida de /dev/null (es decir que lo vaciamos):
[root@server ~]# cat /dev/null > /proc/4432/fd/5
[root@server ~]# lsof +L1 |grep ibgjSOHT mysqld 4432 mysql 5u REG 8,1 0 0 376844 /tmp/ibgjSOHT (deleted)
Y ahora el fichero que ocupaba espacio ha pasado a ocupar 0, problema solucionado. En el caso de que hubiera muchos ficheros, este sistema manual habría que automatizarlo con un script, o bien ir pensando en parar el servicio que tiene abiertos los ficheros.
Y hasta aquí hemos llegado con esta entrada, las causas más comunes de exceso de recursos suelen ser por backups descontrolados, colas enormes de spam, lo que puede superar el limite de inodos, o logs de visitas/errores que crecen descontroladamente, aquí hemos llegado a verlos de 700Gb, pero esto ya forma parte de otro artículo.
Si tienes problemas de este tipo y no consigues solucionarlos por ti mismo te recomendamos contactar con un administrador especializado, nosotros ofrecemos estos servicios, visita nuestra página y pide presupuesto sin ningún compromiso.
Un saludo.