焦点回归:重启后 USB 连接至 APC SmartUPS 失败

焦点回归:重启后 USB 连接至 APC SmartUPS 失败

我管理着分布在全球的大约 90 台戴尔服务器,目前正在从 Ubuntu 16.04LTS xenial 升级到 Ubuntu 20.04LTS focal。每台服务器的电源都由通过 USB 连接的 APC SmartUPS 保护,并由 nut 监控,以便在断电时干净地关闭。这在仍在运行 xenial 的服务器上效果很好。

对于那些运行 focus 的设备,经常会出现一个问题,即重启后无法通过 USB 连接 UPS。具体来说:

  • 在系统启动期间,内核未检测到 UPS,而是在 /var/log/syslog 中发出抱怨:

    kernel: [    2.239216] usb usb1-port4: couldn't allocate usb_device
    
  • upsmon定期在系统日志中抱怨:

    upsmon[1105]: Poll UPS [ups@localhost] failed - Driver not connected
    
  • SmartUPS 没有出现在输出中lsusb

    a-schmidt@somewhere:~$ lsusb
    Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
    Bus 001 Device 004: ID 1604:10c0 Tascam
    Bus 001 Device 003: ID 1604:10c0 Tascam
    Bus 001 Device 002: ID 1604:10c0 Tascam
    Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
    
  • 手动运行sudo upsdrvctl start报找不到设备:

    a-schmidt@somewhere:~$ sudo upsdrvctl start
    Network UPS Tools - UPS driver controller 2.7.4
    Network UPS Tools - Generic HID driver 0.41 (2.7.4)
    USB communication driver 0.33
    No matching HID UPS found
    Driver failed to start (exit status=1)
    

通过命令序列执行 USB 总线重置:

echo '0000:00:14.0' | sudo tee /sys/bus/pci/drivers/xhci_hcd/unbind
echo '0000:00:14.0' | sudo tee /sys/bus/pci/drivers/xhci_hcd/bind

每次都有帮助。UPS 被检测到,正如 /var/log/syslog 消息所证实的那样:

kernel: [20025.662161] usb 1-4: new full-speed USB device number 2 using xhci_hcd
kernel: [20025.838902] usb 1-4: New USB device found, idVendor=051d, idProduct=0003, bcdDevice= 0.01
kernel: [20025.838907] usb 1-4: New USB device strings: Mfr=1, Product=2, SerialNumber=3
kernel: [20025.838910] usb 1-4: Product: Smart-UPS_1500 FW:UPS 04.1 / ID=1018
kernel: [20025.838913] usb 1-4: Manufacturer: American Power Conversion

它出现在 中lsusb,并upsdrvctl start连接成功:

a-schmidt@somewhere:~$ lsusb
Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 001 Device 002: ID 051d:0002 American Power Conversion Uninterruptible Power Supply
Bus 001 Device 005: ID 1604:10c0 Tascam
Bus 001 Device 004: ID 1604:10c0 Tascam
Bus 001 Device 003: ID 1604:10c0 Tascam
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
a-schmidt@somewhere:~$ sudo upsdrvctl start
Network UPS Tools - UPS driver controller 2.7.4
Network UPS Tools - Generic HID driver 0.41 (2.7.4)
USB communication driver 0.33
Using subdriver: APC HID 0.96

upsmon停止抱怨,一切又恢复正常。

造成这种现象的原因是什么?我该如何解决?

答案1

这似乎是由已向 Launchpad 报告的内核错误引起的:

[回归] 启动时未检测到 USB 设备

以及 kernel.org Bugzilla 此处:

Bug 214021 - 启动时无法检测到 USB 设备

因此解决方案是等到固定内核可用。

注意:我尝试添加一个@rebootcrontab 条目,以便在每次重启后运行 USB 总线重置命令序列作为权宜之计,但这没有奏效,因为@reboot在启动过程中发生得太晚了,nut驱动程序已经在运行,所以我放弃了这个想法。

相关内容