Dell PowerEdge T620 : Comment diminuer la vitesse des ventilateurs avec IPMI

Logo Dell Dell PowerEdge T620

J'ai du récemment remplacer des disques mécaniques certifiés Dell par des disques SSD grand public sur un serveur PowerEdge T620 et j'ai eu la mauvaise surprise de constater que suite à l'insertion de ces derniers les ventilateurs se sont soudainement mis à faire beaucoup de bruit.

Après de rapides recherches, j'ai découvert que c'était un problème connu chez Dell et qu'il n'y avait pas de solution en l'état à part acheter des SSD officiels… (Étant pauvre, il me fallait trouver une autre solution).

Grace à dieu/internet, j'ai trouvé une discussion reddit dans laquelle un utilisateur montrait comment contrôler la vitesse des ventilateurs avec l'utilitaire ipmitool. Merci donc à tatmde.

Je vais détailler ici ce que j'ai utilisé dans mon cas présent.

⚠️ Changer la vitesse des ventilateurs peut entrainer une surchauffe et endommager les composants de façon permanante. Donc faites gaffe!. ⚠️ (Dans le même temps laisser les ventilateurs plein pot peut entrainer une perte d''audition donc à choisir…)

Activer l'IPMI over LAN

Pour contrôler la vitesse des ventilateurs à traver le réseau nous aurons besoin d'activer l'IPMI over LAN depuis l'IDRAC.

⚠️ Activer l'IPMI over LAN peut être considéré comme un problème de sécurité dans la mesure ou un utilisateur mal intentionné et disposant du mot de passe aura la possibilité de controler l'état de l'alimentation et également de récupérer des informations du serveur. ⚠️

  • Se connecter sur l'iDRAC, aller dans iDRAC Settings > Network et activer IPMI Over LAN :
Dell IDRAC | activer l'IPMI

L'utilitaire ipmitool

Installation sur GNU/Linux

Installer ipmitool. Ce logiciel va nous permettre de communique avec l'IPMI du serveur.

  • Depuis une distribution Debian entrer la commande suivante :
root@host:~# apt-get install ipmitool

Utiliser ipmitool

Vérifier la température

  • Récupérer les informations sur la température :
user@host:~$ ipmitool -I lanplus -H <iDRAC IP> -U <iDRAC user> -P <iDRAC password> sdr type temperature
Inlet Temp       | 04h | ok  |  7.1 | 21 degrees C
Temp             | 0Eh | ok  |  3.1 | 29 degrees C
Temp             | 0Fh | ok  |  3.2 | 35 degrees C
  • On peut voir la corrélation avec les valeurs présentes dans l'iDRAC :
Dell IDRAC | temperature probes

Contrôler la vitesse des ventilateurs

  • Désactivation du contrôle manuel/statique des ventilateurs (passage en mode par défaut cad automatique) :
user@host:~$ ipmitool -I lanplus -H <iDRAC IP> -U <iDRAC user> -P <iDRAC password> raw 0x30 0x30 0x01 0x01
  • Activation du contrôle manuel/statique des ventilateurs (désactivation du mode automatique) :
user@host:~$ ipmitool -I lanplus -H <iDRAC IP> -U <iDRAC user> -P <iDRAC password> raw 0x30 0x30 0x01 0x00
  • Récupérer la vitesse actuelle des ventilateurs :
user@host:~$ ipmitool -I lanplus -H <iDRAC IP> -U <iDRAC user> -P <iDRAC password> sdr get Fan1 Fan2 | grep "Sensor Reading"
 Sensor Reading        : 1560 (+/- 120) RPM
 Sensor Reading        : 1560 (+/- 120) RPM
  • Définir la vitesse des ventilateurs à 1320 RPM (16%) :
user@host:~$ ipmitool -I lanplus -H <iDRAC IP> -U <iDRAC user> -P <iDRAC password> raw 0x30 0x30 0x02 0xff 0x10
  • Définir la vitesse des ventilateurs à 1560 RPM (20%) :
