Определите диски на сервере SuperMicro, на котором работает FreeBSD

Я работаю на сервере SuperMicro 2U с 6 дисками в ZPool. Я хочу идентифицировать каждый отсек для дисков, используя индикатор Drive Carrier при запуске команды из инструмента во FreeBSD. Есть ли способ сделать это?

Я знаю, если бы диски работали поверх карты Raid, я мог бы использовать утилиту карты raid для идентификации каждого диска, но в моем случае аппаратного рейда нет.

Есть ли инструмент для этого во FreeBSD или Linux?

6 ответов

Решение

Для большинства моих решений ZFS лучше поспорить, что у меня есть таблица и набор меток, идентифицирующих диски по их частичной SAS WWN. Это функция используемых мной контроллеров LSI, которая выглядит следующим образом:

    NAME                        STATE     READ WRITE CKSUM
    vol1                        ONLINE       0     0     0
      mirror-0                  ONLINE       0     0     0
        c10t50000393482B340Cd0  ONLINE       0     0     0
        c10t50000393482B4CF0d0  ONLINE       0     0     0
      mirror-1                  ONLINE       0     0     0
        c10t50000393482B4DB4d0  ONLINE       0     0     0
        c10t50000393482BAB48d0  ONLINE       0     0     0
      mirror-2                  ONLINE       0     0     0
        c10t50000393482BDA68d0  ONLINE       0     0     0
        c10t500003935803910Cd0  ONLINE       0     0     0

введите описание здесь

Есть несколько вариантов, чтобы заставить это работать. Одним из них является коммерческая утилита SanTools SMARTmon, доступная для OEM-производителей и интеграторов. Он использует функции SCSI Enclosure Services (SES) во внешних блоках JBOD, но имеет некоторое волшебство и для внутренних дисков.

У вас также может быть опция в зависимости от используемого контроллера. Вы просто используете контроллер материнской платы или специализированную SAS HBA без RAID?

Средства идентификации бедного человека заключаются в том, чтобы выдать dd if=/dev/daX of=/dev/null и посмотрите, какой индикатор активности диска мигает наиболее быстро. Это, конечно, требует периода низкой активности для других дисков в системе, но это очень общий характер.

Если у вас есть (LSI) контроллер SAS, который будет работать с sas2ircu затем вы можете использовать ее для выдачи команды "display" для вывода списка доступных дисков и их серийных номеров, а затем выполнить команду "LOCATE", чтобы мигать индикатор на корпусе.

Я знаю, что это старый вопрос, но он дал мне несколько кусочков, которые я собрал, и я подумал, что переверну сценарий, который придумал, так как это почти точное совпадение с моей ситуацией: требуется sas2ircu.: http://www.avagotech.com/docs-and-downloads/host-bus-adapters/host-bus-adapters-common-files/sas_sata_6g_p20/SAS2IRCU_P20.zip и из портов, bash и sg3_utils

Это делает несколько предположений, я думаю, что главное состоит в том, что он подключен к контроллеру 0. Вы можете использовать sas2ircu list определить номер вашего контроллера.

Он проверит выбранный пул (через статус zpool). Если ошибок нет, он будет:

  • сохраните файл (в /root/.sas2ircu/drives) с отображением имен устройств в слоты корпуса
  • отключите любые светодиоды, ранее активированные этим скриптом (они хранятся в /root/.sas2ircu/locs)

Если есть ошибки, это будет:

  • отправить письмо с полным выводом статуса zpool
  • активируйте светодиоды любых неисправных дисков (и сохраните местоположения, которые активируются в /root/.sas2ircu locs, чтобы впоследствии их можно было деактивировать)

в любом случае вот сценарий. Я запускаю это как почасовую работу cron.

#! /usr/local/bin/bash
if [ ! "$1" ]; then
  echo "Usage: zpscan.sh pool [email]"
  echo "Scan a pool, send email notification and activate leds of failed drives"
  exit
fi
if [ ! -d /root/.sas2ircu ]; then
  mkdir /root/.sas2ircu
  touch /root/.sas2ircu/drives
  touch /root/.sas2ircu/locs
fi
if [ "$2" ]; then
  email="$2"
else
  email="root"
