找回密码
 加入我们
搜索
      
查看: 10933|回复: 11

[NAS] 自组2.5g NAS系统组建第六篇(完结):联动UPS篇

[复制链接]
发表于 2023-3-23 14:04 | 显示全部楼层 |阅读模式
本帖最后由 lk_yeah 于 2024-7-24 10:35 编辑

最后一贴了!按计划我会在这一贴中介绍下NAS如何配置联动UPS实现断电安全关机。

我们平时使用NAS,最担心数据损坏丢失。造成数据丢失的原因,又可能是软硬两方面。软的方面比如误操作、系统损坏、病毒破坏等。硬的方面,对于机械硬盘来说就是震动和意外断电。如果你能避免这两大禁忌的发生,那么你的机械硬盘的寿命就可以大大延长,虽然不能说高枕无忧,也能用着比较安心了。而固态盘虽然不怕震动,但意外断电也是有可能造成数据损坏的。震动方面,我们需要靠给机械硬盘提供一个安全的使用环境,平时不去主动去挪动使用中的硬盘等措施来减少和避免。意外断电这条,就需要靠UPS了。
家用UPS也不需要很贵的。我买的是山特TG-BOX 850,京东到手价400+。其他还有APC等品牌的同档次的产品可以选。这些都是后备式的UPS,可以满足家用NAS的需求。这些UPS通常会带一根USB信号线,用来连接NAS。而成品NAS可以自动识别这跟USB信号线,并根据相应的信号做出关机动作。所以成品NAS,群晖威联通啥的,联动UPS都是傻瓜式的,接上线就能用,最多点几下鼠标设置下就好了。
自组NAS不能像成品那样傻瓜式使用,需要用到一款软件——Network UPS Tool,简称NUT。其实群晖威联通之所以能实现联动UPS也正是因为内置了NUT,厂商将NUT的配置页面整合进了他们的系统里。
NUT是一款开源免费软件,支持多种操作系统,包括Windows、Linux、VMware等,甚至树莓派都可以安装。从名称就可以看出来,它首先是一个UPS工具,做到联动UPS操作主机,然后它支持网络,可以主从模式,通过网络操作同样接入UPS供电但没有连接UPS信号的主机,因为UPS可能只有一根信号线,无法同时连接多台主机,但供电口可以有多个。
网上能找到一些NUT的配置教程贴,但我参考过程中发现有些细节和原理讲的都不是很明白,于是我只好自己去啃NUT的用户手册了。NUT的主页:https://networkupstools.org,全TM是英文鸟语,我也没找到中文版的用户手册,鸟语水平不咋地,所以最后也搞的迷迷糊糊的,不过总算是配置成功了。
首先说下实现方案。网上的教程多数都是将UPS的USB信号给黑群,由黑群作主,虚拟化底层的宿主机作从。我一开始也是这么搞的,这个方案配置起来比较简单,因为群晖作为NUT的主机就简单点几下鼠标,宿主机PVE配置从机也很简单,但是随后发现这个方案存在几个问题。一个是在我的自组NAS上直通了多口网卡,虚拟机和宿主机的物理网口不同,它们之间通信需要靠交换机,这就需要将交换机也接到UPS供电口,不然停电后网络就没有了。再就是作主的黑群是虚拟机,必然要比宿主机启动晚,宿主从机启动时检测不到主机会导致报错,解决方法是手动重启一下宿主的监控进程,或者写个延时启动脚本。后来我尝试直接在宿主机PVE上配置NUT主机,直接联动UPS,而PVE就可以关闭所有虚拟机了,不需要牵扯黑群了。

配置NUT主机稍微麻烦些。下面我就给出详细步骤和简要原理。

1、【最重要】将NAS的电源接到UPS的不间断供电口!有些UPS还有防雷供电口,它们是不经过电池的,不能停电后续航。如果是多台NAS,从机也要接UPS供电口。UPS的USB信号线接到主NAS上。另外,主机和从机还需要考虑停电时候要有网络能通信,这个要根据自己的网络线路情况自行规划。

2、确认UPS信号连接正常。
PVE命令行运行:
  1. lsusb
