Мы — долго запрягаем, быстро ездим, и сильно тормозим.
www.lissyara.su —> статьи —> FreeBSD —> Файловая система —> Мониторинг RAID

FreeBSD: Мониторинг RAID из командной строки (CLI)

Автор: mvalery.


0. Введение

Выложили деньги, поставили RAID.  Теперь избыточность надежно защищает ваши данные. И успокоились. Зря. Рано или поздно выйдет из строя какой-то жесткий диск, но на поведении системы это никак не отразится. Просто избыточность исчезнет и как результат, отказ очередного HDD внезапно обвалит систему. Систему, которая возможно находится очень и очень далеко от вас. По этому, необходимо постоянно наблюдать за состоянием RAID, чтобы вовремя заметить вышедшие из строя накопители.

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

1. Как определить тип используемого RAID

Для нашего случая оказалось достаточно просмотреть директорию /dev.
Это связано с тем, что  в системе FreeBSD одинаковые имена  получают устройства, идентичные с точки зрения управляемости.
Чаще всего единое имя получает группа устройств построенная на базе общего набора чипов.

Для простоты изложения, в большинстве случаев  я полагаю, что в системе установлен один RAID - контроллер. Наличие нескольких контроллеров потребует вспомогательных ключей. Будет необходимо разбирательство - каких именно.

И так, далее мы поговорим о следующих типах RAID:
/dev/mirror/gm0  - программный RAID gmirror
/dev/twa0 или /dev/twe0  - RAID контроллер компании AMCC 3ware (напр. 9650SE)
/dev/hptrr - RAID контроллер компании HighPoint (напр. RocketRAID 2310)
/dev/mfi0  - либо Dell Perc 5/i (чип LSI MegaRAID SAS 8408E) либо Dell PERC 6/i (чип LSI SAS1078)

Существует несколько других способов, позволяющие определить характеристики вашего железа.

В частности вы можете:
(1) просмотреть файл /var/run/dmesg.boot:
# less /var/run/dmesg.boot

(2) воспользоваться утилитой dmidecode :  
# dmidecode

(3) или утилитой pciconf:
# pciconf -l -cv

Попробуйте. Узнаете много интересного.

2.  Программный RAID gmirror (/dev/mirror/gm0)

Программный RAID не нуждается в установке специальной утилиты. Чтобы убедиться, что RAID исправен даем команду:
# gmirror status

Этот тип RAID отлично документирован. В многочисленной литературе вы найдете дополнительные команды управления.

Программный RAID использует компоненты сервера как аппаратную часть, а компоненты операционной системы как программную часть. В связи с большим количеством компонент, вовлеченных в функционирование программного RAID, его наработка на отказ заметно ниже, чем у RAID выполненного в виде в виде специализированного контроллера. У меня были случаи, когда на нагруженных серверах программный RAID рассыпался через 2-3 месяца круглосуточной работы. Деньги, которые я сэкономил на покупке железного RAID, были потрачены на первой же поездке к провайдеру, где установлены сервера и на работах по восстановлению файловой системы.

3. AMCC 3ware (/dev/twa0 или /dev/twe0)

Ставим утилиту мониторинга из портов:
# cd /usr/ports/sysutils/tw_cli/ && make install clean

Доступны следующие команды:

(1) Статус RAID и отдельных дисков массива узнаем так:
# tw_cli /c0 show 

(2) Общие сведения о контроллере RAID
# tw_cli show

(3) Лог аварийных сообщений
# tw_cli show alarms

(4) Лог диагностических сообщений.
# tw_cli show diag

(5) Развернутая информация о типах контроллеров, поддерживаемых утилитой и сведения о некоторых дополнительных командах.
# man tw_cli



4. HighPoint  (/dev/hptrr)

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

(1) Создаем временную директорию
# mkdir RocketRAID && cd RocketRAID

(2) Скачиваем архив
# wget \
http://www.highpoint-tech.com/BIOS_Driver/HRM/FreeBSD/CLI-FreeBSD-3.2-081224.tar.gz

