Páginas

martes, 23 de septiembre de 2025

Supervisar Disco con smartmontools en FreeBSD 14.4

Configurar smartmontools en FreeBSD 14.4 para supervisar el estado de discos SSD y/o NVMe y enviar correos mediante mail del sistema o los servidores de Gmail.

Requisitos previos

- FreeBSD 14.x
- smartmontools instalado.
- DMA configurado con Gmail.

Paso 1 — Instalar smartmontools

pkg install smartmontools

Habilitar el servicio smartd al arranque

sysrc smartd_enable="YES"

Paso 2 — Configurar DMA para enviar correos por Gmail

FreeBSD 14.4 usa DMA (DragonFly Mail Agent) como agente de correo por defecto. La configuración completa de DMA con Gmail (autenticación, contraseña de aplicación, smarthost) se explica en el siguiente artículo:

https://gnulinuxcodigo.blogspot.com/2024/12/freebsd-dma-dragonfly-mail-agent.html

Probar el envío de correo (directo, sin pasar por el script)

echo "Prueba de correo desde FreeBSD" | mail -s "Prueba" usuario@gmail.com
Esto utiliza mail directamente, sin pasar por el script, y sirve para verificar que DMA funciona antes de integrar smartd. Si no llega el correo, revisa /var/log/maillog y la configuración de DMA antes de continuar.

Paso 3 — Crear el helper de notificación

En FreeBSD el paquete smartmontools no instala ningún helper de notificación; hay que crearlo manualmente. Este script es el que smartd invocará cada vez que necesite enviar un correo, y se encarga de llamar a /usr/bin/mail.

cat > /usr/local/sbin/smartdnotify-mailout <<'EOF'
#!/bin/sh
# ============================================================
# smartdnotify-mailout
#
# Script de notificación para smartd.
# smartd lo invoca con las variables de entorno:
#   SMARTD_SUBJECT - asunto del mensaje
#   SMARTD_ADDRESS - dirección(es) de destino
#   SMARTD_FAILTYPE - tipo de fallo
#   SMARTD_DEVICE / SMARTD_DEVICESTRING - dispositivo afectado
#
# El cuerpo del mensaje llega por stdin.
# ============================================================

MAIL=/usr/bin/mail

exec ${MAIL} -s "${SMARTD_SUBJECT}" "${SMARTD_ADDRESS}"
EOF

Dar permisos de ejecución y propietario

chmod 755 /usr/local/sbin/smartdnotify-mailout
chown root:wheel /usr/local/sbin/smartdnotify-mailout

Verificar que el contenido es correcto

cat /usr/local/sbin/smartdnotify-mailout
El archivo debe contener el script tal cual (con ${MAIL}, ${SMARTD_SUBJECT} y ${SMARTD_ADDRESS} literales, sin expandir). Si ves esas variables ya sustituidas por valores, el heredoc se cerró mal y hay que recrear el archivo.

Prueba manual del script (simulando una llamada de smartd)

echo "Este es un mensaje de prueba enviado por smartdnotify-mailout." \
| env SMARTD_SUBJECT="TEST: prueba de smartdnotify-mailout" \
      SMARTD_ADDRESS="usuario@gmail.com" \
      /usr/local/sbin/smartdnotify-mailout
Se usa env para pasar las variables de entorno de forma portable, porque la sintaxis VAR=valor comando no funciona en csh (el shell por defecto de root en FreeBSD).

Paso 4 — Identificar los discos

smartctl --scan

/dev/da0 -d sat # /dev/da0 [SAT], ATA device
/dev/nvme0 -d nvme # /dev/nvme0, NVMe device

Comprobar que smartctl habla con el NVMe

smartctl -d nvme -a /dev/nvme0

Mostrará modelo, serial, versión NVMe, etc.

smartctl 7.5 2025-04-30 r5714 [FreeBSD 14.4-RELEASE-p8 amd64] (local build)
Copyright (C) 2002-25, Bruce Allen, Christian Franke, www.smartmontools.org

=== START OF INFORMATION SECTION ===
Model Number:                       CT500P3SSD8
Serial Number:                      2240E6733488
Firmware Version:                   P9CR30A
PCI Vendor/Subsystem ID:            0xc0a9
IEEE OUI Identifier:                0x00a075
Controller ID:                      1
NVMe Version:                       1.4
Number of Namespaces:               1
Namespace 1 Size/Capacity:          500,107,862,016 [500 GB]
...

Paso 5 — Configurar /usr/local/etc/smartd.conf

Este es el contenido completo del fichero de configuración de smartd, adaptado a los dos discos del sistema: el SSD NVMe principal y el disco USB de backup.

# ============================================================
# /usr/local/etc/smartd.conf
# Monitorización SMART
# ============================================================
# Documentación: man 5 smartd.conf
#
# Directivas comunes:
#   -a            Equivale a: -H -f -t -l error -l selftest -l selfteststs -C 197 -U 198
#   -o on         Activa el auto offline data collection test
#   -S on         Activa el auto-save de atributos SMART
#   -n standby,q  No despierta el disco si está dormido
#   -s ...        Programa self-tests (S=corto, L=largo)
#   -m ...        Destinatario del correo
#   -M exec ...   Ejecuta el script indicado para enviar el correo
#   -M test       Envía un correo de prueba al arrancar (solo para verificar)
# ============================================================

