RFC (Request for Comments, Запрос на комментарии) - серия документов, публикуемая сообществом исследователей и разработчиков, руководствующихся практическими интересами, в которой описывается набор протоколов и обобщается опыт функционирования Интернет.
Network UPS Tools представляет собой набор программ, которые обеспечивают общий интерфейс для мониторинга и администрирование UPS оборудования.
У меня есть APC Smart-UPS 1500VA USB & Serial 230V и к нему подключено 2 сервера один с FreeBSD, второй - c Windows 2003. При выключении питания один штатно выключается (тк к нему подключен дата-кабель от UPS), второй - как получится. Передо мной встала задача - автоматизировать процесс выключения серверов подключенных к одному UPS, при разрядке батареи последнего. Требования к утилите были следующие: умение работать с сетью, наличие интерфейса управления, возможность работы с любыми операционными системами.
Установка
Подключение При подключении APC Smart-UPS 1500VA USB & Serial 230V к FreeBSD, UPS определяется так: (подключения через USB)
ugen0: <American Power Conversion Smart-UPS 1500
FW:653.12.I USB FW:4.2, class 0/0, rev 1.10/0.06, addr 2> on uhub0
(подключения через COM)
# dmesg -a | grep sio0
sio0: <16550A-compatible COM port> port 0x3f8-0x3ff irq 4flags 0x10 on acpi0
sio0: type 16550A
sio0: [FILTER]
Я остановился на подключении через COM порт, так как выдел в нем более светлое будущее для работы с NUT.
Порт
# cd /usr/ports ; make search name='nut-'
Port: nut-2.4.1
Path: /usr/ports/sysutils/nut
Info: Network UPS Tools
Maint: Joerg.Pulz@frm2.tum.de
B-deps: autoconf-2.62 autoconf-wrapper-20071109 expat-2.0.1 gettext-0.17_1
gmake-3.81_3 libiconv-1.11_1 libusb-0.1.12_4 m4-1.4.12,1 neon28-0.28.3
net-snmp-5.4.2.1_3 perl-5.8.9_2 pkg-config-0.23_1
R-deps: expat-2.0.1 gettext-0.17_1 libiconv-1.11_1 libusb-0.1.12_4
neon28-0.28.3 net-snmp-5.4.2.1_3 perl-5.8.9_2 pkg-config-0.23_1
WWW: http://www.networkupstools.org/]
# cd /usr/ports/sysutils/nut ;make configOptionsfor nut 2.4.1
[X] SERIAL SERIAL support
[ ] USB USB support
[ ] SNMP SNMP support
[X] NEON NEON XML/HTTP support
[ ] PDU Powerman PDU support
[ ] HAL HAL support
[ ] IPV6IPV6 support
[ ] DEVEL Install header files
[X] CGI Web CGI interface
Уберите лишнее, например IPV6, и SERIAL\USB (зависит от подключаения UPS), поставьте SNMP (если ваш UPS поддерживает такую возможность) и CGI, если требуется мониторить UPS через веб интерфейс. Приступаем к установке.
# cd /usr/ports/sysutils/nut ;make install cleanOptionsfor libusb 0.1.12_4
[ ] SGML Install developer guide from SGML
~~~~~~~~~~~
This port has installed the following startup scripts which may cause
these network services to be started at boot time.
/usr/local/etc/rc.d/nut_upsmon
/usr/local/etc/rc.d/nut_upslog
/usr/local/etc/rc.d/nut
If there are vulnerabilities in these programs there may be a security
risk to the system. FreeBSD makes no guarantee about the security of
ports included in the Ports Collection. Please type 'make deinstall'
todeinstall the port if this is a concern.
Formore information, and contact details about the security
status of this software, see the following webpage:
http://www.networkupstools.org/
Готово, теперь переходим к настройке NUT.
Предварительная настройка
Директория Создадим необходимые директории для драйверов и сервера, куда будут сохраняться данные UPS, и выставим корректные права на директорию.
Поддержка имеется, поэтому я могу использовать два драйвера для USB и для COM порта. На данный момент буду использовать драйвер "apcsmart".
Настройка
Конфигурационные файлы Все конфигурационные файлы находятся в директории /usr/local/etc/nut
ups.conf - настройки UPS драйвера для сбора данных upsd.conf - настройка основного демона upsd для Network UPS Tools upsd.users - контроль доступа к UPS демону (профили пользователей) upsmon.conf - настройки монитора UPS демона
ups.conf В этом файле вы указываете свои UPS.
# cd /usr/local/etc/nut# cp ups.conf.sample ups.conf
[ups_name] - имя используется как адрес вашего UPS. Вы можете его изменить на любое произвольное имя.
driver - драйвер, используемый для работы с UPS.
port - порт, на котором висит UPS (для подключения через USB, UPS вставляет это значение в auto). - Для snmp-ups: имя хоста SNMP агента - Для newhidups: значение "auto" для автоматического соединения с USB UPS.
desc - описание устройства для себя, чтобы не забыть.
sdorder - необязательный элемент. При наличии нескольких UPS подключенных к серверу можно выключать в определенном порядке. используя upsdrvctl можно выключить все 0s или 1s, 2s и тд. Для исключения последовательной остановки используйте -1.
nolock - необязательный элемент, его не рекомендуется использовать в его этом конфиге. Он служит для отключения блокировки порта при пользовании утилитой.
maxstartdelay - необязательный элемент. Может быть, заданна как глобальная переменная выше вашего первого UPS. Это значение определяет, сколько upsdrvctl будет ожидать окончания запуска драйвера. Данная возможность предоставляет стабильность в работе. Значение по умолчанию равно 45 секундам.
cable - Если драйвер UPS требует дополнительных параметров, вы можете указать их здесь. Например, для флага "cable" я ставлю значение 940-0024C. Это индекс вашего кабеля и вы можете посмотреть его тут /usr/local/share/doc/nut/cables. Вы можете не указывать это значение, если ваше подключение к UPS стандартно.
upsd.conf upsd отвечает за передачу данных от драйвера клиентским программам в сети. upsd должен находится под управлением и по возможности, как единственный источник состояния и мониторинга клиентов, таких как upsmon. upsd использует этот файл для контроля доступа к серверу и для установки других значений различных конфигурации. Этот файл содержит подробные сведения об управление доступом и таким образом обеспечивается безопасность. В идеальном случае только процесс upsd должны иметь возможность прочитать этот файл.
MAXAGE <seconds> - по умолчанию 15 секунд. Это частота обновления данных клиентов после остановки драйвера UPS. Следует использовать только если у вас трудности с обновлением данных. См syslog.
LISTEN <address> [<port>] - здесь указывается адрес и порт 3493 (по умолчанию) для прослушивания подключений.
MAXCONN <connections> - по умолчанию используется 1024 подключений. Каждый UPS, каждого LISTEN адреса и каждого клиента считается как одно подключение. Если на сервере заполнятся кол-во подключений, он больше не будет принимать новых входящих клиентских подключений.
upsd.users Контроль доступа для UPS демона (профили пользователей) Именно здесь вы указываете, кто и в какой мере будет контролировать, и работать с утилитой.
Каждый UPS монитор может определяться как один из трех возможных типов:
upsmon master - полные полномочия управлением питания подключенных к системе UPS под управлением upsmon, эта система отвечает за выключение разряженного аккумулятора. Выключение происходит после безопасного выключения всех Slave систем. Если ваш UPS подключен непосредственно к системе через последовательный порт, то для upsmon системы следует определить этот UPS как Master.
upsmon slave - эта система, под управлением upsmon и она не выключается непосредственно. Операционная система будет выключена перед отключением питания Master. Используйте этот режим при запуске монитора на других компьютерах работающих на том же UPS. И очевидно, что только один сервер может быть подключен к последовательному порту на UPS будет, является Master. А все остальные сервера будут Slave.
upsmon monitor-only - при этом режиме будут создаваться уведомления о состоянии или изменения (работы батареи, переключении на линию и т.д.) но не завершать работу системы.
actions - Действия пользователя с применением upsd. - SET - изменить значения определенных переменных в UPS - FSD - установка флага "принудительного выключения" для UPS
instcmds - разрешения пользователю на инициирование конкретных команд. Применяя "ALL" вы разрешаете использовать все команды, Существует множество команд выполните 'upscmd -l' чтобы увидеть, что ваше оборудование поддерживает. Вот, к примеру, несколько команд. - test.panel.start - старт теста передней панели - test.battery.start - старт теста батареи - test.battery.stop - остановка теста батареи - calibrate.start - запуск калибровки батареи - calibrate.stop - остановка калибровки батареи
upsmon.conf upsmon предоставляет основные функции, которая собирается найти в программе мониторинга UPS, например это безопасное завершений работы при сбое питания. В многоуровневой схеме утилиты NUT это клиент.
Мы добавили MONITOR в котором указали наши значения. Формат таков:
MONITOR system powervalue username password type
MINSUPPLIES - указываем количество блоков питания которые должны получать мощность сохраняя систему запущенной. Большинство систем имеют один БП. Но дорогие сервера, например HP NetServer LH4 могут работать с 2 из 4 БП и ему нужно ставить 2.
SHUTDOWNCMD - upsmon выполняет эту команду, когда системе необходимо выключить.
NOTIFYCMD - upsmon отправляет сообщение при происшествиях.
POLLFREQ - опрос мониторами с частотой (измеряется в секундах) для обычной деятельности. Вы можете отрегулировать это частоту опроса, чтобы upsmon не “зашумлял”вашу сеть, но не вносите слишком большие значения тк. оно может пропустить отключение питания.
POLLFREQALERT - опрос UPS с частотой в секундах. Можно сделать значение поменьше, чем POLLFREQ для лучшей чувствительности работы батареи.
HOSTSYNC - как долго upsmon будет ждать перед переходом к следующему upsmon. master upsmon использует это число при ожидании slaves чтобы отключиться после того как он установил флаг принудительное завершение работы (FSD). И если slaves не отключаться после этого тайм аута, то выключение продолжится без них.
DEADTIME - интервал ожидания перед объявлением статуса UPS как «мертвый» upsmon требует, чтобы UPS предоставлял свою статус информацию, каждые несколько секунд (см. POLLFREQ и POLLFREQALERT). Если статус загрузки, UPS помечен fails. И если оно остается fails более чем DEADTIME секунд, то UPS помечается «мертвый».
POWERDOWNFLAG - флаг файла для форсирования завершения работы UPS в master системе.
NOTIFYMSG - изменение сообщения, отправленные upsmon при возникновении определенных событий.
NOTIFYFLAG - изменение поведения upsmon при возникновении событий NOTIFY.
RBWARNTIME - предупреждение замены аккумулятора в секундах.
NOCOMMWARNTIME - предупреждение по времени при не общении к UPS в секундах.
FINALDELAY - процент батареи, при котором происходит завершение работы системы.
Разрешения Проверьте разрешения на директорию /var/db/nut текущий пользователь должен быть uucp (или другой NUT_USER) и права 0750:
Broadcast Message from root@bsd.ampul.local (no tty) at 12:51 MSD...
Communications with UPS APC@localhost lost
Detected Smart-UPS 1500 [AS0537130911] on /dev/cuad0 Starting nut. Network UPS Tools upsd 2.4.1 listening on 192.168.0.2 port 3493 listening on 127.0.0.1 port 3493 Connected to UPS [APC]: apcsmart-APC
Broadcast Message from root@bsd.ampul.local (no tty) at 12:51 MSD...
Communications with UPS APC@localhost established
Смотрим, что все запустилось нормально и UPS подхватился, все правила подключились и порт слушается. =)
Тест Теперь потыкаем демон. И посмотрим, запустился ли демон.
# ps -ax |grep nut 752 ?? Ss 0:00.32 /usr/local/libexec/nut/apcsmart -a APC # ps -ax | grep ups 754 ?? Ss 0:00.03 /usr/local/sbin/upsd 761 ?? Ss 0:00.00 /usr/local/bin/upslog -s myups@localhost -l /var/log/ups.log -i 300 768 ?? Is 0:00.00 /usr/local/sbin/upsmon localhost 771 ?? S 0:00.01 /usr/local/sbin/upsmon localhost
Все замечательно и слушает и логи ведет и нормально висит.
Полная картина ясна и все в порядке, но кому нужно поменьше букв, то выполните следующую команду.
# upsc APC@localhost ups.status OL
OL - система работает на линии (on line power)
OB - система работает от батареи (on battery)
LB - система работает от севшей батареи (low battery)
Можно посмотреть монитором
# upsmon
Network UPS Tools upsmon 2.4.1
UPS: APC@localhost (master) (power value 1)
Using power down flag file /etc/killpower
Когда upsmon необходимо быстро выключить локальную систему, она устанавливает флаг "FSD" (forced shutdown - принудительное отключение) для любых UPSов, на котором она выполняется в master режиме. Это используется и для синхронизации slaves компьютеров в том случае, если master UPS передает событие и всем рассылается сообщение о немедленном прекращении работы. Можно вручную вызвать этот режим на master upsmon, запустив другой экземпляр с флагом '-c fsd '. Это полезно, когда вы хотите инициировать shutdown перед критическом этапе. Эмулируем падение мощности:
# upsmon -c fsd
Если система корректно выключилась, то все в порядке. rc.conf Для запуска NUT при старте FreeBSD добавляем в /etc/rc.conf следующее:
Перезагрузим FreeBSD и увидим при загрузке следующее.
NNetwork UPS Tools - UPS driver controller 2.4.1 Network UPS Tools - APC Smart protocol driver 2.00 (2.4.1) APC command table version 2.0 Detected Smart-UPS 1500 [AS0537130911] on /dev/cuad0 Starting nut. Network UPS Tools upsd 2.4.1 listening on 192.168.0.2 port 3493 listening on 127.0.0.1 port 3493 Connected to UPS [APC]: apcsmart-APC Starting nut_upslog. Network UPS Tools upslog 2.4.1 logging status of myups@localhost to /var/log/ups.log (300s intervals) Starting nut_upsmon. Network UPS Tools upsmon 2.4.1 UPS: APC@localhost (master) (power value 1) Warning: ignoring duplicate UPS [APC@localhost] Using power down flag file /etc/killpower
Сетевой сервер
Клиенты Подключим второй сервер Windows 2003 St в качестве клиента. Для этого необходимо найти необходимое ПО клиента установить и настроить его. Список клиентских модулей смотрите тут Client projects. Мне был необходим Windows NUT client Необходимо скачать и установить модуль, а так же настроить его под свои параметры и добавить в автозагрузку системы.
Проведем практические испытания, выключим электричество на вход к UPS и посмотрим, как отреагирует сервер и клиент.
Как и было задумано сначала штатно выключился Windows 2003 slave (при зарядке батареи 10%), а потом FreeBSD master (при зарядке батареи 5%)
May 5 14:04:03 bsd upsmon[770]: UPS APC@localhost on battery May 5 14:41:43 bsd upsmon[770]: UPS APC@localhost battery is low May 5 14:41:43 bsd upsmon[770]: Executing automatic power-fail shutdown
Broadcast Message from root@bsd.ampul.local (no tty) at 14:41 MSD...
UPS APC@localhost battery is low
Broadcast Message from root@bsd.ampul.local (no tty) at 14:41 MSD...
Executing automatic power-fail shutdown
May 5 14:41:43 bsd upsmon[770]: Auto logout and shutdown proceeding
Broadcast Message from root@bsd.ampul.local (no tty) at 14:41 MSD...
Auto logout and shutdown proceeding
*** FINAL System shutdown message from root@bsd.ampul.local *** System going down IMMEDIATELY
May 5 14:41:48 bsd shutdown: halt by root: May 5 14:42:20 bsd rc.shutdown: 30 second watchdog timeout expired. Shutdown terminated.
Дополнительно
SNMP Доступно для снятия данных со специализированных UPS. К сожалению, у меня нет APC AP9606 APC Web/SNMP management card и тп чтобы я смог бы попробовать данную опцию.
# man snmp-ups
Web Web-интерфейс проверки статуса UPS. Установим и посмотрим, что upsstats может нам предложить.
# man 8 upsstats.cgi
upsset.conf - Конфигурация Network UPS Tools для upsset.cgi
И при переходе на ваш адрес у вас должна отобразится страница Network UPS Tools с вкладками Statistics и Settings. - Settings – тут вы можете, настроит UPS (пользователя берете согласно upsd.users) - Statistics – здесь можете просмотреть статус вашего UPS, а так же посмотреть текущее состояние в графическом виде.
Заключение
Система поработала в тестовом режиме полторы недели и уже один раз спасла (как раз на праздниках выключали электричество). И после получение питания с UPS(включили электричество) эти два сервера включились самостоятельно (настройка BIOSа) как и положено. =)