(3) Распаковываем
# tar xf CLI-FreeBSD-3.2-081224.tar.gz && cd CLI-FreeBSD-3.2-081224

В текущую директорию распаковываются 4 файла:
hptsvr-3.13-4.tbz ; hptraidconf-3.2-1.tbz ; HPT_CLI_Guide.pdf ; README.txt

(4) Устанавливаем серверную часть (демона)
# pkg_add hptsvr-3.13-4.tbz 

(5) Устанавливаем клиентскую часть.
# pkg_add hptraidconf-3.2-1.tbz

(6) Переносим на рабочую станцию файл HPT_CLI_Guide.pdf.  Документ содержит подробный перечень команд, в котором на первых порах тяжеловато разобраться.

После установки, демон запускается автоматически. Далее его можно останавливать и снова запускать как всякий обычный демон командами:
# /usr/local/etc/rc.d/hptdaemon.sh stop
# /usr/local/etc/rc.d/hptdaemon.sh start

Увы, нет даже намека как сделать, чтобы этот демон запускался автоматически при старте системы.

Командная строка для всех команд будет начинаться одинаково:
# hptraidconf -u RAID -p hpt <команда>

здесь ключи "-u RAID -p hpt" это username и password соответственно. Вы не можете их менять.

(7) А теперь подробнее поговорим о командах:

(7.1) Получить список RAID - контроллеров :
# hptraidconf -u RAID -p hpt query controllers

Первая колонка - номера контроллера. Нумерация начинается с единицы.

(7.2) Получить статус всех RAID, построенных на этих контроллерах:
# hptraidconf -u RAID -p hpt query arrays

Номер RAID совпадает с номером контроллера, однако некоторые RAID - составные. Например RAID10, состоящий из четырех дисков на первом контроллере, имеет номер 1, а входящие в него зеркала, каждый из двух дисков имеют номера 1-1 и 1-2 соответственно.

(7.3) Получить информацию о RAID по его номеру:
# hptraidconf -u RAID -p hpt query arrays 1

(Получаем статус 1-го RAID)
Если же вас интересует дополнительная информация, о входящих в него RAID, тогда делаем так:
# hptraidconf -u RAID -p hpt query arrays 1-2

(Получаем статус 2-го RAID, вложенного в 1-й RAID)

(7.4) Получить статус всех дисков:
# hptraidconf -u RAID -p hpt query devices

Диски нумеруются через дробь в формате номер_контроллера/номер_диска. Например 1/3 - это 3-й диск на 1-м контроллере.
Соответственно, указав этот ID, вы можете получить еще более детальную информацию об этом диске:
# hptraidconf -u RAID -p hpt query devices 1/3

(7.5) Контроллер ведет свой лог событий, который вам доступен по команде:
# hptraidconf -u RAID -p hpt events

(7.6) Если вы заменили испорченный диск на новый, его необходимо инициировать:
# hptraidconf -u RAID -p hpt init 1/3

(7.7) Добавить инициированный диск в RAID
# hptraidconf -u RAID -p hpt rebuild 1 1/3

(добавить в 1-й RAID 3-й диск)

Далее читайте HPT_CLI_Guide.pdf. Документ довольно подробный и корректный.


5. Dell Perc 5/i (LSI MegaRAID SAS 8408E) и Dell PERC 6/i (LSI SAS1078)  (/dev/mfi0)

Для этого типа RAID, в портах имеется утилита (ура!), но только под Linux (ну как же).

Примечание:
(1)Читатель weec утверждает, что по его сведениям ожидается коммит порта sysutils/megacli, который не будет требовать linux-окружения. На сегодняшний день такого порта еще нет.
(2) Читатель av советует воспользоваться фирменной утилитой от LSI:
Mega CLI FreeBSD (MegaRAID Release 3.6) ver 4.0.11. Качается с сайта lsi.com.)


Ничего не могу сказать по поводу замечаний наших коллег. Поэтому, продолжаю рассказывать о том что я опробовал и что точно работает.
Для начала, разбираемся - установлена ли у нас поддержка Linux.
Если модуль linux.ko загружен, поддержка уже присутствует. Проверяем.

