Настраиваем PowerCom BNT 800AP под FreeBSD 9.1

Любой сервер должен иметь источник бесперебойного питания, раньше я уже настраивал данное оборудования. Тогда были проблемы что в портах не обновлялся Network UPS Tools (NUT). Ну что же посмотрим как сейчас, приступим.

Для того что бы когда электроэнергия выключится, ИБП должен сообщить операционной системе что нужно будет выключить раньше чем разрядиться аккумуляторная батарея.
К тому же ИБП серии Black Knight имеют так называем Green Mode. При работе от аккумулятора с нагрузкой меньше 15 ватт, ИБП через 5 минут выключается.
В EFI (BIOS) выставим настройки что при появление питания включаться самостоятельно.
И так, для работы с ИБП нам понадобиться Network UPS Tools (NUT)
Переходим в порт nut, обновив предварительно дерево портов.
cd /usr/ports/sysutils/nut
Далее установим с нужными нам параметрами make install clean

Так как у меня ИБП с интерфейсом USB и различные отчеты и интерфейсы не нужны, то выбираю только USB support. Дожидаемся окончания установки, возможно будет установлено сопутствующие программное обеспечение.

Файлы конфигурации лежат по пути /usr/local/etc/nut
Подключаем ИБП к USB и смотрим как определилось командой usbconfig
root@localhost:/usr/local/etc/nut # 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
ugen0.2: <product 0x0024 vendor 0x8087> at usbus0, 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.3: <UPS  BNT-AP FW5.A6 0A6 POWERCOM Co.,LTD> at usbus0, cfg=0 md=HOST spd=LOW (1.5Mbps) pwr=ON


В строчке параметр 0A6 говорит что product 0x00a6. В файле /usr/local/etc/nut/driver.list находим наш ИБП и драйвер который нужно использовать.
"Powercom"      "ups"   "5"     "Black Knight PRO"      "USB (2009 models, product id: 00a6)"   "usbhid-ups (experimental)"

Нам нужен драйвер usbhid-ups, его и будем использовать.

Начинаем настраивать NUT для работы с ИБП.
В файл /usr/local/etc/nut/ups.conf мы заносим информации о нашем ИБП и правах запуска
user = root
[powercom]
driver = usbhid-ups
port = auto
offdelay = 60
pollonly

Опция offdelay указывается в секундах, это ожидания выключение ИБП командой upsdrvctl shutdown. Команда отправятся на сам ИБР и он отсчитывает 60 секунд и выключается. Команда должна выполнять после завершения работы операционной системы.
Запускаю от root что бы не было проблем с доступом к usb устройствам, да и root управлять питание самое то.
Pollonly ставить если при ответах ИБП разбивает сообщения, у меня получилось что без этой опции постоянно показывал что работает то от сети, то от аккумулятора.

Файл /usr/local/etc/nut/upsd.conf отвечает за настройку основного демона.
В основном там устанавливает время ожидание ответа драйвера, разоренные IP для подключения (по умолчанию localhost на порту 3493), количество подключений.
Я оставлю все как есть, так как по сети использовать не буду. В sample файле все подробно расписано.

Файл /usr/local/etc/nut/upsd.users отвечает за доступ к демона.
[powercom]
password = notanony
upsmon master

Пароль используется только внутри конфигурационных файлов, upsmon запускает демон в режиме master. В большинстве случаев он работает в мастер режиме.

Файл /usr/local/etc/nut/upsmon.conf отвечает за мониторинг работы ИБП.
# Network UPS Tools: upsmon configuration

# Указывает параметры подключения, то что указывали в файле upsd.users
# powercom это те секции которые указывали в других файлах, localhost адрес на которые происходит подключение.
# Цифра 1 указывает значение мощности, оставляет также. Пароль которые был указан раньше и master (режим работы).
MONITOR powercom@localhost 1 powercom notanony master

# Указывает количество ИБП которые поддерживают работу компьютера. В большинстве случаев один, у нас так же.
MINSUPPLIES 1

# Какую команду выполнять для отключения. То что по умолчанию "shutdown -h +0" не выключает, а просто показывает что нажмите любую клавишу для перезагрузки. Просто останавливает систему. Будет использовать параметр -p.
SHUTDOWNCMD "/sbin/shutdown -p now"

# Выполнять команду после события NOTIFYFLAG с флагом EXEC. Указывает выполнения запуск событий для таймера.
NOTIFYCMD /usr/local/sbin/upssched

# Частота опроса ИБП когда он работает от электрической сети. Значение в секундах, слишком частые не следует делать.
POLLFREQ 5

# Частота опроса ИБП когда он работает от аккумуляторной батареи. Можно сделать меньше чем предыдущие значение. Указывает в секундах, рекомендую не больше 5.
POLLFREQALERT 1

# Как долго upsmon будет ждать, прежде чем отсоединится другой upsmon. Сколько дожидаться остановки дополнительных процессов. Указывает в секундах.
HOSTSYNC 15