user@host:~$ ipmitool -I lanplus -H <iDRAC IP> -U <iDRAC user> -P <iDRAC password> raw 0x30 0x30 0x02 0xff 0x14
  • Définir la vitesse des ventilateurs à 2040 RPM (30%) :
user@host:~$ ipmitool -I lanplus -H <iDRAC IP> -U <iDRAC user> -P <iDRAC password> raw 0x30 0x30 0x02 0xff 0x1e
  • Définir la vitesse des ventilateurs à 3000 RPM (50%) :
user@host:~$ ipmitool -I lanplus -H <iDRAC IP> -U <iDRAC user> -P <iDRAC password> raw 0x30 0x30 0x02 0xff 0x32
  • Définir la vitesse des ventilateurs à 5040 RPM (100%) :
user@host:~$ ipmitool -I lanplus -H <iDRAC IP> -U <iDRAC user> -P <iDRAC password> raw 0x30 0x30 0x02 0xff 0x64

Create ipmi service

Je me suis énervé et ai décidé de crééer un service pour gérer automatiquement la vitesse des ventilateurs.

Je détaillerai ici toutes les étapes à suivre pour le mettre en place.

Note : Ce script est adapté à ma configuration

Création d'un compte système

  • Pour des raisons de sécurité j'ai décidé de faire tourner le service depuis un compte système. Donc créons un compte de type système :
root@host:~# useradd --system --no-create-home ipmiservice
  • Créer un dossier log :
root@host:~# mkdir /var/log/ipmiservice
root@host:~# chown -R ipmiservice /var/log/ipmiservice

Créer le script bash

  • Créer le fichier /usr/local/sbin/ipmiservice.sh :
root@host:~# touch /usr/local/sbin/ipmiservice.sh
root@host:~# chown ipmiservice: /usr/local/sbin/ipmiservice.sh
root@host:~# chmod +x /usr/local/sbin/ipmiservice.sh
  • /usr/local/sbin/ipmiservice.sh :
#!/bin/bash

#Stops script on errors, unset variables or failing pipeline
set -euo pipefail

#variables definitions
LOG=/var/log/ipmiservice/ipmi.log

#functions
##Set Fan Speed, accept one argument to set speed
FanSpeed()
{
        ipmitool -I lanplus -H 192.168.1.10 -U root -P 'STp@ssw0rd!' raw 0x30 0x30 0x02 $1
}
##Get Temp values
GetValues()
{
        #Get motherboard, cpu1 and cpu2 temperature
        OUTPUT=$(/usr/bin/ipmitool -I lanplus -H 192.168.1.10 -U root -P 'STp@ssw0rd!' sdr type temperature | sed -e 's/Temp\(.*0Eh\)/Cpu1\1/' -e 's/Temp\(.*0Fh\)/Cpu2\1/')
        #Extract motheboard temp
        SB=$(echo $OUTPUT| awk -F'|' '{ print $5 $9 $13 }' | awk '{ print $1 }')
        #Extract cpu1 temp
        CPU1=$(echo $OUTPUT| awk -F'|' '{ print $5 $9 $13 }' | awk '{ print $5 }')
        #Extract cpu2 temp
        CPU2=$(echo $OUTPUT| awk -F'|' '{ print $5 $9 $13 }' | awk '{ print $9 }')
        #motherboard+cpu1+cpu2 temp
        LOG_TOTAL=$(($SB+$CPU1+$CPU2))
        #Get Fan1 speed
        FANS=$(ipmitool -I lanplus -H 192.168.1.10 -U root -P 'STp@ssw0rd!' sensor reading Fan1 | awk '{ print $3 }')
}

GetValues
echo "$(date "+%Y-%m-%d %H:%M:%S")" "MB : $SB | CPU1 : $CPU1 | CPU2 : $CPU2 | LOG_TOTAL : $LOG_TOTAL"

