После обновления до Ubuntu 12.10, заметил, что NUT стал сыпать ошибки в консоль после выхода из спящего режима.
Не уверен как было раньше, но теперь после выхода из спящего режима (да и просто при переподключении кабеля) "usb кабелю" упса стал выдаваться новый файл в /dev.
/dev/bus/usb/008: crw-rw-r-- 1 root root 189, 896 нояб. 25 21:53 001 crw-rw-r-- 1 root nut 189, 897 нояб. 27 01:48 002
выдёргиваем и вставляем кабель заново
/dev/bus/usb/008: crw-rw-r-- 1 root root 189, 896 нояб. 25 21:53 001 crw-rw-r-- 1 root nut 189, 898 нояб. 27 01:48 003
А в конфиге у меня был прописан абсолютный путь. Пичаль.
/etc/nut/ups.conf
[ippon]
driver = blazer_usb
port = /dev/bus/usb/008/002
desc = "Ippon Black Power Pro 400"
Вообще, можно ставить port = auto, но и это мне не помогло - nut детектил и открывал девайс только при старте демона.
Сперва я подумал сделать правило в udev (есть отличная статья - http://hackaday.com/2009/09/18/how-to-write-udev-rules/), которое бы давало бы упсу одно и тоже имя всегда
~# udevadm info -a -p $(udevadm info -q path -n /dev/bus/usb/008/003)
~# cat /etc/udev/rules.d/50-ups.rules
# This file maintains persistent name for UPS.
# See udev(7) for syntax.
SUBSYSTEM=="usb", ATTR{idVendor}=="0665", ATTR{idProduct}=="5161", SYMLINK+="ups2", NAME="ups"
Однако, если если задать в правиле имя устройства, то в syslog можно прочитать пару ругательств в свой адрес о созданном конфликте наименования девайса:
udevd[27845]: kernel-provided name 'bus/usb/008/010' and NAME= 'ups' disagree, please use SYMLINK+= or change the kernel to provide the proper name
Если попробовать
SUBSYSTEM=="usb", ACTION=="add", ATTR{idVendor}=="0665", ATTR{idProduct}=="5161", KERNEL=="bus/usb/008/0*", SYMLINK+="ups2", NAME="ups"
то... ничего интересного не происходит и в логах нет ошибок.
(Кстати, вместо
sudo /etc/init.d/udev restart
можно использовать
sudo udevadm control --reload-rules)
В общем, после различных экспериментов я остановился на такой строчке
SUBSYSTEM=="usb", ATTR{idVendor}=="0665", ATTR{idProduct}=="5161", SYMLINK+="ups"
по факту, кроме красоты (симлинки), ничего не даёт.
Но зато в /etc/nut/ups.conf пишем вместо auto
port = /dev/ups
Так что пришлось решать проблему по другому:
~# cat /etc/pm/sleep.d/20_ups
#!/bin/sh
PATH=/sbin:/usr/sbin:/bin:/usr/bin
case "${1}" in
hibernate)
:
;;
resume|thaw)
service nut restart&
;;
esac
При выходе из сна сервис будет перезапускаться и открывать вновь нами созданную симлинку уже на новый девайс. Хотя опять же можно было не заморачиваться и сделать просто port=auto. Но раз уже сделал правило, чего добру пропадать :-)
Хотя в принципе можно в тех же udev rules через RUN+="service nut restart" обновлять подключение к девайсу, заодно и для переподключения кабеля работать будет.
P.S. вероятно лучше юзать не restart, а reload. Не проверял обновить ли он коннект, но если да, то процесс не будет перезапускаться, что должно быть быстрее.
P.S. вероятно лучше юзать не restart, а reload. Не проверял обновить ли он коннект, но если да, то процесс не будет перезапускаться, что должно быть быстрее.
Комментарии