Контроллеры LSI MegaRAID десятилетиями стояли в серверах под разными именами, и на многих из них до сих пор лежит ответственность за целые стойки. Утилита MegaCli64 остаётся рабочим инструментом для таких контроллеров: она собирает состояние дисков, создаёт и удаляет массивы, запускает проверку целостности и показывает прогресс восстановления. Разобранная ниже серия команд закрывает повседневные задачи администратора: осмотр, создание, замену диска и подключение мониторинга.

Установка MegaCli64 и устройство команд контроллера

Утилита распространяется отдельным пакетом с сайта Broadcom, куда переехал бренд LSI после поглощений Avago: свежий rpm называется MegaCli-8.07.14, а после установки бинарник появляется в /opt/MegaRAID/MegaCli/MegaCli64. В системах на rpm его ставят командой rpm -ivh, в Debian-семействе архив распаковывают через rpm2cpio и переносят бинарник в /usr/local/bin для удобства:

rpm -ivh MegaCli-8.07.14-1.noarch.rpm
/opt/MegaRAID/MegaCli/MegaCli64 -AdpAllInfo -aALL

Команда выше печатает сведения о каждом контроллере в системе: модель, число портов, объём кэша, версию прошивки и наличие батареи. Синтаксис утилиты однотипен: действие задаётся парой типа CfgLdAdd, объект может быть адаптером a0, логическим томом L0 или физическим диском в записи [номер-enclosure:номер-слота], а суффикс -aALL распространяет команду на все контроллеры сразу. Утилита требует прав root и не работает поверх сети сама по себе, поэтому на удалённых машинах её запускают через ssh. Для удобства в /root/.bashrc часто добавляют сокращение вида alias megacli=/opt/MegaRAID/MegaCli/MegaCli64, а длинный вывод срезают фильтром по полям Firmware state и Slot Number. Контроллеры Dell серий PERC H700, H710, H730 и H740 это переименованные LSI MegaRAID, и MegaCli64 работает с ними после проверки совместимости прошивки. Отдельное семейство составляют HBA-адаптеры вроде SAS 9300-8i: в режиме IT они вообще не собирают массивы и отдают диски системе напрямую, что предпочитают файловые системы вроде ZFS, а в режиме IR умеют простые зеркала.

Просмотр физических дисков командой PDList

Полный список носителей с их состоянием даёт первая команда любого обследования:

/opt/MegaRAID/MegaCli/MegaCli64 -PDList -aALL

Для каждого диска важны несколько полей. Enclosure Device ID и Slot Number дают адрес в записи [252:0], где 252 это типовой номер внутреннего бэкплейна. Media Type различает HDD и SSD, Protocol показывает SAS или SATA, а Firmware state описывает жизнь диска: Online для участников массива, Unconfigured(good) для свободных, Hotspare для резервных, Failed для сбойных, Rebuild для восстанавливающихся. У диска в массиве видны и состояния прокрутки шпинделя вроде Online, Spun Up, полезные при отладке энергосбережения.

Детали конкретного носителя открывает отдельная команда:

/opt/MegaRAID/MegaCli/MegaCli64 -PDInfo -PhysDrv [252:0] -a0

Здесь видны температура привода, модель, серийный номер, объём после выравнивания и специальная отметка S.M.A.R.T. alert flagged by drive, которую диск выставил сам. Отдельно полезны счётчики Media Error Count, Other Error Count и Predictive Failure Count: растущие ошибки чтения и ненулевой прогноз отказа это повод заменить диск до того, как массив уйдёт в деградацию. Утилита никогда не меняет состояние сама, поэтому PDList безопасно запускать хоть каждую минуту, и именно на нём строятся скрипты мониторинга, сравнивающие Firmware state с ожиданиями.

Логические тома, LDInfo и политика кэша

Второй командой обследования смотрят логические тома:

/opt/MegaRAID/MegaCli/MegaCli64 -LDInfo -Lall -aALL

