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

Boris HUISGEN
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
Boris HUISGEN
Boris HUISGEN
Blog owner
  • #linux
  • #gentoo
  • #raid
  • #mdadm