复制代码
01.png
返回的信息中应该有UPS设备。

3、安装NUT。
  1. apt install -y nut
复制代码

Debian系的nut包包括了nut-server和nut-client两个包,所以直接装nut包即可,不必按网上某些教程说的都写到命令里。

4、查看UPS设备硬件信息
  1. nut-scanner -U
复制代码
02.png
这段返回信息待会要用。

5、/etc/nut/ups.conf
配置NUT,实际上就是对几个配置文件进行修改。
NUT的配置文件都自带比较详细的注释,不过都是英文鸟语。。。
ups.conf中配置的是UPS硬件信息,会影响驱动的加载。从机不需要配置。
  1. [qnapups]
  2.     driver = "usbhid-ups"
  3.     port = "auto"
  4.     vendorid = "0463"
  5.     productid = "FFFF"
  6.     product = "SANTAK TG-BOX"
  7.     serial = "Blank"
  8.     vendor = "EATON"
  9.     ignorelb
  10.     override.battery.charge.low = 40
  11.     override.battery.runtime.low = -1
复制代码
这段就是刚才扫描到的UPS硬件信息,直接复制进去就可以。这里面,driver和port是必需的。因为port = "auto"了所以bus = "001"不需要了。
段首标签的含义:UPS标识。NUT的主从通信信息,有三个关键词——UPS标识、NUT用户名、密码,这三个关键词都匹配了才能联动。群晖和威联通虽然都内置了NUT,但它们的三个关键词都不一样,所以它们默认是不能联动的,如果你同时拥有群晖和威联通,可以接同一个UPS,但想要它们一起联动,就需要修改某一方的配置文件跟另一方一致起来才行,当然正规界面是不会有的,要SSH进去。
群晖:UPS标识:ups、用户名:monuser、密码:secret
威联通:UPS标识:qnapups、用户名:admin、密码:123456
我还有个成品威联通,我需要自组跟它联动,所以这里就配置成威联通的UPS标识了。
后三行,ignorelb表示忽略UPS传来的低电量状态值,或者说重新定义低电量状态值,需要配合后面两句一起使用。默认的低电量值为20,我设置成倒数第二行的40,最后一行是电池估算运行剩余时间,这个不怎么准的,设置成-1表示不启用这一项。这三行可以根据自己的情况来设置,也可以不设置。
配置好后,命令行运行:
  1. upsdrvctl start
复制代码
运行后不应有报错,否则就是信号线连接有问题或者驱动没有配置对。

6、/etc/nut/nut.conf
  1. MODE=netserver
复制代码
这个文件很简单,就是决定主从模式的。从机需要设置成netclient,还有个单机模式standalone,没有从机,其他跟主模式一样。


7、/etc/nut/upsd.conf
  1. LISTEN 0.0.0.0 3493
复制代码
这个文件配置监听地址和端口。NUT默认主从通信端口是3493。至于地址为啥是0.0.0.0,其实NUT用户手册推荐的是127.0.0.1的,不过网上的教程贴都是写的0.0.0.0,我也更喜欢配0.0.0.0,因为127.0.0.1是回环地址,0.0.0.0是本机地址。这里两个都是可以的。

8、/etc/nut/upsd.users
  1. [admin]
  2.   password = 123456
  3.   upsmon master
复制代码
这个文件就是配置用户名密码的了。admin和123456分别是威联通的用户名密码。第三行的master表示该机器作为NUT网络中的主机,要最后关机。从机不需要设置该文件。


9、启动NUT主进程
NUT有三层进程,分别是驱动层upsdrvctl、主进程upsd、监控进程upsmon+upssched。NUT主机要分别启动这三个层,在PVE中,它们位于/usr/sbin/。从机不需要启动和配置驱动层和uspd。以上三个配置文件都是uspd用到的。
命令行运行:
  1. systemctl restart nut-server    //重启主进程服务
  2. systemctl status nut-server    //查看主进程服务状态