В выводе важны поле State, где Optimal это здоровый том, Degraded сигнал о потере избыточности, а Failed потеря данных, и поле RAID Level в виде Primary-5, Secondary-0, RAID Level Qualifier-0, где первая цифра и есть уровень массива. Там же перечислены размер тома, число дисков, глубина спанов и размер страйпа. Политика кэша описывается строкой вида WriteBack, ReadAhead, Direct: WriteBack подтверждает запись в кэш контроллера до попадания на диск и заметно ускоряет работу при живой батарее, а защитная приставка No Write Cache if Bad BBU переключает том в WriteThrough, когда батарея неисправна. ReadAhead ускоряет последовательное чтение, предвыбирая блоки, и почти ничего не даёт базам со случайным доступом.

Политику меняют после создания тома:

/opt/MegaRAID/MegaCli/MegaCli64 -LDSetProp -WT -L0 -a0
/opt/MegaRAID/MegaCli/MegaCli64 -LDSetProp -WB -L0 -a0

Аргумент WT переводит том в сквозную запись, аргумент WB возвращает отложенную. Изменение живого тома безопасно и не требует остановки сервисов, но на нагруженных базах момент переключения кратко проседает по скорости записи.

Создание массивов RAID5 и RAID10 командами CfgLdAdd и CfgSpanAdd

Новый массив собирается одной строкой с перечислением дисков по адресам из PDList:

/opt/MegaRAID/MegaCli/MegaCli64 -CfgLdAdd -r5 [252:0,252:1,252:2] WB RA Cached -a0

Здесь r5 задаёт уровень, а токены WB, RA и Cached устанавливают стартовую политику кэша. Зеркало из пары дисков создаётся командой с r1, одиночный диск под систему командой с r0, а RAID6 с двумя блоками чётности собирается через r6 и оправдан на широких массивах из восьми и более дисков. RAID10 требует другого синтаксиса, потому что это массив над массивами:

/opt/MegaRAID/MegaCli/MegaCli64 -CfgSpanAdd -r10 -Array0[252:0,252:1] -Array1[252:2,252:3] -a0

Пары дисков внутри Array0 и Array1 образуют зеркала, а контроллер чередует их между собой. Чередование по умолчанию у большинства прошивок равно 64 KB, а допустимый диапазон простирается от 8 KB до 1 MB, и его стоит выбирать под нагрузку: крупные файлы любят больший страйп, базы данных чаще меньший. После создания контроллер запускает фоновую инициализацию, том уже доступен системе, а полная производительность появится по завершении инициализации. Удаляется том обратной командой CfgLdDel с номером, а полная очистка конфигурации контроллера выполняется через CfgClr, и обе операции стирают только метаданные массивов, поэтому заранее стоит убедиться, что нужный том определён верно.

Отдельный случай это диски с конфигурацией от прежнего контроллера: они получают метку foreign, которую видно командой CfgForeign -Scan, а затем конфигурацию либо принимают через CfgForeign -Import, либо стирают через CfgForeign -Clear.

Замена диска, hotspare и восстановление rebuild

Жизненный цикл диска в массиве заканчивается заменой, и полная процедура выглядит так:

  1. определить позицию сбойного носителя в выводе PDList по статусу Failed и счётчикам ошибок;
  2. извлечь диск из слота и установить новый на то же место, контроллер заметит подмену сам;
  3. при необходимости снять диск с массива вручную командой PDOffline перед физической заменой;
  4. перевести новый носитель в состояние Unconfigured(good) командой PDMakeGood;
  5. запустить восстановление командой PDRbld на массиве с дыркой и следить за прогрессом через ShowProg.
/opt/MegaRAID/MegaCli/MegaCli64 -PDMakeGood -PhysDrv [252:2] -a0
/opt/MegaRAID/MegaCli/MegaCli64 -PDRbld -Start -PhysDrv [252:2] -Array0 -a0
/opt/MegaRAID/MegaCli/MegaCli64 -PDRbld -ShowProg -PhysDrv [252:2] -a0 -NoLog

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

/opt/MegaRAID/MegaCli/MegaCli64 -AdpGetProp RebuildRate -aALL
/opt/MegaRAID/MegaCli/MegaCli64 -AdpSetProp RebuildRate -60 -a0

По умолчанию у большинства прошивок это тридцать процентов ресурсов контроллера, и в ночном окне обслуживания значение поднимают до шестидесяти и выше, возвращая обратно с утра. Если rebuild не стартовал сам после подмены, ситуацию чинит команда PdReplaceMissing, которая связывает новый диск с потерянной позицией в массиве. Ручной замены проще избежать заранее: глобальный hotspare занимает свободный диск и восстанавливает массив автоматически:

/opt/MegaRAID/MegaCli/MegaCli64 -PDHSP -Set -PhysDrv [252:3] -a0

С модификатором -Dedicated и номером массива резерв назначается конкретному тому, что полезно, когда скорости разных массивов заметно различаются. По завершении rebuild контроллер с включённым режимом copyback может вернуть данные с резервного диска на основной слот, проделав фоновый перенос ещё раз.

Проверка целостности LDCC и patrol read

Избыточность защищает от отказа одного диска, но тихие ошибки чтения на оставшихся носителях копятся незаметно, и ни файловая система, ни диск сам по себе их не покажут, пока не придёт время реального чтения. Против этого работают два механизма контроллера. Согласованность конкретного тома проверяется командой LDCC:

/opt/MegaRAID/MegaCli/MegaCli64 -LDCC -Start -L0 -a0
/opt/MegaRAID/MegaCli/MegaCli64 -LDCC -ShowProg -L0 -a0 -NoLog
/opt/MegaRAID/MegaCli/MegaCli64 -LDCC -Abort -L0 -a0

Проверка читает все данные тома вместе с избыточностью и замечает расхождения раньше файловой системы. Её обычно ставят в расписание раз в месяц на время низкой нагрузки, а команда Abort позволяет прервать проверку, если рабочая нагрузка пришла раньше. Patrol read это самостоятельная задача контроллера, которая в свободные периоды понемногу читает все диски и при обнаружении предотказного состояния переводит носитель в деградацию заранее, пока массив ещё цел. Состояние задачи видно через -AdpPR -Info, включается она командой -AdpPR -Enable, а период между запусками задаётся через -AdpPR -SetDelay в часах. Для массивов с горячим резервом patrol read особенно ценен: именно он подбирает носитель под замену до того, как исчезнет запас на восстановление, и превращает отказ из экстренного события в плановую работу.

Батарея BBU, журнал событий и переход на StorCLI

Кэш контроллера стоит на батарее, и её здоровье напрямую влияет на скорость записи:

/opt/MegaRAID/MegaCli/MegaCli64 -AdpBbuCmd -GetBbuStatus -aALL

Вывод показывает заряд, температуру, напряжение, отметку о необходимости замены и срок следующего цикла переобучения, при котором контроллер разряжает и заряжает батарею заново для калибровки; у модулей iBBU такой цикл проходит примерно раз в девяносто дней, и во время него кэш временно переходит в сквозной режим записи, что заметно по пикам задержек в графике записи. Неисправную батарею не стоит игнорировать: тома по умолчанию сами уходят в WriteThrough, и скорость записи падает в разы.

Журнал событий контроллера хранит всю историю переходов:

/opt/MegaRAID/MegaCli/MegaCli64 -AdpEventLog -GetEvents -f /tmp/events.log -aALL

Файл расшифровывает моменты переходов дисков между состояниями, запуски rebuild и patrol read, события батареи, и это первый документ при разборе инцидентов. Для постоянного мониторинга вывод LDInfo и PDList отдаётся скриптам: строка State с любым значением кроме Optimal или счётчик ошибок выше порога превращаются в оповещение систем вроде Zabbix без посредников, а журнал событий выгружается по расписанию. Проверку удобно автоматизировать целиком: раз в несколько минут скрипт вызывает PDList, сверяет все Firmware state с эталоном и при отклонении шлёт оповещение, что закрывает самую частую дыру серверов с RAID, где деградация висит неделями незамеченной.

Новые контроллеры Broadcom обслуживаются преемником утилиты StorCLI с бинарником storcli64 и адресацией вида /c0 для контроллера, /c0/e252/s0 для диска и /c0/v0 для тома. Соответствие прямое: PDList это /c0/eall/sall show, LDInfo это /c0/vall show all, а создание тома выглядит как add vd type=raid5 drives=252:0-2. Модель знакомая, порядок работы тот же, а старые машины на MegaCli64 спокойно живут дальше: контроллеру без разницы, какой из двух инструментов читает его регистры. На массивах, где важно состояние обоих путей сразу, полезно держать под рукой модель контроллера и версию прошивки из -AdpAllInfo: совместимость утилит и прошивок менялась между поколениями, и знание точной модели экономит время на любую диагностику.