[i=s] 本帖最后由 vanlea 于 2025-2-4 20:09 编辑 [/i]<br />
<br />
一、需求简述
飞牛系统更新后可以支持UPS了,使用的程序是nut,其实群晖的UPS支持也是基于nut。而飞牛的UPS功能只支持关闭飞牛自身,不可以关闭UPS,这样,有市电来之后NAS不会自动开机(只支持来电自启的主板),市电来电后想要开NAS,只能加支持远程控制的开关,或者只能网络唤醒,或者手动开机。
关闭系统后关闭UPS,这个选项在群晖是有的(如下图),飞牛没有这个功能。
有这个需求的,可以参考本教程。

二、本教程测试的设备
主板:豆希B250 6盘位(主板提前进BIOS配置好来电自启)
UPS:雷迪斯H1000M
其他:理论上使用USB和NAS通讯的UPS都可以使用
三、教程开始
教程开始前:
所有配置文件和脚本,使用sudo或者root账户编辑,编辑前请自行进行备份!!!
所有配置文件和脚本,使用sudo或者root账户编辑,编辑前请自行进行备份!!!
所有配置文件和脚本,使用sudo或者root账户编辑,编辑前请自行进行备份!!!
1、在飞牛OS的web,启用UPS支持

2、登录SSH后修改upssched配置文件
文件位置:/etc/nut/upssched.conf
文件内容:
CMDSCRIPT /usr/trim/bin/upssched_cmd.sh
PIPEFN /run/nut/upssched.pipe
LOCKFN /run/nut/upssched.lock
AT ONBATT * EXECUTE onbatt
AT ONBATT * START-TIMER power-off 60 #自行手动添加
AT ONLINE * CANCEL-TIMER power-off #自行手动添加
AT ONLINE * EXECUTE online
AT COMMBAD * EXECUTE commbad
AT COMMOK * EXECUTE commok
AT LOWBATT * EXECUTE lowbatt
添加以下2行:
AT ONBATT * START-TIMER power-off 60
AT ONLINE * CANCEL-TIMER power-off
第一行:UPS进入电池供电状态时,开始一个60秒的计时器,如果计时器结束后没有恢复市电供电,就执行/usr/trim/bin/upssched_cmd.sh脚本下“power-off”函数。
第二行:如果UPS从电池供电恢复到市电供电,就取消60秒的计时器,并且不会执行/usr/trim/bin/upssched_cmd.sh脚本下“power-off”函数。
其他注意事项:
这个60秒,要比第1步设置的“关机等待时间”快,否则只会关机但不关闭UPS!
这个60秒,要比第1步设置的“关机等待时间”快,否则只会关机但不关闭UPS!
这个60秒,要比第1步设置的“关机等待时间”快,否则只会关机但不关闭UPS!
3、登录SSH后修改upssched_cmd.sh脚本
文件位置:/usr/trim/bin/upssched_cmd.sh
a、只需要关机并关闭UPS,不需要邮件通知,则
#!/usr/bin/bash
set -ex
exec 1> >(logger -t upssched-cmd) 2>&1
/usr/bin/curl --unix-socket /var/run/ups_device.socket -X POST -d "eventType=$1" http://localhost/event
if [ "$1" == "power-off" ]; then #自行添加
/sbin/upsmon -c fsd #自行添加
fi #自行添加
也就是在文件最后添加这3行:
if [ "$1" == "power-off" ]; then
/sbin/upsmon -c fsd
fi
b、如果需要发送邮件通知,则按照如下修改
#!/usr/bin/bash
set -ex
exec 1> >(logger -t upssched-cmd) 2>&1
/usr/bin/curl --unix-socket /var/run/ups_device.socket -X POST -d "eventType=$1" http://localhost/event
case $1 in
onbatt)
echo "UPS已经进入电池供电模式!" | s-nail -s "UPS告警" 你的QQ邮箱@qq.com
;;
online)
echo "UPS已经恢复市电供电!" | s-nail -s "UPS告警" 你的QQ邮箱@qq.com
;;
power-off)
echo "UPS已经使用电池供电超过60秒,开始关闭fnOS并且关闭UPS!" | s-nail -s "UPS告警" 你的QQ邮箱@qq.com
/sbin/upsmon -c fsd
;;
commok)
echo "UPS连接成功!" | s-nail -s "UPS告警" 你的QQ邮箱@qq.com
;;
commbad)
echo "UPS已断开连接!" | s-nail -s "UPS告警" 你的QQ邮箱@qq.com
;;
*)
logger -t upssched-cmd "Unrecognized command: $1"
;;
esac
echo "UPS已经恢复市电供电" | s-nail -s "UPS告警" 你的QQ邮箱@qq.com
就是邮件提醒使用的命令,echo 后面双引号的内容是邮件正文, -s 后面双引号是邮件标题,内容可以自行修改。想要使用的话,首先百度一下s-nail怎么配置。
/usr/bin/curl --unix-socket /var/run/ups_device.socket -X POST -d "eventType=$1" http://localhost/event
这一行是飞牛用来将UPS事件显示到web的。
至于第1步设置的“关机等待时间”,这里触发的关机事件定义的配置文件在哪还没空研究,先用着upssched.conf配置文件的计时器
重点看power-off函数内:/sbin/upsmon -c fsd
,实现关机后关闭UPS的重点就是将关机命令执行换成这个。
全部设置完后,就可以实现“关闭fnOS系统后完全关闭UPS”功能。
4、开机自动复制upssched_cmd.sh
复制一份upssched_cmd.sh到用户文件夹下,或者/etc/nut/下,我这里放在/etc/nut
在/etc/init.d/下新建一个脚本文件,我这里取名为cp-upsconf.sh,内容如下(全部复制粘贴,自行修改16行,15行的配置文件自己按需配置,如果不用,就直接删掉):
#!/bin/sh
#
### BEGIN INIT INFO
# Provides:cp-upsconf
# Required-Start: $network $remote_fs $local_fs
# Required-Stop: $network $remote_fs $local_fs
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: cp upsconf to Folder
# Description: Cp upssched.conf to /etc/nut. Cp upssched-cmd to /usr/trim/bin/.
### END INIT INFO
sleep 120
cp /etc/nut/upssched.conf.bk /etc/nut/upssched.conf
cp /etc/nut/upssched_cmd.sh /usr/trim/bin/upssched_cmd.sh
exit 0
赋予执行权限
chmod +x /etc/init.d/cp-upsconf.sh
将复制配置文件的脚本添加到启动执行
update-rc.d cp-upsconf.sh defaults 90
四、成果展示-20241218

