В предыдущий статье шла речь о настройке мониторинга дисков за 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 проблемного диска.
На этом все. Пробуйте.
Вот так спасибо!
Замечательный скрипт, а то вечно руками лазить приходится, выясняя что за диск соответствует VD
Как этот 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
Команду нужно запускать с правами рута (sudo).