Monitorización de Temperatura y Hardware con lm-sensors

lm-sensors es el conjunto de herramientas estándar en Linux para leer sensores de temperatura de CPU, velocidad de ventiladores, voltajes y otros parámetros de hardware directamente desde los chips de monitorización de la placa base. Esta guía cubre la instalación, la detección de sensores, la configuración de umbrales de alerta, el control de ventiladores y la integración con herramientas de monitorización.

Requisitos Previos

  • Ubuntu 20.04/22.04 o CentOS 7/8 con acceso root
  • Hardware compatible con sensores I2C/SMBus (la mayoría de placas base modernas)
  • Módulos del kernel: i2c-dev, coretemp (Intel) o k10temp (AMD)

Instalación de lm-sensors

# Ubuntu/Debian
apt update
apt install -y lm-sensors fancontrol i2c-tools

# CentOS/Rocky Linux
dnf install -y lm_sensors fancontrol i2c-tools

# Verificar la instalación
sensors --version

# Cargar los módulos necesarios para la detección de sensores
modprobe i2c-dev

# Para CPUs Intel, el módulo de temperatura del core
modprobe coretemp

# Para CPUs AMD Ryzen/EPYC
modprobe k10temp

# Para plataformas más antiguas
modprobe lm85
modprobe w83781d

Detección de Sensores

# Ejecutar la detección automática de chips de sensores
# IMPORTANTE: responder 'yes' a todas las preguntas de carga de módulos
sensors-detect

# El proceso detecta:
# - Chips de monitorización de la placa base (ITE, Nuvoton, Winbond, etc.)
# - Sensores de temperatura de CPU
# - Módulos I2C disponibles

# Al final, sensors-detect sugiere añadir módulos al fichero de módulos del kernel
# Normalmente añade líneas a /etc/modules o /etc/modules-load.d/lm-sensors.conf

# Verificar los módulos cargados después de la detección
lsmod | grep -E "sensor|it87|nct|coretemp|k10temp"

# Guardar los módulos para carga automática al arrancar
cat /etc/modules-load.d/lm-sensors.conf

Lectura de Temperaturas y Voltajes

# Ver todos los sensores disponibles
sensors

# Salida típica de ejemplo:
# coretemp-isa-0000
# Adapter: ISA adapter
# Core 0:       +42.0°C  (high = +80.0°C, crit = +100.0°C)
# Core 1:       +44.0°C  (high = +80.0°C, crit = +100.0°C)
#
# nct6797-isa-0290
# Adapter: ISA adapter
# Vcore:        +0.95 V  (min = +0.20 V, max = +1.74 V)
# fan1:         800 RPM  (min = 300 RPM)
# SYSTIN:       +38.0°C
# CPUTIN:       +45.0°C

# Ver sensores con más detalle (incluye límites y alarmas)
sensors -u

# Filtrar solo las temperaturas
sensors | grep -E "°C|Temp|temp"

# Filtrar velocidades de ventiladores
sensors | grep -E "fan|RPM"

# Ver la temperatura de la CPU específicamente
sensors | grep -A2 "coretemp\|k10temp"

# Obtener la temperatura en formato legible por máquinas (para scripts)
sensors -j  # Formato JSON (requiere lm-sensors >= 3.5)

# Ver el nombre del chip de cada sensor
sensors -A

# Temperatura de las tarjetas gráficas NVIDIA
# (requiere nvidia-smi)
nvidia-smi --query-gpu=temperature.gpu --format=csv,noheader

Configuración de Umbrales

# El archivo de configuración de sensores
# /etc/sensors3.conf o /etc/sensors.d/*.conf

# Ver la configuración actual de un chip específico
cat /etc/sensors3.conf | grep -A 20 "nct6797"

# Crear una configuración personalizada para nuestros sensores
cat << 'EOF' > /etc/sensors.d/servidor-produccion.conf
# Configuración de sensores para el servidor de producción

# Chip: NCT6797 (placa base)
chip "nct6797-*"

    # Temperatura del sistema (umbral de advertencia a 70°C, crítico a 85°C)
    set temp1_max 70
    set temp1_crit 85

    # Fan1 - ventilador de CPU
    # Umbral mínimo: si baja de 200 RPM, alertar
    set fan1_min 200

    # Ignorar sensores no conectados (evita alarmas falsas)
    ignore fan5
    ignore fan6