(1) Даем команду:
# kldstat | grep linux

Правильный ответ - что-то вроде:
5 1 0xc6c88000 16000 linux.ko

(2) Если модуль linux.ko не подгружен, попытаемся его подгрузить:
# kldload linux

а затем опять идем в п.1 и проверяем

(Вдумчивый читатель может возразить, что достаточно запросить информацию о наличии установленного пакета, который называется linux_base-fc:
# pkg_version -v -s"linux_base-fc"

и будет почти прав. Если бы не одно НО: Эта команда ничего не покажет, если поддержка Linux была включена в процессе инсталляции системы.)

Выполнение п.3 и 4 длится довольно долго. Убедитесь, что у вас достаточно времени, чтобы дождаться завершения.

(3) Если поддержка Linux уже установлена, переходите к п.4. Иначе ставим поддержку Linux:
# cd /usr/ports/emulators/linux_base-fc4/ && make install clean

(4) Затем собственно утилиту мониторинга:
# cd /usr/ports/sysutils/linux-megacli2/ && make install clean



(5) Готовимся к первому запуску.

(5.1) Загружаем модуль совместимости с Linux:
# kldload linux

(5.2) Выставляем системную переменную:
# sysctl compat.linux.osrelease=2.6.12

(по умолчанию 2.4.2 )

(5.3) Монтируем соответствующие элементы файловой системы:
# mount -t linprocfs linproc /compat/linux/proc
# mount -t linsysfs linsys /compat/linux/sys

(5.4) Запускаем утилиту, чтобы убедиться, что все сделели правильно:
# megacli -AdpAllInfo -aALL

В этот момент вы должны увидеть подробную осмысленную информацию об имеющихся в наличии контроллерах данного типа.

Тогда продолжаем.

(6) Вносим изменения в конфигурационные файлы.

(6.1) Файл /etc/rc.conf. Добавить
linux_enable="YES"

(6.2) Файл /etc/sysctl.conf. Добавить
# For MegaCLi
compat.linux.osrelease=2.6.12

(6.3) Файл /etc/fstab. Добавить
# For MegaCLi
linproc /compat/linux/proc linprocfs rw 0 0
linsys /compat/linux/sys linsysfs rw 0 0



(7) А теперь перечень самых необходимых команд.

(7.1) Информация обо всех RAID контроллерах данного типа, присутствующих в системе:
# megacli -AdpAllInfo -aALL

(7.2) Статус  всех логических дисков, присутствующих в системе. Все они должны быть в состоянии "optimal":
# megacli -LDInfo -LALL -aALL | grep "State"

(7.3) Статус всех физических жестких дисков для всех адаптеров. Все они должны быть в состоянии "Online":
# megacli -PDList -aALL | grep "Firmware state"

(7.4) Получить внутренний лог всех адаптеров:
# megacli  -AdpEventLog -GetEvents -f events.log -aALL && cat events.log



(8) список важнейших команд (только на английском) вы можете найти здесь.
http://tools.rapidsoft.de/perc/perc-cheat-sheet.html


6. Общий скрипт для контроля за состоянием всех типов RAID.

Создайте скрипт типа того, что приведен ниже. Я свой назвал raid-status.sh и раскопировал по всем серверам. Теперь на любом из моих серверов, команда
# ~/raid-status.sh

сообщает мне о состоянии моих RAID.

#!/bin/sh

# -- for gmirror
if [ -r /dev/mirror/gm0 ] ; then
echo gmirror
gmirror status

# -- for HighPoint RocketRAID 2310
elif [ -r /dev/hptrr ] ; then
echo "HighPoint RocketRAID 2310"
hptraidconf -u RAID -p hpt query arrays

# -- for AMCC 3ware 9650SE-4LP
elif [ -r /dev/twa0 ] ; then
echo "AMCC 3ware 9650SE"
tw_cli /c0 show

