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?
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
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?
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.
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:
S'il y a des erreurs, il sera:
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