Начнем с небольшой предыстории, поломки дисков на двух-трех десятках серверов дело нечастое и что бы этот процесс контролировать вполне достаточно прислушиваться к крикам юзеров, типа что-то притормаживает, и хоть иногда заглядывать в серверную.  И все было бы хорошо пока дело не коснулось старенького сервера Intel SR2500, в который недавно засунули контроллер LSI 9260 и новые жесткие диски по 3Тб. Самое печальное то, что лампочки на его дисках не сигнализируют фактически ни о чем, разве что о изъятии диска из корзины, да и падение производительности при поломке одного диска на не сильно нагруженном сервере мало заметно.

Обычно при необходимости мониторить RAID я брал утилиту для управления контроллером с сайта производителя и писал небольшой bash-скрипт, который в случае появления слова Failed или Degraded слал на почту письмо с криком о помощи. Сейчас же стараюсь уходить от ситуации когда сервер монтиорит сам себя, и контролировать все через центральную систему мониторинга, поэтому мой выбор пал на SNMP.

В статье используется CentOS 6.3 i386.

1. Установка

В первую очередь идем на сайт производителя и скачиваем оттуда MegaRAID Storage Manager для Linux, распаковываем архив и достаем оттуда файлы подходящие для нашей системы. В архиве есть два типа SNMP агентов один для встроенных контроллеров содержащий в названии IR (Integrated RAID), другой для обычных поставляемых в виде платы PCIe.

Устанавливаем необходимые пакеты и LSI SNMP агент из архива.

[root@smb02 disk]# yum install net-snmp net-snmp-utils
[root@smb02 disk]# rpm -i sas_snmp-12.05-0200.i386.rpm
Starting snmpd
Stopping snmpd: [  OK  ]
Starting snmpd: [  OK  ]
Registering Service lsi_mrdsnmpd
Starting LSI SNMP Agent
Starting LSI SNMP Agent:LSI MegaRAID SNMP Agent Ver 3.18.0.0 (Mar 06th, 2012) Started
[  OK  ]

2. Настройка

По умолчанию snmpd настроен на отдачу только SNMPv2-MIB::system и HOST-RESOURCES-MIB::hrSystemUptime, поэтому для того что бы можно было читать группу OID относящуюся к LSI SNMP агенту придется добавить разрешения на отдачу ветки .1.3.6.1.4.1.3582, или можно воспользоваться готовым файлом настроек от LSI.

[root@smb02 ~]#  cp /etc/lsi_mrdsnmp/lsi_mrdsnmpd.conf /etc/snmp/snmpd.conf

Теперь открываем /etc/snmp/snmpd.conf для редактирования, удаляем не нужные и дописываем адреса с которых можно читать данные из public, например адрес сервера Zabbix.

com2sec snmpclient      192.168.10.25              public

Включаем в автозагрузку и перезапускаем сервис snmpd.

[root@smb02 ~]# chkconfig snmpd on
[root@smb02 ~]# service snmpd restart

3. SELinux

Как оказалось, LSI SNMP агент не умеет работать с SELinux включенным в принудительном enforcing режиме. Если использовать LSI SNMP агент на локальном файловом сервере, то проще и правильнее всего будет просто отключить SELinux. Для этого открываем в редакторе файл /etc/sysconfig/selinux и меняем в нем параметр SELINUX=enforcing на SELINUX=disabled, а за тем презапускаем систему.
Другой вариант написать дополнительный модуль политики SELinux, он больше подходит для случая когда необходима большая защищенность, например для почтового или веб-сервера. В первую очередь меняем защитный контекст запускаемого файла, который обрабатывает ветку .1.3.6.1.4.1.3582.

[root@smb02 ~]# setenforce 0 
[root@smb02 ~]# semanage fcontext --add --type snmpd_initrc_exec_t /etc/lsi_mrdsnmp/lsi_mrdsnmpmain
[root@smb02 ~]# restorecon -v -r /etc/lsi_mrdsnmp
[root@smb02 ~]# setenforce 1

Создаем текстовый файл описания модуля политики с именем lsi_snmp.te

module lsi_snmp 1.0;
require {
        type unconfined_t;
        type snmpd_t;
        type user_tmpfs_t;
        class shm { unix_read read write unix_write associate };
        class file { read write };
}
allow snmpd_t unconfined_t:shm { unix_read read write unix_write associate };
allow snmpd_t user_tmpfs_t:file { read write };

Компилируем, собираем и устанавливаем бинарный модуль для SELinux.

[root@smb02 ~]# checkmodule -M -m -o lsi_snmp.mod lsi_snmp.te
[root@smb02 ~]# semodule_package -o lsi_snmp.pp -m lsi_snmp.mod
[root@smb02 ~]# semodule -i lsi_snmp.pp

Готово, теперь LSI SNMP агент может работать в принудительном режиме SELinux.

4. SNMP

По умолчанию системе установлены только базовые MIB, все параметры которые в них не включены будут отображаться в виде длинных цифровых OID, выискивать среди них при помощи snmpwalk нужные параметры очень не удобно. Добавляем MIB контроллера LSI.

