
机房里的服务器半夜报警值班同事盯着远方管理系统里跳出来的红色告警第一反应不是去机房而是先远程敲一条ipmitool sdr list看看风扇转速和电源状态是不是还正常。这种情况在数据中心里太常见了而“ipmitool监控电源风扇状态”这件事也确实是服务器运维里最基础但又最容易被做糙的一块。这篇文章就是围绕这个场景来写的。我会从环境搭建开始把常用命令、输出解析、阈值判断以及怎么通过 raw 命令调整风扇策略都过一遍最后再聊聊我自己踩过的一些坑。适合刚接手服务器运维的工程师、自己在家玩二手服务器的玩家以及想在带外管理上补一课的朋友。读完你至少能做到不登录系统、不开机箱就把电源和风扇的健康状况摸个七七八八。1. 为什么服务器管理员都在用 ipmitool 盯电源和风扇1.1 服务器管理里最容易被忽略的“沉默部件”对于一台已经稳定运行的服务器CPU 占用率、内存使用率、磁盘 IO 这些指标会被盯得很死但电源和风扇往往是出了问题才被注意到的。这俩部件平时不说话、没有可交互的界面等到风扇狂转或者电源模块报警的时候往往已经影响到了业务或者正在逼近宕机边缘。电源模块失效是个缓慢的过程通常不是瞬间断电而是电压纹波变大、输出功率下降、模块温度持续偏高。像 750W 的冗余电源如果一只已经带不动负载另一只就会默默扛下所有这种状态下表面看系统还在跑实际上已经没有冗余能力了。风扇也是一样转速掉下去、轴承开始磨损短时间内机器不会重启但 CPU 或者内存的温度会开始缓慢爬坡等温度撞到保护阈值整机直接掉电连报错日志都来不及写。ipmitool 的价值就在于它能通过独立的带外管理通道直接读取这些硬件的传感器数据不需要进操作系统也不需要装驱动。主板上的 BMC基板管理控制器从开机那一秒就在工作它独立于 CPU 和操作系统运行只要服务器插着电源线、连着管理网口你就能从远程把电源和风扇的状态全部拉出来。1.2 ipmitool 到底能监控什么从传感器到事件日志很多人以为 ipmitool 只有一个sensor list命令实际上它的能力覆盖硬件管理的方方面面。单就电源和风扇监控来说我日常最常用的是这几个层面传感器实时读数风扇转速、电源模块温度、各路电压、系统总功耗这些由 BMC 定时采样并缓存在 SDRSensor Data Record里通过ipmitool sdr list或ipmitool sensor list能一次性拿全。传感器事件日志BMC 不仅记录“当前电压是多少”还会记录“某年某月某日电压越过阈值”这些事件会写进 SELSystem Event Log用ipmitool sel list可以回溯整个硬件的历史健康状况。电源模块与整机状态ipmitool chassis status能看到电源是否正常、是否处于开机状态、上次关机原因ipmitool dcmi power reading能直接读到当前功耗对评估电源负载率非常有帮助。FRU 信息ipmitool fru print能读出电源模块的厂家、型号、序列号、额定功率等字段这在核对硬件配置和保修信息时特别有用。换句话说通过 ipmitool 这一条通道你可以把电源和风扇从“硬件黑盒”变成“可观测的部件”。接下来我按实操顺序从环境搭建开始讲。2. 搭建监控环境ipmitool 安装与带外连接2.1 工具安装不用编译也能用ipmitool 是一个老牌开源工具绝大多数 Linux 发行版的软件源里都有直接装就行。Debian/Ubuntu 系apt install ipmitoolRHEL/CentOS/Rocky 系yum install ipmitool如果管理机是 Windows可以到主板厂商或开源镜像站找 Windows 编译版本也可以直接用 WSL 装 Linux 版。macOS 用 Homebrew 装brew install ipmitool也行。这里需要说一句如果服务器自带的管理软件比如 Dell iDRAC、HP iLO、浪潮 BMC 的 Web 管理台已经能看风机转速你确实可以不用命令行但 ipmitool 的优势是脚本化、可批量、能接入监控平台这些都是 Web 界面很难做到的。安装完先验证一下版本ipmitool -V2.2 打通 BMC 网络硬件的零配置通信通道有了工具下一步是让管理机能够访问服务器 BMC。BMC 通常有一个独立的管理网口可能是专门的 IPMI 口也可能是共享的业务网口。不同厂商机器的默认 IP、默认账号密码各不相同这个在第一次开机自检界面就能看到也建议第一时间改成自己管理的地址和强密码。本地服务器上用内核模块方式访问最省事前提是主板开启了 IPMI 的 KCS 接口支持ipmitool sensor list这是本机直连 BMC 的方式不经过网络适合人在服务器旁边、或者通过 SSH 登录到服务器上排查问题。我们日常运维中很多操作都是这样用优点是不需要知道 BMC 的 IP 和账号只要操作系统里能看到/dev/ipmi0或者类似设备就行。远程访问则是生产环境用的最多的方式使用lanplus接口类型走 lan 管理网络ipmitool -I lanplus -H 192.168.1.10 -U admin -P your_password sensor list这里-I lanplus表示用 IPMI 2.0 的 RMCP 协议-H指定 BMC 的 IP-U和-P分别是用户名和密码。IPMI 默认监听 623 端口管理机上要确保防火墙放行这个端口。如果不想每次都在命令行里带密码可以用环境变量配合-E参数export IPMITOOL_PASSWORDyour_password ipmitool -I lanplus -H 192.168.1.10 -U admin -E sensor list这样密码不会出现在 shell 历史里多台机器管理时也方便些。2.3 权限、账号与安全基线IPMI 是带外管理通道权限极高可以把服务器开机、关机、重启还能读取所有传感器所以账号安全一定要重视。很多旧服务器的 BMC 默认密码是弱口令上线前必须改掉。检查当前 IPMI 用户列表ipmitool -I lanplus -H 192.168.1.10 -U admin -P your_password user list输出的表格里有用户 ID、用户名、权限级别Administrator/Operator/User/No Access、是否启用等字段。我个人的建议是保留至少一个具有 Administrator 权限的本地位账号用于带外管理密码用独立的强密码。如果只做监控可以单独建一个 User 权限的账号只授权传感器读取和 SEL 查询不给电源控制权限。关闭不需要的匿名访问或默认账号。管理网口尽量放在独立的 VLAN 里不要直接暴露在业务网络或公网。这里有一个坑我需要提醒很多人在sensor list报权限错误时第一反应是“传感器坏了”实际上很可能就是当前账号权限不够。IPMI 用户的权限级别直接决定了你能不能读到传感器数据某些厂商的 BMC 固件里Operator 权限也不一定能看到全部传感器所以监控账号至少得是 Operator 以上最好是 Administrator。3. 核心实操电源与风扇状态监控命令全解3.1 正确姿势读取传感器数据sdr/sensor登上去之后第一件事是拉全量传感器列表ipmitool -I lanplus -H 192.168.1.10 -U admin -P your_password sdr list这个输出会把所有传感器混合在一起包括 CPU 温度、主板温度、风扇转速、各路电压、电源状态。数据量比较大所以我通常会配合 grep 过滤关键字ipmitool sdr list | grep -E FAN|PS|POWER|V_|TEMP还有一种更结构化的方式是用sensor listipmitool sensor list两者的区别在于sdr list显示的是 SDR 记录里的当前值sensor list会额外显示每个传感器的上下限阈值。对于判断风扇转速是否正常sensor list更直观因为它直接告诉你当前读数距离上限、下限还有多少余量。以一台常见 2U 服务器为例输出大概长这样CPU1_TEMP | 52.000 | degrees C | ok | 0.000 | 0.000 | 0.000 | 85.000 | 90.000 | 95.000 CPU2_TEMP | 48.000 | degrees C | ok | 0.000 | 0.000 | 0.000 | 85.000 | 90.000 | 95.000 FAN1 | 10240.000 | RPM | ok | 500.000 | 600.000 | 700.000 | 25500.000 | 25500.000 | 25500.000 FAN2 | 10241.000 | RPM | ok | 500.000 | 600.000 | 700.000 | 25500.000 | 25500.000 | 25500.000 FAN3 | 7168.000 | RPM | ok | 500.000 | 600.000 | 700.000 | 25500.000 | 25500.000 | 25500.000 FAN4 | 7169.000 | RPM | ok | 500.000 | 600.000 | 700.000 | 25500.000 | 25500.000 | 25500.000 PS1_STATUS | 0x01 | discrete | 0x0180 | 0x0000 | 0x0000 | 0x0000 PS2_STATUS | 0x01 | discrete | 0x0180 | 0x0000 | 0x0000 | 0x0000 PS1_TEMP | 40.000 | degrees C | ok | 0.000 | 0.000 | 0.000 | 75.000 | 80.000 | 85.000 POWER_METER | 628.000 | Watts | ok | 0.000 | 0.000 | 0.000 | 1200.000 | 1300.000 | 1400.000这段输出里的每一列都有意义。风扇的阈值列从左到右分别是 LNR下限不可恢复、LCR下限临界、LNC下限非临界、UNC上限非临界、UCR上限临界、UNR上限不可恢复。如果当前值低于 LNC 或者高于 UNC状态列就会从 ok 变成 nr/cr。也正是因为这些阈值在 SDR 里是静态的所以我们可以据此写监控规则。3.2 电源模块状态与功耗读数电源模块是故障率偏高的部件之一尤其运行了三五年的服务器电源里的电解电容和风扇轴承都在老化。ipmitool 里看电源状态最常用的传感器名是PSx_STATUS、PSx_Input、Power Supply这类不同厂商命名略有差异。如果想快速一览ipmitool sdr list | grep -i PSPS1_STATUS这类传感器一般是 discrete 类型它不像风扇转速那样输出一个连续数值而是一组状态位。比如常见的0x0180表示“存在且状态正常”0x0200可能表示“电源故障”具体含义要看厂商的传感器 PDR 定义。实际使用中别太纠结于每一位的编码含义重点看状态列是不是 ok以及是否有告警。除了状态整机功耗也是必须盯的数据。现代服务器大多支持 DCMIData Center Management Interface直接读取ipmitool dcmi power reading输出示例Instantaneous power reading: 608 Watts Minimum during sampling period: 532 Watts Maximum during sampling period: 642 Watts Average power reading over sample period: 593 Watts这个数据对判断电源负载率非常有价值。我一般把瞬时功耗除以电源总额定功率算出一个负载百分比。比如说一台双电源 1600W 的服务器瞬时功耗 640W单个电源负载约 40%如果另一只电源故障剩下的那只负载就是 80%已经不算健康了。如果用不到冗余能力或者业务扩容后功耗明显上升应该在监控里对电源负载率设置单独的告警而不是只等电源模块彻底挂掉。3.3 风扇转速、状态与阈值判断风扇传感器是服务器的“呼吸系统”指标。CPU 可以因为降频硬撑但风扇一旦失效热量散不出去整机就只能在重启时留下措手不及的记录。看风扇状态我建议用单独的传感器查询而不是每次刷全量ipmitool sensor get FAN1某个具体传感器的输出会更详细包括当前值、状态、阈值上下限、正负变化率等字段。例如Locating sensor record... Sensor ID : FAN1 (0x30) Entity ID : 7.1 (System Board) Sensor Type (Discrete): Fan Sensor Reading : 10240.000 ± 0.000 RPM Status : ok Nominal Reading : 12000.000 Normal Minimum : 3000.000 Normal Maximum : 25000.000 Lower critical : 600.000 Lower non-critical : 700.000 Upper critical : 25500.000 Upper non-critical : 25500.000判断风扇是否正常的核心逻辑是三看看读数是否在某一个稳定区间。高负载时转速上升、空闲时下降是正常的异常的是转速突然掉零或持续贴在低阈值附近。看状态状态列是否是 ok。如果出现 nr、cr说明超过了不可恢复或临界阈值。看历史ipmitool sel list里是否出现过 Fan 相关的告警事件。瞬时抖动的风扇在传感器当前值里可能看不出问题但 SEL 会留下“Fan speed out of range”的事件记录。把这三条逻辑固化到监控脚本里能过滤掉很多无效告警。我曾经遇到一台 4U 存储服务器FAN5 每隔几天就报一次非临界下限当前值又都正常后来排查就是风扇轴承间歇性卡涩靠 SEL 里的历史事件才定位到。3.4 把状态拉进监控系统单台服务器手动执行命令没问题但几十台上百台机器还是得脚本化。最基础的做法是用一个循环去拉所有服务器的关键传感器#!/bin/bash HOSTS(bmc01 bmc02 bmc03) for host in ${HOSTS[]}; do echo $host ipmitool -I lanplus -H $host -U admin -E sdr list \ | grep -E FAN|PS|POWER_METER done更进一步可以把采集到的数据推给 Prometheus、Zabbix 这类监控平台。思路很简单定时执行 ipmitool 采集输出 metrics 格式的数据然后让监控系统抓取。以下是一个简化版的 exporter 片段用脚本把关键传感器转成 Prometheus 文本格式#!/bin/bash IPMI_HOST192.168.1.10 IPMI_USERmonitor export IPMITOOL_PASSWORDyour_password sensor_data$(ipmitool -I lanplus -H $IPMI_HOST -U $IPMI_USER -E sensor list) echo ipmi_power_meter_watts{hostserver01} $(echo $sensor_data | grep ^POWER_METER | awk {print $2}) echo ipmi_fan1_rpm{hostserver01} $(echo $sensor_data | grep ^FAN1 | awk {print $2})这只是一个最朴素的写法真实落地时建议直接用社区现成的 ipmi_exporter没必要重复造轮子。关键点是别只采集 CPU 温度电源功耗、风扇转速这两个指标一定要放进监控面板和告警规则里。4. 高级玩法用 ipmitool 调整风扇转速策略4.1 从自动到手动OEM raw 命令的底层逻辑服务器风扇转速策略通常由 BMC 固件决定基于 CPU、内存、硬盘等温度传感器做 PID 调节。但实际使用中BMC 的策略并不总是符合我们的需求。比如家用的实验室服务器装了低功耗 CPUBMC 依然按数据中心散热模型把风扇拉到 8000 转噪音大到没法放在工位旁边反过来某些高密度 GPU 服务器在机房里温度升高时风扇策略响应又偏保守需要人为干预。ipmitool 可以通过raw命令直接向 BMC 发送 OEM 字节序列把风扇策略从自动切到手动。以很多 x86 服务器通用的 Intel IPMI OEM 命令为例切换到手动模式ipmitool raw 0x30 0x30 0x01 0x00设置全部风扇转速百分比十六进制表示的转速值例如设置 50% 左右ipmitool raw 0x30 0x30 0x02 0xff 0x32切回自动模式ipmitool raw 0x30 0x30 0x01 0x010xff表示这组转速设置应用到所有风扇0x32是十六进制的 50约 50% 转速档位具体百分比与厂商实现有关0x64就是 100%0x00是最低转速。我自己实测过这条命令在部分戴尔和浪潮机器上是有效的设置完风扇转速会明显变化。但这里必须非常强调一句不同厂商、不同 BMC 固件的 OEM 命令都不一样0x30 0x30系列是很多 Intel 平台服务器通用的但并非所有厂商都支持。4.2 不同服务器厂商的转速控制差异我简单列一下主流厂商的常见差异方便你对照自己手头的设备厂商/平台常见控制方式注意事项戴尔 PowerEdgeipmitool raw 0x30 0x30 0x01 0x00手动0x30 0x30 0x02 0xff 0xXX设定转速低版本固件也可能用 iDRAC 的 IPMI 命令重启后策略可能恢复浪潮部分机型同样支持0x30 0x30系列新机型建议先用ipmitool raw 0x30 0x30 0x01 0x01验证是否有响应HPE一般不建议用 raw 命令优先 iLO 的 GUI 或 RESTful API 设置iLO 固件对 raw 命令限制较多强行发送可能无效Supermicroipmitool raw 0x30 0x45 0x01 0x00手动0x30 0x70 0x66 0x01 0x00等模式型号差异极大老平台和新平台的命令不通用联想多用 XCC 管理命令行 raw 支持有限建议走 XCC 的 Web 或 Redfish API之所以有这么多差异是因为 IPMI 规范只定义了传感器、SEL、FRU、机箱控制这些标准命令风扇策略属于厂商私有命令范围每家的实现方式都不一样。所以在生产环境批量调整风扇之前一定要先在测试机上验证命令是否生效别拿着网上搜来的命令直接往几百台上推。4.3 脚本化风扇曲线一台静音同时又安全的 NAS/工作站如果你是在家里或者小办公室运行一台服务器BMC 的风扇策略很可能让你觉得“有点吵”。这时候可以把手动调速做成一个周期性任务按负载自动调节转速兼顾温度和噪音。核心思路是先用手动模式接管风扇控制。定时读取 CPU 温度传感器和风扇转速。根据温度档位设定对应的转速百分比。如果温度超过安全阈值直接切回自动模式兜底避免人为调速导致散热不足。我用一个简单的 bash 脚本实现过这个逻辑#!/bin/bash IPMI_HOST192.168.1.10 IPMI_USERadmin export IPMITOOL_PASSWORDyour_password get_cpu_temp() { ipmitool -I lanplus -H $IPMI_HOST -U $IPMI_USER -E sensor get CPU1_TEMP \ | grep Sensor Reading | awk {print $4} } set_fan_speed() { local pct$1 local hex$(printf %x $pct) ipmitool -I lanplus -H $IPMI_HOST -U $IPMI_USER -E raw 0x30 0x30 0x02 0xff 0x$hex } ipmitool -I lanplus -H $IPMI_HOST -U $IPMI_USER -E raw 0x30 0x30 0x01 0x00 while true; do temp$(get_cpu_temp) if [ $temp -ge 70 ]; then set_fan_speed 100 elif [ $temp -ge 60 ]; then set_fan_speed 70 elif [ $temp -ge 50 ]; then set_fan_speed 50 else set_fan_speed 30 fi sleep 30 done这个脚本思路很直观但我必须泼几盆冷水CPU 温度测量点不止一个建议同时看CPU2_TEMP、Ambient_TEMP不要单一温度驱动。风扇转速百分比与实际 RPM 不是线性关系不同转速档位之间的声学差异很大需要实测。手动模式下的风扇转速不会因为系统负载变化自动升高所以温度阈值必须保守一些。每次 BMC 重启、服务器重启之后策略大概率会恢复成自动模式脚本要有重入手动模式的机制。不要在一个脚本里既做监控又做控制至少把采集脚本和控制器分离否则监控程序故障会导致风扇策略失控。5. 故障排查与避坑实录5.1 有传感器却没有读数怎么办最让人头疼的情况就是sensor list能看到传感器条目但读数是na或者No Reading。这不一定代表传感器坏了要分情况看。第一类情况是传感器本身未启用。有些服务器在 BIOS 或 BMC 设置里可以开关传感器比如“电源冗余状态传感器”未启用时就显示na这时候需要进 BIOS/BMC 把对应开关打开。第二类是 IPMI 通道配置问题。在lanplus模式下如果某个传感器的读数始终不出可以先试试本地 KCS 通道ipmitool sensor list如果本地能读到远程读不到那就是 lan 通道的传感器访问权限没给全或者 BMC 固件的 lan 通道存在已知 bug可以先升级固件试试。第三类是传感器被屏蔽。部分 OEM 机型在出厂时确实不会让某些传感器暴露给 IPMI你需要用厂商的专用工具或者 Redfish 接口去读。这种情况下硬抠 ipmitool 是没意义的换条路就行。5.2 服务器开机风扇狂转的经典路径“开机风扇狂转”是服务器最常见的故障现象之一很多时候 CPU 还没起来、系统还没进 BIOS风扇就已经满转。面对这件事不要慌按顺序排查先看温度传感器是否正常。如果 CPU 温度传感器读数是 0 或者异常值BMC 会认为温度失控直接拉满风扇转速。常见原因是 CPU 没装好、散热器没压紧、传感器接触不良。再看传感器状态和 SEL 事件ipmitool sel list | tail -50如果 SEL 里全是温度告警优先查散热和硅脂如果有电源相关的告警优先查电源和背板供电。风扇狂转本身是 BMC 的自我保护不是故障根因一定要顺着告警事件往回找。还有一种容易忽略的情况是风扇本身缺相或者转速反馈线断了。有些服务器风扇是 4 针接口一根 PWM 控制线一根转速反馈线如果转速反馈没接到 BMCBMC 会默认风扇异常同样拉满转速。这时候可以看单个风扇传感器是不是只有某一个FANx异常而不是全部狂转。如果是单风扇异常检查接针是否松动、线有没有断。另外浪潮、戴尔等很多服务器在更换风扇、加装硬件后首次上电默认全转速运行然后 BMC 重新训练风扇策略过几分钟才恢复。这属于正常现象但需要在监控里做延迟告警别一看到风扇狂转就半夜打电话。5.3 排查思路速查表以下是我这几年用 ipmitool 排查电源风扇问题时总结的一张速查表遇到问题直接对着看现象可能原因优先检查项排查命令某风扇传感器无读数风扇未插、接针松、SDR 未更新物理接线、风扇供电ipmitool sensor list | grep FAN风扇全部高速运转温度传感器异常、CPU 过热、BMC 策略传感器读数、SEL 事件ipmitool sel list电源模块状态异常电源进线松、模块故障、电源背板状态位、亮灯情况ipmitool sdr list | grep -i ps功耗读数为 naDCMI 不支持、权限不足固件版本、账号权限ipmitool dcmi power reading远程连不上 BMC网络不通、623 端口被禁、IP 冲突网口连通性、BMC 配置ping IPipmitool mc inforaw 命令无响应平台不支持该 OEM 命令厂商命令手册检查命令返回码风扇转速设置后重启恢复手动模式未持久化重新执行脚本开机后重新设置传感器显示 na 但状态 ok传感器未启用或读不到BIOS/BMC 设置ipmitool sensor list排查时的另一个原则是先看 SEL再看传感器。SEL 是 BMC 记录的历史事件传感器当前值只是快照。很多间歇性故障靠当前值根本看不出来但 SEL 里早就有告警。养成定期导出 SEL 的习惯比如每天凌晨存一份对定位这类问题帮助极大。5.4 脚本化时的几个实用经验批量管理几百台服务器时ipmitool 的坑会成倍放大。我整理几条典型经验供你参考登录超时和并发限制。BMC 本身的处理能力很有限大批量同时执行 ipmitool 会导致超时。我通常用xargs -P控制并发数一个 BMC 同时只允许十个以内的查询线程超过就容易丢包。密码安全管理。不要在命令行里直接明文写密码也不要把密码放在脚本文件里提交到 Git。用环境变量、密钥管理工具或者封装一个ipmitool_wrapper.sh统一在里边处理认证信息脚本只关心业务逻辑。版本兼容性。老服务器配新版本 ipmitool 偶发协议兼容问题如果某些服务器返回异常空结果可以先降级 ipmitool 或者改用freeipmi工具对比验证快速判断是工具问题还是硬件问题。报警阈值要结合季节。数据中心温度随季节波动很大冬天机房 18 度时风扇 3000 转很正常夏天进风 35 度时 6000 转也可能很正常。别把风扇转速绝对值作为唯一报警依据要用转速相对于温度基线的偏离来判断。比如同样 CPU 50 度冬天风扇 4000 转夏天风扇 8000 转都是正常状态但如果温度没变风扇转速突然上涨或下跌才需要关注。我自己的习惯是温度不变风扇转速涨超过 20%进入观察清单电源模块温度比平时高 15 度以上直接开票准备备件。这些阈值都不是来自厂商手册而是看了一段时间历史数据后自己定的比死阅读手册靠谱得多。最后说两句用 ipmitool 做电源和风扇监控这件事刚开始会觉得命令又多又杂传感器名字还挺绕但真正把流程跑顺之后你会发现它是服务器硬件可靠性里性价比最高的一环。带外管理天然不依赖操作系统哪怕系统完全卡死你照样能远程看到电源和风扇状态这是 Agent 类监控替代不了的。我个人的体会是不要等机器出问题了再去学这些命令而是在服务器刚上架、系统还没部署业务的时候就把 BMC 地址配好、监控采集跑起来、SEL 定期备份做好。硬件故障从来毫无预兆但 ipmitool 能帮你提前几周发现那些藏在传感器数据里的小异常这个提前量往往能救一台机器也救一个加班的晚上。