фокальная регрессия: сбой USB-подключения к APC SmartUPS после перезагрузки
Я управляю примерно девяноста серверами Dell, распределенными по всему миру, которые в настоящее время находятся в процессе обновления с Ubuntu 16.04LTS xenial до Ubuntu 20.04LTS focus. Блок питания каждого сервера защищен ИБП APC SmartUPS, подключенным через USB, и контролируется гайкой для корректного отключения в случае сбоя питания. Это работает довольно хорошо на серверах, на которых все еще работает xenial.
На тех, кто работает с фокусом, часто возникает проблема с USB-подключением к ИБП, которое не появляется после перезагрузки. Конкретно:
При запуске системы ядро не обнаруживает ИБП и вместо этого пишет в /var/log/syslog:
kernel: [ 2.239216] usb usb1-port4: couldn't allocate usb_device
периодически жалуется в syslog:
upsmon[1105]: Poll UPS [ups@localhost] failed - Driver not connected
SmartUPS не отображается в выводе:
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
помогает каждый раз. ИБП обнаружен, о чем свидетельствует сообщение /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 здесь:
Ошибка 214021 — USB-устройства не обнаруживаются во время загрузки.
Таким образом, решением было бы подождать, пока не будет доступно исправленное ядро.
Примечание. Я попытался добавить запись в crontab для запуска последовательности команд сброса шины USB после каждой перезагрузки в качестве временной меры, но это не сработало, потому что
@reboot
происходит слишком поздно в процессе запуска, когда
nut
Драйвер уже запущен, поэтому я отказался от этой идеи.