web-dev-qa-db-fra.com

Identifiez les disques sur Supermicro Server exécutant FreeBSD

Je cours sur un serveur SuperMicro 2U avec 6 disques dans un Zpool. Je souhaite identifier chaque baie d'entraînement à l'aide de la conduite d'entraînement de l'exécution d'une commande d'un outil de FreeBSD. Y a-t-il un moyen de faire cela?

Je sais que si les lecteurs fonctionnaient sur une carte RAID, je pourrais utiliser l'utilitaire de carte RAID pour identifier chaque disque, mais dans mon cas, il n'y a pas de raid matériel.

Y a-t-il un outil pour le faire dans FreeBSD ou Linux?

8
Timothy C. Quinn

Pour la plupart de mes solutions ZFS, vous pouvez mieux parier que j'ai une table et un ensemble d'étiquettes identifiant des lecteurs par leur partiel SAS WWN . Ceci est une fonction des contrôleurs LSI que j'utilise, qui se lisent comme:

    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

enter image description here

Il y a quelques options pour que cela fonctionne. L'un est l'utilitaire commercial Santools Smartmon Utility qui est disponible pour les OEM et les intégrateurs. Il exploite les fonctions SCSI Enfiler Services (SES) Caractéristiques des unités JBOD externes, mais a également une magie pour les disques internes.

Vous pouvez également avoir une option en fonction du contrôleur que vous utilisez. Utilisez-vous simplement un contrôleur de la carte mère ou un non-raid intégré à des fins SAS HBA?

3
ewwhite

Les moyens de l'homme pauvre d'identifier des disques seraient d'émettre un dd if=/dev/daX of=/dev/null et voir le voyant d'activité du disque clignote le plus rapidement. Ceci a bien sûr besoin d'une période d'activité faible pour les autres disques du système, mais est très générique.

Si vous avez un (LSI) SAS contrôleur fonctionnant avec sas2ircu Ensuite, vous pouvez l'utiliser pour émettre la commande "Afficher" pour répertorier les lecteurs disponibles et leurs séries et exécuter ensuite la commande "localiser" pour clignoter la lumière sur l'enceinte.

9
the-wabbit

Je sais que c'est une vieille question, mais cela m'a donné quelques-unes des pièces que j'ai rassemblées et je pensais que je tirai le script que j'ai proposé, car c'est une correspondance presque exacte à ma situation: elle nécessite SAS2IRCU : http://www.avagotech.com/docs-and-tadownloads/host-bus-adapters/host-bus-adapters-commmon-files/sas_sata_6g_p20/sasata_6g_p20/sasata_6g_p20.zip Et des ports, bash et sg3_utils

Il fait quelques hypothèses, je pense que le principal est qu'il est attaché au contrôleur 0. Vous pouvez utiliser sas2ircu list Pour identifier votre numéro de contrôleur.

Il vérifiera le pool sélectionné (via Zpool Statut). S'il n'y a pas d'erreur, ce sera:

  • enregistrez un fichier (à /root/.sas2irco/drives) avec une cartographie des noms de périphérique aux emplacements de boîtier
  • éteignez les voyants précédemment activés par ce script (ceci est stocké dans /root/.sas2ircogr/locs)

S'il y a des erreurs, il sera:

  • envoyer un email avec la sortie complète de l'état Zpool
  • activez les voyants de tout disque en échec (et stockez les emplacements activés dans /root/.sas2ircu locs afin qu'ils puissent être désactivés ultérieurement)

de toute façon voici le script. Je l'exécute comme un travail de cron horaire.

#! /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
4
palesius