前言
自从开始搭建自己的NAS服务器后,偶尔会遇到突然断电的情况。不管是手误不小心点到米家APP上的智能插座的开关,还是公寓电费用完时的突然断电,都足以让人提心吊胆。
我的这台NAS其实相对算稳定的,突然断电过好几次,期间只因此出了两三次问题。如群晖无法引导需要重装系统之类。
虽然群晖的系统设计比较优秀,重装系统并不会导致数据丢失,但是毕竟得花费不少时间恢复系统,有时候甚至需要重建存储池(并不会丢失数据)。而且毕竟是NAS,数据安全第一。于是便买了台山特的UPS,型号是TG-BOX 850。
山特 Santak TG-BOX 850 UPS 简介
- 首先这是一款后备式的UPS,也就是说其平时处于蓄电池充电状态,在停电时逆变器紧急切换到工作状态,将电池提供的直流电转变为稳定的交流电输出。因此,这类UPS存在一个切换时间的问题,不过一般切换时间达到了毫秒级别,对于家用NAS或计算机来说已经足够使用。
- 它具有即插即用型USB通讯接口,可以用来与电脑、NAS、软路由等连接,在紧急断电时通知这类设备,进而可以实现自动关机的功能。相比于无通讯接口的UPS来说,实现了无人值守的自动关机。这点对于我的使用场景来说还是相当重要的,毕竟我不可能时时刻刻待在家里,坐在NAS旁边待停电后给它关机。
- 较大的功率支持。TG-BOX 850最大不间断电源功率达到了850VA/510W,虽然我的NAS满载时功率也就100多W,但是8盘位且本身机箱硬盘仓背板不支持交错启动,加上CPU和显卡等,启动时的瞬时功率还是比较高的。并且为了日后的扩展需求,功率大点总归没错。
- 电池容量大。我的NAS上黑群晖虚拟机跑了不少服务,导致开关机时间会比较长,完整的关机时间大概在6分钟左右,这就要求UPS有着较长的续航来撑过这6分钟。而这款UPS在100W输出时可以续航24分钟,200W输出时也可以续航10.5分钟,对于我的需求是绰绰有余了。
- 全部输出接口均有防雷支持,同时还有一组RJ45防止电话线/网线的防浪涌接口,最大限度防止设备受到电力波动影响。
- 除了一组 2x双孔+3x三孔 支持不间断供电+防雷保护 的输出插座外,它还另附一组 2x双孔+3x三孔 仅支持防雷保护 的输出插座,总输出功率可以达到2000VA,即使是当作普通插线板来用也是非常不错的。
- 它还自带四个5V/2A的USB充电口,用来给一些低功耗设备供电,这四个口也是防雷的,只用USB的话可以把它当作一个超大号充电宝。
我的需求分析
我买这台UPS的主要目的是给NAS用,实现停电自动关机。但是我的NAS物理机装的是ESXI 8.0的虚拟化环境,群晖、Ubuntu、Windows等都是同时运行在ESXI之上的虚拟机。这样就带来了问题。这台UPS本身是支持群晖的,可以直接用USB连接到群晖来实现相关功能。虽然群晖本身可以在USB连接UPS后充当一个网络UPS服务器来通知同网络中其它设备,但是群晖是跑在虚拟机上的,固然可以设置让ESXI在收到群晖UPS服务器的断电通知后延时一段时间等群晖关掉后再关机,不过这个延时的时间谁也说不准。
而正好我的局域网里还有一台设备可以充当这个角色,那就是被我刷了OpenWRT用作软路由的树莓派4B。这样我可以将UPS直接连接到树莓派,然后在树莓派上开启UPS服务器来通知NAS上的所有虚拟机以及ESXI本身,然后树莓派自己关机。并且树莓派4B功耗不高,和NAS一起插到UPS上也不会对续航有什么可感知的影响。
整个UPS供电及通信网络拓扑如下图所示。
OpenWRT配置
Linux上实现和UPS之间通信主要依靠 NUT(Network UPS Tools) 软件来实现。在OpenWRT上,除了基础的nut-common相关库和nut-driver驱动外,NUT主要又由三个部分组成: nut-server、nut-upsmon、nut-web-cgi。其中net-server负责直接同UPS进行通信,提供UPS服务器功能,用于通知局域网设备;nut-upsmon负责和net-server进行通信,相当于一个nut-client,用于树莓派本机自动关机;nut-web-cgi负责对外提供API程序和监控网页。另外还有nut-upsc可以直接命令行操作UPS等。
对于这款UPS,可以使用标准的usbhid协议来进行通信,所以需要安装nut-driver-usbhid-ups驱动包。
-
首先,我们连接好UPS电源和USB数据线,使用SSH连接到软路由,通过opkg安装相关软件:
opkg update && opkg install nut nut-common nut-driver-usbhid-ups nut-server nut-upsmon nut-web-cgi nut-upsc
-
然后进行nut-server的配置,配置文件路径为
/etc/config/nut_server
,将其内容修改为:config driver 'ups' option driver usbhid-ups option port 3493 option vendorid 0463 config user option username monuser option password secret option upsmon master config listen_address option address 0.0.0.0 option port 3493 config upsd upsd
然后重启一下nut-server服务:
/etc/init.d/nut-server reload
这里设置了一台名为
ups
的UPS,其驱动程序为usbhid-ups
,UPS服务器端口为3493
,制造商ID为0463
,UPS服务器用户名为monuser
,UPS服务器密码为secret
,UPS监控模式为master
主机模式,并且UPS服务器监听在设备的所有IP即0.0.0.0
上,最后通过upsd
来启动UPS通信程序。
需要注意的是,如果你需要把群晖连接到这台UPS服务器的话,这里的
UPS名称
、用户名
、密码
、模式
、端口
均不能修改,这是因为群晖的开发者偷了个懒,UPS设置只能设置服务器IP地址,UPS名称和用户名、密码、端口等均写死到系统固件了(群晖其实也是通过nut client实现的,可以通过命令行修改,但没必要),因此,这里就按群晖的规范来书写。其实NUT本身是不能正确识别山特UPS的部分信息的,不过因为山特和Eaton之间有比较暧昧的关系,山特UPS的USB通信
VendorID
值0463
其实对应的是Eaton,最终我们在其他客户端软件中识别到的也会是Eaton,也算是变相实现了。
-
接着我们设置一下nut-web-cgi,配置文件路径为
/etc/config/nut_cgi
,将其内容修改为:config host option uspsname ups option hostname localhost option displayname "TG-BOX-850"
然后重启一下nut-web-cgi服务:
/etc/init.d/nut-cgi reload
这里UPS名称按之前nut-server的设置改为
ups
,hostname
改为本机localhost
即可,显示名称displayname
可以自定义。 -
然后设置一下nut-upsmon来实现树莓派的自动关机,配置文件路径为
/etc/config/nut_monitor
,将其内容修改为:config 'upsmon' upsmon config master option upsname ups option hostname localhost option username monuser option password secret
然后重启一下nut-upsmon服务:
/etc/init.d/nut-monitor reload
这里的UPS名称、用户名、密码均按nut-server的设置填写即可,主机名也是
localhost
。其实upsmon有一些相关配置项,比如通过shutdowncmd
来设置关机命令等。不过这些设置项的默认值已经够用,这里我们不填保持默认设置即可。相关选项可以参考OpenWRT的官方Wiki。 -
大功告成,此时给UPS断电来模拟停电的话,树莓派也会自己关机。
群晖配置
群晖的设置相对简单,图形化界面并且没什么太多可选项。
这里以我的NAS现在运行的最新版的DSM 7.1.1-42962 Update 2
系统为例,我们只需要进入群晖DSM网页端的控制面板-硬件和电源-不断电系统
中,打开启用UPS支持
选项,选择UPS类型为Synology不断电系统服务器
,然后设置DiskStation进入待机模式之前的时间为5秒
或者保留默认和服务器设置相同即可,然后再填入网络不断电系统服务器IP地址为软路由的IP,点击应用即可。
如果群晖没有提示任何错误,此时我们点击页面上的设备信息,就可以看到群晖获取到的UPS服务器信息了。可以看到,这里识别到的UPS厂商为EATON
。
其实这一步可以省略,因为我的群晖里安装了
vm-tools
,可以接收宿主机的命令,也就是通过ESXI来关机。ESXI配置
ESXI监听nut-server需要通过NutClient-ESXI插件来实现。
- 首先我们下载插件到桌面,通过scp推送到ESXI宿主机:
scp ~\Desktop\NutClient-ESXi-2.8.0-2.4.1-offline_bundle.zip root@192.168.50.100:/tmp
记得将命令中的包路径和IP地址替换为你下载的路径和你自己的ESXI宿主机地址。
-
然后使用SSH登录到ESXI宿主机,运行如下命令安装插件:
esxcli software vib install -d /tmp/NutClient-ESXi-2.8.0-2.4.1-offline_bundle.zip
等待一会儿后返回安装结果:
Installation Result Message: Install succeed. Reboot Required: false VIBs Installed: Margar_bootbank_upsmon_2.8.0-2.4.1 VIBs Removed: VIBs Skipped:
安装成功。
-
分别把
UserVars.NutUpsName
、UserVars.NutUser
、UserVars.NutPassword
三个选项改为之前OpenWRT中nut-server设置的UPS名称、用户名、密码即可,其他选项可以保持默认,也可以根据需要自定义。 -
最后进入
管理-系统-自动启动
中,设置ESXI的启动和关机策略。
最上方的编辑设置里是宿主机的启动和关机策略,首先启用该选项,启动延迟(宿主机启动多久后开始启动客户机)根据自己的需要修改。停止操作选择关机
而不要选择关闭电源
,这样以来只要客户机上安装有vm-tools,宿主机会发送关机命令给客户机,让其自动关机。等待检测信号
指宿主机是否检测客户机有没有完成关机,设置为是
时,宿主机会等待客户机关机后再关机,设置为否
后,宿主机只等待停止延迟
选项设置的时间后便自动关机。建议两个设置均根据自身情况设置好,以防万一。
然后针对每个客户机设置好对应的启动和关机策略即可,这里根据自己客户机开关机的实际情况设置。我的设置是开启等待检测信号
的同时,也设置好停止延迟,防止出现问题。
测试
到这里所有设备就都设置好了,我们可以进行一场模拟演练。
进入ESXI的任务监控后,断开UPS的供电线,可以发现,任务里依次出现了各个客户机的关机任务,最终客户机依次关机后,ESXI宿主机自动关机,软路由也正常关机。
大功告成。
附录:将UPS监控集成到HomeAssistant
我在软路由上还运行了HomeAssistant来监控所有的智能家居设备,而HomeAssistant是有官方NUT插件的,如图所示,可以很方便的连接到NUT服务器。
近期评论