[root@smb02 ~]# cp /etc/lsi_mrdsnmp/sas/LSI-AdapterSAS.mib /usr/share/snmp/mibs
[root@smb02 ~]# echo "mibs +LSI-MegaRAID-SAS-MIB" >> /etc/snmp/snmp.conf

Запускаем snmptranslate для просмотра древовидной структуры.

[root@smb02 ~]# snmptranslate -Tp LSI-MegaRAID-SAS-MIB::lsi | less

Если все правильно должна получиться следующая картинка.

+--lsi(3582)
   |
   +--storageComponents(4)
      |
      +--lsiRAIDServer(1)
         |
         +-- -R-- String    hostName(1)
         |        Textual Convention: DisplayString
         |        Size: 0..63
         +-- -R-- String    hostOSInfo(2)
         |        Textual Convention: DisplayString
         |        Size: 0..63
 
    .  .  .  .  .

Запускаем snmpwalk для просмотра всех параметров

[root@smb02 ~]# snmpwalk -v1 -c public localhost LSI-MegaRAID-SAS-MIB::lsi | less

Для настройки мониторинга в Zabbix вполне достаточно добавить всего один параметр LSI-MegaRAID-SAS-MIB::pdDiskFailedCount (.1.3.6.1.4.1.3582.4.1.4.1.2.1.24), и добавить триггер срабатывающий при отличном от нуля значении. Более интересную схему можно построить при помощи низкоуровневого обнаружения появившегося в Zabbix 2.0, подробнее в статье “Настройка низкоуровневого обнаружения в Zabbix”.

8 Коммент. : “Мониторинг LSI MegaRAID по SNMP”

  1. Иван пишет:

    Сделал все как описано в статье, но snmpwalk не выдает ничего… snmptranslate при этом отрабатывает нормально.

    Еще одно замечание (касается 64-битной версии, видимо):
    в файле LSI-AdapterSAS.mib нужно исправить mirrorDataSize_paritySize на mirrorDataSizeParitySize или что-то похожее, но без знака подчеркивания, иначе snmptranslate выдает ошибку.

  2. Привет, Иван.

    SNMPD работает по достаточно простому принципу, часть запросов он обрабатывает сам, а запросы к LSI-MegaRAID-SAS-MIB::lsi c OID .1.3.6.1.4.1.3582 передает внешнему обработчику (pass .1.3.6.1.4.1.3582 /usr/sbin/lsi_mrdsnmpmain).

    Для начала стоит проверить работает ли SNMPv2-MIB, который обрабатывается самим SNMPD.

    snmpwalk -v1 -c public localhost .1.3.6.1.2.1.1

    А дальше ковырять конфиг на предмет правильной передачи внешнему обработчику /usr/sbin/lsi_mrdsnmpmain. Можно также проверить SELinux у меня всех машинках с LSI он отключен.

    PS: На ошибку с mirrorDataSize_paritySize я тоже наткнулся, правда решил что это временный баг в конкретной версии MIB-файла… ;)

  3. Иван пишет:

    Да, все дело в SELinux. После ввода setenforce 0 все заработало:
    # snmpget -v1 -c public localhost LSI-MegaRAID-SAS-MIB::pdIndex.0
    LSI-MegaRAID-SAS-MIB::pdIndex.0 = INTEGER: 1

    Отсюда вытекает следующий вопрос: как заставить дружить мониторинг и SELinux? Интересно, что в логах по SELinux ничего нет…

  4. Иван пишет:

    Упс, оказывается не там смотрел. В логах-то как-раз все есть. Вот что появляется после ввода команды
    snmpget -v1 -c public localhost LSI-MegaRAID-SAS-MIB::pdIndex.0 :

    type=AVC msg=audit(1349945123.761:2255): avc: denied { execute } for pid=5622 comm=”snmpd” name=”lsi_mrdsnmpmain” dev=dm-0 ino=1053476 scontext=unconfined_u:system_r:snmpd_t:s0 tcontext=system_u:object_r:etc_t:s0 tclass=file
    type=SYSCALL msg=audit(1349945123.761:2255): arch=c000003e syscall=59 success=no exit=-13 a0=7f4d38dc8f40 a1=7f4d38e2a400 a2=7fffa31369a0 a3=2e312e322e312e32 items=0 ppid=4487 pid=5622 auid=0 uid=0 gid=0 euid=0 suid=0 fsuid=0 egid=0 sgid=0 fsgid=0 tty=(none) ses=246 comm=”snmpd” exe=”/usr/sbin/snmpd” subj=unconfined_u:system_r:snmpd_t:s0 key=(null)

  5. Как помнится SELinux много разной малины портит, но как говаривают он так же не плохо защищает систему от стороннего вторжения ;)

    Про SELinux дописал в 3-ей части, пробуй.

  6. Иван пишет:

    Благодарю, все работает. Не думал, что для этого придется компилировать модуль для SELinux. Я надеялся обойтись указанием контекста для бинарника :)

  7. aprogrammer пишет:

    Спасибо за инструкцию. Кому интересно – подобная инструкция для мониторинга Magaraid под deb-подобными системами – http://sysadmin.te.ua/linux/monitoring-systems/smart-under-lsi-2108-kontroller.html

  8. Whoa, things just got a whole lot easier.

Оставить комментарий