Redécouverte LUN sans redémarrer
Ce script ne date pas d'hier, mais il est tellement pratique et fonctionne encore dans ma production pour redécouvrir des LUN à chaud (sans redémarrer le serveur) sous Linux (testé de RedHat 4.7 à 5.5).
Je me suis largement inspiré de la documentation de RedHat Scanning Storage Interconnects et les deux lignes qui font le boulot sont celles-ci :
echo "1" > /sys/class/fc_host/host/issue_lip
echo "- - -" > /sys/class/scsi_host/hosth/scan
Voici le reste du script, qui tient compte du logiciel / pilote de multipathing EMC² PowerPath :
#!/bin/sh
#
# AUTEUR : SGT Virtual Thom
# VERSION : 1.0
# DATE : 10/12/2010
#
# set -n # Decommenter pour debug syntax sans exécution
# NOTE: Ne pas oublier de recommenter !
# set -x # Decommenter pour debug
#
##########################################################
# VARIABLES
##########################################################
OK=0
KOCRIT=1
KOWARN=2
CR=${OK}
args="$*"
date_du_jour=`date +"%d_%m_%Y"`
tmpavant="/tmp/powermtavant"
tmpemcavant="/tmp/emcavant"
tmpemcapres="/tmp/emcapres"
tmpapres="/tmp/powermtapres"
##########################################################
# FONCTIONS
##########################################################
date_heure(){
date_heure_var=`date +"%d/%m/%Y - %H:%M:%S : "`
echo "${date_heure_var}$1"
}
fonc_sortie(){
numero_exit=$1
message_exit=$2
date_heure "${message_exit}"
date_heure "Fin du script. Exit : ${numero_exit}"
exit ${numero_exit}
}
usage(){
# exemple d'usage
script=${0##*/} ;
#script=${script%.*} ;
echo "" ;
echo "NE FONCTIONNE QUE POUR LES OS LINUX TYPE REDHAT"
echo "${script} - permet de decouvrir de nouvelles LUNs sans redemarrer le serveur"
echo ""
echo "Usage :" ;
echo " ${script}"
echo " Pas de parametre."
echo ""
echo ""
# echo " ${script} [options]" ;
# echo "" ;
# echo "Liste des options :" ;
# echo "" ;
# echo "Parametres Caracteristiques Valeurs / Formats Valeurs par def" ;
# echo "------------- ------------------------------- ------------------- ---------------" ;
# echo " /help (ou -h) pour afficher l'aide" ;
# echo " /all (ou -a) pour tous les serveurs" ;
# echo " /server (ou -s) specifie le serveur | localhost" ;
}
##########################################################
# SCRIPT
##########################################################
help=`echo $args | grep help`
if test -n "$help"
then
usage && fonc_sortie $KOWARN
fi
powermt display dev=all > $tmpavant
for var in $(ls /sys/class/fc_host/host*/issue_lip); do echo "1" > $var ; done || CR=$KOCRIT
for var in $(ls /sys/class/scsi_host/host*/scan) ; do echo "- - -" > $var ; done || CR=$KOCRIT
powermt check
powermt config
powermt save
powermt display dev=all > $tmpapres || CR=$KOCRIT
cat $tmpavant | grep "emcpower" | cut -d"=" -f2 | sort > $tmpemcavant || CR=$KOCRIT
cat $tmpapres | grep "emcpower" | cut -d"=" -f2 | sort > $tmpemcapres || CR=$KOCRIT
while read apres
do
i="false"
while read avant
do
if test "$avant" == "$apres"
then
i="true"
break
fi
done < $tmpemcavant
if test "$i" != "true"
then
powermt display dev="$apres"
fi
done < $tmpemcapres || CR=$KOCRIT
rm $tmpavant $tmpapres $tmpemcavant $tmpemcapres
fonc_sortie "$CR"