null

Читаем логи Adaptec контроллера или MegaRAID "не удалось подключиться к серверу"

Три-четыре дня назад случилось у одного заказчика недоразумение в период обновления парка машин (преимущественно x4170). На части этих серверов не удавалось посмотреть состояние дисков (MegaRAID Storage Manager не выводил сообщение, что не может подключиться к серверу), кроме того, эти системы (по понятным причинам) не отвечали на SNMP пробы системы мониторинга. Решили обратиться ко мне.

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

Но рассказать хочется не об этом. Возникла необходимость понять, что же происходило с Adaptec-овским контроллером в определённые моменты времени. Как известно, для взаимодействия с этим контроллером используется утилита arcconf. Далее приведён кусок когда, который позволяет относительно читаемо понять, что же происходило с контроллером, избавляя вывод от избыточной информации.

arcconf GETLOGS 1 EVENT tabulate |
egrep '(\<Date|eventType)' |
perl -pe 's/\.+/-/g;s/(\d+)/print scalar localtime($1)/ge if /Date/'

Поясню код. Первая команда, собственно, запрашивает лог контроллера в - tabulate - "читаемом" (не XML виде). Конечно, можно было бы запросить XML-ный документ и воспользоваться libxml, но это требует чуть больше времени на имплементацию и не стоит того. Цифра 1 в команде означает номер контроллера. Нумерация начинается с единицы. EVENT - тип логов. Arcconf можно запустить без последних двух аргуменов (EVENT tabulate) и увидеть возможные значения.

Далее я умышленно расточительно воспользовался утилитой egrep - исключительно для наглядности. На данном этапе выбираются строки, содержащие слова Date и eventType.

Последняя команда занимается форматированием вывода. На самом деле, она очевидна и пояснения не требует, но для соблюдения формальностей, в общих чертах опишу, как она работает. Скрипт включает в себя всего две строковых замены. Первая во всех входных строках длинные последовательности точек заменяет на тире. А вторая в строках, содержащих Date, заменяет числа на строку вида 'print scalar localtime(число)' и выполняет полученную строку в интерпретаторе perl, заставляя его вывести дату в понятном формате на stdout. Если мы не хотим видеть строку Date, можно модифицировать паттерн до такого вида: '.*(\d+).*', но это может привести к определённым проблемам, связанным с кривым выводом arcconf.

В результате, становится возможным читать журнальные файлы в понятном для человека формате.

korg

 

Коротко о себе

Работаю в компании Tune-IT, администрирую инфраструктуру компании и вычислительную сеть кафедры Вычислительной ТехникиСПбНИУ ИТМО.

Интересы: администрирование UNIX и UNIX-like систем и активного сетевого оборудования, написание shell- и perl-скриптов, изучение технологий глобальных сетей.
Люблю собирать GNU/Linux и FreeBSD, использовать тайлинговые оконные менеджеры и писать системный софт.