вторник, 27 ноября 2012 г.

Заставляем работать Network UPS Tools (NUT) после выхода из спящего режима


После обновления до 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. Не проверял обновить ли он коннект, но если да, то процесс не будет перезапускаться, что должно быть быстрее.

Комментариев нет:

Избранное сообщение

Запуск "Петька и Василий Иванович спасают галактику" в Linux через wine

Совсем недавно, почему-то вспомнил про серию "Петька и Василий Иванович". К своему удивлению, обнаружил, что первую и вторую част...