# ------------------------------------------------------------
# SSD NVMe principal (sistema)
# Self-test corto diario a las 02:00, largo los domingos a las 03:00
# ------------------------------------------------------------
/dev/nvme0 -d nvme \
    -a -o on -S on \
    -s (S/../.././02|L/../../7/03) \
    -m usuario@gmail.com \
    -M exec /usr/local/sbin/smartdnotify-mailout

# ------------------------------------------------------------
# Disco USB de backup (Toshiba MQ04UBD200)
# Self-test CORTO diario a las 04:00 (el largo no es viable por USB)
# El disco es extraíble, por eso -d removable
# ------------------------------------------------------------
/dev/da0 -d removable \
    -a -o on -S on \
    -n standby,q \
    -s (S/../.././04) \
    -m usuario@gmail.com \
    -M exec /usr/local/sbin/smartdnotify-mailout

Claves de la configuración

Directiva Motivo
/dev/nvme0 en lugar de /dev/nda0 El dispositivo de caracteres NVMe es el correcto para SMART en FreeBSD
-d nvme en el NVMe Fuerza explícitamente el tipo de dispositivo
-d removable en el USB Permite a smartd arrancar aunque el disco esté desconectado
-n standby,q en el USB No despierta el disco si está en standby
-s (S/...|L/...) para NVMe Self-test corto diario, largo semanal
-s (S/...) solo para USB Únicamente self-test corto (el largo se aborta por el puente USB)
-M exec Ejecuta el script smartdnotify-mailout para enviar el correo

Paso 6 — Verificar la sintaxis sin reiniciar el servicio

smartd -q onecheck

Interpretación de la validación

Configuration file /usr/local/etc/smartd.conf parsed.       ← Sintaxis correcta
Device: /dev/nvme0, opened                                   ← NVMe accesible
Device: /dev/nvme0, CT500P3SSD8, S/N:2240E6733488, FW:P9CR30A
Device: /dev/nvme0, is SMART capable. Adding to "monitor" list.
Device: /dev/da0 [SAT], opened                              ← USB accesible
Device: /dev/da0 [SAT], TOSHIBA MQ04UBD200, S/N:Y0JKT0QOT, ... 2.00 TB
Device: /dev/da0 [SAT], enabled SMART Attribute Autosave.   ← -S on aplicado
Device: /dev/da0 [SAT], enabled SMART Automatic Offline Testing.  ← -o on aplicado
Monitoring 1 ATA/SATA, 0 SCSI/SAS and 1 NVMe devices        ← Los dos discos
Device: /dev/nvme0, previous short self-test completed without error
Device: /dev/da0 [SAT], previous self-test completed without error
Started with '-q onecheck' option. All devices successfully checked once.
smartd is exiting (exit status 0)                            ← Salida limpia
Si en algún momento añades temporalmente -M test a la configuración, en esta salida aparecerá también una línea del tipo: Test of /usr/local/sbin/smartdnotify-mailout to usuario@gmail.com: successful. Es la confirmación de que smartd ha ejecutado el helper correctamente.

Paso 7 — Reiniciar smartd

service smartd restart
Stopping smartd.
Waiting for PIDS: 29540.
Starting smartd.                                             ← Arrancado sin errores

Verificar que arrancó bien

service smartd status
smartd is running as pid 32393.

Comprobar la actividad en el log

tail -10 /var/log/messages | grep smartd
Sep 24 02:06:19 tormenta smartd[32393]: Device: /dev/nvme0, starting scheduled Short Self-Test (NSID 0xffffffff).
Sep 24 02:36:19 tormenta smartd[32393]: Device /dev/nvme0, previous short self-test completed without error
Sep 24 03:06:19 tormenta smartd[32393]: Device: /dev/da0 [SAT], is back in ACTIVE or IDLE mode, resuming checks (9 checks skipped)

Comprobación final — smartd invoca al helper

Para verlo en tiempo real, se puede arrancar smartd en primer plano con modo debug (salir con Ctrl+C):

smartd -d -c /usr/local/etc/smartd.conf
smartd 7.5 2025-04-30 r5714 [FreeBSD 14.4-RELEASE-p8 amd64] (local build)
Copyright (C) 2002-25, Bruce Allen, Christian Franke, www.smartmontools.org

Opened configuration file /usr/local/etc/smartd.conf
Configuration file /usr/local/etc/smartd.conf parsed.
Device: /dev/nvme0, opened
Device: /dev/nvme0, CT500P3SSD8, S/N:2240E6733488, FW:P9CR30A
Device: /dev/nvme0, is SMART capable. Adding to "monitor" list.
Device: /dev/da0 [SAT], opened
Device: /dev/da0 [SAT], TOSHIBA MQ04UBD200, S/N:Y0JKT0QOT, WWN:0-000000-000000000, FW:JT001U, 2.00 TB
Device: /dev/da0 [SAT], found in smartd database 7.5/5706: Toshiba 2.5" HDD MQ04UBD...
Device: /dev/da0 [SAT], enabled SMART Attribute Autosave.
Device: /dev/da0 [SAT], enabled SMART Automatic Offline Testing.
Device: /dev/da0 [SAT], is SMART capable. Adding to "monitor" list.
Monitoring 1 ATA/SATA, 0 SCSI/SAS and 1 NVMe devices
Device: /dev/nvme0, opened NVMe device
Device /dev/nvme0, previous short self-test completed without error
Device: /dev/da0 [SAT], opened ATA device
Device: /dev/da0 [SAT], previous self-test completed without error
Cualquier problema de salud detectado (temperatura alta, sectores reasignados, errores de lectura, etc.) se notificará automáticamente por correo a usuario@gmail.com.
FreeBSD es genial!.