Très classiquement, il n'est pas nécessaire d'aller récupérer quoi que ce soit sur un site web, lm_sensors et RRDtool sont généralement en standard dans les Linux modernes. Au contraire de Windows il suffit donc de demander au système d'aller les chercher ! Bien sûr il y a un peu de configuration derrière pour adapter ces outils à ses besoins mais les résultats sont à la hauteur.

RRD graph

Installation et configuration de base

Ça commence évidemment par l'installation des paquets. La page Utilisation de lm_sensors traite du cas lm_sensors et se veut relativement généraliste quand à la distribution Linux utilisée. Si vous êtes sous Debian ou dérivé (Ubuntu), je résume les commandes ci-dessous. Il faut être root bien sûr !

Installation :

# apt-get install lm-sensors rrdtool

Recherche des modules qui fonctionnent avec la machine :

# sensors-detect
This program will help you determine which I2C/SMBus modules you need to
load to use lm_sensors most effectively
[...]

Il faut quasiment répondre yes à toutes les questions. À la fin sensors-detect récapitule les modules qu'il a détectés comme convenant et demande s'il doit les enregistrer dans /etc/modules afin de les charger au démarrage : oui ! Chez moi ça donne :

$ tail /etc/modules
# Generated by sensors-detect on Wed May 31 21:35:57 2006
# I2C adapter drivers
i2c-nforce2
i2c-isa
# I2C chip drivers
eeprom
w83627hf

Certains recommandent de redémarrer le système. Normalement ce n'est pas nécessaire, il suffit de charger les modules précédemment listés :

# modprobe w83627hf eeprom i2c-core i2c-isa

Il n'y a qu'à vérifier ensuite que tout fonctionne :

$ sensors
w83627thf-isa-0290
Adapter: ISA adapter
VCore:     +1.11 V  (min =  +1.40 V, max =  +1.60 V)       ALARM
+12V:     +12.10 V  (min = +10.82 V, max = +13.19 V)
+3.3V:     +3.31 V  (min =  +3.14 V, max =  +3.47 V)
+5V:       +4.99 V  (min =  +4.75 V, max =  +5.25 V)
-12V:     -12.20 V  (min = -10.80 V, max = -13.18 V)       ALARM
V5SB:      +5.11 V  (min =  +4.76 V, max =  +5.24 V)
VBat:      +2.82 V  (min =  +2.40 V, max =  +3.60 V)
PC Fan:   1088 RPM  (min =  664 RPM, div = 8)
CPU Fan:   740 RPM  (min =  998 RPM, div = 8)              ALARM
Power Fan:   0 RPM  (min =  664 RPM, div = 8)              ALARM
M/B Temp:    +35°C  (high =   +40°C, hyst =   +37°C)   sensor = thermistor
CPU Temp:  +31.0°C  (high =   +52°C, hyst =   +47°C)   sensor = diode
Amb. Temp: +26.0°C  (high =   +52°C, hyst =   +75°C)   sensor = thermistor
vid:      +0.275 V  (VRM Version 9.0)
alarms:
beep_enable:
         Sound alarm enabled

Il semble que tout marche pour le mieux...

Utilisation et configuration avancée

La commande sensors permet de faire un sondage ponctuel comme vu précédemment. Il est toutefois possible d'enregistrer régulièrement les valeurs dans une base de données RRD gérée par RRDtool. Pour lancer l'enregistrement automatique, il faut modifier le fichier /etc/default/sensord, chez moi il contient :

# Interval between scanning for alarms; e.g., 30s, 1m, 1h
ALARM_INTERVAL=5m
# Interval between logging sensor measurements; e.g., 30s, 1m, 1h
LOG_INTERVAL=30m
# Syslog facility to use
SYSLOG_FACILITY=daemon
# Libsensors config file to use
# CONFIG_FILE=/etc/sensors.conf
# Chips to scan
# SCAN_CHIPS=...

# Uncomment this to enable a 7-day round-robin database of sensor
# readings.  See the ROUND ROBIN DATABASES section of the sensord
# manual page for details.
RRD_FILE=/var/log/sensord.rrd
# Interval between RRD readings; e.g. 30s, 5m (default), 1h
RRD_INTERVAL=5s
# Include the load average in the RRD file.  If you enable this you
# must remove your old RRD file and rebuild your CGI script.
RRD_LOADAVG=yes

La première section configure l'enregistrement dans les logs du système alors que la seconde s'occupe de la base RRD. Ce qui est intéressant est que l'intervalle d'enregistrement peut être différent. En effet le nombre d'entrées de la base RRD est fixe ce qui fait que la durée d'enregistrement diminue avec la diminution de la durée de l'intervalle. Pour éviter de redémarrer la machine une fois les modifications apportées, il faut (re)démarrer manuellement le service sensord qui enregistre périodiquement les données :

/etc/init.d/sensord restart

