Identificar discos no servidor SuperMicro executando o FreeBSD

8

Estou executando em um servidor SuperMicro 2U com 6 discos no ZPool. Quero identificar cada compartimento de unidade usando o LED Drive Carrier executando um comando de uma ferramenta no FreeBSD. Existe uma maneira de fazer isso?

Sei que as unidades estavam rodando em cima de uma placa RAID, eu poderia usar o utilitário da placa RAID para identificar cada disco, mas, no meu caso, não há invasão de hardware.

Existe uma ferramenta para fazer isso no FreeBSD ou Linux?

Timothy C. Quinn
fonte

Respostas:

3

Para a maioria das minhas soluções ZFS, é melhor você apostar que eu tenho uma tabela e um conjunto de rótulos que identificam unidades pelo SAS WWN parcial . Esta é uma função dos controladores LSI que eu uso, que têm a seguinte redação:

    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

insira a descrição da imagem aqui

Existem algumas opções para fazer isso funcionar. Um deles é o utilitário comercial SMARTmon da SanTools , disponível para OEMs e integradores. Ele aproveita os recursos do SCSI Enclosure Services (SES) em unidades JBOD externas, mas também possui alguma mágica para discos internos.

Você também pode ter uma opção, dependendo do controlador que estiver usando. Você está usando apenas um controlador de placa-mãe ou um HBA SAS não RAID criado especificamente para isso?

ewwhite
fonte
Nota: a notação cXtYdZ é apenas Solaris. A maioria das distribuições Linux possui o diretório / dev / disk / by-id / contendo links simbólicos dos nomes que contêm o WWN para os nomes dos /dev/sdXestilos. Não faço ideia, se o FreeBSD tem algo semelhante.
the-wabbit
Usando placa-mãe como eu estou usando apenas unidades SATA por enquanto. Pode migrar para o SAS em um futuro próximo. Eu também estava pensando em fazer exatamente o que você propõe, que é apenas rotular as baías com adesivos. Parece que mudar para um HBA SAS não RAID dedicado é o caminho a longo prazo. Um com APIs CLI para * nix iria colocar a cereja no topo do bolo;)
Timothy C. Quinn
9

O meio do homem pobre de identificar discos seria emitir um dd if=/dev/daX of=/dev/nulle ver qual LED de atividade do disco está piscando mais rapidamente. Obviamente, isso precisa de um período de baixa atividade para os outros discos do sistema, mas é muito genérico.

Se você tiver um controlador SAS (LSI) com o qual funcionaria sas2ircu, você poderá usá-lo para emitir o comando "display" para listar as unidades disponíveis e seus seriais e, posteriormente, executar o comando "LOCATE" para piscar a luz no gabinete.

o wabbit
fonte
Em vez de "Baixa atividade", é melhor parar todas as E / S desmontando o disco e desligando os trabalhos de patrulha.
Roman
1
sas2ircu FTW! Obrigado, você me salvou. Aliás, eu tenho um LBA HSI de TI com um backplane supermicro de 12 baias com mini-sas únicos. Rodando em supermicro mobo, e3-1230v3, 32gb ecc. executando o FreeNAS 9.3 mais recente. O comando LOCATE piscou no LED vermelho (erro), deixando o LED azul de atividade com a função normal. O comando Display mostra, curiosamente, que o controlador LSI é # 0, mas o gabinete aparece como # 2 (provavelmente os controladores mobo sata 2 e sata 3 são # 0 e # 1, mas isso é conjectura).
Therealstubot
4

Sei que essa é uma pergunta antiga, mas me deu algumas das peças que montei e pensei em revisar o script que criei, já que essa é uma correspondência quase exata com a minha situação: requer sas2ircu : http://www.avagotech.com/docs-and-downloads/host-bus-adapters/host-bus-adapters-common-files/sas_sata_6g_p20/SAS2IRCU_P20.zip e a partir das portas, bash e sg3_utils

Ele faz algumas suposições, acho que o principal é que ele está anexado ao controlador 0. você pode usar sas2ircu listpara identificar o número do seu controlador.

Ele verificará o pool selecionado (via status do zpool). Se não houver erros, ele irá:

  • salve um arquivo (em /root/.sas2ircu/drives) com um mapeamento de nomes de dispositivos nos slots do gabinete
  • desative quaisquer leds ativados anteriormente por este script (este é armazenado em /root/.sas2ircu/locs)

Se houver erros, ele irá:

  • envie um email com a saída completa do status do zpool
  • ative os leds de todas as unidades com falha (e armazene os locais ativados nos locais /root/.sas2ircu para que possam ser desativados posteriormente)

de qualquer maneira aqui está o script. Eu o executo como um trabalho cron de hora em hora.

#! /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
Palesius
fonte
3

Eu não conheço o FreeBSD, mas no Linux, há uma coleção de softwares da Intel chamada ledmon(8)e eu usei o programa userspace ledctl(8)para piscar o LED "localizar" em uma unidade específica no meu SuperMicro SC847E26-RJBOD1 que possui unidades controladas por um HBA LSI SAS3008 (não MegaRAID):

$ sudo ledctl locate=/dev/sdce

Depois que o localizei, apaguei o LED "localizar":

$ sudo ledctl locate_off=/dev/sdce

sgpio(1) é necessário para a comunicação entre o HBA e o backplane.

ja-s
fonte
2

Eu sei que essa é uma pergunta antiga, mas para os pesquisadores que acessam isso, no FreeBSD> = 10.3, você pode sesutil locate da2 onativar o LED da2, desde que esteja em um gabinete que forneça um dispositivo / dev / sesN.

eborisch
fonte
1

Não existe uma interface de software abstrata padronizada para acender o LED do portador da unidade (não o LED de atividade) - isso depende muito do hardware. Isso significa que você ainda precisa das ferramentas do controlador de armazenamento (os utilitários da placa RAID de que você está falando) para enviar os comandos apropriados ao controlador. Como esse software é chamado ou implementado depende, é claro, do fabricante / fornecedor do controlador de armazenamento.

(Não importa se você possui um ataque SW, pois obviamente ainda precisa de um controlador de armazenamento conversando com seu backplane, caddies e unidades.)

Se você estiver usando caddies de unidade de nível empresarial com um controlador barato, poderá não ter sorte.

romano
fonte