IPMI - Hardwareverwaltung aus der Ferne

21. Jan. 2024

IPMI (Intelligent Platform Management Interface) ist eine standardisierte Schnittstelle zur Hardware und Firmware des Computers, über die sie auf Hardwareebene ferngesteuert, überwacht und verwaltet werden können, insbesondere wenn sie ausgeschaltet sind oder kein Betriebssystem installiert ist. Zentral zum IPMI ist der BMC (Baseboard Management Controller), der als anwendungsspezifische integrierte Schaltung über den IPMB (Intelligent Platform Management Bus) mit den grundlegenden Komponenten des Computers auf Hardwareebene, und den erforderlichen Kommunikationsschnittstellen (wie USB oder einer Netzwerkschnittstelle)verbunden ist.

Wie beim BIOS-Chip befindet sich auch ein BMS-Chip auf der Hauptplatine, der gestartet wird (vergleichbar mit dem Booten), sobald der Computer mit Standbystrom versorgt wird (also sobald das Netzteil eingeschaltet wird). Nachdem der BMC eine Reihe grundlegender Tests der Hardware ausgeführt hat, wird eine Schnittstelle (z.B. eine Webseite) bereitgestellt, auf die man als Administrator zugreifen kann, um den Computer zu verwalten. Um Unberechtigten den Zugriff zu verweigern, muss man sich authentifizieren, um auf diese Schnittstelle zugreifen zu können.

Erwirbt man aber eine gebrauchte Hauptplatine, besteht die Möglichkeit, dass das Benutzername und/oder Passwort geändert wurden. Um auch auf das IPMI zugreifen zu können, müssen die Zugangsdaten geändert werden. Hier können Werkzeuge, wie ipmi-config oder ipmitool Abhilfe verschaffen. Dieselben Werkzeuge können auch Einstellungen ändern, um z.B. die Lüftersteuerung an geänderte Hardware anzupassen. Dieser Beitrag erläutert, wie diese Werkzeuge installiert und benutzt werden können.

Installation

In meinem Home-Lab setzte ich Unraid ein, wo Docker-Container und Plugins installiert werden können. Hierbei kann das IPMI-Plugin installiert werden, wodurch auch der Befehl ipmi-config (und weitere IPMI-Befehle) für die Konsole installiert werden. Um ipmitool zu installieren, muss zuerst das Plugin NerdTools installiert, und dann in den Einstellungen des Plugins ipmitool hinzugefügt werden.

Netzwerk

Sollte der BMC sich nicht mit dem Heimnetz verbinden (z.B. weil eine statische IP gespeichert war, die nicht zur neuen Netzwerkkonfiguration passt), so sollte der BMC eine neue IP-Adresse dynamisch beziehen. Hierfür ändert man die Netzwerkeinstellungen des BMC auf DHCP:

ipmi-config --commit --key-pair=Lan_Conf:IP_Address_Source=Use_DHCP

Benutzer

Sobald man dann die Admin-Webseite aufrufen kann, muss man sich anmelden.

login

Ab Werk sind die Zugangsdaten ADMIN und ADMIN. Sollte das Passwort jedoch geändert worden sein, kann man ein neues wie folgt definieren:

ipmi-config --commit --key-pair=User2:Password=new_password

Oder mit:

ipmitool user set password 2 new_password

Hierbei ist User2 bzw. die Benutzer-ID 2 ausgewählt, da dies das Konto des Administrators war. Welche Benutzer es gibt, und welche ID sie haben, kann mit dem folgenden Befehlen aufgeführt werden:

ipmi-config --checkout | grep User

oder

ipmitool user list

Lüfter

Da nicht jedes Home-Lab klassische Serverlüfter einsetzt (insbesondere, wenn der Server im Arbeitszimmer stehen und nicht zu laut sein soll) kann es wünschenswert sein, die Lüftereinstellungen anzupassen. Hierfür

ipmi-sensors-config --checkout | grep FAN

oder

ipmitool sensor

Die Ausgabe sollte dann z.B. folgende informationen enthalten:

Section 1009_FAN1
Section 1076_FAN2
Section 1143_FAN3
Section 1210_FAN4
Section 1277_FAN5

