【浪潮sm5212 m4服务器自动修改风扇转速以降低噪音】_浪潮服务器噪音如何降低
【浪潮sm5212 m4服务器自动修改风扇转速以降低噪音】
- 前言
- 开始折腾
-
- 研究方案
- 改进方案
- 开始实现
-
- 1、BIOS配置IPMI接口地址
- 2、实现服务器自己访问BMC系统
- 3、实现python脚本来自动修改风扇转速
- 4、把运行脚本的命令加入开机自启
- 题外话
前言
前段时间想升级一下家里的 HP T610 瘦客户机,但是由于瘦客户机本身cpu焊死,内存条上限较低等原因,无法升级,除非整套包括主板一起更换,但如此做就等于重新组一套新的了,所以干脆网购了一套云厂商淘汰下来的浪潮sm5212 m4服务器
踩坑:
1、在组装的过程中,由于我是只装了一个CPU,所以要注意CPU安装的位置,要安装在电源那一侧,否则开不了机
2、我第一次安装使用的统信的家庭版镜像,发现安装了后怎么也进不去系统,后面换成了ubuntu系统,一次就成功了,装机推荐工具ventor,推荐理由:轻便简洁无广告并且易使用
开始折腾
研究方案
那服务器一开机那风扇声简直跟战斗机一样,很是影响日常生活,用手机分贝测试软件测试有80分贝左右,于是我在开机观察了一下CPU温度后,试着拔掉了三个风扇(总共4个尼得科的风扇),只保留正对着CPU的风扇,实测风扇温度稳定在30°,由此可见一台风扇足以压得住,这时声音小一些了但依然有60多分贝,还是很吵,于是我就开始百度解决方案,经过一番搜索,找到一个靠谱的方案,通过主板的IPMI接口访问BMC系统,然后去修改风扇的转速,把转速从100%改成10%
,风扇声音瞬间就下去了,效果显著,放在卧室都完全不影响睡眠的程度,但是该方案有个缺点就是服务器不能断电
,断电后就需要使用笔记本用网线连接服务器IPMI接口去手动修改风扇转速,这显然不合理。于是再去百度一番无果,只能自己研究想办法了。
改进方案
经过冥思苦想,我突然灵光一现,如果用一根网线一端插服务器网口,一端插服务器IPMI接口是否可以实现自己控制自己呢?说干就干,一番操作下去发现果然可以,那么现在要解决的问题就是让服务器开机后自己去访问BMC接口,然后修改风扇转速,我马上用postapi去请求接口来调整转速,总共三个接口(第一步请求登录接口拿到授权token,第二步携带token去修改风扇转速为可调整,第三步修改风扇转速为10%
),测试一番有效果,然后我再去把上面三个步骤用shell脚本来实现,但由于个人的shell脚本水平有限,实现起来很是困难,卡在第二步搞不下去,然后我转换思路改用python,因为大多数发行版linux系统都是默认安装了Python解释器的,于是就有了以下Python脚本(本人不会Python,下面代码是自己现学现写的,有什么错误或需要优化的地方还请各位不吝赐教)
开始实现
1、BIOS配置IPMI接口地址
- 开机按del键进入BIOS系统
- 选择Server Mgmt -->BMC network configuration,进入BMC网络配置界面
- Get BMC Dedicated Parameters选择Manual 配置独享BMC端口的IP
- Configuration Addresss source选择static; 配置为静态模式ip模式
- 配置管理接口地址:
网关设置应避免使用192.168.1.1等地址,因为会与路由器网关冲突
-
配置BMC(IPMI)的用户和密码
浪潮的默认用户和密码都是admin
如果不是可以修改
-
保存配置
注明:本博客以上方法借鉴这篇文章配置
完成上面步骤就已经可以把笔记本和IPMI接口用网线连接起来,即可通过笔记本访问BMC管理系统了
插入网线后给笔记本有线网卡配置ip分配方式为静态,设置ip地址为192.168.2.2,子网掩码255.255.255.0,网关192.168.2.1,再打开浏览器访问192.168.2.100即可访问到BMC管理系统,在里面就可以设置风扇转速。
2、实现服务器自己访问BMC系统
连接配置好后可以在服务器系统里面用浏览器访问BMC管理系统(192.168.2.100)
3、实现python脚本来自动修改风扇转速
python脚本如下:
#!/usr/bin/python# -*- coding: UTF-8 -*-import http.clientimport reimport socketimport timedic = { \'username\': \'admin\', \'password\': \'admin\', \'ip\': \'192.168.2.100\', \'speed\': \'1\', # 需要调整的转速 \'maxConnectivityTest\':100, # 超时重连的最大次数 \'fans\':[\"0\", \"1\", \"2\", \"3\", \"4\", \"5\", \"6\", \"7\"] # 需要调整转速的风扇端口 一共8个端口 0~7 (一般默认插的是 0,2,4,6)}print(\"感谢使用修改风扇速度脚本\")def is_port_open(ip_address, port): sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) result = sock.connect_ex((ip_address, port)) if result == 0: print(\'bmc控制台端口测试通过 \', time.strftime(\"%Y-%m-%d %H:%M:%S\", time.localtime(time.time()))) return True else: print(\'bmc控制台连接超时,端口测试失败 \', time.strftime(\"%Y-%m-%d %H:%M:%S\", time.localtime(time.time()))) return Falseindex = 0def loop_func(second): global index while not is_port_open(dic.get(\'ip\'), 80): if index+1 >= dic.get(\'maxConnectivityTest\'): return False index = index + 1 time.sleep(second) return Trueif not loop_func(5): print(\"重连超出最大次数\" + str(dic.get(\'maxConnectivityTest\')) + \"次。\\n请检查网线是否接入管理端口\") exit()print(f\'用户名: {dic.get(\"username\")}\')print(f\'密码: {dic.get(\"password\")}\')print(f\'ip: {dic.get(\"ip\")}\')print(f\'待调整速度: {dic.get(\"speed\")} %\')print(\"开始登录bmc------>\")print(\'——————————————————————————————————————————————————————————————\')# 执行登录请求conn = http.client.HTTPConnection(dic.get(\"ip\"))payload = \"WEBVAR_USERNAME=\" + dic.get(\"username\") + \"&WEBVAR_PASSWORD=\" + dic.get(\"password\")headers = { \'Accept\': \"application/json, text/plain, */*\", \'Accept-Language\': \"zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6\", \'Cache-Control\': \"no-cache\", \'Connection\': \"keep-alive\", \'Content-Type\': \"application/json;charset=UTF-8\", \'Origin\': \"http://192.168.1.100\", \'Pragma\': \"no-cache\", \'Referer\': \"http://192.168.1.100/index.html\", \'User-Agent\': \"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/130.0.0.0 Safari/537.36 Edg/130.0.0.0\", \'Cookie\': \"BMC_IP_ADDR=192.168.1.100; test=1\", \'Accept-Encoding\': \"gzip, deflate, br\"}conn.request(\"POST\", \"/rpc/WEBSES/create.asp\", payload, headers)tokenStr = conn.getresponse().read().decode(\"utf-8\")match = re.search(r\"\'SESSION_COOKIE\' : \'([^\']*)\'\", tokenStr)if match: session_cookie = match.group(1)else: raise ValueError(\"SESSION_COOKIE not found in the string\")# 输出截取的信息print(\'登录成功\')print(f\'获取到Session Cookie: {session_cookie}\')print(\'——————————————————————————————————————————————————————————————\')print(\'开始修改风扇为手动\')payload1 = \"MODE=1\"headers1 = { \'Accept\': \"application/json, text/plain, */*\", \'Accept-Language\': \"zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6\", \'Cache-Control\': \"no-cache\", \'Connection\': \"keep-alive\", \'Content-Type\': \"application/json;charset=UTF-8\", \'Origin\': \"http://192.168.1.100\", \'Pragma\': \"no-cache\", \'Referer\': \"http://192.168.1.100/main.html\", \'User-Agent\': \"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/130.0.0.0 Safari/537.36 Edg/130.0.0.0\", \'Cookie\': \"BMC_IP_ADDR=192.168.1.100; test=1; SessionCookie=\" + session_cookie + \"; Username=admin; PNO=4; gMultiLAN=true; settings={eth:[0,1],ethstr:[\'eth0\',\'eth1\'],lan:[8,1],enable:[1,1]}\", \'Accept-Encoding\': \"gzip, deflate, br\"}conn.request(\"POST\", \"/rpc/setfanmode.asp\", payload1, headers1)conn.getresponse().read().decode(\"utf-8\")print(\'已修改风扇为手动\')print(\'——————————————————————————————————————————————————————————————\')print(\'开始调整风扇风速\')headers2 = { \'Accept\': \"application/json, text/plain, */*\", \'Accept-Language\': \"zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6\", \'Cache-Control\': \"no-cache\", \'Connection\': \"keep-alive\", \'Content-Type\': \"application/json;charset=UTF-8\", \'Origin\': \"http://192.168.1.100\", \'Pragma\': \"no-cache\", \'Referer\': \"http://192.168.1.100/main.html\", \'User-Agent\': \"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/130.0.0.0 Safari/537.36 Edg/130.0.0.0\", \'Cookie\': \"test=1; SessionCookie=\" + session_cookie + \"; BMC_IP_ADDR=192.168.1.100; Username=admin; PNO=4; gMultiLAN=true; settings={eth:[0,1],ethstr:[\'eth0\',\'eth1\'],lan:[8,1],enable:[1,1]}\", \'Accept-Encoding\': \"gzip, deflate, br\"}for x in dic.get(\'fans\'): print(\"调整风扇\" + x) payload2 = \"ID=\" + x + \"&PERCENT=\" + dic.get(\"speed\") conn.request(\"POST\", \"/rpc/setfanspeed.asp\", payload2, headers2) conn.getresponse().read().decode(\"utf-8\") print(\"调整风扇\" + x + \"完成\")print(\'——————————————————————————————————————————————————————————————\')print(\'关闭连接\')conn.close()print(\'退出脚本\')exit()
到这一步就可以通过Python来修改风扇速度了
python3 fan.py
4、把运行脚本的命令加入开机自启
我是在ubuntu系统上通过服务的方式配置开机自启的,我的python脚本路径是:/home/wanjun/桌面/fan.py
1、创建一个新的服务单元文件。在终端中输入以下命令创建startFan_service.service文件:
sudo nano /etc/systemd/system/startFan_service.service
2、在打开的文件中添加以下内容::
[Unit]Description=Start Fan ServiceAfter=network.target [Service]Type=simpleExecStart=/usr/bin/python3 /home/wanjun/桌面/fan.py [Install]WantedBy=multi-user.target
其中 /home/wanjun/桌面/fan.py 是你的 Python 脚本的路径。请确保你具有对该脚本的执行权限。
3、按下 Ctrl + X 保存文件并退出。
4、运行以下命令以启用 systemd 服务:
sudo systemctl enable startFan_service.service
5、reboot 重启系统,你的 Python 脚本将在开机后自动运行。
题外话
在最后,不得不说浪潮服务器真的牛逼好用,作为个人学习使用绰绰有余,ubuntu系统也是非常nice。
2000元不到喜提性能如此之强的服务器,真是垃圾佬的福音,你就用吧,一用一个不吱声。