飞牛 NAS 用便宜 UPS 实现停电自动关机,实测可用
为什么要搞这个方案
家用 NAS 最怕突然断电:轻则丢缓存,重则伤硬盘。正规做法是配一台带通讯口的 UPS,停电时 UPS 通知 NAS,NAS 再执行关机。但带通讯的 UPS 一般要贵一百多,很多人只想要「停电时别突然断电」这一个功能。
于是有了折中方案:买不带通讯口的便宜 UPS + 在飞牛 NAS 上跑一个自研应用。思路很简单:
停电时,市电没了,但 NAS 接在 UPS 上还能撑几分钟。
同一时间,光猫、路由器多半没接 UPS,会立刻断电,网络就断了。
应用在 NAS 上定期 Ping 外网或网关,一旦发现连续 Ping 不通,就认为「很可能是停电了」,然后通知系统正常关机,并把这次事件记下来,等来电开机后还能查。
这样用「网络断开」间接判断停电,省了 UPS 通讯线的钱,逻辑也说得通。
核心需求(应用要做到什么)
可以归纳成四条:
发现停电:通过 Ping 失败判断「疑似停电」,而不是等 NAS 自己没电。
正常关机:触发的是系统关机流程,不是直接掉电,保护硬盘。
记录可查:每次关机原因、时间要记下来,恢复供电后能翻记录。
重要记录不丢:停电、关机这类关键信息要持久化到磁盘,不能被日常的「一切正常」流水冲掉或挤没。
前两条决定「能不能用」,后两条决定「事后能不能复盘」。
1.1.4 能跑,但有个浪费问题
早期版本(例如 1.1.4)已经能实现:Ping 失败若干次后触发关机,并把状态写进文件。但实现方式是每 10 秒往磁盘写一次当前状态。
问题在于:绝大多数时间并没有停电,写进去的几乎都是「Ping 成功 / SUCCESS」。这些记录对排查没帮助,却带来:
频繁的磁盘写入,对 SSD/硬盘寿命和 I/O 都不友好;
日志文件被大量无意义的「成功」占满,真正有用的异常和关机记录反而不好找。
所以下一版要解决的是:平时少写盘甚至不写盘,只在「有事」的时候才写。
1.1.9 的改进:按需写盘
到 1.1.9 把「什么时候写内存、什么时候写盘」分清楚了。
平时:成功记录只放内存
在没有任何「异常事件」之前,所有 Ping 成功的记录只存在应用的内存里,不写文件。
Web 管理界面通过 API 直接读这份内存里的列表,所以列表展示很快,也不产生磁盘 I/O。
这样日常运行就是:定时 Ping,成功就只更新内存,界面从内存取数,磁盘不动。
只有这四种情况才写盘

总结:普通的 Ping 成功只留在内存;只有异常、关机、清理、启停才动磁盘。 这样既保证了关键信息不丢,又避免了无意义的频繁写盘。
记录怎么展示
最近一次下发关机命令会在列表里置顶显示,方便一眼看到「上次是怎么关的」。
逻辑是:连续多次(例如三次)Ping 失败后下发关机;而从第一次 Ping 失败开始就已经往磁盘写记录了,所以即使关机前再断一次电,至少「发生过失败」这件事已经落盘。
来电、系统和服务重新启动之后,从磁盘读出来的就是完整的一条线:失败 → 再失败 → 触发关机,时间线清晰。
一次真实停电的验证
有一次遇到真实停电,当时 UPS 还没到,NAS 和光猫一起断电,相当于一次「被动测试」:
上午 10:27 有一次手动断网测试,产生的记录已经写进磁盘,所以还在。
10:29 监控服务重新启动,按设计会写一条「监控已启动」到磁盘,所以也留下了。
在这之后、断电之前,那些只存在内存里的 Ping 成功记录,因为没机会写盘,随着断电一起丢了。
下午 17:16 恢复供电、NAS 开机,监控再次启动,又触发了一次写盘。
这说明:该写盘的时候(失败、关机、启停)确实会写;平时只在内存里的设计也按预期工作。 当然,如果是「突然断电」且当时内存里还有未写盘的重要状态,理论上会丢,这属于已知限制,后续可以从策略上再优化(例如对「失败」更敏感,或缩短某类状态的写盘间隔等)。
小结
用飞牛 NAS + 便宜无通讯 UPS,配合一个「Ping 检测 + 断网判定停电 + 触发关机 + 记录落盘」的自研应用,可以实现停电自动关机,实测逻辑成立、能正常关机并留下可查记录。
顺便说一句:外网访问
飞牛 NAS 和便宜 UPS 一样,很多人也是图省钱、图省事。如果你还想在单位或出门时访问家里的这台 NAS(看文件、备份照片之类),又不想折腾公网 IP 或买内网穿透年费,可以试试 星空组网:免费版支持约 20 台设备,P2P 直连不限速,移动宽带也能用,和本文「用便宜 UPS 搞定停电关机」算同一类思路——少花钱把事办了。客户端和应用市场搜「星空组网」即可,官网可自行搜索。
作者声明本文无利益相关,欢迎值友理性交流,和谐讨论~

yiniot
校验提示文案
yiniot
校验提示文案