while :
do
        if [ "$LOG_TOTAL" -le 100 ] && [ $FANS -eq 1440 ]; then
                echo "$(date "+%Y-%m-%d %H:%M:%S")" "FAN speed : 1440, don't do anything" | tee -a "$LOG"
        elif [ "$LOG_TOTAL" -le 100 ] && [ $FANS -ne 1440 ]; then
                FanSpeed "0xff 0x12" #Set speed to 1440
                echo "$(date "+%Y-%m-%d %H:%M:%S")" "Set speed to 1440" | tee -a "$LOG"
        elif [ "$LOG_TOTAL" -gt 100 ] && [ "$LOG_TOTAL" -le 105 ] && [ $FANS -ne 1560 ]; then
                FanSpeed "0xff 0x14" #Set speed to 1560
                echo "$(date "+%Y-%m-%d %H:%M:%S")" "Set speed to 1560" | tee -a "$LOG"
        elif [ "$LOG_TOTAL" -gt 105 ] && [ "$LOG_TOTAL" -le 115 ] && [ $FANS -ne 2040 ]; then
                FanSpeed "0xff 0x1e" #Set speed to 2040
                echo "$(date "+%Y-%m-%d %H:%M:%S")" "Set speed to 2040" | tee -a "$LOG"
        elif [ "$LOG_TOTAL" -gt 115 ] && [ "$LOG_TOTAL" -le 130 ] && [ $FANS -ne 3000 ]; then
                FanSpeed "0xff 0x32" #Set speed to 3000
                echo "$(date "+%Y-%m-%d %H:%M:%S")" "Set speed to 3000" | tee -a "$LOG"
        elif [ "$LOG_TOTAL" -gt 130 ] && [ $FANS -ne 5040 ]; then
                FanSpeed "0xff 0x64" #Set speed to 5040
                echo "$(date "+%Y-%m-%d %H:%M:%S")" "Set speed to 5040" | tee -a "$LOG"
        fi
        sleep 30s
        GetValues
        echo "$(date "+%Y-%m-%d %H:%M:%S")" "MB : $SB | CPU1 : $CPU1 | CPU2 : $CPU2 | TEMP TOTAL : $LOG_TOTAL" >> "$LOG"
        echo "$(date "+%Y-%m-%d %H:%M:%S")" "FAN speed : $FANS" | tee -a "$LOG"
done

Créer un service systemd

Maintenant créons notre service systemd.

  • Créer un service systemd :
root@host:~# vim /etc/systemd/system/ipmi.service
[Unit]
Description=ipmi t620 fan control
After=network.target

[Service]
Type=simple
User=ipmiservice
Group=ipmiservice
WorkingDirectory=/usr/local/sbin/
ExecStart=/usr/local/sbin/ipmiservice.sh
Restart=always

[Install]
WantedBy=multi-user.target
  • Activer le service systemd :
root@host:~# systemctl enable ipmi.service
  • Démarrer le service systemd :
root@host:~# systemctl start ipmi.service
  • Vérifier les logs :
root@host:~# tail -f /var/log/ipmiservice/ipmi.log
2021-05-09 15:16:57 FAN speed : 1440, don't do anything
2021-05-09 15:17:32 MB : 22 | CPU1 : 37 | CPU2 : 40 | TEMP TOTAL : 99
2021-05-09 15:17:32 FAN speed : 1440, don't do anything
2021-05-09 15:17:32 FAN speed : 1440, ne rien faire
2021-05-09 15:18:04 MB : 22 | CPU1 : 38 | CPU2 : 40 | TEMP TOTAL : 100
2021-05-09 15:18:04 FAN speed : 1440, don't do anything
2021-05-09 15:18:04 FAN speed : 1440, ne rien faire
2021-05-09 15:18:36 MB : 22 | CPU1 : 39 | CPU2 : 40 | TEMP TOTAL : 101
2021-05-09 15:18:36 FAN speed : 1440, don't do anything
2021-05-09 15:18:37 Set speed to 1560
2021-05-09 15:19:09 MB : 22 | CPU1 : 38 | CPU2 : 40 | TEMP TOTAL : 100
2021-05-09 15:19:09 FAN speed : 1560
Creative Commons License
This work is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License.

Contact :