Registrando errores de hardware en Linux con mcelog y rasdaemon

por | junio 11, 2018

Inestabilidad en el sistema, reinicios inesperados… pueden deberse a problemas de software y también de hardware. Para estar al tanto de estos últimos tenemos dos utilidades que no serán de utilidad: mcelog y rasdaemon.

Mcelog

La utilidad mcelog decodifica eventos MCE (Machine Check Exception) generados cuando se produce un error de hardware.

Para instalarla:

# Debian y derivadas
apt-get install mcelog

# RHEL y derivadas
yum install mcelog

No todas las CPUs están soportadas por la utilidad. Para comprobar si la nuestra lo está ejecutamos mcelog con la opción --is-cpu-supported que producirá una salida de 0 en caso positivo:

jota@jota-portatil:/etc/mcelog$ mcelog --is-cpu-supported
jota@jota-portatil:/etc/mcelog$ echo $?
0

El servicio se gestiona con systemctl:

jota@jota-portatil:/var/log$ systemctl status mcelog.service 
● mcelog.service - LSB: Machine Check Exceptions (MCE) collector & decoder
   Loaded: loaded (/etc/init.d/mcelog; bad; vendor preset: enabled)
   Active: active (running) since dom 2018-06-10 14:27:27 CEST; 20min ago
     Docs: man:systemd-sysv-generator(8)
   CGroup: /system.slice/mcelog.service
           └─1518 /usr/sbin/mcelog --daemon

jun 10 14:27:27 jota-portatil systemd[1]: Starting LSB: Machine Check Exceptions (MCE) collector & decoder...
jun 10 14:27:27 jota-portatil mcelog[1513]: failed to prefill DIMM database from DMI data
jun 10 14:27:27 jota-portatil mcelog[1352]: Starting Machine Check Exceptions decoder: mcelog.
jun 10 14:27:27 jota-portatil systemd[1]: Started LSB: Machine Check Exceptions (MCE) collector & decoder.

En /etc/mcelog tenemos el fichero de configuración principal así como los ficheros de trigger que señalan la acción a realizar por el demonio de mcelog en caso de detectar un error de hardware:

jota@jota-portatil:/etc/mcelog$ cat bus-error-trigger
#!/bin/sh
#  This shell script can be executed by mcelog in daemon mode when a sockets
#  receives Bus and Interconnect errors
#
# environment:
# MESSAGE	Human readable consolidated error message
# LOCATION	Consolidated location as a single string
# SOCKETID	Socket ID of CPU that includes the memory controller with the DIMM
# LEVEL		Interconnect level
# PARTICIPATION	Processor Participation (Originator, Responder or Observer)
# REQUEST	Request type (read, write, prefetch, etc.)
# ORIGIN	Memory or IO
# TIMEOUT	The request timed out or not
#
# note: will run as mcelog configured user
# this can be changed in mcelog.conf

logger -s -p daemon.err -t mcelog "$MESSAGE"
logger -s -p daemon.err -t mcelog "Location: $LOCATION"

[ -x ./bus-error-trigger.local ] && . ./bus-error-trigger.local

exit 0

Mcelog sigue siendo una herramienta disponible en repositorios que cumple su cometido perfectamente -siempre y cuando nuestra CPU sea compatible- pero que a día de hoy ha sido adelantada por rasdaemon. De hecho, en RHEL 7 el paquete mcelog se muestra como deprecated (obsoleto)

Más info en la página de la utilidad.

Rasdaemon

La utilidad que actualmente se encuentra en desarrollo activo y recomendada para relevar a mcelog en sus tareas de supervisión de errores de hardware. Monitoriza eventos RAS (Reliability, Availability and Serviceability) a nivel de CPU, I/O, almacenamiento

Para instalarla:

# Debian y derivadas
apt-get install rasdaemon

# RHEL y derivadas
yum install rasdaemon

También la administraremos con systemctl. Tendremos un demonio rasdaemon encargado de escribir en syslog los errores de hardware detectados por el kernel y otro servicio ras-mc-ctl centrado en tareas de detección y corrección de errores en memoria:

jota@jota-portatil:/etc/ras$ systemctl status rasdaemon.service 
● rasdaemon.service - RAS daemon to log the RAS events
   Loaded: loaded (/lib/systemd/system/rasdaemon.service; enabled; vendor preset: enabled)
   Active: active (running) since lun 2018-06-11 18:08:57 CEST; 2h 16min ago
  Process: 1090 ExecStartPost=/usr/sbin/rasdaemon --enable (code=exited, status=0/SUCCESS)
 Main PID: 1088 (rasdaemon)
   CGroup: /system.slice/rasdaemon.service
           └─1088 /usr/sbin/rasdaemon -f -r

