Linux : script de vérification des périphériques RAID pour Gentoo

Boris HUISGEN
|
Ce script shell permet de lancer une vérification des périphériques RAID (mdadm).
Il est largement inspiré du script checkarray écrit par Martin F. Krafft (intégré à la distribution Debian).
#!/bin/sh
#
# mdcheck.sh
#
# Boris HUISGEN <bhuisgen@hbis.fr>
#
set -eu
PROGNAME=${0##*/}
VERSION="0.1-20110328"
usage()
{
echo "
Usage: $PROGNAME [OPTIONS] [ARRAY ...]
Options:
-a|--all check all assembled arrays.
-s|--status show status of arrays.
-x|--cancel cancel a running redundancy check.
-h|--help show this output.
-v|--version show version information."
}
version()
{
echo "$PROGNAME version $VERSION"
}
SHORTOPTS=asxhv
LONGOPTS=all,status,cancel,help,version
eval set -- $(getopt -o $SHORTOPTS -l $LONGOPTS -n $PROGNAME -- "$@")
arrays=''
all=0
status=0
action=check
for opt in $@; do
case "$opt" in
-a|--all) all=1;;
-s|--status) action=status;;
-x|--cancel) action=idle;;
-h|--help) usage; exit 0;;
-v|--version) version; exit 0;;
/dev/md/*|md/*) arrays="${arrays:+$arrays }md${opt#*md/}";;
/dev/md*|md*) arrays="${arrays:+$arrays }${opt#/dev/}";;
/sys/block/md*) arrays="${arrays:+$arrays }${opt#/sys/block/}";;
--) :;;
*) echo "$PROGNAME: invalid option: $opt" >&2; usage; exit 0;;
esac
done
if [ ! -f /proc/mdstat ]; then
echo "$PROGNAME: MD subsystem not loaded, or /proc unavailable." >&2
exit 1
fi
if [ ! -d /sys/block ]; then
echo "$PROGNAME: /sys filesystem not available." >&2
exit 2
fi
if [ -z "$(ls /sys/block/md* 2>/dev/null)" ]; then
echo "$PROGNAME: no active MD arrays found." >&2
exit 3
fi
if [ -z "$(ls /sys/block/md*/md/level 2>/dev/null)" ]; then
echo "$PROGNAME: kernel too old, no support for redundancy checks." >&2
exit 4
fi
if ! egrep -q '^raid([1456]|10)$' /sys/block/md*/md/level 2>/dev/null; then
echo "$PROGNAME: no redundant arrays present." >&2
exit 5
fi
if [ -z "$(ls /sys/block/md*/md/sync_action 2>/dev/null)" ]; then
echo "$PROGNAME: no kernel support for redundancy checks." >&2
exit 6
fi
[ $all = 1 ] && arrays="$(ls -d1 /sys/block/md* | cut -d/ -f4)"
for array in $arrays; do
SYNC_ACTION_CTL=/sys/block/$array/md/sync_action
if [ ! -e $SYNC_ACTION_CTL ]; then
echo "$PROGNAME: skipping non-redundant array $array." >&2
continue
fi
cur_status="$(cat $SYNC_ACTION_CTL)"
if [ $action = status ]; then
echo "$array: $cur_status"
continue
fi
if [ ! -w $SYNC_ACTION_CTL ]; then
echo "$PROGNAME: $SYNC_ACTION_CTL not writeable." >&2
exit 7
fi
if [ "$(cat /sys/block/$array/md/array_state)" = 'read-auto' ]; then
echo "$PROGNAME: array $array in auto-read-only state, skipping." >&2
continue
fi
case "$action" in
check)
if [ "$cur_status" != idle ]; then
echo "$PROGNAME: array $array not idle, skipping." >&2
continue
fi
echo $action > $SYNC_ACTION_CTL
echo "$PROGNAME: check queued for array $array."
;;
idle)
echo $action > $SYNC_ACTION_CTL
echo "$PROGNAME: cancel request queued for array $array."
;;
esac
done
exit 0