Tag Archives: fsck

NAGIOS: Supervisando los test de disco

El sistema de ficheros por defecto en Linux viene siendo Extendida en sus versiones 2, 3 y ahora 4. A la hora de crear el sistema, cuando damos formato a la partición, se establecen un intervalo de tiempo y un número de veces que la partición se montará antes de ser revisada para comprobar la integridad del sistema. En Debian, estos valores son 180 días o 39 montajes. Es bueno comprobar periódicamente la salud de nuestros sistemas para evitar corrupciones y la consiguiente perdida de datos.

Sin embargo, tenemos la posibilidad de no definir ningún número de montajes máximo ni intervalo de fechas para que nunca se automaticen los test de disco, quedando bajo nuestra responsabilidad llevarlos a cabo cuando estimemos oportuno. Cuando ese momento llegue, reiniciaremos la máquina con este comando.

# shutdown -r -F now

Que reiniciará la máquina y pasará el test al arrancar el sistema.

Esta decisión implica una planificación de la acción, tener un calendario a mano y marcar los días que se va a lanzar el comando.

Para que los test no sean automáticos debemos configurar las particiones para que no cuenten los montajes o los intervalos de tiempo entre revisiones. Por ejemplo para /dev/sda1 haríamos:

# tune2fs -i 0 /dev/sda1 
# tune2fs -c -1 /dev/sda1

Y deshabilitamos las comprobaciones automáticas.

Si nos decidimos por dejar estos valores intactos o cambiarlos por un rango más amplio de tiempo o mayor número de montajes nos gustará saber cuando sucederá la siguiente comprobación, por ejemplo, en el caso de actualizar alguna máquina y tener que reiniciarla, si no podemos perder tiempo pasando el test, reiniciaremos con el siguiente comando.

# shutdown -r -f now

Que reiniciará y se saltará el test.

Para supervisar estos valores he escrito un script para Nagios que recibirá por parámetros los valores de aviso y critico y el dispositivo a supervisar.

Esta es la sintaxis.

# check_next_fsck -w DAYS,MOUNTS -c DAYS,MOUNTS -d DEVICE

Si queremos que nos avise 7 días o 10 montajes antes de que se cumplan los límites de aviso y entre en crítico cuando queden 4 días o 5 montajes pues pasaremos los siguiente parámetros al script

# check_next_fsck -w 7,10 -c 4,5 -d /dev/sda1

También cumple con la especificación POSIX de Nagios y el valor devuelto es el indicado para cada caso. Se comprueba si el dispositivo que le pasamos como parámetro está configurado para ser revisado periódicamente tanto en tiempo como en número de montajes. Si el usuario que corre Nagios es no privilegiado, necesitaras configurar sudo para que pueda ejecutar tune2fs

La principal motivación que me ha llevado a escribirlo es que no he encontrado en el directorio de plugins de Nagios ninguno que me gustara. Este es:

#!/bin/bash
# --
# Check the date and mount count of the device passed by parameter. It's able to
# manage devices not configurated to be checked by fsck (values -1 and none in
# max mount count and date interval).
#
# Needs sudo without passwd to run tune2fs
#
# Usage: check_next_fsck -w DAYS,MOUNTS -c DAYS,MOUNTS -d DEVICE
#
# @author: Fede Diaz nordri (at) gmail.com
# @version: 1.0.1
# @date: 2011/03/20
# Changelog
# 2011/07/12
# Fix a type.
# --

if [ "$#" -lt 6 ]; then
  echo "Usage: $0 -w DAYS,MOUNTS -c DAYS,MOUNTS -d DEVICE";
  exit 3;
fi

until [ -z "$1" ]  
do
  if [ $1 == "-w" ]; then
    VALUE=$2;
    WARNING_DAYS=$(echo $VALUE | cut -d, -f1);
    WARNING_MOUNTS=$(echo $VALUE | cut -d, -f2);
  elif [ $1 == "-c" ]; then
    VALUE=$2;
    CRITICAL_DAYS=$(echo $VALUE | cut -d, -f1);
    CRITICAL_MOUNTS=$(echo $VALUE | cut -d, -f2);
  elif [ $1 == "-d" ]; then
    DEVICE=$2;
  fi
  shift;
done

# Parsing tune2fs exits (Beware with sudo)
TARGET_DATE=$(sudo /sbin/tune2fs -l $DEVICE | grep "Next check after" | cut -d: -f2,3,4 );
CHECK_INTERVAL=$(sudo /sbin/tune2fs -l $DEVICE | grep "Check interval" | cut -d: -f2 );
INTERVAL=$(echo $CHECK_INTERVAL | cut -d" " -f1);
MOUNT_COUNT=$(sudo /sbin/tune2fs -l $DEVICE | grep "Mount count" | cut -d: -f2 );
MAX_MOUNT_COUNT=$(sudo /sbin/tune2fs -l $DEVICE | grep "Maximum mount count" | cut -d: -f2 );

# Calculating dates
TODAY=$(date +"%s");
EPOCH_TARGET_DATE=$(date +"%s" -d "$TARGET_DATE");

let SECONDS_LEFT="$EPOCH_TARGET_DATE - $TODAY";