# -- For Dell PowerAge 1950 (Perc 5/i, Perc 6/i)
elif [ -r /dev/mfi0 ] ; then
echo "Dell PowerAge 1950 (Perc 5/i, Perc 6/i)"
echo RAID status:
megacli -LDInfo -LALL -aALL | grep "State"
echo DISKS status:
megacli -PDList -aALL | grep "Firmware state"
rm MegaSAS.log
else
echo "unnown RAID or doesn't present anyone"
fi



Примечание:
В процессе обсуждения на форуме всплыли описания утилит для еще двух типов RAID. Вы можете прочитать о них, если перейдете по ссылке, приведенной в нижней части статьи, после слов "Ссылка на обсуждение".
(1) /dev/amr -  утилита для RAID типа Dell Perc и LSI MegaRAID. Предыдущие модели. Полный список можно получить в справке: # man 4 amr
(2) /dev/??? - утилита для RAID комании Areca(Tekram)



размещено: 2009-04-12,
последнее обновление: 2009-04-19,
автор: mvalery


Garick, 2009-04-13 в 16:37:15

404.status-zfs
405.status-ata-raid
406.status-gmirror
407.status-graid3
408.status-gstripe
409.status-gconcat
400.status-disks

/etc/periodic/daily

weec, 2009-04-13 в 23:40:58

ожидается коммитт порта sysutils/megacli
он не будет требовать linux-окружения

genuine, 2009-04-14 в 11:11:23

T0варищщи! Это поля для ввода комментариев к статье, а не для вопросов. Саюда пишите найденные баги, или какие-то фичи :)
Для вопросов есть форум!

LiSergey, 2009-04-14 в 20:20:28

про РЭЙД на HP Smart Array P400 (на отдельных платах или в серверах HP ProLiant)
ставим /usr/ports/sysutils/hpacucli
ему требуется поддержка в ядре
options         COMPAT_FREEBSD5         # Compatible with FreeBSD5

сама утилита вроде может все, но работать с ней крайне неудобно, пришлось набросать скриптец

# cat /usr/local/etc/periodic/daily/check-HP_SmartArray_P400_status.sh
#!/bin/sh

/usr/local/sbin/hpacucli ctrl slot=0 array A show > /root/hp-status 2>/dev/null

cat /root/hp-status | tail -n 8

выдает вот в таком виде

Smart Array P400 in Slot 0
  Array: A
     Interface Type: SAS
     Unused Space: 0 MB
     Status: OK

vp, 2009-04-21 в 16:54:20

Adaptec 5405
arcconf getconfig 1
(arcconf устанавливается с диска или сайта адаптека, и требует compat6x(pkg_add -r compat6x))

Михайло, 2009-05-04 в 15:56:14

"Полуаппаратный" рейд, создаваемый BIOS'ом материнки (довольно распространённый вариант сейчас) удобно мониторить atacontrol'ом:

# atacontrol status ar0
ar0: ATA RAID1 status: READY
subdisks:
  0 ad8  ONLINE
  1 ad10 ONLINE

playnet, 2009-05-13 в 14:10:12

Статья хорошая, респект!
Но хорошо бы еще описать zfs-ный рейд (мега вещь, уже стабилен) и ничего не сказано про Areca, adaptec.

mvalery, 2009-05-13 в 15:22:58

> ничего не сказано про Areca, adaptec
1. Читатель GreenX дал замечательное описание Areca на форуме.
У меня рука не поднялясь копипастить:
http://forum.lissyara.su/viewtopic.php?f=8&t=17197
2. Adaptec не любит FreeBSD. Для каждого конкретного RAID адаптера необходимо проверять - есть ли поддержка FreeBSD.
Год назад, не подумав, я потратил 180$ на модель Adaptec 1420SA. Так и валяется. Больше не хочу инвестировать эту компанию.

mvalery, 2009-05-13 в 15:29:22

P.S. Читатель shlash дал на форуме описание утилиты для Adaptec. Жаль я раньше не заметил.

adre, 2009-07-27 в 7:26:26

как удобно просто делать gvinum list

azimut, 2009-11-24 в 9:49:01

А что, graid3 status и graid5 status уже не котируются?

drTr0jan, 2011-01-29 в 18:05:10

Для HP Smart Array E200i:

alex-jacobson:/etc# cat /etc/daily.local
#!/bin/sh

for raid in `find /dev/ -name 'pass[0-9]*' -type c | cut -d / -f 3`
do
   status=`/sbin/camcontrol inquiry $raid -D`
   rc=`echo $status | grep -v OK | wc -l`
   [ $rc -gt 0 ] && echo -n '> '
   echo $status
done

alex-jacobson:/etc# camcontrol inquiry pass0
pass0: <COMPAQ RAID 1  VOLUME OK> Fixed Direct Access SCSI-5 device
pass0: Serial Number PR81MP8952
pass0: 135.168MB/s transfers, Command Queueing Enabled

arez, 2011-09-30 в 7:44:16

rm MegaSAS.log
можно добавить ключ -NoLog

kot, 2012-11-14 в 13:48:29

Хочу дополнить. Бывают еще mpt-девайсы на пролиантах (у меня DL160G5). Для них существует прекрасная утилита mptutil.
# grep mpt0 /var/run/dmesg.boot
mpt0: <LSILogic SAS/SATA Adapter> port 0xc000-0xc0ff mem 0xfdefc000-0xfdefffff,0xfdee0000-0xfdeeffff irq 48 at device 0.0 on pci10
mpt0: [ITHREAD]
mpt0: MPI Version=1.5.16.0
mpt0: Capabilities: ( RAID-0 RAID-1E RAID-1 )
mpt0: 1 Active Volume (2 Max)
mpt0: 2 Hidden Drive Members (10 Max)
mpt0: mpt_read_cfg_page: Config Info Status 22
mpt0:vol0(mpt0:0:0): mpt_refresh_raid_vol: Failed to read RAID Vol Page(0)
mpt0:vol0(mpt0:0:0): Settings ( )
mpt0:vol0(mpt0:0:0): 0 Members:
mpt0:vol0(mpt0:0:0): RAID-0 - Optimal
(mpt0:0:2): Physical (mpt0:0:2:0), Pass-thru (mpt0:1:0:0)
(mpt0:0:2): Online
(mpt0:0:9): Physical (mpt0:0:9:0), Pass-thru (mpt0:1:1:0)
(mpt0:0:9): Online
da0 at mpt0 bus 0 target 1 lun 0

# mptutil show adapter
mpt0 Adapter:
      Board Name: SAS3042E
  Board Assembly: L3-25006-02D
       Chip Name: C1064E
   Chip Revision: UNUSED
     RAID Levels: RAID0, RAID1, RAID1E
   RAID0 Stripes: 64K
  RAID1E Stripes: 64K
RAID0 Drives/Vol: 2-8
RAID1 Drives/Vol: 2
RAID1E Drives/Vol: 3-8

http://www.freebsd.org/cgi/man.cgi?query=mptutil&sektion=8&manpath=FreeBSD+7.3-stable

CaptainSASH, 2013-09-27 в 20:30:19

Для PERC 5/i Integrated и PERC 6/i Integrated
использую mfiutil

# mfiutil version
mfiutil version 1.0.13

# mfiutil show adapter
mfi0 Adapter:
   Product Name: PERC 5/i Integrated
  Serial Number: 12345
       Firmware: 5.1.1-0040
    RAID Levels: JBOD, RAID0, RAID1, RAID5, RAID10, RAID50
 Battery Backup: present
          NVRAM: 32K
 Onboard Memory: 256M
 Minimum Stripe: 8k
 Maximum Stripe: 128k

# mfiutil show config
mfi0 Configuration: 2 arrays, 2 volumes, 0 spares
   array 0 of 2 drives:
       drive  0 (  136G) ONLINE <SEAGATE ST3146855SS S515 serial=3LN2G34R> SAS
       drive  1 (  136G) ONLINE <SEAGATE ST3146855SS S515 serial=3LN2C5NM> SAS
   array 1 of 2 drives:
       drive  2 (  558G) ONLINE <SEAGATE ST3600057SS ES64 serial=6SL2C93Q> SAS
       drive  3 (  558G) ONLINE <SEAGATE ST3600057SS ES64 serial=6SL2DSPM> SAS
   volume mfid0 (136G) RAID-1 64k OPTIMAL <Virtual Disk 0> spans:
       array 0
   volume mfid1 (558G) RAID-1 64k OPTIMAL <Raid-1-600> spans:
       array 1