# Chip: coretemp (temperatura del procesador Intel)
chip "coretemp-*"

    # Temperatura máxima de los cores a 85°C
    # (el fabricante puede especificar el TjMax, generalmente 100°C)
    set temp2_max 85
    set temp3_max 85

# Etiquetas personalizadas para los sensores
    label temp1 "CPU Package"
    label temp2 "Core 0"
    label temp3 "Core 1"
EOF

# Verificar que la configuración es válida
sensors

Control de Ventiladores con fancontrol

# Configurar el control automático de ventiladores según temperatura
# ADVERTENCIA: Hacer una copia de seguridad de la configuración del BIOS primero

# Ejecutar la configuración interactiva de fancontrol
pwmconfig

# El proceso pregunta:
# 1. ¿Qué ventiladores controlar? (fan1, fan2, etc.)
# 2. ¿Qué sensores de temperatura usar como referencia?
# 3. Los umbrales de temperatura y velocidad de ventilador

# El archivo de configuración resultante se guarda en /etc/fancontrol
cat /etc/fancontrol

# Ejemplo de configuración de fancontrol:
cat << 'EOF' > /etc/fancontrol
# Configuración de control de ventiladores
INTERVAL=10

# Mapeo: pwmX controla fanX, basado en tempX
DEVPATH=hwmon0=devices/platform/nct6775.2576
DEVNAME=hwmon0=nct6797

# Ventilador 1 controlado por temperatura del CPU
FCTEMPS=hwmon0/pwm1=hwmon0/temp2_input

# Cortes y mínimos de velocidad del ventilador
FCFANS=hwmon0/pwm1=hwmon0/fan1_input

# Temperatura a la que el ventilador empieza a girar (en milligrados)
MINTEMP=hwmon0/pwm1=40000

# Temperatura a la que el ventilador gira a máxima velocidad
MAXTEMP=hwmon0/pwm1=80000

# Velocidad mínima del ventilador (0-255, 0=parado)
MINSTART=hwmon0/pwm1=100

# Valor PWM cuando está a temperatura mínima
MINSTOP=hwmon0/pwm1=50
EOF

# Iniciar el servicio fancontrol
systemctl enable fancontrol
systemctl start fancontrol

# Verificar que funciona
systemctl status fancontrol

Integración con Prometheus y Grafana

# Instalar el exporter de lm-sensors para Prometheus
# Opción 1: node_exporter (incluye sensores automáticamente)
wget https://github.com/prometheus/node_exporter/releases/download/v1.7.0/node_exporter-1.7.0.linux-amd64.tar.gz
tar xvf node_exporter-1.7.0.linux-amd64.tar.gz
mv node_exporter-1.7.0.linux-amd64/node_exporter /usr/local/bin/

# Crear el servicio systemd para node_exporter
cat << 'EOF' > /etc/systemd/system/node-exporter.service
[Unit]
Description=Prometheus Node Exporter
After=network.target

[Service]
Type=simple
User=node_exporter
ExecStart=/usr/local/bin/node_exporter \
    --collector.hwmon \
    --collector.thermal_zone
Restart=on-failure

[Install]
WantedBy=multi-user.target
EOF

useradd --no-create-home --shell /bin/false node_exporter
systemctl daemon-reload
systemctl enable node-exporter
systemctl start node-exporter

# Verificar las métricas de temperatura exportadas
curl -s http://localhost:9100/metrics | grep node_hwmon_temp

Configurar alertas en Prometheus:

# prometheus/rules/hardware-alerts.yml
groups:
  - name: hardware-temperature
    rules:
      - alert: CPUTemperaturaAlta
        expr: node_hwmon_temp_celsius{sensor="Package id 0"} > 80
        for: 2m
        labels:
          severity: warning
        annotations:
          summary: "Temperatura CPU alta en {{ $labels.instance }}"
          description: "La temperatura del CPU es {{ $value }}°C"

      - alert: CPUTemperaturaCritica
        expr: node_hwmon_temp_celsius{sensor="Package id 0"} > 95
        for: 1m
        labels:
          severity: critical
        annotations:
          summary: "CRÍTICO: Temperatura CPU peligrosa en {{ $labels.instance }}"
          description: "La temperatura del CPU es {{ $value }}°C - riesgo de apagado"

