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-20010328"

usage()
{
 echo
 echo "Usage: $PROGNAME [OPTIONS] [ARRAY ...]"
 echo
 echo "Options:"
 cat <<EOF | column -s\& -t
    -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.
 EOF
 echo
}

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