# mfiutil show drives
mfi0 Physical Drives:
0 (  136G) ONLINE            <SEAGATE ST3146855SS S515 serial=3LN2G34R> SAS E1:S0
1 (  136G) ONLINE            <SEAGATE ST3146855SS S515 serial=3LN2C5NM> SAS E1:S1
2 (  558G) ONLINE            <SEAGATE ST3600057SS ES64 serial=6SL2C93Q> SAS E1:S2
3 (  558G) ONLINE            <SEAGATE ST3600057SS ES64 serial=6SL2DSPM> SAS E1:S3
4 (  558G) UNCONFIGURED GOOD <SEAGATE ST3600057SS 0008 serial=6SL6QCHY> SAS E1:S4
5 (  558G) UNCONFIGURED GOOD <SEAGATE ST3600057SS 0008 serial=6SL6QQBM> SAS E1:S5

# less /usr/local/etc/periodic/daily/402.status-mfi-raid
#!/bin/sh
#
# From:
# $FreeBSD: src/etc/periodic/daily/406.status-3ware,v 1.1.2.1 2006/03/08 22:56:28 brueffer Exp $
#

# If there is a global system configuration file, suck it in.
#
if [ -r /etc/defaults/periodic.conf ]
then
. /etc/defaults/periodic.conf
source_periodic_confs
fi

case "$daily_status_mfi_enable" in
[Yy][Ee][Ss])
echo
echo 'Checking status of mfi(8) devices:'
echo
/usr/sbin/mfiutil show volumes
echo
/usr/sbin/mfiutil show drives

rc=0
;;

*) rc=0;;
esac

exit $rc

# /usr/local/etc/periodic/daily/402.status-mfi-raid

Checking status of mfi(8) devices:

mfi0 Volumes:
 Id     Size    Level   Stripe  State   Cache   Name
mfid0 (  136G) RAID-1      64k OPTIMAL Enabled  <Virtual Disk 0>
mfid1 (  558G) RAID-1      64k OPTIMAL Enabled  <Raid-1-600>

mfi0 Physical Drives:
0 (  136G) ONLINE            <SEAGATE ST3146855SS S515 serial=3LN2G34R> SAS E1:S0
1 (  136G) ONLINE            <SEAGATE ST3146855SS S515 serial=3LN2C5NM> SAS E1:S1
2 (  558G) ONLINE            <SEAGATE ST3600057SS ES64 serial=6SL2C93Q> SAS E1:S2
3 (  558G) ONLINE            <SEAGATE ST3600057SS ES64 serial=6SL2DSPM> SAS E1:S3
4 (  558G) UNCONFIGURED GOOD <SEAGATE ST3600057SS 0008 serial=6SL6QCHY> SAS E1:S4
5 (  558G) UNCONFIGURED GOOD <SEAGATE ST3600057SS 0008 serial=6SL6QQBM> SAS E1:S5

aleks, 2019-04-27 в 13:03:52

UNCONFIGURED GOOD (FOREIGN) - ? как с етим боротся через mfiutil



 

  Этот информационный блок появился по той простой причине, что многие считают нормальным, брать чужую информацию не уведомляя автора (что не так страшно), и не оставляя линк на оригинал и автора — что более существенно. Я не против распространения информации — только за. Только условие простое — извольте подписывать автора, и оставлять линк на оригинальную страницу в виде прямой, активной, нескриптовой, незакрытой от индексирования, и не запрещенной для следования роботов ссылки.
  Если соизволите поставить автора в известность — то вообще почёт вам и уважение.

© lissyara 2006-10-24 08:47 MSK

Время генерации страницы 0.4316 секунд
Из них PHP: 24%; SQL: 76%; Число SQL-запросов: 86 шт.
Исходный размер: 62876; Сжатая: 14126