APC в Linux

С появлением компьютеров мы все больше и больше становимся зависимыми от них. У каждого пользователя на жестком диске скапливаются десятки гигабайт музыки, фильмов, книг, важных документов, без которых привычное существование представляется с трудом. Ну а ценность переписки по e-mail’у переоценить вообще достаточно трудно – это уже святое. Ведь будет очень приятно перечитать через лет десять свои письма какой-нибудь девчонке: «Эх! Как я тогда зажигал!». А пользователи Линукса – это вообще отдельный разговор. Ведь у каждого заядлого линуксоида его операционная система представляет своего рода собственное государство, где он президент, правительство и парламент в одном лице :). Доказать? Да без проблем! По мере освоения и изучения Linux’а все приходят к тому, что надо: скомпилировать ядро под свою систему, оптимизировать процесс загрузки, собрать из исходников некоторые программы, настроить под себя многие сервисы и т.д. Перечислять можно очень долго. Все это достигается тяжким трудом путем чтения и изучения документации и редактирования файлов конфигурации. В конечном итоге у каждого пользователя получается свой собственный оригинальный Линукс, представляющий для владельца большую ценность. Но как всегда бывает в жизни, если существуют силы добра, то обязательно должны существовать и силы зла, которые пытаются все это уничтожить. В компьютерном мире они представлены в огромном разнообразии, начиная от всевозможных вирусов и заканчивая физическими отказами в работе железа. Но главный враг для компьютера, это то, благодаря чему он существует и живет, а именно – электричество, точнее сказать, его скачки и перепады или вообще неожиданное отключение. Резкий сильный скачок или падение напряжения может вывести из строя практически все железо. Отключение же электричества во время работы может закончиться очень печальными последствиями для файловой системы и вызвать серьезные нарушения в работе ОС. Именно для борьбы с такими ситуациями и был придуман источник бесперебойного питания (ИБП) или, как его обычно называют, UPS (Uninterruptable Power Supplies). К сожалению, в рамках одной статьи сложно рассказать про специфику UPS’ов различных производителей, поэтому я выбрал наиболее популярного мирового производителя, компанию APC (American Power Conversion). Дальше в статье я расскажу про принципы работы UPS’ов и настройку Linux’а для корректного взаимодействия с ним.
Об UPS’ах

На данный момент, на компьютерном рынке имеется достаточно широкий выбор источников бесперебойного питания по относительно низким ценам (60-80 долларов). Средненький UPS сбережет нервы и сэкономит время, потраченное на восстановление системы. Несмотря на разнообразие моделей, практически все они, как правило, внутренне организованы по некоторым общепринятым технологиям. Если коротко, не вдаваясь в технические подробности, описать принцип работы обычного UPS’а, то UPS подключается к электросети, к его розеткам подключается какая-то внешняя нагрузка (системный блок, монитор, модем…). В процессе своей работы UPS контролирует питание внешней нагрузки. В то время пока питание осуществляется от сети (режим Stand-by), UPS выполняет ряд функций по сохранению стабильности выходного напряжения: стабилизирует и фильтрует входящее напряжение, контролирует заряд своих внутренних батарей, следит за допустимым диапазоном напряжения в сети. Если в какой-то момент времени внешнее питание от сети прекращается или напряжение выходит за допустимый диапазон, то UPS осуществляет питание внешней нагрузки за счет своего внутреннего аккумулятора (режим On-Line). При возникновении напряжения UPS переключается обратно в режим Stand-by и пополняет заряд своих батарей. При переключении с сетевого питания (Stand-by) на питание от аккумуляторов (On-Line) и обратно в большинстве UPS’ов среднего класса возникает задержка (Switch Time), в течение которой внешняя нагрузка остается без питания. Для компьютерной техники это время должно укладываться в максимальный интервал 4-16 мс, и чем меньше это значение, тем лучше и безопаснее для оборудования. Основной определяющей характеристикой ИБП является его мощность (Вт). Желательно, чтобы потребляемая мощность нагрузкой составляла 70-90% от заявленной в технических характеристиках ИБП. При соблюдении необходимых условий, среднестатистический UPS при полном исчезновении электропитания в сети способен за счет своих внутренних батарей поддержать работу компьютера 5-10 минут. Этого времени вполне достаточно, чтобы нормально завершить работу приложений и безопасно выключить компьютер. Если требуется увеличить время питания, то следует подобрать UPS большей мощности или уменьшить потребляемую мощность внешней нагрузки.
Взаимодействие ИБП с компьютером

