Подключение ИБП Ippon Back Power Pro 600 к FreeBSD

15th Октябрь 2011 | Метки: , , ,
Опубликовал: Dmitriy [dk] Kalinin

NUT

Есть прекрасный проект по подключению источников питания к *nix системам – NUT (Network UPS Tools) — http://www.networkupstools.org

Позволяет следить и управлять работой ИБП и PDU.

 

В моем случае – это ИБП Ippon Back Power Pro 600. Подключаться будет к системе:

mira# uname -a
FreeBSD mira.s25.tmb.local 8.2-STABLE FreeBSD 8.2-STABLE #37 r226374M: Sat Oct 15 08:57:56 MSD 2011 root@mira.s25.tmb.local:/usr/obj/usr/src/sys/mira amd64

Установка проходит стандартно, из портов:

mira# cd /usr/ports/sysutils/nut
mira# make config

[X] USB     USB support
[ ] SNMP    SNMP support
[ ] NEON    NEON XML/HTTP support
[ ] PDU     Powerman PDU support
[ ] HAL     HAL support
[ ] CGI     Web CGI interface
[ ] BASH    Bash Completion support

mira# make install clean

Из всего арсенала мне нужна только поддержка USB, прочее убрал. На этом все, пакет установлен.

Теперь надо определить, какой драйвер нужен для ИБП. С этим очень просто, разработчики уже обо всем позаботились, переходим по ссылке http://www.networkupstools.org/stable-hcl.html и выбираем свой ИБП. Драйвер оказался blazer_usb (experimental).

Можно приступать к настройке NUT. Лирическое отступление – что из себя представляет NUT? Разделить его можно на несколько частей – upsd, upsmon и upslog.

В свою очередь, upsd состоит из двух частей, собственно запущенные ИБП (а верней драйверы к ИБП) и сетевой демон, который предоставляет доступ к этим драйверам. Драйверы можно посмотреть здесь:

mira# cd /usr/local/libexec/nut/
mira# ls
bcmxcp_usb      blazer_usb      netxml-ups      richcomm_usb    tripplite_usb   upsdrvctl       usbhid-ups

 

Определяем, на каком USB живет бесперебойник:

mira# usbconfig
ugen0.1: <EHCI root HUB Intel> at usbus0, cfg=0 md=HOST spd=HIGH (480Mbps) pwr=SAVE
ugen1.1: <EHCI root HUB Intel> at usbus1, cfg=0 md=HOST spd=HIGH (480Mbps) pwr=SAVE
ugen1.2: <product 0x0024 vendor 0x8087> at usbus1, cfg=0 md=HOST spd=HIGH (480Mbps) pwr=SAVE
ugen0.2: <product 0x0024 vendor 0x8087> at usbus0, cfg=0 md=HOST spd=HIGH (480Mbps) pwr=SAVE
ugen0.3: <USB to Serial Cypress Semiconductor> at usbus0, cfg=0 md=HOST spd=LOW (1.5Mbps) pwr=ON
ugen0.4: <USB2.0 Hub vendor 0x05e3> at usbus0, cfg=0 md=HOST spd=HIGH (480Mbps) pwr=SAVE
ugen0.5: <product 0x0805 vendor 0x046d> at usbus0, cfg=0 md=HOST spd=HIGH (480Mbps) pwr=ON
ugen0.6: <USB 2.0 PC Cam Image Processor> at usbus0, cfg=0 md=HOST spd=HIGH (480Mbps) pwr=ON

Живет на ugen0.3USB to Serial Cypress Semiconductor.

 

Итак, известно где живет бесперебойник и какой драйвер он использует – составляем конфиг /usr/local/etc/nut/ups.conf. В этом файле описываются подключенные к системе ИБП:

mira# cat /usr/local/etc/nut/ups.conf
[ippon]
driver    = blazer_usb
port      = /dev/ugen0.3
desc      = «Ippon Back Power Pro 600»

 

Пробуем стартануть драйвер, сможет ли он увидеть ИБП?

