S.M.A.R.T. (часть 10). Улучшенный мониторинг дисков под LSI MegaRAID контроллером

LSIВ предыдущий статье шла речь о настройке мониторинга дисков за LSI MegaRAID контроллером используя megacli и smartctl утилиты. Основной недостаток использования этих инструментов – это невозможность определить название логического диска и его соответствие виртуальному диску в MegaRAID-e. Т.е. если возникла проблема с физическим диском под MegaRAID контроллером – нам нужно запускать megacli, смотреть к какому виртуальному устройству он принадлежит, и потом искать в самой ОС – какой это логический диск.
Чтобы избежать всей этой рутины удальцы Adam Cecile и Vincent S. Cojot написали python скрипт, который парсит вывод megacli и выводит форматированный вывод о статусе логических и физических дисков и информацией о их принадлежности. Скрипт можно скачать здесь.
Для его нормальной работы – нужна megacli утилите. Для установки megacli сомой последней версии можно перейти на сайт разработчика, ввести в поиску “megacli” и скачать архив с готовым бинарником. После этого закинуть к исполняемым скриптам (в моем случаи — /usr/sbin/megacli). Осталось прописать путь к megacli в скрипте.

root@s19:~# less megaraid_status.py | grep megacli
…
def_megaclipath = "/usr/sbin/megacli"
…

Теперь запускаем скрипт.

root@s19:~# python megaraid_status.py
-- Controller information --
-- ID | H/W Model         | RAM    | Temp | Firmware
c0    | LSI MegaRAID ROMB | 1024MB | 57C  | FW: 23.18.0-0013

-- Array information --
-- ID | Type   |    Size |  Strpsz |   Flags | DskCache |   Status |  OS Path | InProgress
c0u0  | RAID-1 |    278G |   64 KB |   RA,WT |  Default |  Optimal | /dev/sda | None
c0u1  | RAID-0 |    930G |   64 KB |   RA,WB |  Enabled |  Optimal | /dev/sdb | None
c0u2  | RAID-5 |   2725G |   64 KB |   RA,WT |  Default |  Optimal | /dev/sdc | None
c0u3  | RAID-0 |    111G |   64 KB | ADRA,WB |  Enabled |  Optimal | /dev/sdd | None

-- Disk information --
-- ID   | Type | Drive Model                                        | Size     | Status          | Speed    | Temp | Slot ID  | Device ID
c0u0p0  | HDD  | SEAGATE ST300MM0026 0001S0K263T8                   | 278.4 Gb | Online, Spun Up | 6.0Gb/s  | 31C  | [252:0]  | 12
c0u0p1  | HDD  | SEAGATE ST300MM0026 0001S0K23LQQ                   | 278.4 Gb | Online, Spun Up | 6.0Gb/s  | 30C  | [252:1]  | 13
c0u1p0  | SSD  | S21CNXAG506746T Samsung SSD 850 EVO 1TB EMT01B6Q   | 930.3 Gb | Online, Spun Up | 6.0Gb/s  | N/A  | [252:3]  | 0
c0u2p0  | HDD  | SEAGATE ST91000640SS 00049XG5VT6F                  | 930.3 Gb | Online, Spun Up | 6.0Gb/s  | 30C  | [252:4]  | 8
c0u2p1  | HDD  | SEAGATE ST91000640SS 00049XG5VYP6                  | 930.3 Gb | Online, Spun Up | 6.0Gb/s  | 30C  | [252:5]  | 11
c0u2p2  | HDD  | SEAGATE ST91000640SS 00049XG690HG                  | 930.3 Gb | Online, Spun Up | 6.0Gb/s  | 31C  | [252:6]  | 10
c0u2p3  | HDD  | SEAGATE ST91000640SS 00049XG690W8                  | 930.3 Gb | Online, Spun Up | 6.0Gb/s  | 33C  | [252:7]  | 9
c0u3p0  | SSD  | S1FZNEAG514429 SAMSUNG MZ7WD120HCFV-00003 DXM9203Q | 110.8 Gb | Online, Spun Up | 6.0Gb/s  | N/A  | [252:2]  | 2

