make mdraid check script really check to see of the rootfs is on an

mdraid block device when run in hostonly mode.
master
Victor Lowther 2009-08-16 15:29:27 -05:00
parent dc670134f8
commit 62bde8ed7e
1 changed files with 32 additions and 5 deletions

View File

@ -3,11 +3,38 @@
# No mdadm? No mdraid support.
which mdadm >/dev/null 2>&1 || exit 1

# We were asked to run in hostonly mode, so pass the check only if there
# is an mdraid volume in use somewhere. This should really check to see if
# root is on an mdraid volume only, but I am lazy.
if [[ $1 = -h ]]; then
blkid | grep -q linux_raid || exit 1
is_mdraid() { /lib/udev/vol_id /dev/block/$1 |egrep -q '(linux|isw)_raid'; }

check_block_and_slaves() (
# $1 = block device in major:minor format
local x
cd /sys/dev/block/$1
[[ -b /dev/block/$1 ]] || return 1 # Not a block device? So sorry.
is_mdraid $1 && return
[[ -d slaves ]] || return 1 # there are no underlying devices, done.
# we want to search the tree breadthwise, so...
for x in slaves/*/dev; do
is_mdraid $(cat "$x") && return 0
done
for x in slaves/*/dev; do
check_block_and_slaves $(cat "$x") && return 0
done
return 1
)

if [[ $1 = '-h' ]] ; then
rootdev=''
while read blkdev fs type opts misc; do
[[ $blkdev = rootfs ]] && continue # skip rootfs entry
[[ $fs = / ]] && { rootdev=$blkdev; break; }
done < /proc/mounts
[[ -b $rootdev ]] || exit 1 # Not on a block device? Definitly not mdraid.
# get major/minor for the device
majmin=$(ls -nLl "$rootdev" | \
(read x x x x maj min x; maj=${maj//,/}; echo $maj:$min))
# now, walk backwards though our master/slave relationships looking
# for a mdraid device
check_block_and_slaves $majmin || exit 1
fi

exit 0