Linux et le raid
Voici un petit script bien utile qui permet de diagnostiquer un système raid.
Il fonctionne sous Redhat.
Ce script permet, dans un système raid de savoir si tous les raid sont ok.
Si ce n'est pas le cas, le script donne une succession de commandes à envoyer pour
1/ supprimer le disque déféctueux du raid
2/ re-insérer le nouveau disque dans le raid.
Tous les mdx en service sont scannés.
Seul truc non géré : la reconstruction de la table de partition une fois un nouveau disque inséré.
Attention : ce script est donné à titre indicatif, il faut vérifier les deux scripts générés dans /tmp
/tmp/diag_remove
/tmp/diag_add
avant de les exécuter.
De plus, il faut reformater le disque avant de lancer /tmp/diag_add.
Une autre solution est de lancer les commandes à la main.
if [ "$1" == "" ]; then
echo "" >/tmp/diag_remove
echo "" >/tmp/diag_add
cat /proc/mdstat | grep "(F)" >/tmp/mdstat.diag
wc=`wc /tmp/mdstat.diag | awk '{print $1}'`
if [ "$wc" == "0" ]; then
echo "Raid status ok"
else
echo "Raid status : defect !"
./raid_diagnostic `cat /tmp/mdstat.diag`
fi
else
diag_md=/dev/$1
if [ "$1" == "enum" ]; then
diag_md=$2
diag_disk=$3
cat /proc/mdstat | grep "^md" | awk '{print $1}' | xargs -l -i ./raid_diagnostic enum_1 $diag_disk {}
else
if [ "$1" == "enum_1" ]; then
raid_line=`cat /proc/mdstat | grep "^$3"`
for item in $raid_line; do
if (echo "$item" | grep "$2" >/dev/null) ; then
v=`echo $item | sed "s/[/ /g" | awk '{print $1}'`
echo " raidhotremove /dev/$3 /dev/$v" >> /tmp/diag_remove
echo " raidhotadd /dev/$3 /dev/$v" >> /tmp/diag_add
a=1
fi
done
else
echo $diag_md is in bad state.1
while [ "$1" != "" ]; do
if (echo "$1" | grep "(F)"); then
echo "Faulty : $1"
diag_disk=`echo "$1" | sed "s/[/ /g" | awk '{print $1}'`
diag_disk=`echo $diag_disk | sed "s/[01234]/ /g"`
echo " Suggested commands for removing the disk:"
./raid_diagnostic enum $diag_md $diag_disk
# echo " either ./raid_remove $diag_disk"
cat /tmp/diag_remove | sort
chmod +x /tmp/diag_remove
echo
echo " Suggested commands for re-adding the disk:"
cat /tmp/diag_add | sort
chmod +x /tmp/diag_add
fi
shift
done
fi
fi
fi
Il fonctionne sous Redhat.
Ce script permet, dans un système raid de savoir si tous les raid sont ok.
Si ce n'est pas le cas, le script donne une succession de commandes à envoyer pour
1/ supprimer le disque déféctueux du raid
2/ re-insérer le nouveau disque dans le raid.
Tous les mdx en service sont scannés.
Seul truc non géré : la reconstruction de la table de partition une fois un nouveau disque inséré.
Attention : ce script est donné à titre indicatif, il faut vérifier les deux scripts générés dans /tmp
/tmp/diag_remove
/tmp/diag_add
avant de les exécuter.
De plus, il faut reformater le disque avant de lancer /tmp/diag_add.
Une autre solution est de lancer les commandes à la main.
if [ "$1" == "" ]; then
echo "" >/tmp/diag_remove
echo "" >/tmp/diag_add
cat /proc/mdstat | grep "(F)" >/tmp/mdstat.diag
wc=`wc /tmp/mdstat.diag | awk '{print $1}'`
if [ "$wc" == "0" ]; then
echo "Raid status ok"
else
echo "Raid status : defect !"
./raid_diagnostic `cat /tmp/mdstat.diag`
fi
else
diag_md=/dev/$1
if [ "$1" == "enum" ]; then
diag_md=$2
diag_disk=$3
cat /proc/mdstat | grep "^md" | awk '{print $1}' | xargs -l -i ./raid_diagnostic enum_1 $diag_disk {}
else
if [ "$1" == "enum_1" ]; then
raid_line=`cat /proc/mdstat | grep "^$3"`
for item in $raid_line; do
if (echo "$item" | grep "$2" >/dev/null) ; then
v=`echo $item | sed "s/[/ /g" | awk '{print $1}'`
echo " raidhotremove /dev/$3 /dev/$v" >> /tmp/diag_remove
echo " raidhotadd /dev/$3 /dev/$v" >> /tmp/diag_add
a=1
fi
done
else
echo $diag_md is in bad state.1
while [ "$1" != "" ]; do
if (echo "$1" | grep "(F)"); then
echo "Faulty : $1"
diag_disk=`echo "$1" | sed "s/[/ /g" | awk '{print $1}'`
diag_disk=`echo $diag_disk | sed "s/[01234]/ /g"`
echo " Suggested commands for removing the disk:"
./raid_diagnostic enum $diag_md $diag_disk
# echo " either ./raid_remove $diag_disk"
cat /tmp/diag_remove | sort
chmod +x /tmp/diag_remove
echo
echo " Suggested commands for re-adding the disk:"
cat /tmp/diag_add | sort
chmod +x /tmp/diag_add
fi
shift
done
fi
fi
fi
Publicité