P

Supermicro X9/X10/X11 Fan Speed Control

Notice: Page may contain affiliate links for which we may earn a small commission through services like Amazon Affiliates or Skimlinks.

peter_s

Member
Oct 15, 2021
30
23
8
Looks like there are reports that it doesn't work for the X9SRi-F already: Supermicro X9 compatibility · petersulyok smfc · Discussion #54. I'll see if i can find some time to confirm
Indeed. X9SRi-F is a special one.
You can test these command:

Code:
# Switch to FULL mode
ipmitool raw 0x30 0x45 0x01 0x01
# Enable manual mode
ipmitool raw 0x32 0x90 0x01
# Set fan speed: ipmitool raw 0x32 0x91 <fan_id> <value>
# Fan 0 -> 50%
ipmitool raw 0x32 0x91 0x00 0x80
# Disable manual mode
ipmitool raw 0x32 0x90 0x00
If you receive 0x82 response, it means your BMC does not support this mode. You can still play with Optimal mode and thresholds.
 

DataKeeper

New Member
Mar 13, 2015
1
0
1
56
Thanks... Works great on the 4 Supermicro 1U 6018U X10DRU-i+ systems I'm running. I'll have to try it on the Supermicro X10SRL-F board in our NAS and the older 1U SC813M with a X8SIE-F mainboard later today.
 

peter_s

Member
Oct 15, 2021
30
23
8
If somebody would try newly discovered IPMI raw commands for Supermicro X14 / H14 motherboards, here is a simple script to test them:

Edited on 2026/09/07:
Code:
#!/bin/bash
#
#   fan_test.sh — manual fan test for Supermicro X14 and H14 boards.
#
#   1. Identify the BMC stack (Phosphor or ATEN).
#   2. Switch to manual fan mode.
#   3. Print the full SDR.
#   4. Set zone 0 to 50 %, wait 2 s, print the fan sensors again.
#   5. Wait for ENTER.
#   6. Restore automatic BMC control.
#
set -u
BMC=${BMC:-}          # remote example: BMC="-I lanplus -H 10.0.0.42 -U ADMIN -P secret"
ZONE=0x00             # first zone (0-based)
DUTY=0x32             # 50 %

ipmi() { ipmitool $BMC "$@"; }

# ── 1. identify the stack ───────────────────────────────────────────────────
# Phosphor answers this probe with exactly 4 bytes: cf c2 00 <flag>.
# ATEN rejects it with a completion code (0xC7 seen on H14DSG-O-CPU).
echo "== 1. Identifying the BMC stack =="
PROBE=$(ipmi raw 0x2e 0x04 0xcf 0xc2 0x00 0x00 0x01 2>/dev/null | tr -s ' ')
if [ "$(echo $PROBE | wc -w)" = "4" ]; then
    STACK="Phosphor"
else
    STACK="ATEN"
fi
echo "   Stack: $STACK"

# ── 2. switch to manual mode ────────────────────────────────────────────────
# The same command works on both stacks. Phosphor sets Manual on all zones.
# ATEN sets the at_b_ByPassFanCtrl flag, which suspends the automatic daemon.
echo "== 2. Switching to manual fan mode =="
ipmi raw 0x30 0x70 0x66 0x02 0x01 || { echo "   ERROR: rejected. Stopping." >&2; exit 1; }
echo "   Manual mode is on. The flag is write-only, so it cannot be read back."

restore() {
    echo "== 6. Restoring automatic BMC control =="
    ipmi raw 0x30 0x70 0x66 0x02 0x00
    echo "   Automatic control resumes within about 1 second."
}
trap 'echo; restore; exit 130' INT TERM

# ── 3. full SDR before the change ───────────────────────────────────────────
echo "== 3. SDR before the duty change =="
ipmi sdr

# ── 4. set the duty, then show the fans again ───────────────────────────────
echo "== 4. Setting zone 0 to 50% =="
ipmi raw 0x30 0x70 0x66 0x01 $ZONE $DUTY
sleep 2
echo "   Duty read-back (expect 32; 31 is also a pass on ATEN):$(ipmi raw 0x30 0x70 0x66 0x00 $ZONE)"
echo "   Fan sensors after the change:"
ipmi sdr | grep FAN

# ── 5. hold ─────────────────────────────────────────────────────────────────
echo "== 5. Hold =="
read -r -p "   Press ENTER to restore automatic BMC control..."

# ── 6. restore ──────────────────────────────────────────────────────────────
trap - INT TERM
restore
echo "Done."
Looking forward any feedback!
 
Last edited:

peter_s

Member
Oct 15, 2021
30
23
8
smfc 6.0.0 released — Supermicro IPMI fan control for Linux
smfc is an open-source systemd service for IPMI-based fan control on Supermicro motherboards (X9-X14, some H-series). Version 6.0.0 has been released with the following new features:
  • Signed APT and DNF repositories — install via apt install smfc (Debian/Ubuntu/Proxmox/Mint/Raspberry Pi OS) or dnf install smfc (Fedora/RHEL/Rocky/AlmaLinux/CentOS Stream/openSUSE).
  • New smfc-client tool — a live, read-only snapshot of controllers, fan levels, IPMI zones, and standby state; works against a running service or standalone.
  • Experimental X14/H14 motherboard support, auto-detected from the BMC product name.
  • Grafana integration — sample dashboard and guide for visualizing live and historical fan/temperature data.
  • Advanced multi-segment control function — fan curves can now be defined as an arbitrary piecewise-linear curve instead of a single linear segment.
  • BMC fan-mode enforcement — detects and restores FULL mode if the BMC drifts out of it.
  • Multiple fan curves per controller type, allowing independent curves across IPMI zones.
Project page: GitHub - petersulyok/smfc: Super Micro Fan Control



 

nabsltd

Well-Known Member
Jan 26, 2022
843
629
93
After further investigation on my X9SRL-F, I have found that there is definitely a Linux solution for fan speed control on all boards that cannot be controlled by IPMI but where the BMC does control the fans.

Like many other Supermicro boards, the X9SRL-F has just two fan zones:
  • CPU, which controls FAN1, FAN2, FAN3, FAN4
  • Peripheral, which controls FANA
You can't change this, and you cannot set the duty cycle for the zone through IPMI commands (e.g., ipmitool raw).

But, just like other boards, if you set the IPMI fan speed to "Full", then the BMC doesn't try to make any changes to the fan speed unless one of the fans hits an "unrecoverable" RPM (either high or low).

The key to actually managing the fan speeds is the Linux hwmon subsystem. The easiest way is to install lm-sensors, run sensors-detect, and allow the changes to be made to /etc/modules (or manually add the changes to a file in /etc/modules-load.d). You will then have directories in sysfs that describe the sensors. This will allow the fancontrol program (an optional package that supplements lm-sensors) to control fan speed by associating temperature sensors to PWM control and creating curves.

Or, you can just do something like the following to set the CPU zone fan speed to 50%:
Bash:
PWM_PCT=50
echo $(($PWM_PCT * 255 / 100)) > /sys/class/hwmon/hwmon1/pwm2
What this allowed me to do was to use the FANA as the "CPU" zone and all the other headers as "peripheral". Since I have a CPU heatsink with a fan, this solves the biggest problem I had where any real CPU activity sent the noise up to unacceptable levels because all the fans were controlled by the CPU temperature. I tried using a splitter cable connected to FANA, but there were just too many fans and not enough current available from one header.