delphij's Chaos

选择chaos这个词是因为~~实在很难找到一个更合适的词来形容这儿了……

14 Jan 2023

试试看 CyberPower UPS

因为机房家里 之前发生过一些停电的问题,因此这两处我都放了UPS。

UPS使用的铅酸电池是有一定寿命的,机房这台UPS是2016年5月上线的(当时是觉得已经到了5年,应该换掉了; 而当时查看价格发现购买一个UPS电池自己更换的原材料价值和买一个新的差不多,于是就直接整体换成了 APC BE600)。

1月10日,突然收到了来自 apcupsd 的报警说机房这台的电池必须更换了,考虑到这一台已经服役了六年多, 我就查了一下此 UPS 的电池,结果发现 APC 官方已经在去年愚人节停止销售这款产品了。 这次的电池价格比购买一台新同品牌换代产品要便宜接近一半,但与此同时发现 CyberPower 也有一款规格类似且便宜接近一半的产品。之前在 UPS 见过这个牌子的产品, 考虑到现在经济形势不好应该消费降级,于是下了一单 CyberPower SX650G。需要注意的是它的电池比 APC BE 600G 要小一些,并且设计也没有考虑用户自行更换这件事,但由于我的这台机器相当省电, 权衡之下最终我还是选择了这台。

周五休假,收到快递之后就去机房换UPS了。机房并没出现我之前设想的可能出现的电池漏液一类的问题,只是 UPS 在不停地报警(此前 apcupsd 也在每隔半天发一封邮件敦促我赶快换电池)。

CyberPower SX650G 和 APC BE600G 类似,也是使用了 USB Type B 接口,并提供了一根 USB Type B 和 USB Type A 的转接线。由于电池没有设计为用户可以自行更换,因此也不像 APC 那样需要自己连接电池 (我认为对用户来说这个区别不太大),直接插上电源以后启动即可。

根据说明书,该 UPS 需要大约 8 个小时完成充电,但我到家想要拿 nut 去读一下的时候发现电池已经充满了。由于之前很少用 nut,因此可能还得找时间再跑一趟去测试断电的情况。

FreeBSD 上,这个 UPS 会被识别为由 ugen(4) 支持的 USB 未注册设备 (generic device)。插上以后可以看到:

$ sudo usbconfig -u 0 -a 2 dump_device_desc
ugen0.2: <CPS ST Series> at usbus0, cfg=0 md=HOST spd=LOW (1.5Mbps) pwr=ON (50mA)

  bLength = 0x0012 
  bDescriptorType = 0x0001 
  bcdUSB = 0x0110 
  bDeviceClass = 0x0000  <Probed by interface class>
  bDeviceSubClass = 0x0000 
  bDeviceProtocol = 0x0000 
  bMaxPacketSize0 = 0x0008 
  idVendor = 0x0764 
  idProduct = 0x0501 
  bcdDevice = 0x0001 
  iManufacturer = 0x0003  <CPS>
  iProduct = 0x0001  <ST Series>
  iSerialNumber = 0x0000  <no string>
  bNumConfigurations = 0x0001 

此处的 iSerialNumber 一项居然啥也没有(与之不同,APC的每一台设备都有一个自己的序列号), 此外看起来 CyberPower 的 “ST” 系列共享了同一个产品 id (0x0501),果然便宜不是没有便宜的道理。

接下来用 nut-scanner 来扫描 USB 总线上的设备:

$ sudo nut-scanner -U
Scanning USB bus.
[nutdev1]
        driver = "usbhid-ups"
        port = "auto"
        vendorid = "0764"
        productid = "0501"
        product = "ST Series"
        vendor = "CPS"
        bus = "000"

把上面扫描获得的 nutdev1 写入 /usr/local/etc/nut/ups.conf 即可。nutdev1 可以改成任何名字。

需要注意的是, nut-scanner 是以当前用户(上面的例子中是 sudo 得到的 root)的身份运行的, 而正常情况下 nut 是以 uucp 的身份运行的(我提了一个 PR), 但默认情况下所有的设备都只能由 root 进行操作。为此,nut 的 package 会安装一个 /usr/local/etc/devd/nut-usb.conf,其中包含了针对上述 Vendor ID 和 Product ID 的识别。

如果不幸在启动之后才安装了 nut,则 devd 不会根据这些配置进行正确的权限配置,如果不愿意重启的话, 可以拔插一次,或用 devctl detach 掉对应的 uhub 设备,然后再用 usbconfig 把对应的 USB 总线重置一下来强制产生一个 ATTACH 事件,或是手工用 chown 把设备的 group 改为 uucp,否则 nut 服务会无法访问该设备。

upscmd <upsname>@localhost test.battery.start.quick 可以让 UPS 进行一次快速自测。 除此之外,此 UPS 也可以做深度自测(相当于切断电源,耗到 low battery 为止), 由于机器不在身边因此我只是测试了一下耗到 75% 需要的时间,而没有完成这个测试。 从测试数据来看,该 UPS 的容量可以坚持10-15分钟,不过关于断电通知的问题看来只能哪天再跑一趟测试了。