复制代码
微信截图_20240723205044.png
NUT安装好后,主进程服务nut-server.service就已经是enabled状态了,也就是开机自启状态,不过配置文件内容不正确,运行状态是dead,以上配置文件都设置好后,正常情况下该服务的运行状态应该是active (running),否则就要检查一下了。
主服务启动正常后,运行下面命令可以查看UPS详细状态。
  1. upsc qnapups@localhost
复制代码
qnapups是UPS标识,@后面是主机名称或地址。
微信截图_20240723204953.png
注意看前几行:battery.charge是当前电池电量,;battery.charge.low表示低电量值,低于这个值就是低电量状态,默认是20,我通过/etc/nut/ups.conf把它修改成了40;battery.runtime表示电池预估可用时间(秒),我把它禁用了;battery.type表示电池种类铅酸;其他的不多说了,用户手册可查。。。

10、威联通从机联动
04.png
我还有台成品威联通,进入它的管理页面,开启UPS功能,设置好后,下方就能看到UPS的信息了,威联通也可以联动关机了。

11、/etc/nut/upsmon.conf
upsmon是NUT的监控程序。upsmon.conf是upsmon的配置文件。
  1. RUN_AS_USER root
  2. MONITOR qnapups@127.0.0.1 1 admin 123456 master
  3. SHUTDOWNCMD "/sbin/shutdown -h +0"
  4. NOTIFYMSG ONLINE    "UPS %s on line power"
  5. NOTIFYMSG ONBATT    "UPS %s on battery"
  6. NOTIFYMSG LOWBATT    "UPS %s battery is low"
  7. NOTIFYMSG FSD        "UPS %s: forced shutdown in progress"
  8. NOTIFYFLAG ONLINE       SYSLOG+WALL+EXEC
  9. NOTIFYFLAG ONBATT       SYSLOG+WALL+EXEC
  10. NOTIFYFLAG LOWBATT      SYSLOG+WALL+EXEC
复制代码
upsmon是NUT的监控程序。upsmon.conf是upsmon的配置文件。
第一行不用说了。
第二行,MONITOR后面分别是:UPS标识、NUT主机地址、1表示UPS数量、NUT用户名、密码、master/slave(master表示最后执行动作,slave表示断电立即执行动作)。主机地址后面还有端口号的,默认的3493可以省略。从机只需要配置这一行,最后一个词用slave。
第三行,SHUTDOWNCMD,用于定义当UPS监测到严重事件(如电池电量极低或电源完全丢失)且需要立即关闭系统时,应该执行的关机命令。经过测试,这一条的优先级比下面的NOTIFYCMD低,可以看作是最后的保障,默认执行的命令是/sbin/shutdown -h +0,保持这条就可以了。
第四行,NOTIFYCMD,用于指定一个脚本或程序的路径,该脚本或程序在UPS状态发生变化时(如从在线状态变为电池供电状态,或电池电量达到某个阈值)被调用。这个脚本或程序可以执行各种操作,比如记录日志、关闭虚拟机等。NOTIFYCMD的触发条件比SHUTDOWNCMD更广泛,它可以在UPS的多种状态变化时被调用,这些状态变化可能并不需要关闭系统,比如电池电量低到某个程度就关闭某个虚拟机之类的。这里通常指定为upssched,它是upsmon的辅助程序,详情下面再说。
NOTIFYMSG表示事件消息,当发生事件时,upsmon会发出相应文本信息。ONLINE是正常市电状态,ONBATT是市电断电电池供电状态,LOWBATT是电池供电且电量低状态,FSD是“forced shutdown in progress”强制关机状态,%s代表UPS标识+地址,还有些其他的状态,不多说了,用户手册可查。
NOTIFYFLAG表示当事件发生时,upsmon做出相应的处理,后面SYSLOG表示写入syslog日志,WALL不是指的墙,是发送消息给系统上所有用户,EXEC表示会执行第四行的NOTIFYCMD。


12、/etc/nut/upssched.conf
  1. CMDSCRIPT /etc/nut/upssched-cmd
  2. PIPEFN /etc/nut/upssched.pipe
  3. LOCKFN /etc/nut/upssched.lock
  4. AT ONBATT * START-TIMER power-off 10
  5. AT ONLINE * CANCEL-TIMER power-off