# Время по истечение которого stale ИБП почесаться как "dead". Если в течение опроса по параметрам POLLFREQ и POLLFREQALERT ИПБ не ответил во время он помечается как stale. По истечению времени DEADTIME он помечается как "dead". DEADTIME должен быть кратным POLLFREQ и POLLFREQALERT. Указывается в секундах.
DEADTIME 15

# Файл-флаг, выполняющий принудительное выключение ИБП. Файл должен существовать в скриптах выключения системы и выполняться командой "upsdrvctl shutdown".
POWERDOWNFLAG /etc/killpower

# NOTIFYMSG – Изменяет стандартные сообщение ответа на различные события

# NOTIFYFLAG – Изменение поведение при случившихся событиях.
# По умолчанию посылает сообщением всем пользователям и записывает их в системный журнал.
# Пример флагов:
# SYSLOG – писать сообщение  в syslog 
# WALL   - писать сообщение всем пользователям системы
# EXEC   - выполнить  команду NOTIFYCMD
# IGNORE – нечего не делать
NOTIFYFLAG ONLINE	SYSLOG+EXEC
NOTIFYFLAG ONBATT	SYSLOG+EXEC
NOTIFYFLAG LOWBATT	SYSLOG
NOTIFYFLAG FSD		SYSLOG
NOTIFYFLAG COMMOK	SYSLOG
NOTIFYFLAG COMMBAD	SYSLOG
NOTIFYFLAG SHUTDOWN	SYSLOG
NOTIFYFLAG REPLBATT	SYSLOG
NOTIFYFLAG NOCOMM	SYSLOG
NOTIFYFLAG NOPARENT	SYSLOG

# Сообщения в о необходимости замены аккумуляторной батареи. По умолчанию 12 часов, время указывает в секундах.
RBWARNTIME 43200

# Если в течение указанного времени в секундах не было связи с ИБП, будут попадать сообщение в уведомление системы о том что нет связи с ИБП.
NOCOMMWARNTIME 300

# Интервал перед выключение. Если нужно что-то сделать после отправки команды на выключение, но до выполнения команды SHUTDOWNCMD. Мне нечего делать не нужно.
FINALDELAY 0


В файл /usr/local/etc/nut/upssched.conf можно настроить различные таймеры на события. Что мы и сделаем, так что бы после 30 секунд работы от аккумулятора выключать сервер. Это можно не делать тогда сервер выключиться когда аккумулятор ИБП разрядиться до критического состояния, но зачем его доводить до этого.
# Скрипт с таймерами, должен быть раньше строчек AT
CMDSCRIPT /usr/local/bin/upssched-cmd
# PIPEFN это файл pire который будет передавать таймер между процессами, LOCKFN предотвращает события когда два события отправлены почти одновременно. Рекомендуется создать отдельный каталог upssched с правами от пользователя который запускает и может иметь доступ записывать в файлы которые мы указали ниже.
PIPEFN /var/db/nut/upssched/upssched.pipe
LOCKFN /var/db/nut/upssched/upssched.lock
# При событии ONBATT запускаем таймер которые выполнит команду "onbatter" через 60 секунд. Команду "onbatter" мы создадим позже в файле /usr/local/bin/upssched-cmd , которые был указан в переменной CMDSCRIPT. Если в течение 30 секунд произойдет событие ONLINE, то таймер будет отменен и команда "onbatter" не будет выполнена.
AT ONBATT * START-TIMER onbatter 30
AT ONLINE * CANCEL-TIMER onbatter


Файл /usr/local/bin/upssched-cmd это скрипт которые выполняется по таймеру, у меня имеет такой вид
case $1 in
# Имя нашего таймера, указанного в  upssched.conf
	onbatter)
# Если когда произошло событие нужно записать в лог
		logger -t upssched-cmd "shutdown on 30 sek"
# Выполняем команду на выключение
		/usr/local/sbin/upsmon -c fsd
		;;
# Если поступила команда который нет в скрипте, запишем в лог об этом
	*)
		logger -t upssched-cmd "Unrecognized command: $1"
		;;
esac


В результате теперь когда пропадает электричество в сети и если оно в течение 30 секунд не появилось, то сервер выключается. ИБП работает 5 минут и тоже выключается, так как нагрузка слишком мала. С upsdrvctl shutdown который выключит принудительно ИБП через 60 секунд я не придумал куда его засунуть, та как был случай что сервер выключался где то в районе 2 минут. Теоретически он должен посылаться перед последней командой операционной о том что отскочить сервер. С этим я разберусь позже.

В файл /etc/rc.conf вносим строчки на запуск NUT
# Network UPS Tools
nut_enable="YES"
nut_upsmon_enable="YES"
# Если нужен лог ups.log содержания о заряде аккумулятора, напряжения сети, статусе. Мне лог не нужен, да и SSD не любит логи.
#nut_upslog_enable="YES"
#nut_upslog_ups="powercom@localhost"


Перезагружаем операционную систему, проверяем работу NUT и ИБП. Делаем тесты вида: пропало электричество, появилось в течение 30 секунд и так далее.

Все должно работать, если есть вопросы и предложения с радостью отвечу. Да возможно уже кто-то разобрался с upsdrvctl, буду рад выслушать.
0.10
14.08.2013 17:42