Большинство источников бесперебойного питания помимо выполнения своих основных функций по сохранению стабильности питания внешней нагрузки имеют возможность взаимодействовать с компьютером через стандартный COM или USB-порт. Благодаря такой возможности с помощью дополнительного программного обеспечения можно организовать совместную работу UPS’а с операционной системой и создать ряд дополнительных полезных функций, таких как автоматическое завершение работы компьютера и выход из операционной системы с сохранением всех данных при длительном отсутствии питающего напряжения в электросети, контроль и диагностика уровня заряда батарей, ведение log-файла состояния питания UPS’а и его компонентов…

Думаю, этих и некоторых других функций будет вполне достаточно, чтобы защитить компьютер от посягательств со стороны злобных электриков. Связь компьютера с некоторыми видами UPS’ов осуществляется через специальный SMART-протокол. Благодаря этому протоколу через терминальную программу можно получить различную служебную информацию от UPS’а, провести его диагностику, изменить его текущие параметры и установки. Как это делать, я расскажу чуть позже. Теперь, после получения некоторых теоретических знаний, я расскажу, как обстоит дело с поддержкой ИБП в Linux.
UPS в Linux

В принципе, для поддержки UPS’ов в Linux’е не требуется каких-то специальных драйверов – все, что надо, это чтобы ядро имело поддержку того интерфейса, через который подключен UPS. Как упоминалось выше, подавляющее большинство UPS’ов подключаются через USB, либо через последовательный COM-порт. Подключение через COM-порт более простое и потребует меньше усилий со стороны пользователя. Да и оно является пока более популярным, чем USB-подключение, хотя сейчас все больше и больше выпускается UPS’ов с USB.

Мне, честно говоря, непонятно, зачем это делать. Ладно, не буду отвлекаться от темы. Поддержка последовательных портов по умолчанию имеется во всех версиях ядер, так что всяких хитрых манипуляций с перекомпилированием ядра не потребуется.

В Linux’е последовательные порты представлены в виде файлов устройств в каталоге /dev, и для каждого порта существует свой оригинальный файл, через который устройство общается с операционной системой:

/dev/ttyS0 — COM1

/dev/ttyS1 — COM2

/dev/ttyS2 — COM3

/dev/ttyS3 — COM4

Проверь их наличие в твоем дистрибутиве. Если таких устройств нет, то их можно создать, используя специальный скрипт MAKEDEV. Например, если UPS подключен через COM1, то необходимо ввести команду:

# cd /dev

# ./MAKEDEV ttyS0

Обладателям UPS’ов, подключаемых к компьютеру только через USB, потребуется больше усилий. Если в ядре нет поддержки USB, то ее придется включить. Вкратце расскажу, как это сделать. Переходим в каталог с исходными текстами ядра и запускаем меню его конфигурации:

# cd /usr/src/linux-[version]

# make menuconfig

Выбираем нужные пункты меню (на примере ядер 2.6.x):

Device Drivers —>

USB support —>

<*> Support for Host-side USB

[*] USB device filesystem

<M> UHCI HCD (most Intel and VIA) support

<M> USB Human Interface Device (full HID) support

[*] HID input layer support

[*] /dev/hiddev raw HID device support

Разберемся с тем, что мы тут повключали.

Первый пункт, собственно, и включает поддержку шины USB (Universal Serial Bus). Второй пункт создает в файловой системе /proc каталог /proc/bus/usb/, в котором для каждого подключенного USB-устройства создается специальный файл: /proc/bus/usb/xxx/yyy, где xxx – номер шины, yyy – номер устройства. С помощью этой опции создается своеобразный интерфейс между ядром и пользователем, благодаря чему различные приложения смогут общаться с устройством «напрямую». Третий пункт включает поддержку USB-контроллера для Intel и VIA чипсетов. Если твой контроллер поддерживает USB 2.0, то в ядре ты без проблем найдешь пункт, который включает и его поддержку. Следующие два пункта включают поддержку так называемых USB HID-устройств, которыми как раз и являются источники бесперебойного питания. И последний пункт создает интерфейс в виде файлов устройств под названием /dev/usb/hiddevXX для работы с HID-устройствами.

Теперь следует скомпилировать ядро и прописать его в /etc/lilo.conf. Замечу, что в линейке ядер 2.6.x, в отличие от предшественников, не требуется вводить поочередно команды: make dep, make bzImage и так далее. Достаточно ввести команду # make, и она все сделает за тебя. Тебе лишь останется только проинсталлировать модули и ядро командами:

# make modules_install

# make install

Далее следует перезагрузиться и проверить полученные результаты. Сразу после перезагрузки загляни в директорию /proc/bus/usb, там ты должен увидеть различные поддиректории и файлы, например ./devices. Если она оказалась пустой, то, скорее всего, при загрузке системы эта директория не была примонтирована. Примонтируем ее командой:

# mount -t usbfs none /proc/bus/usb

Разберем параметры:

* -t usbfs – указывает на тип монтируемой файловой системы;
* none – так как файловая система /proc «виртуальная», то для нее не существует устройства в каталоге /dev. Данный параметр на это и указывает.
* /prco/bus/usb – точка монтирования.

Для того чтобы файловая система монтировалась автоматически при загрузке, необходимо дописать в файл /etc/fstab следующую строчку:

none /proc/bus/usb usbfs defaults 0 0

Только не забудь в конце нажать «Enter» – каждая строчка в fstab’е должна им завершаться.

Теперь нужно проверить полученные результаты – ради чего мы, собственно, мучались. Если ты еще не подключил свой UPS, то сделай это и посмотри содержимое файла /proc/bus/usb/devices:

# cat /proc/bus/usb/devices

В этом файле находится детальная информация обо всех устройствах, подключенных к твоему USB-контроллеру. Вот что примерно должно получиться:

T: Bus=01 Lev=01 Prnt=01 Port=01 Cnt=01 Dev#= 4 Spd=1.5 MxCh= 0

D: Ver= 1.10 Cls=00(>ifc ) Sub=00 Prot=00 MxPS=64 #Cfgs= 1

P: Vendor=0e21 ProdID=0601 Rev= 1.06

S: Manufacturer=American Power Conversion

S: Product=Back-UPS RS 1500 FW:7.g3 .D USB FW:g3

S: SerialNumber=YB0375825104

C:* #Ifs= 1 Cfg#= 1 Atr=a0 MxPwr=30mA

I: If#= 0 Alt= 0 #EPs= 2 Cls=03(HID.) Sub=00 Prot=00 Driver=hid

Как видно, ядро обнаружило устройство и готово с ним работать. Наибольший интерес тут представляет последняя строчка, в конце которой указан драйвер (Driver=hid), через который работает устройство.

Чуть выше я говорил, что UPS’ы являются HID-устройствами и, соответственно, должны работать через HID-драйвер, тут, как видно, все в порядке. Точно так же должно быть и у тебя. Помимо этого для работы с UPS’ом необходимо наличие файлов устройств /dev/usb/hiddevXX или /dev/usb/hid/hiddevXX. Если их у тебя в системе нет, то чуть позже мы их создадим. А пока я хочу рассказать, как общаться со SMART UPS’ами напрямую через терминальную программу. Думаю, это может пригодиться для случаев, когда в работе UPS’а происходят какие-то проблемы, а причину найти достаточно проблематично.
Общаемся со SMART UPS’ом

Для того чтобы можно было посылать команды UPS’у и получать на них реакцию, нужна самая обычная терминальная программа. Да-да! Именно та, которая используется для работы с модемом, только ее нужно будет чуть поднастроить. В качестве примера я возьму наиболее популярную среди такого класса программ – minicom. В твоем дистрибутиве она точно должна быть. В крайнем случае, ищи на дистрибутивных дисках. Становимся root’ом и запускаем minicom в режиме настройки:

# minicom -s

Перед глазами видим меню настроек и переходим в подменю «Настройка последовательного порта».

В поле «Последовательный порт» (A) вписываем порт, на котором находится UPS, для поля «Скорость/Четность/Биты» (E) устанавливаем значение «2400 8N1». Теперь переходим в подменю «Модем и дозвон». В поле «Строка инициализации» (A) нужно написать «Y\0^M», для того чтобы при запуске minicom’а UPS переходил в режим мониторинга. В поле «Строка сброса» пишем «Y^M» и в «Строка разрыва связи» пишем «R\0^M» – это чтобы при выходе из minicom’a UPS сохранял свои настройки и выключал режим мониторинга (для UPS’ов третьего поколения Back-UPS PRO, SMART-UPS (v/s)).

Теперь можно смело запускать minicom и опрашивать свой UPS. Сразу после запуска minicom’а в окне появится сообщение «SM» – это значит, что UPS перешел в режим мониторинга и готов выполнять команды. Я не советую нажимать подряд все клавиши на клавиатуре и проверять, какая что значит, – это может окончиться печальными последствиями.

Для начала советую нажать клавишу «а», после чего UPS выведет информацию о протоколе и поддерживаемых командах (в конце строки). Приведу описание, как мне кажется, наиболее интересных и полезных команд:

* A – тест звука и индикаторов на UPS’е;
* L – входное напряжение;
* P – процент потребляемой мощности внешней нагрузкой;
* U – имитация сбоя питания;
* W – тест работоспособности;
* X – тест внутренних аккумуляторов (OK – все хорошо, BT – маленькая емкость, NG – тест не пройден);
* f – процент уровня заряда аккумуляторов;
* l – минимальное входное напряжение, при котором UPS переключается на питание от аккумуляторов;
* s – чувствительность к изменению напряжения в сети (H – высокая, M – средняя, L – низкая).

