自从上了nas这条贼船,家里的各种开销就增加了。以前使用Rock 5b开发板+USB硬盘盒的组合还好,因为ARM架构的功耗非常低;但是自从几个月前自己基于超微X11SSH-F服务器主板DIY了一套NAS系统,加上散热风扇、HBA卡、SAS硬盘的用电开销,每月电费就直线上升,去年年底付了四百多了电费。当然这也不能完全归咎于存储系统,毕竟因为个人爱好的缘故,家里的各式电子设备比较多,而且目前国家采用的阶梯型计费系统,12月份往往是一年中电费最高的月份。
我自己分析了一下,家中NAS的主要用途是自动下载高清电影,但是实际上存储中的电影太多没有时间及时观看,所以NAS保持24小时开机不间断下载完全没必要,其实只要保证在家中的时间段可以媒体播放娱乐即可。
自动开关机有很多种实现办法,我最早hack的Pogoplug是通过定时插座实现自动开关机的,优点是方法简单,但是关机是强制关机,对于硬盘健康不利。
不少电脑支持Wake On Lan技术,直接在BIOS里开启这一功能即可。
这项技术的特点如下:
依赖网卡(NIC) 接收特定的 Magic Packet 进行远程唤醒。
需要主板和网卡支持 WoL,并在 BIOS 和操作系统中启用相关设置。
主要用于消费级 PC 和服务器,无法监控系统健康状态,仅用于远程开机。
一般只能在 同一局域网(LAN) 发送魔术包,远程使用需要端口转发或 VPN。
而我最近折腾的服务器主板拥有IPMI接口,可以利用超微的IPMI Tool实现定时开关机。
机制和WoL也是不一样的:
独立于操作系统,通常由服务器上的 BMC(Baseboard Management Controller) 处理。
提供 远程电源控制(开机、关机、重启)功能,类似物理电源按钮的作用。
支持硬件级监控(如 CPU 温度、电源状态、风扇速度等)。
通过 IP 地址 访问,不受局域网限制,可以通过外网远程管理。
常用于企业级服务器,如 Dell iDRAC、HPE iLO、Supermicro IPMI 等。
具体操作方法如下:
首先到超微的官网中下载名为SMCIPMITool的软件包,支持Windows和Linux系统。
因为需要网络中的另一台设备向NAS系统发送指令开关机,所以这台设备需要保持长期在线。
在我家的环境中,有一个Rock5b的开发板作为软路由保持24小时开机,我准备让其承担这一角色。因此我下载了Linux版本。
将软件包通过Putty或者WinSCP等软件拷贝到开发板上。
解压缩,我们要用到的就是SMCIPMITool。注意需要预先安装JAVA环境。
命令格式如下:
ipmitool -I lanplus -H -U <用户名> -P <密码> power on
其中指的是NAS的IPMI地址,相应的用户名和密码也就是登录IPMI的账号信息。
比如我这里的命令是这样的:
将命令放到sh文件中执行,却收到了Unable to establish IPMI v2 / RMCP+ session的报错。
网上搜了下对应错误的解决方案,试了却没有起作用。
绝望之际,偶然发现短时间内再次运行脚本就成功了,我猜想可能是因为网络延迟造成无法响应的缘故。
于是将脚本更新一下,增加了一个循环,直至执行成功。
开机脚本 power_on.sh
#!/bin/bash
IPMI_CMD="/usr/bin/ipmitool -H 192.168.1.144 -I lanplus -U 用户名 -P 密码 chassis power on"
# 最大尝试次数
MAX_RETRIES=5
COUNT=0
while [ $COUNT -lt $MAX_RETRIES ]; do
OUTPUT=$($IPMI_CMD 2>&1)
echo "$OUTPUT"
# 如果执行成功,退出循环
if echo "$OUTPUT" | grep -q "Chassis Power Control: Up/On"; then
exit 0
fi
# 增加计数器
COUNT=$((COUNT + 1))
# 等待1秒后重试
sleep 2
done
echo "Failed to power on after $MAX_RETRIES attempts."
exit 1
关机脚本 power_off.sh,注意这里要使用power soft软关机,让系统执行标准的关闭流程,就像执行 shutdown -h now 命令一样。
#!/bin/bash
IPMI_CMD="/usr/bin/ipmitool -H 192.168.1.144 -I lanplus -U 用户名 -P 密码 chassis power soft"
# 最大尝试次数
MAX_RETRIES=5
COUNT=0
while [ $COUNT -lt $MAX_RETRIES ]; do
OUTPUT=$($IPMI_CMD 2>&1)
echo "$OUTPUT"
# 如果执行成功,退出循环
if echo "$OUTPUT" | grep -q "Chassis Power Control: Up/On"; then
exit 0
fi
# 增加计数器
COUNT=$((COUNT + 1))
# 等待1秒后重试
sleep 2
done
echo "Failed to power off after $MAX_RETRIES attempts."
exit 1
可以手工执行一下两个sh文件,确认脚本可以成功运行。
crontab -e
编辑crontab定时任务:
保证在主机开机之后,对应的CT,Docker也能自动启动,运行以下命令:
pct set -onboot 1
docker update --restart unless-stopped 容器名称或ID
开关机脚本已经在我的环境中正常运行几周了,现在每周通电时间只有四十几小时,大大节省了用电开销,同样可以满足我平日的NAS需求;模拟软关机的方式也不会强制断电,损害硬盘健康。
如果大家的NAS系统支持IPMI,也可以采用此种方式节省每月电费。
,