Alertas Automáticas

# Script de monitorización de temperatura con alertas
cat << 'EOF' > /usr/local/bin/temp-monitor.sh
#!/bin/bash
# Monitorización de temperatura con alertas

UMBRAL_WARN=75    # Temperatura de advertencia en Celsius
UMBRAL_CRIT=90    # Temperatura crítica en Celsius
EMAIL="[email protected]"
HOSTNAME=$(hostname)

# Obtener la temperatura máxima de la CPU
TEMP_MAX=$(sensors 2>/dev/null | \
    grep -E "Core|Package" | \
    grep -oP '\+\d+\.\d+°C' | \
    grep -oP '\d+\.\d+' | \
    sort -n | \
    tail -1 | \
    cut -d. -f1)

if [ -z "$TEMP_MAX" ]; then
    echo "ERROR: No se pueden leer los sensores de temperatura"
    exit 1
fi

echo "Temperatura máxima de CPU: ${TEMP_MAX}°C"

if [ "$TEMP_MAX" -ge "$UMBRAL_CRIT" ]; then
    # Temperatura crítica: enviar email y registrar en syslog
    logger -p daemon.crit -t TempMonitor "CRÍTICO: CPU a ${TEMP_MAX}°C"
    echo "CRÍTICO: CPU a ${TEMP_MAX}°C en ${HOSTNAME}" | \
        mail -s "[CRÍTICO] Temperatura CPU en ${HOSTNAME}" "$EMAIL"
    exit 2
elif [ "$TEMP_MAX" -ge "$UMBRAL_WARN" ]; then
    # Temperatura de advertencia
    logger -p daemon.warning -t TempMonitor "ADVERTENCIA: CPU a ${TEMP_MAX}°C"
    echo "ADVERTENCIA: CPU a ${TEMP_MAX}°C en ${HOSTNAME}" | \
        mail -s "[ADVERTENCIA] Temperatura CPU en ${HOSTNAME}" "$EMAIL"
    exit 1
fi

exit 0
EOF
chmod +x /usr/local/bin/temp-monitor.sh

# Programar la monitorización cada 5 minutos con cron
echo "*/5 * * * * root /usr/local/bin/temp-monitor.sh" > /etc/cron.d/temp-monitor

Solución de Problemas

# sensors no muestra nada después de sensors-detect
# Cargar los módulos manualmente
sensors-detect --auto
systemctl restart kmod

# Error "Can't access sysfs directory"
# Verificar que los módulos están cargados
lsmod | grep -E "coretemp|k10temp|nct|it87"

# Cargar un módulo específico manualmente
modprobe coretemp
modprobe nct6775

# La detección automática no encuentra sensores
# Intentar especificar el chip manualmente
modprobe w83781d
modprobe lm85

# Sensores de temperatura muestran valores incorrectos (comunes en VMs)
# Verificar que es un servidor físico real
systemd-detect-virt

# Tempscalar: calibrar los sensores
# Algunos chips necesitan un offset de calibración
# Añadir a /etc/sensors.d/calibracion.conf:
# compute temp1 @+5, @-5    # Añadir 5°C de offset

# Ver los dispositivos I2C disponibles
i2cdetect -l
i2cdump -y 0 0x2d  # Leer el chip en bus 0, dirección 0x2d

Conclusión

lm-sensors es una herramienta fundamental para la monitorización de hardware en servidores Linux físicos, proporcionando visibilidad sobre las temperaturas, voltajes y velocidades de ventiladores que son críticos para la estabilidad y longevidad del hardware. La integración con Prometheus y Grafana permite crear dashboards de salud del hardware y alertas proactivas que pueden prevenir apagados por temperatura o fallos de hardware. En entornos baremetal de producción, la monitorización continua de temperatura es tan importante como la monitorización de métricas de aplicación.