前几天家里经历了多次断电事件,由于家中的UPS无法直接与群晖NAS通信,尽管UPS电池容量很大,但在多台设备(两个摄像头、多台主机、三台AP)的高功耗下,电力未能及时恢复,最终导致两台群晖NAS被迫强制关机。
大多数UPS都支持群晖DSM,只要将UPS与群晖连接,一旦断电,UPS就会自动为群晖供电。但是有些UPS型号不兼容群晖,或需要额外的设备才能与群晖通信,这就无法及时向群晖发送断电信号。
突然断电会对硬盘造成很大的伤害,极有可能导致重要数据的丢失。为了解决这个问题,老宁我特地用AI编写了一个脚本:只要群晖检测到断电,就会自动执行关机操作,从而保护数据和硬件。
当然,断电后的关机只解决了一半问题。电力恢复后,我们还需要群晖自动开机。所以在文章的后半部分也有如何唤醒群晖的操作,一起来看看。
关机脚本
让我们先来探讨一下自动关机的原理。
首先需要一个定时执行的脚本,其核心功能是定期ping一个特定的局域网IP地址。这个IP地址对应的设备是没有连接UPS的,因此当断电发生时,这个设备会立即失去响应。如果脚本检测到无法ping通这个IP,就可以合理推断发生了断电,随即触发群晖的关机操作。
为了进一步提高可靠性,脚本会每次执行ping操作都会发送10次ping命令,当两次ping操作(20次ping)都失败时,才会执行真正的关机命令。
了解了原理后,我们来看看如何在群晖上如何部署和执行这个脚本。
🔻 首先去论坛下载脚本https://www.synocircle.top/d/128,再把脚本上传到群晖中。(任意文件夹都行)
🔻 右键脚本进入属性选项卡,把脚本路径复制下来。
🔻 打开控制面板,新增任务计划。
🔻 选择用户定义的脚本。
🔻 任务名称可以随意,用户账户必须选择root。
🔻 设置计划时间为每5分钟执行一次脚本。
🔻 在脚本输入框中输入bash /volume1/homes/laoning/script/ping_poweroff.sh 192.168.2.12
命令,注意/volume1/homes/laoning/script/ping_poweroff.sh
为前面上传的脚本路径,192.168.2.12
为需要ping的IP地址。(我的路由器也连着UPS,所以这里ping的IP为小爱的IP)
🔻 如果嫌麻烦不想在脚本后面加IP参数,也可以直接修改shell脚本的代码,把IP写死在脚本中。
🔻 当脚本执行完毕后,会在同级目录生成日志文件network_monitor.log
。
🔻 如果两次ping都失败,那么就会执行关机操作。(前面设置的5分钟ping一次,也就是断电10分钟关闭群晖)
因为脚本中使用synopoweroff
执行关机操作,它会等待所有服务停止后再关机,所以整个关机过程非常慢,如果你觉得整个关机过程时间超过了UPS所能承受的极限,那么可以把前面ping的间隔设置得更短一些。
唤醒
在群晖上电源自动恢复有两种模式,第一种是恢复电源问题后自动重新启动;第二种是启用局域网的局域网唤醒。
它们的区别在于第一种是群晖直接断电后,来电了会自动启动,也就是突然断电(非正常关机)后,它会自动重启。
第二种则是启用WOL唤醒功能,正常关机后可以被局域网的其他设备唤醒启动。
🔻 电源自动恢复选项都建议勾选。
前面执行的脚本是正常关机,所以要启动群晖就需要采用第二种方式局域网唤醒。
🔻 可以在iKuai路由器的高级应用中找到局域网唤醒功能。
🔻 openwrt同样提供了网络唤醒功能。
🔻 想要唤醒群晖也非常简单,输入群晖的mac地址即可。
接下来只需等待群晖启动即可,如果群晖中服务较多,启动时间也会很久。有一点需要注意,能唤醒的前提是群晖断电后也必须要连接电源和网线,否则是无法执行唤醒操作的。
后记
有了上面的脚本,我们在选购UPS时就不必纠结是否支持群晖了,只要有办法检测到断电就行,我们也可以发散下思维,断电能检测自动关机,来电时是否能自动开机呢?
1 条评论
成功的ping,log文件并没有具体ip信息,只有两行2024-12-16 22:10:16: 脚本开始执行
2024-12-16 22:10:25: 脚本执行结束