CHECK_DATES="YES"; # Check interval = none means NO INTERVAL TIME BETWEEN MOUNTS
if [ $INTERVAL == 0 ]; then 
  CHECK_DATES="NO";
else
  let DAYS_LEFT="$SECONDS_LEFT/86400";
fi

CHECK_MOUNT_COUNT="YES"; # Maximum mount count = -1 means NO COUNT MOUNTS
if [ $MAX_MOUNT_COUNT == -1 ]; then
  CHECK_MOUNT_COUNT="NO";
else
  let MOUNT_LEFT="$MAX_MOUNT_COUNT - $MOUNT_COUNT";
fi

# Calculating WARNINGS and CRITICAL
if [ $CHECK_DATES == "YES" ]; then
  if [ $DAYS_LEFT -gt $WARNING_DAYS ]; then
    VALUE="0";
  elif [ $DAYS_LEFT -lt $CRITICAL_DAYS ]; then
    VALUE="2";
  else
    VALUE="1";
  fi
else
  VALUE="3";
fi

if [ $CHECK_MOUNT_COUNT == "YES" ]; then
  if [ $MOUNT_LEFT -gt $WARNING_MOUNTS ]; then
    VALUE=$VALUE"0";
  elif [ $MOUNT_LEFT -lt $CRITICAL_MOUNTS ]; then
    VALUE=$VALUE"2";
  else
    VALUE=$VALUE"1";
  fi
else
  VALUE=$VALUE"3";
fi

# Returning the results
case $VALUE in
  "00")
    echo "OK next check in $DAYS_LEFT days or $MOUNT_LEFT mounts";
    exit 0;
    ;;
  "01")
    echo "WARNING next check in $MOUNT_LEFT mounts";
    exit 1;
    ;;
  "02")
    echo "CRITICAL next check in $MOUNT_LEFT mounts";
    exit 2;
    ;; 
  "10")
    echo "WARNING next check in $DAYS_LEFT days";
    exit 1;
    ;;
  "11")
    echo "WARNING next check in $DAYS_LEFT days and $MOUNT_LEFT mounts";
    exit 1;
    ;;
  "12")
    echo "CRITICAL next check in $MOUNT_LEFT mounts";
    exit 2;
    ;;
  "20")
    echo "CRITICAL next check in $DAYS_LEFT days";
    exit 2;
    ;;
  "21")
    echo "CRITICAL next check in $DAYS_LEFT days";
    exit 2;
    ;;
  "22")
    echo "CRITICAL next check in $DAYS_LEFT days and $MOUNT_LEFT mounts";
    exit 2;
    ;;
  "33")
    echo "UNKNOWN Nothing to check";
    exit 3;
    ;;
esac

La salida cubre todos los estados posibles dando prioridad a crítico frente a los demás.

UpdateEl código también está disponible en el repositorio de extensiones de Nagios.

Se Equivocó

Hoy realizaba una nueva instalación de un servidor con una Debian Lenny, instalación desde DVD. Esta máquina hará las veces de Servidor de Directorio para la LAN. Tiene su miga. Partiendo de la base que si un Linux falla, es culpa del administrador (o sea, yo), voy a contar lo que pasó.

En esta instalación el punto más importante estaba en el particionado del disco, el plan era tener la / en raid1 y luego una DAS de 8 Teras en raid5 con LVM2 para /home. Bien, el proceso de instalación avanzó sin problemas hasta la edición del particionado del disco. Físicamente tenemos dos discos sata de 500 GB y el dispositivo /dev/sdc que es la DAS en acceso en bruto, el dispositivo se monta a través de /dev/mapper/datos.

Entonces cuando llegué a este punto de la instalación, el programa me presentó todas estas cosas, tomé sda y creé una partición primaria al final del disco de 490GB, nació sda1, hice lo mismo con sdb, y también nació sdb1, puse los 10GB sobrantes de sda para /boot, ya sda2 y los 10GB de sdb para swap, sdb2. Elegí entonces sda1 y sdb1 y los seleccioné para formar el raid1, nació md0. Posteriormente, le dije que el volumen lógico lo montara en /home. Hasta aquí todo bien.

La instalación prosiguió y al momento de reiniciar e iniciar la nueva instalación… error!! fsck me comenta que la partición /dev/sda2 no tiene una tabla de particiones válida.

CLARO QUE NO es una partición swap, pero es que ahora sda2 no es swap, por alguna razón al reiniciar, el que era /dev/sdc, o sea, el DAS físico había cambiado a /dev/sda! y las líneas en /etc/fstab ya no valían. No todas, al menos. Una vez corregido el inconveniente, reinicié y ya no intentaba checar trozos de disco sin partición.

Aun no entiendo por qué cambió el orden de los dispositivos, cae un mito sobre el poder de Linux, no me esperaba algo de este calibre. Otra cosa que he visto es que también nombra a las particiones en el orden en la que aparecen, no en el orden en el que están físicamente en el disco.

Solucionado el problema, pude irme a casa satisfecho, mañana empezaré la instalación y configuración del nuevo servidor. Pero yo no tuve la culpa!