Many server motherboards, including the Supermicro X10 series, have their fans monitored by the BMC, which automatically attempts to recover stalling (of the motor, not in the aerodynamic sense) fans by spinning them up to maximum (PWM set to 100% speed). This behavior is determined by the sensor thresholds.
Supermicro X10 motherboard fan profiles are controlled via IPMI. Unfortunately, only very basic functions are exposed via its web interface and Supermicro's own IPMI utility is superbly well hidden on Supermicro's website and uses Java. The pragmatists among us would complain about Java, use the application, and move on - however, for some reason (*cough* Java *cough*) Supermicro application and its nice GUI do not always work properly. Thus, third-party universal IPMI tools are needed.
This guide should also be helpful for owners of other motherboards with similar problems or for those trying to learn how to interact with the motherboard's sensors using IPMI.
This is Part 1 of this guide and covers how to perform these operations “locally” (in other words, from FreeNAS’ console). Part 2 covers how to perform these operations remotely using ipmiutil, running on a client machine.
In this guide, I will be using ipmitool, running on the server – all interactions are via a remote terminal session.
Ipmitool can also be used remotely over the network, in the same way that ipmiutil is used in Part 2. If you're interested in this usage scenario, please read the relevant man pages.
Ipmitool forces the user to jump through more hoops in order to accomplish some tasks, but is included in FreeNAS and allows setting thresholds for sensors that are not attached.
Ipmiutil is somewhat more straightforward, but requires a remote client and refuses to change thresholds on sensors that are not attached.
While I will provide the necessary steps and explain some options, I recommend you read through the appropriate man page sections to learn about the various options.
Please note that all input may be case sensitive. For details, check the relevant man pages. Particularly, sensor names are case-sensitive.
Start by loading ipmitool:
Now, run the following command to list all sensors:
This will list the system’s sensors, current readings and current thresholds, as exemplified below:
The thresholds listed are, in order: lnr, lcr, lnc, unc, ucr, unr
These are acronyms for:
Lower Non-Recoverable
Lower Critical
Lower Non-Critical
Upper Non-Critical
Upper Critical
Upper Non-Recoverable
Take note of the sensor names for the sensors you want to change (if you don't know which fans you want to edit, I recommend you check the IPMI log in the web interface to see which fans have sensor events being asserted).
Now, calculate the lowest and highest angular velocities your fan is rated to run at (check the manufacturer's specs). For instance, my Noctua NF-F12 IndustrialPPC 3000 PWM are rated at 750RPM +-20% at the low end, so 600RPM or less is an appropriate lower non-critical threshold value. To get the other values, subtract 100 for the lower critical and 200 for the lower non-recoverable.
Take note of your results.
To set the lower thresholds, use:
Replacing *sensor name*, *lnr*, *lcr* and *lnc* with the appropriate values.
To set the upper thresholds, use:
Replacing *sensor name*, *unc*, *ucr* and *unr* with the appropriate values.
It has come to my attention that ipmitool will gladly set the thresholds in absurd orders (lower non-critical lower than lower non-recoverable, for instance). The effects of this are unknown. In any case, I recommend that attention be paid to the proper order to avoid potential future issues.
Please note that invalid inputs will be rounded to the nearest valid value. On my system, for instance, setting a fan threshold to 540 will actually set it to 500. 550 is set as 600.
Repeat this for all fans whose thresholds you wish to change.
Supermicro X10 motherboard fan profiles are controlled via IPMI. Unfortunately, only very basic functions are exposed via its web interface and Supermicro's own IPMI utility is superbly well hidden on Supermicro's website and uses Java. The pragmatists among us would complain about Java, use the application, and move on - however, for some reason (*cough* Java *cough*) Supermicro application and its nice GUI do not always work properly. Thus, third-party universal IPMI tools are needed.
This guide should also be helpful for owners of other motherboards with similar problems or for those trying to learn how to interact with the motherboard's sensors using IPMI.
This is Part 1 of this guide and covers how to perform these operations “locally” (in other words, from FreeNAS’ console). Part 2 covers how to perform these operations remotely using ipmiutil, running on a client machine.
In this guide, I will be using ipmitool, running on the server – all interactions are via a remote terminal session.
Ipmitool can also be used remotely over the network, in the same way that ipmiutil is used in Part 2. If you're interested in this usage scenario, please read the relevant man pages.
Ipmitool forces the user to jump through more hoops in order to accomplish some tasks, but is included in FreeNAS and allows setting thresholds for sensors that are not attached.
Ipmiutil is somewhat more straightforward, but requires a remote client and refuses to change thresholds on sensors that are not attached.
While I will provide the necessary steps and explain some options, I recommend you read through the appropriate man page sections to learn about the various options.
Please note that all input may be case sensitive. For details, check the relevant man pages. Particularly, sensor names are case-sensitive.
Start by loading ipmitool:
~# kldload ipmi.ko
Now, run the following command to list all sensors:
~# ipmitool sensor list all
This will list the system’s sensors, current readings and current thresholds, as exemplified below:
Code:
[root@freenas] ~# ipmitool sensor list all CPU Temp | 37.000 | degrees C | ok | 0.000 | 0.000 | 0.000 | 95.000 | 98.000 | 100.000 System Temp | 30.000 | degrees C | ok | -9.000 | -7.000 | -5.000 | 80.000 | 85.000 | 90.000 Peripheral Temp | 40.000 | degrees C | ok | -9.000 | -7.000 | -5.000 | 80.000 | 85.000 | 90.000 PCH Temp | 48.000 | degrees C | ok | -11.000 | -8.000 | -5.000 | 90.000 | 95.000 | 100.000 VRM Temp | 39.000 | degrees C | ok | -9.000 | -7.000 | -5.000 | 87.000 | 92.000 | 97.000 DIMMA1 Temp | na | | na | na | na | na | na | na | na DIMMA2 Temp | 31.000 | degrees C | ok | 1.000 | 2.000 | 4.000 | 80.000 | 85.000 | 90.000 DIMMB1 Temp | na | | na | na | na | na | na | na | na DIMMB2 Temp | 32.000 | degrees C | ok | 1.000 | 2.000 | 4.000 | 80.000 | 85.000 | 90.000 FAN1 | na | | na | na | na | na | na | na | na FAN2 | na | | na | na | na | na | na | na | na FAN3 | 900.000 | RPM | ok | 300.000 | 400.000 | 500.000 | 3700.000 | 3800.000 | 3900.000 FAN4 | 900.000 | RPM | ok | 300.000 | 400.000 | 500.000 | 3600.000 | 3700.000 | 3800.000 FANA | 1100.000 | RPM | ok | 400.000 | 600.000 | 800.000 | 25300.000 | 25400.000 | 25500.000 Vcpu | 1.755 | Volts | ok | 1.242 | 1.260 | 1.395 | 1.899 | 2.088 | 2.106 VDIMM | 1.453 | Volts | ok | 1.096 | 1.124 | 1.201 | 1.642 | 1.719 | 1.747 12V | 12.000 | Volts | ok | 10.164 | 10.521 | 10.776 | 12.918 | 13.224 | 13.224 5VCC | 4.969 | Volts | ok | 4.225 | 4.380 | 4.473 | 5.372 | 5.527 | 5.589 3.3VCC | 3.344 | Volts | ok | 2.804 | 2.894 | 2.969 | 3.554 | 3.659 | 3.689 VBAT | 3.015 | Volts | ok | 2.400 | 2.490 | 2.595 | 3.495 | 3.600 | 3.690 AVCC | 3.329 | Volts | ok | 2.399 | 2.489 | 2.594 | 3.494 | 3.599 | 3.689 VSB | 3.284 | Volts | ok | 2.399 | 2.489 | 2.594 | 3.494 | 3.599 | 3.689 Chassis Intru | 0x0 | discrete | 0x0000| na | na | na | na | na | na
The thresholds listed are, in order: lnr, lcr, lnc, unc, ucr, unr
These are acronyms for:
Lower Non-Recoverable
Lower Critical
Lower Non-Critical
Upper Non-Critical
Upper Critical
Upper Non-Recoverable
Take note of the sensor names for the sensors you want to change (if you don't know which fans you want to edit, I recommend you check the IPMI log in the web interface to see which fans have sensor events being asserted).
Now, calculate the lowest and highest angular velocities your fan is rated to run at (check the manufacturer's specs). For instance, my Noctua NF-F12 IndustrialPPC 3000 PWM are rated at 750RPM +-20% at the low end, so 600RPM or less is an appropriate lower non-critical threshold value. To get the other values, subtract 100 for the lower critical and 200 for the lower non-recoverable.
Take note of your results.
To set the lower thresholds, use:
~# ipmitool sensor thresh "*sensor name*" lower *lnr* *lcr* *lnc*
Replacing *sensor name*, *lnr*, *lcr* and *lnc* with the appropriate values.
To set the upper thresholds, use:
~# ipmitool sensor thresh "*sensor name*" upper *unc* *ucr* *unr*
Replacing *sensor name*, *unc*, *ucr* and *unr* with the appropriate values.
It has come to my attention that ipmitool will gladly set the thresholds in absurd orders (lower non-critical lower than lower non-recoverable, for instance). The effects of this are unknown. In any case, I recommend that attention be paid to the proper order to avoid potential future issues.
Please note that invalid inputs will be rounded to the nearest valid value. On my system, for instance, setting a fan threshold to 540 will actually set it to 500. 550 is set as 600.
Repeat this for all fans whose thresholds you wish to change.