Monitorización de Salud de Disco con Smartmontools
Smartmontools es la herramienta estándar en Linux para monitorizar la salud de discos duros, SSDs y unidades NVMe mediante el sistema S.M.A.R.T. (Self-Monitoring, Analysis and Reporting Technology), permitiendo predecir fallos de disco antes de que ocurran. Esta guía cubre el análisis de atributos SMART, la configuración de tests automáticos, alertas por email, monitorización NVMe y la planificación de sustitución de discos.
Requisitos Previos
- Ubuntu 20.04/22.04 o CentOS 7/8 con acceso root
- Discos HDD, SSD o NVMe con soporte S.M.A.R.T.
- Servidor de correo configurado (para alertas por email)
Instalación de Smartmontools
# Ubuntu/Debian
apt update
apt install -y smartmontools
# CentOS/Rocky Linux
dnf install -y smartmontools
# Verificar la instalación
smartctl --version
# Habilitar el servicio de monitorización
systemctl enable smartd
systemctl start smartd
# Listar todos los discos del sistema
lsblk
ls /dev/sd* /dev/nvme* 2>/dev/null
Análisis de Atributos SMART
# Ver información básica y estado SMART de un disco
smartctl -i /dev/sda
# Ver todos los atributos SMART del disco
smartctl -a /dev/sda
# Salida compacta solo de los atributos
smartctl -A /dev/sda
# Para discos SATA detrás de controladores RAID (LSI/MegaRAID)
# Puede ser necesario especificar el tipo de acceso
smartctl -a /dev/sda -d sat
# Para discos detrás de controlador HP SmartArray
smartctl -a /dev/sda -d cciss,0
Atributos SMART más importantes a monitorizar:
# Interpretar los atributos críticos
smartctl -A /dev/sda | grep -E "Reallocated|Pending|Uncorrectable|Temperature|Hours"
# Atributos críticos:
# ID 5 - Reallocated_Sector_Ct: sectores reasignados (>0 = preocupante)
# ID 10 - Spin_Retry_Count: reintentos de arranque del disco
# ID 184 - End-to-End_Error: errores de integridad de datos
# ID 187 - Reported_Uncorrect: errores no corregibles (HDD)
# ID 188 - Command_Timeout: timeouts de comandos
# ID 196 - Reallocated_Event_Count: eventos de reasignación de sectores
# ID 197 - Current_Pending_Sector: sectores pendientes de reasignar
# ID 198 - Offline_Uncorrectable: sectores no corregibles en offline
# Script para verificar los atributos críticos de todos los discos
cat << 'EOF' > /usr/local/bin/smart-check.sh
#!/bin/bash
# Verificación rápida de atributos SMART críticos
DISCOS=$(lsblk -dn -o NAME,TYPE | awk '$2=="disk" {print "/dev/"$1}')
ALERTA=0
for DISCO in $DISCOS; do
echo "=== Verificando: $DISCO ==="
# Verificar estado global
ESTADO=$(smartctl -H $DISCO 2>/dev/null | grep "SMART overall-health")
echo "$ESTADO"
if ! echo "$ESTADO" | grep -q "PASSED"; then
echo "ALERTA: $DISCO no ha pasado la verificación de salud!"
ALERTA=1
fi
# Verificar sectores reasignados
REASIGNADOS=$(smartctl -A $DISCO 2>/dev/null | \
awk '/Reallocated_Sector_Ct/{print $10}')
if [ -n "$REASIGNADOS" ] && [ "$REASIGNADOS" -gt 0 ]; then
echo "ADVERTENCIA: $DISCO tiene $REASIGNADOS sectores reasignados"
ALERTA=1
fi
echo ""
done
exit $ALERTA
EOF
chmod +x /usr/local/bin/smart-check.sh
Tests SMART Manuales
# Test rápido (tarda ~2 minutos): verifica los atributos básicos
smartctl -t short /dev/sda
# Test largo (HDD: 1-4 horas, SSD: minutos): verificación completa de la superficie
smartctl -t long /dev/sda
# Test de conveyance (solo HDD): detecta daños de transporte
smartctl -t conveyance /dev/sda
# Ver el progreso del test en curso
smartctl -l selftest /dev/sda
# Ver los resultados de los últimos tests
smartctl -l selftest /dev/sda
# Cancelar un test en progreso
smartctl -X /dev/sda
# Ejecutar el test offline (en segundo plano sin interrumpir el sistema)
smartctl -t offline /dev/sda
# Verificar la salud general después del test
smartctl -H /dev/sda
Configuración del Demonio smartd
El demonio smartd monitoriza los discos automáticamente:
# Editar la configuración de smartd
cat << 'EOF' > /etc/smartd.conf
# Monitorizar todos los discos automáticamente detectados
# DEVICESCAN -H -m [email protected] -M exec /usr/share/smartmontools/smartd-runner
# Monitorizar discos específicos con opciones detalladas
/dev/sda \
-H \ # Verificar la salud cada ciclo
-f \ # Reportar cambios en atributos de fallo
-l error \ # Reportar nuevos errores en el log SMART
-l selftest \ # Reportar fallos en los self-tests
-C 197+ \ # Alerta si Current_Pending_Sector aumenta
-U 198+ \ # Alerta si Offline_Uncorrectable aumenta
-o on \ # Activar tests offline automáticos
-S on \ # Activar el guardado automático de atributos
-t \ # Test corto semanal automático
-T permissive \ # Ignorar errores menores de la librería
-m [email protected] \ # Enviar alertas a este email
-M diminishing \ # No repetir emails idénticos
-s (S/../../6/02|L/../../1/01) # Short test los sábados, Long test los lunes
/dev/sdb \
-H \
-f \
-l error \
-l selftest \
-C 197+ \
-U 198+ \
-o on -S on -t \
-m [email protected] \
-M diminishing \
-s (S/../../6/02|L/../../1/01)
EOF
# Reiniciar smartd para aplicar la configuración
systemctl restart smartd
# Verificar el estado de smartd
systemctl status smartd
# Probar la configuración de smartd
smartd --savestate /tmp/smart-state -d
Alertas por Email
# Configurar el sistema de mail en el servidor
apt install -y mailutils postfix
# Configurar postfix para relay (editar /etc/postfix/main.cf)
# relayhost = [smtp.empresa.com]:587
# Probar el envío de emails
echo "Test de alerta SMART" | mail -s "Test SMART" [email protected]
# Configurar el script de alerta personalizado
cat << 'EOF' > /usr/local/bin/smart-alert.sh
#!/bin/bash
# Script ejecutado por smartd cuando detecta un problema
# Variables disponibles de smartd:
# $SMARTD_DEVICE - dispositivo con problema
# $SMARTD_FAILTYPE - tipo de fallo
# $SMARTD_MESSAGE - mensaje de alerta
DESTINATARIO="[email protected]"
HOSTNAME=$(hostname)
# Enviar email con información detallada del fallo
{
echo "ALERTA SMART en el servidor: ${HOSTNAME}"
echo "Dispositivo: ${SMARTD_DEVICE}"
echo "Tipo de fallo: ${SMARTD_FAILTYPE}"
echo "Fecha: $(date)"
echo ""
echo "=== Estado actual del disco ==="
smartctl -a ${SMARTD_DEVICE}
} | mail -s "[ALERTA] Disco ${SMARTD_DEVICE} en ${HOSTNAME}" "${DESTINATARIO}"
# También registrar en syslog
logger -t SMART-ALERT "Fallo en ${SMARTD_DEVICE}: ${SMARTD_FAILTYPE}"
EOF
chmod +x /usr/local/bin/smart-alert.sh
# Referenciar el script en smartd.conf
# -M exec /usr/local/bin/smart-alert.sh
Monitorización de NVMe
Los discos NVMe tienen su propio conjunto de atributos de salud:
# Ver información y salud de un disco NVMe
smartctl -a /dev/nvme0
# Ver los atributos específicos de NVMe
smartctl -A /dev/nvme0
# Atributos importantes de NVMe:
# Critical Warning: debe ser 0x00
# Temperature: temperatura en Celsius
# Available Spare: porcentaje de bloques de repuesto disponibles
# Percentage Used: desgaste del disco (0-100%, >95% = reemplazar pronto)
# Data Units Read/Written: datos leídos/escritos (indicador de desgaste)
# Media and Data Integrity Errors: errores críticos (debe ser 0)
# Test corto NVMe
smartctl -t short /dev/nvme0
# Script de verificación NVMe
cat << 'EOF' > /usr/local/bin/nvme-health-check.sh
#!/bin/bash
# Verificación de salud para discos NVMe
for NVME in /dev/nvme*n1; do
if [ ! -b "$NVME" ]; then continue; fi
echo "=== $NVME ==="
# Porcentaje de desgaste
USADO=$(smartctl -A $NVME | grep "Percentage Used" | awk '{print $3}' | tr -d '%')
echo "Desgaste: ${USADO}%"
if [ -n "$USADO" ] && [ "$USADO" -gt 80 ]; then
echo "ADVERTENCIA: El disco $NVME tiene un desgaste del ${USADO}%"
fi
# Spare disponible
SPARE=$(smartctl -A $NVME | grep "Available Spare" | head -1 | awk '{print $3}' | tr -d '%')
echo "Spare disponible: ${SPARE}%"
if [ -n "$SPARE" ] && [ "$SPARE" -lt 20 ]; then
echo "ADVERTENCIA: Poco spare disponible en $NVME: ${SPARE}%"
fi
echo ""
done
EOF
chmod +x /usr/local/bin/nvme-health-check.sh
Predicción de Fallos
# Ver el número de horas de uso del disco
smartctl -A /dev/sda | grep "Power_On_Hours"
# Calcular la vida útil restante estimada (para SSDs)
# Los SSDs tienen una garantía de TBW (Terabytes Written)
# Comparar el valor "Total_LBAs_Written" con las especificaciones del fabricante
# Ver la temperatura histórica
smartctl -l scttemp /dev/sda
# Ver la distribución de temperaturas a lo largo del tiempo
smartctl -l scttempsts /dev/sda
# Guardar el estado SMART para comparación futura
smartctl -s on /dev/sda
smartctl -S on /dev/sda
# Generar un informe completo de un disco
smartctl -x /dev/sda > /var/log/smart-informe-sda-$(date +%Y%m%d).txt
# Comparar atributos SMART a lo largo del tiempo
# (usando el estado guardado por smartd con -S on)
cat /var/lib/smartmontools/DEVSTAT-dev-sda
Solución de Problemas
# El disco no soporta SMART
smartctl -i /dev/sda | grep "SMART support is"
# Si dice "Disabled", habilitarlo:
smartctl -s on /dev/sda
# Errores "Device open failed"
# Verificar que el disco existe y es accesible
ls -la /dev/sda
lsblk
# SMART no disponible en disco detrás de controlador RAID
# Especificar el tipo de acceso
smartctl -a /dev/sda -d sat # Para discos SATA estándar
smartctl -a /dev/sda -d auto # Detección automática
# Ver los errores del log de smartd
journalctl -u smartd --no-pager | tail -30
# Ejecutar smartd en modo foreground para depuración
smartd -d -D -i 1 2>&1 | head -50
# Ver el test en progreso (porcentaje)
smartctl -a /dev/sda | grep "Self-test execution status"
Conclusión
Smartmontools es una herramienta indispensable para cualquier administrador de sistemas que gestione servidores baremetal, ya que permite detectar discos con problemas antes de que fallen completamente y provoquen pérdida de datos. La combinación de smartd para la monitorización continua, tests automáticos programados y alertas por email crea un sistema de vigilancia robusto. Para una gestión proactiva, monitoriza especialmente los atributos de sectores reasignados, sectores pendientes y el porcentaje de desgaste en SSDs, y actúa cuando estos valores superan los umbrales críticos.


