试试看 CyberPower UPS

• 本文约 1365 字,阅读大致需要 3 分钟 | Hardware | #APC | #CyberPower | #nut | #UPS | #Hardware | #FreeBSD | #System Administration | #硬件 | #系统管理

因为机房家里 之前发生过一些停电的问题,因此这两处我都放了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)。插上以后可以看到:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
$ 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总线上的设备:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
$ 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分钟,不过关于断电通知的问题看来只能哪天再跑一趟测试了。