linux下读取风扇转速主要依赖ipmi协议或厂商专用驱动,标准hwmon接口在多数服务器主板(如supermicro、dell、hpe)上不可用;需先确认ipmi支持并启用bios中smbus/i2c,再用ipmitool sensor get "fan1"等结构化命令安全提取rpm值。

Linux下读取主板和CPU风扇转速依赖什么硬件支持
绝大多数服务器主板(尤其是Supermicro、Dell PowerEdge、HPE ProLiant)的风扇信息不通过标准/sys/class/hwmon暴露,而是由厂商专用驱动或IPMI协议提供。普通lm_sensors在无对应芯片驱动或BIOS未启用SMBus/I2C时,sensors命令根本不会显示fanX_input——这不是脚本写得不对,是硬件层没暴露数据。
实操建议:
- 先确认是否支持IPMI:
ipmitool -I open sensor list | grep -i fan,有输出才可继续; - 若用
lm_sensors,必须先运行sensors-detect并按提示加载对应内核模块(如it87、nct6775),且BIOS中需开启“Hardware Monitor”或“SMBus Controller”; - ARM服务器(如Ampere Altra)或部分OCP主板可能只支持
ipmitool或厂商工具(如racadm); - 虚拟机里永远读不到物理风扇——别白费劲。
用ipmitool获取风扇转速的稳定写法
ipmitool是目前最通用、最可靠的方案,尤其适合带BMC的x86服务器。关键不是“能不能读”,而是怎么读得准、不超时、不误报。
实操建议:
- 避免裸用
ipmitool sensor list:输出格式不固定,字段顺序随固件版本变,grep解析易崩; - 改用
ipmitool sensor get "FAN1"(注意引号),返回结构化key-value,例如Reading : 8400 RPM,正则提取更稳; - 加
-I open走本地KCS接口,比LAN方式快且免认证;若报Unable to establish IPMI v2 / RMCP+ session,说明BMC未启用或驱动未加载(检查modprobe ipmi_devintf ipmi_si); - 为防BMC响应慢,加
-t 2设超时2秒,配合timeout 3兜底,避免脚本卡死。
shell脚本中安全提取并告警风扇值
直接grep "RPM" | awk '{print }'这种写法在多语言BMC或固件升级后极易失效。真正健壮的提取必须锚定“Reading”行,并容错空格/单位变化。
Zynq‑7000 / Zynq UltraScale+ 硬件调试技能。适用于 Xilinx Zynq(Cortex‑A9/A53 + FPGA)Linux 环境,调试 I2C、I2S、UART、GPIO 等外设。包括设备树配置、内核驱动、用户空间调试工具、交叉编译和常见问题排查,支持 PetaLinux 开发。
实操建议:
- 用
ipmitool sensor get "FAN1" 2>/dev/null | sed -n 's/Reading[[:space:]]*:[[:space:]]*\([0-9]\+\).*/\1/p'提取纯数字; - 对多个风扇循环时,用数组存名称:
fan_names=("FAN1" "FAN2" "CPU_FAN"),避免硬编码; - 告警阈值别写死:CPU风扇低于3000 RPM可能异常,但系统风扇低于800 RPM才需报警,不同位置阈值差异大;
- 记录日志时务必带时间戳和BMC地址(
$(date '+%F %T')),否则排查历史问题时全是谜。
为什么用Python重写监控逻辑更可靠
Shell处理IPMI返回的乱序字段、编码异常(如UTF-8含BOM)、超时重试逻辑太脆弱。Python用pyghmi或python-ipmi库能直接解析原始Sensor数据结构,跳过文本解析这道高危工序。
实操建议:
- 装
pip install pyghmi后,用IpmiCommand(bmc, user, password)连BMC,调get_sensor_data()得字典,data['FAN1']['reading']直接取值; - 它自动处理重试、session维护、权限协商,比反复fork
ipmitool进程省资源; - 若BMC禁密码认证(仅KCS),用
pyghmi.ipmi.command.Command()走本地接口,无需账号; - 注意
pyghmi默认超时10秒,生产环境建议显式设timeout=3。
真正难的从来不是“怎么读风扇”,而是当ipmitool突然返回空、或某块主板把“FAN1”叫成“System Fan #1”、或BMC固件升级后sensor ID全变——这些边界情况,shell很难兜住,得靠结构化协议交互和异常分类处理。