复制代码
upssched是upsmon的辅助程序,当upsmon.conf相应位置有EXEC关键词时,upsmon会调用upssched,去执行另一个脚本文件upssched-cmd。
CMDSCRIPT规定upssched-cmd脚本的路径和文件名,文件名可以自定。PIPEFN是计时器文件,LOCKFN是临时文件,这两个文件要放在一个文件夹。AT命令是事件执行的动作,AT后面是状态词,START-TIMER/CANCEL-TIMER分别是开始和终止计时器,power-off是upssched-cmd中定义的动作,10表示延时10秒执行动作。AT ONBATT * START-TIMER power-off 10这句表示当断电电池供电开始后10秒,执行power-off动作。AT ONLINE * CANCEL-TIMER power-off这句表示断电后计时器未完成的这段时间内如果市电恢复则停止计时器不再执行power-off动作。


13、upssched-cmd
  1. #!/bin/sh
  2. case $1 in
  3.     power-off)
  4.     logger -t upssched-cmd "UPS running on battery"
  5.     /usr/sbin/upsmon -c fsd
  6.     ;;
  7.     *)
  8.     logger -t upssched "Unrecognized command: $1"
  9.     ;;
  10. esac
复制代码

upssched-cmd.sh是个shell脚本文件,需要自行创建,用case语句处理。power-off是事件定义,名称可以自定,要跟upssched.conf对应。/usr/sbin/upsmon -c fsd是关机命令,可以关闭本机,并通知UPS关机。这个文件可以定义各种事件执行的动作,除了关机,还可以用PVE的qm命令操作虚拟机开关机之类的。我这里只是简单地写了个关机的动作,因为我已经测试好我的PVE能够做到关机前正常关闭所有虚拟机。另外,上面我自定义低电量值也没用上,各位如果有兴趣,可以写个这样的脚本:电池电量低到某个数值,关闭某些虚拟机,电量达到低电量值时才关闭PVE主机。
以上文件配置好后,别忘了设置下权限,主要是upssched-cmd,其他几个conf文件的属主和属组应该是root:nut。
  1. chown root:nut /etc/nut/upssched-cmd
  2. chmod 750 /etc/nut/upssched-cmd
复制代码
启动upsmon。
  1. systemctl restart nut-monitor
  2. systemctl status nut-monitor
复制代码

至此,NUT配置完成。

14、测试
正常情况应该可以通过测试,断开UPS的市电,PVE会在计时器完成后顺利关机。我的自组NAS已经通过测试了。
微信截图_20240723212901.png
这是测试期间的系统日志,可以看到,45分45秒断掉UPS的市电,NOTIFYMSG ONBATT    "UPS %s on battery"语句正确显示了信息,10秒之后,/etc/nut/upssched-cmd中的power-off语句开始执行了,显示了信息,然后开始关机。




 楼主| 发表于 2023-3-23 14:04 | 显示全部楼层
 楼主| 发表于 2023-3-23 14:04 | 显示全部楼层
本帖最后由 lk_yeah 于 2023-3-23 14:09 编辑

最后写段结语吧。

我这套关于自组NAS的帖子,算上装机贴,写了7个帖子了。为什么写这些帖子?这套帖子算是我最近这段时间折腾自组NAS的一个总结。我在21年就开始用PVE+黑群的自组NAS了,当时用了一套7700+B250I的旧电脑,机箱没找到很合适的,中途换过好几次,硬盘最多也只接了3块,不过一直很稳定。后来换了个威联通成品,还配了UPS,可用了不长时间我就烦了,虽然即插即用不用折腾系统,但性能太烂了,开个虚拟机卡得经常自动重启。后来看到了御夫座机箱,加上我把家里的网络弄到了2.5g,于是燃起了重新搞一套能够满足我需求的自组NAS的欲望。从去年国庆节一直到今年春节,我不断尝试了各种系统和方案。在折腾的过程中我发现,网上的很多技术贴,不可否认有一些大神的高质量帖子,但太少了,很多知识点,虽然一搜一大堆,但同质化挺严重的,其实原作者就那么一两个,大把帖子都是爬来的,经过我的实践,存在很多问题。再就是很多帖子一上来就教步骤,不讲原理,很多专业名词和英文缩写搞得我晕头转向的,想弄明白其中的原理,又要花费更多的时间。于是我做了很多笔记,并且尽可能搞明白各种步骤的原理,根据我自己的环境和需求来调整和优化方案。虽然还有相当多的问题,但我自己也提高了很多。这段时间折腾下来,我还是挺有成就感的。