jun 11 18:08:57 jota-portatil rasdaemon[1088]: ras:aer_event event enabled
jun 11 18:08:57 jota-portatil rasdaemon[1088]: Enabled event ras:aer_event
jun 11 18:08:57 jota-portatil rasdaemon[1088]: mce:mce_record event enabled
jun 11 18:08:57 jota-portatil rasdaemon[1088]: Enabled event mce:mce_record
jun 11 18:08:57 jota-portatil rasdaemon[1088]: ras:extlog_mem_event event enabled
jun 11 18:08:57 jota-portatil rasdaemon[1088]: Enabled event ras:extlog_mem_event
jun 11 18:08:57 jota-portatil rasdaemon[1088]: rasdaemon: Recording mc_event events
jun 11 18:08:57 jota-portatil rasdaemon[1088]: rasdaemon: Recording aer_event events
jun 11 18:08:57 jota-portatil rasdaemon[1088]: rasdaemon: Recording extlog_event events
jun 11 18:08:57 jota-portatil rasdaemon[1088]: rasdaemon: Recording mce_record events

Servicio ras-mc-ctl:

jota@jota-portatil:/etc/ras$ systemctl status ras-mc-ctl.service 
● ras-mc-ctl.service - Initialize EDAC v3.0.0 Drivers For Machine Hardware
   Loaded: loaded (/lib/systemd/system/ras-mc-ctl.service; enabled; vendor preset: enabled)
   Active: active (exited) since lun 2018-06-11 18:08:57 CEST; 2h 28min ago
  Process: 1108 ExecStart=/usr/sbin/ras-mc-ctl --register-labels (code=exited, status=0/SUCCESS)
 Main PID: 1108 (code=exited, status=0/SUCCESS)
   CGroup: /system.slice/ras-mc-ctl.service

jun 11 18:08:57 jota-portatil systemd[1]: Starting Initialize EDAC v3.0.0 Drivers For Machine Hardware...
jun 11 18:08:57 jota-portatil ras-mc-ctl[1108]: ras-mc-ctl: Error: No dimm labels for ASUSTeK COMPUTER INC. model X555LDB
jun 11 18:08:57 jota-portatil systemd[1]: Started Initialize EDAC v3.0.0 Drivers For Machine Hardware.

Toda la actividad de rasdaemon puede observarse en el log de sistema /var/log/syslog

Jun 11 18:08:57 jota-portatil rasdaemon: ras:mc_event event enabled
Jun 11 18:08:57 jota-portatil rasdaemon: ras:aer_event event enabled
Jun 11 18:08:57 jota-portatil rasdaemon[1090]: rasdaemon: ras:mc_event event enabled
Jun 11 18:08:57 jota-portatil rasdaemon[1090]: rasdaemon: ras:aer_event event enabled
Jun 11 18:08:57 jota-portatil rasdaemon[1090]: rasdaemon: mce:mce_record event enabled
Jun 11 18:08:57 jota-portatil rasdaemon[1090]: rasdaemon: ras:extlog_mem_event event enabled
Jun 11 18:08:57 jota-portatil rasdaemon: mce:mce_record event enabled
Jun 11 18:08:57 jota-portatil rasdaemon[1088]: rasdaemon: ras:mc_event event enabled
Jun 11 18:08:57 jota-portatil rasdaemon[1088]: rasdaemon: Enabled event ras:mc_event
Jun 11 18:08:57 jota-portatil rasdaemon[1088]: rasdaemon: ras:aer_event event enabled
Jun 11 18:08:57 jota-portatil rasdaemon[1088]: rasdaemon: Enabled event ras:aer_event
Jun 11 18:08:57 jota-portatil rasdaemon: ras:extlog_mem_event event enabled
Jun 11 18:08:57 jota-portatil rasdaemon[1088]: rasdaemon: mce:mce_record event enabled
Jun 11 18:08:57 jota-portatil rasdaemon[1088]: rasdaemon: Enabled event mce:mce_record
Jun 11 18:08:57 jota-portatil rasdaemon[1088]: rasdaemon: ras:extlog_mem_event event enabled
Jun 11 18:08:57 jota-portatil rasdaemon[1088]: rasdaemon: Enabled event ras:extlog_mem_event
Jun 11 18:08:57 jota-portatil rasdaemon[1088]: rasdaemon: Listening to events for cpus 0 to 3
Jun 11 18:08:57 jota-portatil rasdaemon: ras:mc_event event enabled
Jun 11 18:08:57 jota-portatil rasdaemon: Enabled event ras:mc_event
Jun 11 18:08:57 jota-portatil rasdaemon: ras:aer_event event enabled
Jun 11 18:08:57 jota-portatil rasdaemon: Enabled event ras:aer_event
Jun 11 18:08:57 jota-portatil rasdaemon: mce:mce_record event enabled
Jun 11 18:08:57 jota-portatil rasdaemon: Enabled event mce:mce_record
Jun 11 18:08:57 jota-portatil rasdaemon: ras:extlog_mem_event event enabled
Jun 11 18:08:57 jota-portatil rasdaemon: Enabled event ras:extlog_mem_event

Tenéis más info en la web oficial.