Как видим, скрипт выводит всю нужную информацию о логический и физических дисков. Видно, какой тип физического диска, его модель и серийный номер, статус, слот, ID и к какому логическому диску он принадлежит. По логическим дискам видно политику кэша, статус, тип рейда, размер и название блочного устройства, как видно в операционной системе.
Покажу также пример вывода с проблемным диском.

root@s11:~# python megaraid_status.py
-- Controller information --
-- ID | H/W Model          | RAM    | Temp | Firmware
c0    | Supermicro SMC2108 | 512MB  | N/A  | FW: 12.9.0-0033

-- Array information --
-- ID | Type   |    Size |  Strpsz | Flags | DskCache |   Status |  OS Path | InProgress
c0u0  | RAID-5 |   2725G |   64 KB | RA,WT |  Default | Degraded | /dev/sda | None
c0u1  | RAID-6 |   7271G |   64 KB | RA,WT |  Default |  Optimal | /dev/sdb | None
c0u2  | RAID-1 |     55G |   64 KB | RA,WT |  Default |  Optimal | /dev/sdc | None

-- Disk information --
-- ID   | Type | Drive Model                               | Size     | Status          | Speed    | Temp | Slot ID  | Device ID
c0u0p0  | HDD  | IBM-ESXSST31000424SS BC219WK18XWW0128BC21 | 930.3 Gb | Online, Spun Up | 6.0Gb/s  | 30C  | [4:0]    | 16
c0u0p1  | HDD  | IBM-ESXSST31000424SS BC219WK1E4RT0128BC21 | 930.3 Gb | Online, Spun Up | 6.0Gb/s  | 29C  | [4:1]    | 17
c0u0p2  | HDD  | SEAGATE ST1000NM0001 0002Z1N4K2PY         | 930.3 Gb | Failed          | 6.0Gb/s  | 29C  | [4:2]    | 15
c0u0p3  | HDD  | SEAGATE ST31000424SS 00059WK16RV7         | 930.3 Gb | Online, Spun Up | 6.0Gb/s  | 28C  | [4:3]    | 2
c0u1p0  | HDD  | SEAGATE ST2000NM0001 0002Z1P2TNGP         | 1.817 TB | Online, Spun Up | 6.0Gb/s  | 32C  | [4:6]    | 12
c0u1p1  | HDD  | SEAGATE ST2000NM0001 0002Z1P2TNPA         | 1.817 TB | Online, Spun Up | 6.0Gb/s  | 32C  | [4:7]    | 13
c0u1p2  | HDD  | SEAGATE ST2000NM0001 0002Z1P2TD37         | 1.817 TB | Online, Spun Up | 6.0Gb/s  | 30C  | [4:8]    | 14
c0u1p3  | HDD  | SEAGATE ST2000NM0001 0002Z1P2T63H         | 1.817 TB | Online, Spun Up | 6.0Gb/s  | 34C  | [4:9]    | 9
c0u1p4  | HDD  | SEAGATE ST2000NM0001 0002Z1P2TML0         | 1.817 TB | Online, Spun Up | 6.0Gb/s  | 32C  | [4:10]   | 10
c0u1p5  | HDD  | SEAGATE ST2000NM0001 0002Z1P2E4KH         | 1.817 TB | Online, Spun Up | 6.0Gb/s  | 32C  | [4:11]   | 11
c0u2p0  | SSD  | OCZ-2TF2WV2T3068D9B1OCZ-AGILITY3 2.22     | 54.9 Gb  | Online, Spun Up | 6.0Gb/s  | N/A  | [4:4]    | 7
c0u2p1  | SSD  | OCZ-FF73P3DT9GPQD2B5OCZ-AGILITY3 2.22     | 54.9 Gb  | Online, Spun Up | 6.0Gb/s  | N/A  | [4:5]    | 8

There is at least one disk/array in a NOT OPTIMAL state.

Если для мониторинга вы используете Nagios, то скрипт может запускаться в режиме Nagios.

root@s11:~# python megaraid_status.py --nagios
RAID ERROR - Arrays: OK:2 Bad:1 - Disks: OK:11 Bad:1