bzw. für ipmitool

...
FAN1                     | 3100.000   | RPM        | ok    | 200.000   | 500.000   | 800.000   | 25300.000 | 25400.000 | 25500.000 
FAN2                     | 2200.000   | RPM        | ok    | 200.000   | 500.000   | 800.000   | 25300.000 | 25400.000 | 25500.000 
FAN3                     | 2200.000   | RPM        | ok    | 200.000   | 500.000   | 800.000   | 25300.000 | 25400.000 | 25500.000 
FAN4                     | na         |            | na    | na        | na        | na        | na        | na        | na        
FAN5                     | 3200.000   | RPM        | ok    | 200.000   | 500.000   | 800.000   | 25300.000 | 25400.000 | 25500.000 
...

Inspiziert man nun die Einstellungen für FAN1 mit:

ipmi-sensors-config --checkout --section=1009_FAN1

erhält man folgende Informationen:

Section 1009_FAN1
        ## Possible values: Yes/No
        Enable_All_Event_Messages                                                   Yes
        ## Possible values: Yes/No
        Enable_Scanning_On_This_Sensor                                              Yes
        ## Possible values: Yes/No
        Enable_Assertion_Event_Lower_Critical_Going_Low                             Yes
        ## Possible values: Yes/No
        Enable_Assertion_Event_Lower_Non_Recoverable_Going_Low                      Yes
        ## Possible values: Yes/No
        Enable_Assertion_Event_Upper_Critical_Going_High                            Yes
        ## Possible values: Yes/No
        Enable_Assertion_Event_Upper_Non_Recoverable_Going_High                     Yes
        ## Possible values: Yes/No
        Enable_Deassertion_Event_Lower_Critical_Going_Low                           Yes
        ## Possible values: Yes/No
        Enable_Deassertion_Event_Lower_Non_Recoverable_Going_Low                    Yes
        ## Possible values: Yes/No
        Enable_Deassertion_Event_Upper_Critical_Going_High                          Yes
        ## Possible values: Yes/No
        Enable_Deassertion_Event_Upper_Non_Recoverable_Going_High                   Yes
        ## Give valid input for sensor type = Fan; units = RPM
        Lower_Non_Critical_Threshold                                                800.000000
        ## Give valid input for sensor type = Fan; units = RPM
        Lower_Critical_Threshold                                                    500.000000
        ## Give valid input for sensor type = Fan; units = RPM
        Lower_Non_Recoverable_Threshold                                             200.000000
        ## Give valid input for sensor type = Fan; units = RPM
        Upper_Non_Critical_Threshold                                                25300.000000
        ## Give valid input for sensor type = Fan; units = RPM
        Upper_Critical_Threshold                                                    25400.000000
        ## Give valid input for sensor type = Fan; units = RPM
        Upper_Non_Recoverable_Threshold                                             25500.000000
        ## Give valid input for sensor type = Fan; units = RPM; 'None' to not use hysteresis
        Positive_Going_Threshold_Hysteresis                                         100.000000
        ## Give valid input for sensor type = Fan; units = RPM; 'None' to not use hysteresis
        Negative_Going_Threshold_Hysteresis                                         100.000000
EndSection

So kann man nun die Schwellenwerte einzeln auf die Werte ändern, die zu dem eingebauten Lüfter am besten passen. Lüfter von Noctua z.B. drehen sich so langsam, dass eine Schwelle von 500 rpm (Umdrehungen pro Minute) zu hoch sein könnte. Der Server würde dann immer einen Fehler des Lüfters erkennen und in umgehend mit 100% ansteuern. Die Schwellenwerte können dann wie folgt geändert werden:

ipmi-sensors-config --commit --key-pair=1009_FAN1:Lower_Non_Critical_Threshold=300
ipmi-sensors-config --commit --key-pair=1009_FAN1:Lower_Critical_Threshold=200
ipmi-sensors-config --commit --key-pair=1009_FAN1:Lower_Non_Recoverable_Threshold=100

Und auf vergleichbare Weise können auch die Einstellungen der anderen Lüfter geändert werden.