Ensuite on peut consulter le contenu de la base avec les outils de RRD mais aussi créer des graphiques. Pour ce faire, la syntaxe est un peu lourde malheureusement, la commande typique est :

$ rrdtool graph rrd-test.png --start 1147554410 --end 1147556410 --imgformat PNG DEF:in0=/var/log/sensord.rrd:in0:AVERAGE LINE2:in0#FF0000:"VCore"

rrd-test.png est le graphique généré et --start et --end spécifient la plage de dates à afficher (entiers depuis epoch). Le reste définit quel signal afficher :

  • le fichier /var/log/sensord.rrd de la base de données (cf. /etc/default/sensord)
  • le signal (in0:AVERAGE)
  • la légende du graphique

Évidemment, avec un script Python on peut faire tout ça plus simplement et pour tous les signaux enregistrés automatiquement ! Je publierai cela plus tard ;-) .

Retrouver le nom des signaux

Dans l'exemple RRDTool précédent, c'est in0 qui détermine quel signal afficher. Pour savoir qui est ce in0, il faut fouiner dans le fichier /etc/sensors.conf. Celui-ci contient tous les paramètres de tous les chipset gérés, il faut donc y trouver celui correspondant à sa machine[1], w83627hf dans mon cas :

# nano /etc/sensors.conf
[...]
chip "w83782d-*" "w83627hf-*"

# Same as above for w83781d except that in5 and in6 are computed differently.
# Rather than an internal inverting op amp, the 82d/83s use standard positive
# inputs and the negative voltages are level shifted by a 3.6V reference.
# The math is convoluted, so we hope that your motherboard
# uses the recommended resistor values.

   label in0 "VCore 1"
   label in1 "VCore 2"
   label in2 "+3.3V"
   label in3 "+5V"
   label in4 "+12V"
   label in5 "-12V"
   label in6 "-5V"
   label in7 "V5SB"
   label in8 "VBat"
[...]

Normalement les noms par défaut sont corrects car lm_sensors se base sur les spécifications des chipsets qui effectuent ces mesures sur la carte mère de l'ordinateur.

Valeurs relevées erronées

Il reste éventuellement un dernier problème : les valeurs affichées sont peut-être erronées, par exemple parce que le fabricant de la carte mère a jugé bon de faire différemment des autres. On s'en rend compte en allant faire un tour dans le BIOS au redémarrage de la machine par exemple. Dans ce cas il faut modifier le fichier /etc/sensors.conf. Un peu plus bas dans la section du chipset concerné, on trouve des formules et des valeurs définissant les différentes mesures :

[...]
# Abit BP6 motherboard has a few differences. VCore1 and VCore2 are the core
# voltages of the two processors. Vtt is memory bus termination resistors
# voltage.
#    label in1 "Vtt"
#    label in8 "VCore2"

   compute in3 ((6.8/10)+1)*@ ,  @/((6.8/10)+1)
   compute in4 ((28/10)+1)*@  ,  @/((28/10)+1)
   compute in5 (5.14 * @) - 14.91  ,  (@ + 14.91) / 5.14
   compute in6 (3.14 * @) -  7.71  ,  (@ +  7.71) / 3.14
   compute in7 ((6.8/10)+1)*@ ,  @/((6.8/10)+1)

# adjust this if your vid is wrong; see doc/vid
#   set vrm 9.0

# set limits to  5% for the critical voltages
# set limits to 10% for the non-critical voltages
# set limits to 20% for the battery voltage

   set in0_min vid*0.95
   set in0_max vid*1.05
   set in1_min vid*0.95
   set in1_max vid*1.05
   set in2_min 3.3 * 0.95
   set in2_max 3.3 * 1.05
   set in3_min 5.0 * 0.95
   set in3_max 5.0 * 1.05
   set in4_min 12 * 0.90
   set in4_max 12 * 1.10
   set in5_max -12 * 0.90
   set in5_min -12 * 1.10
   set in6_max -5 * 0.95
   set in6_min -5 * 1.05
   set in7_min 5 * 0.95
   set in7_max 5 * 1.05
   set in8_min 3.0 * 0.80
   set in8_max 3.0 * 1.20
[...]

Ne pas hésiter à tester de nouvelles valeurs après des recherches sur Internet pour tenter de trouver les bonnes. Dans mon cas, vid, qui est censé être récupéré dans le processeur, ne fonctionnait pas sous Debian/Sarge, ce qui faussait certaines formules. J'ai donc remplacé ce vid par une valeur qui marche bien ! Dans le cas des ventilateurs, on peut aussi avoir à ajouter un diviseur lorsque la vitesse affichée est manifestement non crédible. Il suffit d'ajouter une ligne :

set fan1_div 2

Enfin les valeurs finissant par min ou max déterminent les seuils d'alarme. Il faut ensuite réinitialiser lm_sensors par la commande suivante :

# sensors -s

Bonnes mesures !

Pour en savoir plus

Notes

[1] avec la touche / dans vim et Ctrl+W dans nano