Если этого вывода в мониторинг системе вам не достаточно, то можете подредактировать python скрипт. Или же написать маленький bash скрипт для парсинга вывода. К примеру такой.

root@s19:~# cat megaraid.sh
#!/bin/bash
ERROR_COUNT=0
get_disk_errors() {
while read deviceid_with_errors_count
do
    disk_id=$(echo "$deviceid_with_errors_count" | awk "{if(\$2 > 20) print \$1}")
    if [ -n "$disk_id" ]
    then
        #echo "Disk with Device ID: $disk_id has more then 20 bad blocks"
        failed_item="Disk with Device ID: $disk_id has more then 20 bad blocks\n${failed_item}"
        let "ERROR_COUNT += 1"
    fi
done < <(megacli -ldpdinfo -aALL | grep -E '^Media Error|Device Id:' | awk '{print $NF}' | paste -d' ' - -)
}

get_vdpd_status() {
    stat=`/path/to/megaraid_status.py`
    VD_status_headers=`echo "$stat" | grep -A 1 'Array information'`
    PD_status_headers=`echo "$stat" | grep -A 1 'Disk information'`
    VD_status=`echo "$stat" | grep -E '^c[0-9]u[0-9] ' | grep -v 'Optimal'`
    PD_status=`echo "$stat" | grep -E '^c[0-9]u[0-9]p[0-9] ' | grep -v 'Online, Spun Up'`
    if [ -n "$VD_status" -o -n "$PD_status" ]
    then
        failed_item="\n$VD_status_headers\n$VD_status\n$PD_status_headers\n$PD_status\n${failed_item}"
        let "ERROR_COUNT += 1"
    fi
}

# Get status of all Virtual and Physical drives
get_vdpd_status
# Get Media errors count for each Physical drive
get_disk_errors

if [[ -n $1 ]] && [ $1 == 'log' ]
then
    echo -e "$failed_item"
else
    echo ${ERROR_COUNT}
fi
exit 0

Если скрипт запускать без аргументов – он выведет количество проблемных единиц.

root@s11:~# bash megaraid.sh
1

root@s19:~# bash megaraid.sh
0

Если запустить с опцией “log”, то мы увидим проблемные диски.

root@s11:~# bash megaraid.sh log

-- Array information --
-- ID | Type   |    Size |  Strpsz | Flags | DskCache |   Status |  OS Path | InProgress
c0u0  | RAID-5 |   2725G |   64 KB | RA,WT |  Default | Degraded | /dev/sda | None
-- Disk information --
-- ID   | Type | Drive Model                               | Size     | Status          | Speed    | Temp | Slot ID  | Device ID
c0u0p2  | HDD  | SEAGATE ST1000NM0001 0002Z1N4K2PY         | 930.3 Gb | Failed          | 6.0Gb/s  | 29C  | [4:2]    | 15

Также, в этот bash скрипт добавлена проверка на bad блоки дисков под MegaRAID котроллером: если их количество больше 20-ти, то мы увидим ID проблемного диска.
На этом все. Пробуйте.

Автор: admin, 31 января 2016
Рубрики: Системы мониторинга
Метки: ,
3 комментария к сообщению: “S.M.A.R.T. (часть 10). Улучшенный мониторинг дисков под LSI MegaRAID контроллером”
  1. Eugene:

    Вот так спасибо!
    Замечательный скрипт, а то вечно руками лазить приходится, выясняя что за диск соответствует VD

  2. Павел:

    Как этот python скрипт добавить в cron?
    Поменял os.getenv(‘USER’) на os.getenv(‘LOGNAME’), а-то при запуске из под крона, ругался на «This script requires Administrator privs!».
    И стал ругаться на «Cannot find megacliin your PATH. Please install it.».
    Команда python megaraid_status.py вывод даёт, не ругается.
    Сам crontab:
    0 8 * * * python /root/megaraid_status.py | mail -s «Raid-status» mymail@domain.zxy

Написать комментарий

Последние статьи

Яндекс.Метрика
?>