我在帖子里,整合了很多我在实践中遇到的问题,也尽可能对各个知识点做了简单的讲解,需要用到的工具和材料,我也基本上都给到了官方下载地址,因为我希望拉低自组NAS的门槛。2023年了,我觉得每个家庭都应该拥有自己的NAS,一方面电脑主机存在将机械硬盘赶出机箱的趋势,另一方面我们家里的各种设备越来越多,台式机、笔记本、手机、电视,等等。将家人的照片之类的私人数据,以及高清剧集存放在一个可靠的,并且能够方便随时读取的地方非常有必要。很多人会把数据放到网盘,这点我是很不赞成的,一个是别人的地盘始终不能由我们自己做主,数据被和谐的情况我不多说了,再就是隐私问题,国内厂商的那点小节操,我是无论如何都不愿信任的。成品NAS简单方便,除了传统的群晖威联通,现在还出现了极空间、绿联这种靠SVDN技术的NAS,虽然大多数咱坛子里的人不太能看上眼,但它们确实将使用难度降得极低了。自组NAS也是很方便的,用旧的电脑就可以搞,成本可以很低,而硬盘,我想很多人也用不着很大的容量,一两块4TB就可以了。非常希望我的帖子能够帮到大家,也诚心请各位大神批评指正,我也是个小白,帖子里的内容肯定有不少错误和不足。



发表于 2023-3-23 16:21 | 显示全部楼层
感谢楼主的教程,有原理又有步骤,受益匪浅。

去年我也是搞PVE上的UPS,看了很多教程,还是似懂非懂,最后大致可以运行了,但是没有楼主这么细致的总结。

后来改成unraid后,发现装个NUT插件设置一下就可以了,就一直用unraid了。
发表于 2023-3-23 17:44 | 显示全部楼层
对我来说学起来有些门槛,费时费神,好学的可以研习一下,我选择花钱解决问题,比较高效

评分

参与人数 1邪恶指数 +5 收起 理由
summerq + 5 同道中人

查看全部评分

发表于 2023-3-23 23:13 | 显示全部楼层
楼主的教程太详细了,我感觉能看懂了呢!先标记下,等有机会试试。感谢楼主!
发表于 2023-3-23 23:53 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
发表于 2023-3-24 00:14 | 显示全部楼层
教程不错,兄弟。
发表于 2023-3-24 05:59 | 显示全部楼层
我也用的山特850,不过nas用的win10系统,插上就成电源用了,电源管理设置关机电量就行
发表于 2023-3-24 10:04 | 显示全部楼层
这个真的要学习一下。
发表于 2023-3-24 11:00 | 显示全部楼层
如果是esxi主机与UPS相连接的话,有脚本能实现虚拟化平台检测到断电而进行自动安全关机
发表于 2023-3-24 11:52 | 显示全部楼层
佩服LZ折腾的精神~~

自组四盘黑群晖(非All in one),然后买了一个APC UPS回来,接了黑裙,自动识别,按一下鼠标就完成设置~
您需要登录后才可以回帖 登录 | 加入我们

本版积分规则

Archiver|手机版|小黑屋|Chiphell ( 沪ICP备12027953号-5 )沪公网备310112100042806 上海市互联网违法与不良信息举报中心

GMT+8, 2024-11-28 03:52 , Processed in 0.013258 second(s), 7 queries , Gzip On, Redis On.

Powered by Discuz! X3.5 Licensed

© 2007-2024 Chiphell.com All rights reserved.

快速回复 返回顶部 返回列表