fi
condition=$(/sbin/zpool status $1 | egrep -i '(DEGRADED|FAULTED|OFFLINE|UNAVAIL|REMOVED|FAIL|DESTROYED|corrupt|cannot|unrecover)')
if [ "${condition}" ]; then
  emailSubject="`hostname` - ZFS pool - HEALTH fault"
  mailbody=$(zpool status $1)
  echo "Sending email notification of degraded zpool $1"
  echo "$mailbody" | mail -s "Degraded Zpool $1 on hostname" $email
  drivelist=$(zpool status $1 | grep -E "(DEGRADED|FAULTED|OFFLINE|UNAVAIL|REMOVED|FAIL|DESTROYED)" | grep -vE "^\W+($1|NAME|mirror|logs|spares)" | sed -E $'s/.*was \/dev\/([0-9a-z]+)/\\1/;s/^[\t  ]+([0-9a-z]+)[\t ]+.*$/\\1/')
  echo "Locating failed drives."
  for drive in $drivelist;
  do
  record=$(grep -E "^$drive" /root/.sas2ircu/drives)
  location=$(echo $record | cut -f 3 -d " ")
  echo Locating: $record
  sas2ircu 0 locate $location ON
  if [ ! "$(egrep $location /root/.sas2ircu/locs)" ]; then
  echo $location >> /root/.sas2ircu/locs
  fi
  done
else
  echo "Saving drive list."
  drivelist=$(zpool status $1 | grep -E $'^\t  ' | grep -vE "^\W+($1|NAME|mirror|logs|spares)" | sed -E $'s/^[\t ]+//;s/([a-z0-9]+).*/\\1/')
  saslist=$(sas2ircu 0 display)
  printf "" > /root/.sas2ircu/drives
  for drive in $drivelist;
  do
  sasaddr=$(sg_vpd -i -q $drive 2>/dev/null | sed -E '2!d;s/,.*//;s/  0x//;s/([0-9a-f]{7})([0-9a-f])([0-9a-f]{4})([0-9a-f]{4})/\1-\2-\3-\4/')
  encaddr=$(echo "$saslist" | grep $sasaddr -B 2 | sed -E 'N;s/^.*: ([0-9]+)\n.*: ([0-9]+)/\1:\2/')
  echo $drive $sasaddr $encaddr >> /root/.sas2ircu/drives
  done

  for loc in $(cat /root/.sas2ircu/locs);
  do
  sas2ircu 0 locate $loc OFF
  done
  printf "" > /root/.sas2ircu/locs
fi

  for loc in $(cat /root/.sas2ircu/locs);
  do
  sas2ircu 0 locate $loc OFF
  done
  printf "" > /root/.sas2ircu/locs
fi

Я знаю, что это старый вопрос, но для тех, кто ищет его, во FreeBSD >= 10.3 вы можете использовать sesutil locate da2 on чтобы включить светодиод da2, если он находится в корпусе, который обеспечивает устройство /dev/sesN.

Я не знаю о FreeBSD, но в Linux есть набор программного обеспечения от Intel под названием ledmon(8) и я использовал пользовательскую программу ledctl(8) чтобы мигать светодиод "Определить местонахождение" на определенном диске в моем SuperMicro SC847E26-RJBOD1, который имеет диски, управляемые HBA LSI SAS3008 (не MegaRAID):

$ sudo ledctl locate=/dev/sdce

Затем, как только я его нашел, я выключил светодиод "найти":

$ sudo ledctl locate_off=/dev/sdce

sgpio(1) требуется для связи между HBA и объединительной платой.

Нет стандартного абстрактного программного интерфейса для подсветки индикатора Drive Carrier (не индикатора активности) - это зависит от аппаратного обеспечения. Это означает, что вам все еще нужны инструменты контроллера хранилища (утилиты raid-карт, о которых вы говорите), чтобы отправлять соответствующие команды контроллеру. То, как это программное обеспечение вызывается или реализуется, конечно, зависит от производителя / поставщика контроллера хранилища.

(Неважно, что у вас есть SW raid на месте, поскольку вам, очевидно, все еще нужен контроллер хранилища, взаимодействующий с вашей объединительной платой, дисками и дисками.)

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

Другие вопросы по тегам