五、其他注意事项
1、想验证你的UPS是否支持完全关闭,可以直接执行 /sbin/upsmon -c fsd
,看NAS关机后,UPS是否继续为其他设备供电。
2、全部脚本和配置文件修改好后,不能再在fnOS的web上操作任何关于UPS的选项,否则upssched.conf配置文件会重新被覆盖恢复初始状态。如果不小心操作了,需要重新编辑/etc/nut/upssched.conf 配置文件添加那2行。
可以按照第三大点第4小点,第15行代码,配置开机自动覆盖upssched.conf。
六、后续-20241224
研究了一下飞牛OS网页有关UPS的JS源码,可惜当初大学时(本人网络工程专业)没好好学java,也没有接触过JavaScript,没找到操作后台的java方法,以下都是本人根据自己其他编程预言进行的猜测。
路径:/usr/trim/www/assets/Setting-BWu1KWhI.js
,在33390~33423行之间,shutdownPolicyType
,飞牛官方只做了 LOWBATT
和 ONBATT
这2个的判定,相关内容可见 /etc/nut/upsmon.conf
,如果能将 shutdownPolicyType
的值从 LOWBATT
或者 ONBATT
倒计时X分钟后,最终设定为 FSD
,应该就可以实现“关闭fnOS系统后完全关闭UPS”。
需要这个功能的还是先用本教程改脚本的方式,如需飞牛官方适配,大家多在建议区提建议。