mira# /usr/local/libexec/nut/blazer_usb -a ippon
Network UPS Tools — Megatec/Q1 protocol USB driver 0.03 (2.6.1)
No supported devices found. Please check your device availability with ‘lsusb’
and make sure you have an up-to-date version of NUT. If this does not help,
try running the driver with at least ‘subdriver’, ‘vendorid’ and ‘productid’
options specified. Please refer to the man page for details about these options
(man 8 blazer).

 

Смотрим справку:

mira# /usr/local/libexec/nut/blazer_usb -h
Network UPS Tools — Megatec/Q1 protocol USB driver 0.03 (2.6.1)

usage: blazer_usb -a <id> [OPTIONS]
-a <id>        — autoconfig using ups.conf section <id>
— note: -x after -a overrides ups.conf settings

-V             — print version, then exit
-L             — print parseable list of driver variables
-D             — raise debugging level
-q             — raise log level threshold
-h             — display this help
-k             — force shutdown
-i <int>       — poll interval
-r <dir>       — chroot to <dir>
-u <user>      — switch to <user> (if started as root)
-x <var>=<val> — set driver variable <var> to <val>
— example: -x cable=940-0095B

Вкратце – если запущен от пользователя root, то переключится на пользователя указанного в параметре –u. Если пользователь не указан – то переключится на uucp, у которого нет прав на доступ к устройству /dev/ugen0.0 Улыбка Ну пока мы настраиваем – пробуем проверить драйвер от root:

mira# /usr/local/libexec/nut/blazer_usb -a ippon -u root -D
Network UPS Tools — Megatec/Q1 protocol USB driver 0.03 (2.6.1)
0.000000     debug level is ‘1’
0.393864     Supported UPS detected with megatec protocol
0.777019     Vendor information read 1 failed
0.969022     Vendor information read 2 failed
1.160977     Vendor information read 3 failed
1.161133     Vendor information unavailable
1.161215     Battery runtime will not be calculated (runtimecal not set)
^C   4.164307   Signal 2: exiting

Драйвер успешно нашел ИБП.

 

Создаем пользователя, от которого будут работать драйверы, и прописываем его ups.conf:

mira# pw useradd usbd
mira# cat /usr/local/etc/nut/ups.conf
user = upsd
[ippon]
driver    = blazer_usb
port      = /dev/ugen0.3
desc      = «Ippon Back Power Pro 600»

 

Даем права на чтение/запись для ugen0.3 этому пользователю:

mira# chown upsd /dev/ugen0.3

 

Чтобы права не слетали после перезагрузки, добавляем строчки в /etc/devfs.conf:

# ugen0.3
own             ugen0.3         upsd:wheel
perm            ugen0.3         660

Т.е. при монтировании /dev для устройства будет в качестве владельца выставляться upsd, в качестве группы wheel, права доступа – 660 (владелец – чтение/запись, группа – чтение/запись, прочим – ничего).

Все подготовили, пробуем еще раз запустить драйвер:

mira# /usr/local/libexec/nut/blazer_usb -a ippon -D
Network UPS Tools — Megatec/Q1 protocol USB driver 0.03 (2.6.1)
0.000000     debug level is ‘1’
0.013123     Can’t chdir to /var/db/nut: Permission denied

Как с этим бороться – понятно:

mira# chown upsd /var/db/nut
mira# chmod 750 /var/db/nut

Владелец папки – upsd, права доступа: владелец – полный доступ, группа – только просмотр, прочие – ничего.

 

Пробуем еще раз стартануть драйвер:

mira# /usr/local/libexec/nut/blazer_usb -a ippon -D
Network UPS Tools — Megatec/Q1 protocol USB driver 0.03 (2.6.1)
0.000000     debug level is ‘1’
0.372559     Supported UPS detected with megatec protocol
0.756431     Vendor information read 1 failed
0.948408     Vendor information read 2 failed
1.140545     Vendor information read 3 failed
1.140746     Vendor information unavailable
1.140829     Battery runtime will not be calculated (runtimecal not set)
^C   4.135909   Signal 2: exiting

Все, с драйвером разобрались. Теперь можно переходить к сетевому демону.

Настройка производится путем редактирования двух файлов: upsd.conf и upsd.users.

 

В upsd.conf указываются параметры демона, файл прекрасно документирован, поэтому не вижу смысла описывать параметры. В моем случае он принял такой вид:

mira# cat /usr/local/etc/nut/upsd.conf
LISTEN      127.0.0.1 3493

Принимать подключения на адресе 127.0.01, порт 3493.

 

В upsd.users указываются пользователи, и разрешенные действия. У меня 2 пользователя: root – который может все, и upsmon – который может следить за работой:

mira# cat /usr/local/etc/nut/upsd.users
[root]
password          = set_password
actions           = set
instcmds          = all

[upsmon]
password          = upsmon
upsmon            master

С разрешениями надо быть поосторожней, ибо фактически этим пользователям предоставляется доступ для управления ИБП.

Пробуем запустить демон:

mira# upsd
Network UPS Tools upsd 2.6.1
/usr/local/etc/nut/upsd.conf is world readable
listening on 127.0.0.1 port 3493
Can’t connect to UPS [ippon] (blazer_usb-ippon): No such file or directory
/usr/local/etc/nut/upsd.users is world readable

upsd предлагает изменить права на файлы upsd.conf и upsd.users, и не находит бесперебойник.

 

Проверяем, запустился демон или нет:

mira# ps -axu | grep upsd
uucp       25931  0,0  0,0 11880  2216  ??  Ss   10:58     0:00,03 upsd

Запустился, все тот-же пользователя uucp

Небольшое отступление – после запуска драйвера, он создает канал в /var/db/nut:

mira# ls -l /var/db/nut
total 2
srw-rw—-  1 upsd  uucp  0 15 окт 11:03 blazer_usb-ippon
-rw-r—r—  1 upsd  uucp  6 15 окт 11:03 blazer_usb-ippon.pid

Так вот, демон общается с драйвером через этот канал, т.е. у него должны быть права на чтение/запись. Как видно, на blazer_usb-ippon права rw-rw—-, владелец – upsd, группа – uucp. Следовательно, чтобы демон мог успешно общаться с драйвером, он должен работать либо от пользователя upsd, либо входить в группу uucp.

 

Вернемся к разбору ошибок: Can’t connect to UPS [ippon] (blazer_usb-ippon): No such file or directory. Демон не смог подключиться к драйверу – не найдет файл. Выше описывал, где драйверы создают канал. В моем случае драйвер был просто не запущен Улыбка Запускаю драйвер:

mira# /usr/local/libexec/nut/blazer_usb -a ippon
Network UPS Tools — Megatec/Q1 protocol USB driver 0.03 (2.6.1)
Supported UPS detected with megatec protocol
Vendor information unavailable
Battery runtime will not be calculated (runtimecal not set)
mira# ps -axu|grep blazer_usb
upsd       26973  0,0  0,0  8032  1412  ??  Ss   11:12     0:00,01 /usr/local/libexec/nut/blazer_usb -a ippon
mira# ls /var/db/nut
blazer_usb-ippon        blazer_usb-ippon.pid

 

После того, как исправили права на файлы и запустили драйвер — пробуем еще раз запустить upsd:

mira# killall upsd
mira# upsd –u upsd
Network UPS Tools upsd 2.6.1
listening on 127.0.0.1 port 3493
Connected to UPS [ippon]: blazer_usb-ippon

upsd запускается с параметром “–u upsd” – запуск от указанного пользователя. Демон стартанул успешно, подключился к драйверу, и готов принимать подключения по адресу 127.0.0.1:3493

Чтобы не запускать драйверы и демона руками – существует скрипт /usr/local/etc/rc.d/nut . Для его работы вносим в /etc/rc.conf следующие строки:

# nut
nut_enable=»yes»
nut_flags=»-u upsd»

параметр nut_flags=”-u upsd” говорит, что стартовать upsd надо от пользователя upsd.

 

Останавливаем все, что запустили руками:

mira# killall upsd
mira# killall blazer_usb
mira# ps -axu|grep usb
root          13  0,0  0,0     0   128  ??  DL    9:01     0:04,02 [usb]

 

И пробуем запустить скриптом:

mira# /usr/local/etc/rc.d/nut start
Network UPS Tools — UPS driver controller 2.6.1
Network UPS Tools — Megatec/Q1 protocol USB driver 0.03 (2.6.1)
Supported UPS detected with megatec protocol
Vendor information unavailable
Battery runtime will not be calculated (runtimecal not set)
Starting nut.
Network UPS Tools upsd 2.6.1
listening on 127.0.0.1 port 3493
Connected to UPS [ippon]: blazer_usb-ippon
mira# ps -axu|grep upsd
upsd       27850  0,0  0,0  8032  1412  ??  Ss   11:25     0:00,02 /usr/local/libexec/nut/blazer_usb -a ippon
upsd       27852  0,0  0,0 11880  2220  ??  Ss   11:25     0:00,01 /usr/local/sbin/upsd -u upsd

Все отлично работает.

 

Проверяем ИБП:

mira# upsc ippon@127.0.0.1
battery.voltage: 13.60
battery.voltage.nominal: 12.0
beeper.status: enabled
device.type: ups
driver.name: blazer_usb
driver.parameter.pollinterval: 2
driver.parameter.port: /dev/ugen0.3
driver.version: 2.6.1
driver.version.internal: 0.03
input.current.nominal: 2.0
input.frequency: 49.9
input.frequency.nominal: 50
input.voltage: 225.4
input.voltage.fault: 225.4
input.voltage.nominal: 220
output.voltage: 225.4
ups.delay.shutdown: 30
ups.delay.start: 180
ups.load: 20
ups.productid: 5161
ups.status: OL
ups.temperature: 25.0
ups.type: offline / line interactive
ups.vendorid: 0665

Делаем тоже самое с помощью telnet:

mira# telnet 127.0.0.1 3493
Trying 127.0.0.1…
Connected to localhost.
Escape character is ‘^]’.
username upsmon
OK
password upsmon
OK
login ippon
OK
list var ippon
BEGIN LIST VAR ippon
VAR ippon battery.voltage «13.60»
VAR ippon battery.voltage.nominal «12.0»
VAR ippon beeper.status «enabled»
VAR ippon device.type «ups»
VAR ippon driver.name «blazer_usb»
VAR ippon driver.parameter.pollinterval «2»
VAR ippon driver.parameter.port «/dev/ugen0.3»
VAR ippon driver.version «2.6.1»
VAR ippon driver.version.internal «0.03»
VAR ippon input.current.nominal «2.0»
VAR ippon input.frequency «49.9»
VAR ippon input.frequency.nominal «50»
VAR ippon input.voltage «233.3»
VAR ippon input.voltage.fault «233.3»
VAR ippon input.voltage.nominal «220»
VAR ippon output.voltage «233.3»
VAR ippon ups.delay.shutdown «30»
VAR ippon ups.delay.start «180»
VAR ippon ups.load «21»
VAR ippon ups.productid «5161»
VAR ippon ups.status «OL»
VAR ippon ups.temperature «25.0»
VAR ippon ups.type «offline / line interactive»
VAR ippon ups.vendorid «0665»
END LIST VAR ippon
logout
OK Goodbye
Connection closed by foreign host.

  1. Саян
    9th Ноябрь 2011 в 04:41

    Здравствуйте. я вам уже писал. Немного непонятно. Что за пользователь upsmon появляется после upsd, нужно ли его создавать? А также, возможно причинам того, что его не создавал у меня не создался канал в /var/db/nut/
    # ls -l /var/db/nut/
    total 0

  2. 9th Ноябрь 2011 в 05:42

    Саян :

    Здравствуйте. я вам уже писал. Немного непонятно. Что за пользователь upsmon появляется после upsd, нужно ли его создавать? А также, возможно причинам того, что его не создавал у меня не создался канал в /var/db/nut/
    # ls -l /var/db/nut/
    total 0

    А права на /var/db/nut какие, и под каким пользователем стартуют драйвер для ИБП и upsd?
    Попробуйте позапускать по отдельности драйверы и upsd. Для отладки можно использовать ключи -D(DD)

    upsmon прекрасно может работать и без описанных выше частей. При запуске upsmon делится на 2 части:
    1. Работает от root — при необходимости выключает компьютер
    2. Работает от пользователя, указанного в upsmon.conf (RUN_AS_USER) — эта часть периодически опрашивает upsd на предмет текущего состояния ИБП.

  3. Саян
    9th Ноябрь 2011 в 07:28

    Dmitriy Kalinin :

    А права на /var/db/nut какие, и под каким пользователем стартуют драйвер для ИБП и upsd?
    Попробуйте позапускать по отдельности драйверы и upsd. Для отладки можно использовать ключи -D(DD)
    upsmon прекрасно может работать и без описанных выше частей. При запуске upsmon делится на 2 части:
    1. Работает от root – при необходимости выключает компьютер
    2. Работает от пользователя, указанного в upsmon.conf (RUN_AS_USER) – эта часть периодически опрашивает upsd на предмет текущего состояния ИБП.

    Немного покапавший в нете, вроде всё настроил, теперь все запускается от пользователя uucp:uucp.
    ———————————
    В upsd.users:
    [root]
    password = my_password
    actions = set
    instcmds = all
    [monuser]
    password = monuserpassword
    upsmin master
    ———————————
    Вообще, честно говоря, так и не разобрался откуда какой пользователь берется… С рутом, конечно всё понятно (если он системный), а вот с монъюзером — нет. Нужен ли ему шелл при создании?
    по телнету (скорее всего из-за этого) вот что:
    ———————————
    Trying 127.0.0.1…
    Connected to localhost.
    Escape character is ‘^]’.
    username root
    OK
    password my_password
    OK
    login ippon
    ERR ACCESS-DENIED
    list var ippon
    BEGIN LIST VAR ippon
    VAR ippon battery.voltage «13.50»
    VAR ippon battery.voltage.nominal «12.0»
    VAR ippon beeper.status «enabled»
    VAR ippon device.type «ups»
    VAR ippon driver.name «blazer_usb»
    VAR ippon driver.parameter.pollinterval «2»
    VAR ippon driver.parameter.port «/dev/ugen2.2»
    VAR ippon driver.version «2.6.1»
    VAR ippon driver.version.internal «0.03»
    VAR ippon input.current.nominal «2.0»
    VAR ippon input.frequency «49.9»
    VAR ippon input.frequency.nominal «50»
    VAR ippon input.voltage «219.5»
    VAR ippon input.voltage.fault «219.5»
    VAR ippon input.voltage.nominal «220»
    VAR ippon output.voltage «219.5»
    VAR ippon ups.delay.shutdown «30»
    VAR ippon ups.delay.start «180»
    VAR ippon ups.load «11»
    VAR ippon ups.productid «5161»
    VAR ippon ups.status «OL»
    VAR ippon ups.temperature «25.0»
    VAR ippon ups.type «offline / line interactive»
    VAR ippon ups.vendorid «0665»
    END LIST VAR ippon
    Connection closed by foreign host.
    ———————————

  4. 9th Ноябрь 2011 в 07:43

    @Саян
    uucp — это пользователь по умолчания, с которым собирается nut :)

    Для дрейверов этого пользователя можно сменить, указав в upsd.conf строчку
    user =
    соответственно, драйверы будут запускаться под этим товарищем. необходимо учесть — что у этого товарища должны быть права на доступ к ИБП (/dev/xxx).

    от кого стартовать сам upsd — можно указать в командной строке
    -u
    или указав в rc.conf
    nut_flags=»-u
    »
    Но тут тоже надо учитывать, что при старте дрейверы создают каналы в /var/db/nut, и пользователю, от которого запущен upsd нужны права на чтение/запись этих каналов.

    Шелл этим пользователям не нужен.

    То, что сделал телнет — тоже самое что делает и upsmon :) Он подключается по телнет в upsd и с указанной переодичностью:
    VAR ups.status

    Если в статусе встречается «LB» (Low Battery) то он начинает тушить систему. Впрочем это действие тоже можно настроить.

    Для Windows, кстати, тоже существует Nut. Т.е. если зоопарк серверов — upsmon можно поставить на всех серверах подключенных к ИБП.

  5. Саян
    9th Ноябрь 2011 в 14:52

    Спасибо за разъяснение :) Теперь понял))

  6. Maks
    15th Май 2012 в 11:03

    Доброго времени суток.
    А кто может подсказать как подключить ИБП Smart Ippon к ESXi 5?

Вы должны авторизоваться для отправки комментария.