Рекомендую нажать клавишу «U» или просто отключить на несколько секунд питание, и посмотреть, какие сообщения выдает UPS. Несмотря на всю серьезность такого устройства, логика его работы достаточно проста.

Если во время работы UPS’а в сети происходит сбой или просто пропадает питание, UPS посылает каждые 30 секунд через свой порт сообщение в виде символа «!», который сигнализирует, что UPS перешел на питание от внутренних батарей. При восстановлении питания в нормальное состояние (от сети), UPS сообщает об этом, посылая в порт символ «%».

Вот, собственно, и все. Операционной системе остается лишь наблюдать за данным портом и в зависимости от поступившего с этого порта сообщения выполнять какие-то определенные действия. Если есть желание и навыки в программировании, то можно написать под себя небольшую программку, которая будет все это делать. Ну а для простых смертных уже существуют готовые программные пакеты, которые умеют делать все это и еще много другого.
Паркет apcupsd

Наиболее популярным и функциональным пакетом для работы с UPS’ми компании APC является apcupsd (http://www.apcupsd.com). Он представляет собой набор программ, в который входит: демон apcupsd – он следит за состоянием UPS’а и в случае сбоя предпринимает какие-то действия согласно установкам, apctest – программа, в которую входят различные тесты для UPS’а. Apcaccess выводит детальную информацию о состоянии UPS’а и его настройках. Apcnisd – демон, позволяющий удаленным машинам (клиентам) через сеть получать информацию о состоянии UPS’а и даже управлять им.

После небольшого ознакомления с пакетом переходим непосредственно к сборке пакета. Для начала потребуются его исходники. Скачать их можно с официального сайта. Распаковываем исходные тексты и переходим в каталог пакета:

# tar xzvf apcupsd-3.10.17a.tar.gz

# cd apcupsd-3.10.17a

Для тех, у кого UPS подключен через USB, я говорил, что нужно создать файлы устройств /dev/usb/hid/hiddevXX. Чтобы их не создавать вручную, в пакете имеется специальный скрипт. Запустим его:

# cd examples/

# ./make-hiddev

Также в этой директории имеется программа тестирования HID-устройств. Соберем ее и протестируем, все ли верно настроено:

# make hid-ups

# ./hid-ups

Если все сделано верно, и никаких ошибок не возникло, то программа покажет информацию о подключенном UPS’е.

Когда все протестировано, и ты понял, что Linux правильно определяет твой UPS, можно приступить к компиляции пакета. Переходим в домашний каталог пакета и посмотрим параметры компиляции:

# cd ..

# ./configure —help

Как видно, по умолчанию поддержка USB выключена, поэтому чтобы включить ее придется прописывать опцию —enable-usb. Рекомендую также прописать опцию —enable-powerflute, которая включает компиляцию программы powerflute для интерактивного мониторинга UPS’а. Становимся root’ом и приступаем к компиляции пакета:

#./configure —enable-usb —enable-powerflute

# make

# make install

После компиляции, в зависимости от версии Linux, в каталоге стартовых скриптов появится файл для запуска демона apcupsd в процессе начальной загрузки. У меня, в Linux Slackware, он называется /etc/rc.d/rc.apcupsd.

Теперь нужно сделать так, чтобы он запускался во время загрузки. Это можно сделать по-разному. Я, например, в файл /etc/rc.d/rc.local добавил такие строчки:

if [ -x /etc/rc.d/rc.apcupsd ]; then

. /etc/rc.d/rc.apcupsd start

fi

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

Файл конфигурации демона расположен тут: /etc/apcupsd/apcupsd.conf. Опции просты и хорошо описаны – я думаю, ты без проблем сможешь разобраться, если потребуется. Владельцы UPS’ов с USB могут не переживать, если параметр DEVICE не определен, apcupsd сам определит его при загрузке. А теперь запускай демон, вынимай шнур из розетки и внимательно следи за тем, что получилось.
Заключение

Вот и все! Думаю, что у тебя все получилось, и теперь твой компьютер абсолютно спокойно реагирует на сюрпризы, которые иногда преподносят наши «дорогие» электрики. Конечно, в одной статье трудно широко осветить данную тему, остались еще некоторые моменты, но если мне удалось помочь тебе немного разобраться в ней, я буду очень рад. Бесперебойной тебе работы :)!

Запись опубликована в рубрике Без рубрики. Добавьте в закладки постоянную ссылку.

Добавить комментарий