Начнем с небольшой предыстории, поломки дисков на двух-трех десятках серверов дело нечастое и что бы этот процесс контролировать вполне достаточно прислушиваться к крикам юзеров, типа что-то притормаживает, и хоть иногда заглядывать в серверную. И все было бы хорошо пока дело не коснулось старенького сервера 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”
Сделал все как описано в статье, но snmpwalk не выдает ничего… snmptranslate при этом отрабатывает нормально.
Еще одно замечание (касается 64-битной версии, видимо):
в файле LSI-AdapterSAS.mib нужно исправить mirrorDataSize_paritySize на mirrorDataSizeParitySize или что-то похожее, но без знака подчеркивания, иначе snmptranslate выдает ошибку.
Привет, Иван.
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-файла…
Да, все дело в SELinux. После ввода setenforce 0 все заработало:
# snmpget -v1 -c public localhost LSI-MegaRAID-SAS-MIB::pdIndex.0
LSI-MegaRAID-SAS-MIB::pdIndex.0 = INTEGER: 1
Отсюда вытекает следующий вопрос: как заставить дружить мониторинг и SELinux? Интересно, что в логах по SELinux ничего нет…
Упс, оказывается не там смотрел. В логах-то как-раз все есть. Вот что появляется после ввода команды
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)
Как помнится SELinux много разной малины портит, но как говаривают он так же не плохо защищает систему от стороннего вторжения
Про SELinux дописал в 3-ей части, пробуй.
Благодарю, все работает. Не думал, что для этого придется компилировать модуль для SELinux. Я надеялся обойтись указанием контекста для бинарника
Спасибо за инструкцию. Кому интересно – подобная инструкция для мониторинга Magaraid под deb-подобными системами – http://sysadmin.te.ua/linux/monitoring-systems/smart-under-lsi-2108-kontroller.html
Whoa, things just got a whole lot easier.