Entradas

Liberar espacio en disco – Taller Linux

Liberar espacio en discoEn 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.