本帖最后由 wxyhgk 于 2024-10-7 19:12 编辑
说明:
本文由 ChatGPT 和 Notion AI 辅助完成
主板: 超微 h11dsi-nt
系统:Ubuntu22.04
1. IPMI 接口配置指南
1.1 IPMI 接口连接
将下面的 IPMI 接口 和 网口 都接入到路由器上
1.2 IPMI 功能概述
许多超微服务器都具备了两个网卡,其中一个便是 IPMI 使用的。
这个网口直接由服务器底层硬件进行管理,在操作系统层面不可见,可以实现截屏、服务器启停等控制功能,也包括设置风扇转速。
IPMI 网口可以设置为静态 IP 或者 DHCP;与这个网口处于同一个路由器的主机都可以通过 IPMI 对服务器进行管理。
1.3 IPMI 网络配置
IPMI 的 IP 和主机的 IP ,可以到路由器上去看 IP 地址
这里的 IPMI 的 IP 是 192.168.31.252,记住这个 IP,后面我们需要用这个来登录什么的
1.4 IPMI 登录认证
IPMI 一般需要用户名和密码进行认证,超微服务器一般默认的用户名和密码均为 ADMIN。
可以通过网页登录,看到后台信息
IPMI 后台可以控制的东西很多,这里我们主要以控制风扇为主 2. IPMI 风扇设置
2.1 ipmitool 安装
ipmitool 是一种可用在 linux 系统下的命令行方式的 ipmi 平台管理工具。
在 Ubuntu 系统上使用下面的命令,安装 ipmitool ,方便后面管理风扇什么的
- sudo apt install ipmitool -y
复制代码
2.2 系统内置的风扇模式
超微主板提供了几种预设的风扇控制模式,可以通过IPMI网页后台进行配置。
每种模式都有其特定的用途和特点。
方式1:通过网页
风扇模式 | 描述 | 适用场景 | 标准模式(Standard) | 基础风扇速度为 50% 的 PWM 占空比,根据系统温度在 50-100% 之间调节。 | 适合大多数常规使用场景 | 全速模式(Full Speed) | 风扇始终以全速运行。 | 适合需要最大冷却效果的高负载场景 | 最优转速模式(Optimal) | 基础风扇速度为 30% 的 PWM 占空比,范围为30-100%,根据需要调节。 | 适合低负载或需要节能的场景 | 高负载IO模式(Heavy IO) | 将 FANA 和 FANB 设置为 75%PWM 占空比,其他风扇使用标准模式。 | 适合有大量 PCI 设备或高 IO 负载的场景 |
方式2:通过命令行
除了使用网页后台,您还可以通过IPMI命令行工具来设置这些模式。以下是设置命令的通用格式:
- ipmitool -H IPMI_IP -U USERNAME -P PASSWORD raw 0x30 0x45 0x01 MODE_HEX
复制代码
其中,MODE_HEX 为相应模式的十六进制代码:
模式 | 十六进制代码 | Standard(标准模式) | 0x00 | Full(全速模式) | 0x01 | Optimal(最优转速模式) | 0x02 | Heavy IO(高负载IO模式) | 0x03 |
例如,要将风扇模式设置为全速模式,您可以使用以下命令:
- ipmitool -H 192.168.31.252 -U ADMIN -P ADMIN raw 0x30 0x45 0x01 0x01
复制代码
请注意,IP地址、用户名和密码应替换为你的IPMI设置。
2.3 风扇转速命令说明
这里以超微 h11-dsi-nt 主板为例子说明
上面的图中
- 红色部分是周边设备,对应FAN1,FAN2…FAN6
ipmitool -H 192.168.31.252 -U ADMIN -P ADMIN raw 0x30 0x70 0x66 0x01 0x01 0x24
0x00 表示对周边设备的风扇调速
- 绿色部分是系统区域,对应FANA,FANB,区域一般为负责CPU、GPU的风扇
ipmitool -H 192.168.31.252 -U ADMIN -P ADMIN raw 0x30 0x70 0x66 0x01 0x00 0x24
0x01 表示对系统区域的风扇调速
- 关于上面命令的说明
- -U 和-P 分别指定 IPMI 的用户名和密码
- 0x24 是 16 进制的,0x24 代表风扇转速设置成 36%
注意上面的FANA,FANB,FAN1~FAN6的功能,不同主板不一样,具体的需要看主板的说明书
2.4 风扇的阈值调整
在后台这里可以看到风扇的阈值,如果你的转速低于阈值,那么就会自动提高转速,
那么就会出现这种现象:风扇一会儿低速,一会儿满速运行,非常烦人
对于普通风扇其实没这种问题,但是对于猫头鹰风扇,这个风扇转速本来就地,
那么就会一会儿快,一会儿慢速,我们可以用通过下面的命令来调速
- ipmitool -I lanplus -H 192.168.31.252 -U ADMIN -P ADMIN sensor thresh FANA lower 100 200 300
复制代码
这里是调节 FANA 这个风扇的阈值是 100,200,300 的转速,其他的风扇可以调整成一样的
3. 自动化脚本
在不同的的季节 和不同的使用场景下,我们可能需要调整风扇的转速以达到最佳的散热效果和噪音控制。例如
夏季:由于环境温度较高,可能需要将风扇速度调高以保证足够的散热。
冬季:环境温度较低时,可以适当降低风扇速度以减少噪音。
如果服务器放置在噪音敏感的环境中,在保证足够散热的同时尽量降低风扇速度,实际上满速运行的时候就是会吵,只能说可以控制一点
我们可以写一个 shell 脚本,实现根据 CPU 的温度,控制风扇的转速。
下面的脚本主要是用于 夏天,其实冬天或者秋天的话,用服务器自带的优化模式就够了
- #!/bin/bash
- IPMI_HOST="192.168.31.252"
- IPMI_USER="ADMIN"
- IPMI_PASS="ADMIN"
- # 初始风扇速度级别:1 = 低, 2 = 中, 3 = 高, 4 = 全速
- CUR_FAN_SPEED_LEVEL=1
- # 将风扇控制模式设置为手动(Full Speed Mode)
- ipmitool -I lanplus -H "$IPMI_HOST" -U "$IPMI_USER" -P "$IPMI_PASS" raw 0x30 0x45 0x01 0x01
- sleep 2
- # 设置初始风扇速度(低档,设置为20%)
- ipmitool -I lanplus -H "$IPMI_HOST" -U "$IPMI_USER" -P "$IPMI_PASS" raw 0x30 0x70 0x66 0x01 0x01 0x14
- sleep 2
- # 获取温度函数
- get_temp() {
- # 获取两个 CPU 的温度并取最大值
- temps=$(sensors | grep "Tctl" | awk '{print $2}' | sed 's/+//g' | sed 's/°C//g' | awk -F. '{print $1}')
- echo "$temps" | sort -nr | head -n 1
- }
- while true; do
- TEMP=$(get_temp)
- if [ -z "$TEMP" ] || [ "$TEMP" -eq 0 ]; then
- echo "$(date +"%F %T") 获取温度失败,退出"
- exit 100
- fi
- # 超过 70 度的风扇设置
- if [ "$TEMP" -ge 70 ]; then
- if [ "$CUR_FAN_SPEED_LEVEL" -ne 4 ]; then
- echo "$(date +"%F %T") 温度: $TEMP 风扇速度: 4(100%)"
- ipmitool -I lanplus -H "$IPMI_HOST" -U "$IPMI_USER" -P "$IPMI_PASS" raw 0x30 0x70 0x66 0x01 0x01 0x64 # 设置为100%
- ipmitool -I lanplus -H "$IPMI_HOST" -U "$IPMI_USER" -P "$IPMI_PASS" raw 0x30 0x70 0x66 0x01 0x00 0x64 # 设置为100%
- CUR_FAN_SPEED_LEVEL=4
- fi
- # 超过 65 度的风扇设置
- elif [ "$TEMP" -ge 65 ]; then
- if [ "$CUR_FAN_SPEED_LEVEL" -ne 3 ]; then
- echo "$(date +"%F %T") 温度: $TEMP 风扇速度: 3(80%)"
- ipmitool -I lanplus -H "$IPMI_HOST" -U "$IPMI_USER" -P "$IPMI_PASS" raw 0x30 0x70 0x66 0x01 0x01 0x50 # 设置为80%
- ipmitool -I lanplus -H "$IPMI_HOST" -U "$IPMI_USER" -P "$IPMI_PASS" raw 0x30 0x70 0x66 0x01 0x00 0x50 # 设置为60%
- CUR_FAN_SPEED_LEVEL=3
- fi
- # 超过 55 度的风扇设置
- elif [ "$TEMP" -ge 55 ]; then
- if [ "$CUR_FAN_SPEED_LEVEL" -ne 2 ]; then
- echo "$(date +"%F %T") 温度: $TEMP 风扇速度: 2(60%)"
- ipmitool -I lanplus -H "$IPMI_HOST" -U "$IPMI_USER" -P "$IPMI_PASS" raw 0x30 0x70 0x66 0x01 0x01 0x3C # 设置为60%
- ipmitool -I lanplus -H "$IPMI_HOST" -U "$IPMI_USER" -P "$IPMI_PASS" raw 0x30 0x70 0x66 0x01 0x00 0x3C # 设置为60%
- CUR_FAN_SPEED_LEVEL=2
- fi
- else
- # 超过 低于 55 度的风扇设置
- if [ "$CUR_FAN_SPEED_LEVEL" -ne 1 ]; then
- echo "$(date +"%F %T") 温度: $TEMP 风扇速度: 1(20%)"
- ipmitool -I lanplus -H "$IPMI_HOST" -U "$IPMI_USER" -P "$IPMI_PASS" raw 0x30 0x70 0x66 0x01 0x01 0x14 # 设置为20%
- ipmitool -I lanplus -H "$IPMI_HOST" -U "$IPMI_USER" -P "$IPMI_PASS" raw 0x30 0x70 0x66 0x01 0x00 0x14 # 设置为20%
- CUR_FAN_SPEED_LEVEL=1
- fi
- fi
- sleep 60
- done
复制代码
在夏天可以将上面的代码保存为 fans.sh ,然后使用命令
- bash fans.sh > fan_control.log 2>&1 &
复制代码
来后台运行
与此同时如果想关闭这个脚本程序,可以使用以下命令:
这个命令会直接查找并终止名为fans.sh的脚本进程。
4. 参考文章
1. https://www.licc.tech/article?id=33
2. https://forums.servethehome.com/ ... n-speed-control.20/
|