Un problema común en servidores que manejan grandes volúmenes de datos es quedarse sin espacio disponible en alguna partición. Este inconveniente puede ser crítico, si el sistema de archivos que se queda sin espacio disponible hospeda algún directorio crucial para el funcionamiento del sistema, como por ejemplo el directorio /var y sus subdirectorios.

El directorio /var contiene datos variables como archivos de log del sistema, directorios para colas de correo e impresoras, y archivos transitorios o temporales. Por ende se trata de archivos y directorios que el sistema debe ser capaz de escribir durante su operación. Por otro lado, muchos servicios y aplicaciones (syslog, Apache, por citar ejemplos) utilizan por defecto algún subdirectorio de /var como directorio de trabajo.

Por lo tanto, si el directorio /var se queda sin espacio disponible, muchos servicios colapsan (ya que no pueden escribir archivos) y el sistema se vuelve inutilizable.

Esto denota la importancia de separar correctamente, utilizando particiones y sistemas de archivos independientes, aquellos directorios que puedan crecer de forma ilimitada, hasta el punto de ocupar todo el espacio en disco disponible (por ejemplo /var/log, /tmp, etc.). Esto permite que el sistema pueda seguir escribiendo normalmente en el resto de los directorios, y no se provoque un colapso total del mismo.

Desde el punto de vista de la seguridad, en un servidor que no tiene correctamente separados los directorios en diferentes sistemas de archivos, se puede producir un ataque de denegación de servicio (DoS), prácticamente detener el servidor, si se logra que un servicio genere entradas de log hasta el punto de ocupar todo el espacio disponible.

Imaginen el caso de un servidor remoto al que sólo podemos acceder y administrar mediante SSH. ¿Qué sucedería si un ataque DoS provoca que un servicio alcance a ocupar todo el espacio en disco disponible con entradas de log? Tal vez ni siquiera podríamos conectarnos al servidor para reiniciarlo o borrar archivos, ya que ningún proceso podría escribir en disco. No lo sé a ciencia cierta porque nunca me pasó, pero voy a hacer pruebas al respecto.

Pero aunque separemos correctamente los directorios en diferentes particiones, si un sistema de archivos se llena ningún servicio podrá escribir en el mismo y será necesario hacer una limpieza. Aunque lo ideal sería que nunca se ocupe todo el espacio disponible.

Si no disponemos de una herramienta centralizada de monitoreo (como por ejemplo Nagios o Zabbix), podemos implementar un script Bash que nos envíe una alerta por correo electrónico cada vez que un sistema de archivos esté por quedarse sin espacio disponible.

#!/bin/bash

# Uso máximo permitido (en porcentaje)
LIMITE="80"

# Nombre del servidor
SERVIDOR=$(hostname)

# Destinatario del correo electrónico
DESTINATARIO="emi@mail.linuxito.com"

# Archivos temporales
USO="/tmp/df.tmp"
MAIL="/tmp/mail.tmp"

# Valores de utilización de espacio en cada dispositivo (excluye filesystems temporales)
df -P | grep "/dev" | grep -v "udev" | grep -v "tmpfs" > $USO

# Flag para enviar mail si no queda espacio en algún dispositivo
WARNING="no"

# Para cada valor verificar que no supere el límite
while read DEV
do
        PORCENTAJE=$(echo $DEV | awk '{print $5}' | sed -e 's/\%//')

        if [ $PORCENTAJE -gt $LIMITE ]
        then
                # Si supera el límite enviar correo
                WARNING="si"
                echo $DEV | awk '{print "Dispositivo: "$1", uso: "$5", disponible: "$4}' >> $MAIL
        fi
done < "$USO"

if [ $WARNING == "si" ]
then
        ASUNTO="Poco espacio en disco en ${SERVIDOR}"
        DETALLE=$(cat $MAIL)
        MENSAJE="Queda poco espacio disponible en los siguientes sistemas de archivos:\n\n${DETALLE}"
        echo -e "${MENSAJE}" | mail -s "${ASUNTO}" ${DESTINATARIO}
#       cat $MAIL
fi

# Borrar archivos temporales
rm $USO $MAIL > /dev/null 2>&1

 

En el caso de sistemas basados en RHEL (CentOS y otros), cambiar df -h por df -P para que respete el formato POSIX, y así mantenga una línea por fila en la salida de df.

Este simple script Bash obtiene el espacio utilizado (en porcentaje) en cada dispositivo tal como lo reporta el comando df, y si uno o más dispositivos superan un límite establecido, envía una alerta por correo electrónico.

Luego sólo resta ejecutar el script automáticamente con la frecuencia deseada. En mi caso basta con que se ejecute una vez al día, entonces lo agrego al directorio cron.daily:

root@debian7:~# ln -s /root/scripts/verificar_espacio_disponible.sh /etc/cron.daily/verificar_espacio_disponible
root@debian7:~# ll /etc/cron.daily/verificar_espacio_disponible
lrwxrwxrwx 1 root root 45 may 27 09:47 /etc/cron.daily/verificar_espacio_disponible -> /root/scripts/verificar_espacio_disponible.sh

La hora del día a la que se ejecutan los scripts dentro del directorio /etc/cron.daily/ está definida dentro del archivo /etc/crontab, y varía de distribución en distribución y de versión a versión.

Es posible verificar el espacio con una frecuencia mayor a una vez por día creando una nueva tarea en el crontab del usuario, o en el directorio /etc/cron.d/.

Si se detecta que queda poco espacio en un dispositivo se recibe un correo como el siguiente:


Tal vez pueda interesarte


Compartí este artículo