1*4882a593Smuzhiyun#!/bin/bash 2*4882a593Smuzhiyun# 3*4882a593Smuzhiyun# multipathd Starts the multipath daemon 4*4882a593Smuzhiyun# 5*4882a593Smuzhiyun# chkconfig: - 06 87 6*4882a593Smuzhiyun# description: Manages device-mapper multipath devices 7*4882a593Smuzhiyun 8*4882a593Smuzhiyun### BEGIN INIT INFO 9*4882a593Smuzhiyun# Provides: multipathd 10*4882a593Smuzhiyun# Required-Start: 11*4882a593Smuzhiyun# Required-Stop: 12*4882a593Smuzhiyun# Default-Start: 13*4882a593Smuzhiyun# Default-Stop: 14*4882a593Smuzhiyun# Short-Description: Control multipathd 15*4882a593Smuzhiyun# Description: This service monitors and manages 16*4882a593Smuzhiyun# device-mapper multipath devices 17*4882a593Smuzhiyun### END INIT INFO 18*4882a593Smuzhiyun 19*4882a593SmuzhiyunDAEMON=/sbin/multipathd 20*4882a593Smuzhiyunprog=`basename $DAEMON` 21*4882a593Smuzhiyuninitdir=/etc/init.d 22*4882a593Smuzhiyunlockdir=/var/lock/subsys 23*4882a593Smuzhiyunsysconfig=/etc/sysconfig 24*4882a593Smuzhiyunsyspath=/sys/block 25*4882a593Smuzhiyun 26*4882a593SmuzhiyunRETVAL=0 27*4882a593Smuzhiyun 28*4882a593Smuzhiyunteardown_slaves() 29*4882a593Smuzhiyun{ 30*4882a593Smuzhiyunpushd $1 > /dev/null 31*4882a593Smuzhiyunif [ -d "slaves" ]; then 32*4882a593Smuzhiyunfor slave in slaves/*; 33*4882a593Smuzhiyundo 34*4882a593Smuzhiyun if [ "$slave" = "slaves/*" ]; then 35*4882a593Smuzhiyun read dev < $1/dev 36*4882a593Smuzhiyun tablename=`dmsetup table --target multipath | sed -n "s/\(.*\): .* $dev .*/\1/p"` 37*4882a593Smuzhiyun if ! [ -z $tablename ]; then 38*4882a593Smuzhiyun echo "Root is on a multipathed device, multipathd can not be stopped" 39*4882a593Smuzhiyun exit 1 40*4882a593Smuzhiyun fi 41*4882a593Smuzhiyun else 42*4882a593Smuzhiyun local_slave=`readlink -f $slave`; 43*4882a593Smuzhiyun teardown_slaves $local_slave; 44*4882a593Smuzhiyun fi 45*4882a593Smuzhiyun done 46*4882a593Smuzhiyun 47*4882a593Smuzhiyunelse 48*4882a593Smuzhiyun read dev < $1/dev 49*4882a593Smuzhiyun tablename=`dmsetup table --target multipath | sed -n "s/\(.*\): .* $dev .*/\1/p"` 50*4882a593Smuzhiyun if ! [ -z $tablename ]; then 51*4882a593Smuzhiyun echo "Root is on a multipathed device, multipathd can not be stopped" 52*4882a593Smuzhiyun exit 1 53*4882a593Smuzhiyun fi 54*4882a593Smuzhiyunfi 55*4882a593Smuzhiyunpopd > /dev/null 56*4882a593Smuzhiyun} 57*4882a593Smuzhiyun 58*4882a593Smuzhiyun# 59*4882a593Smuzhiyun# See how we were called. 60*4882a593Smuzhiyun# 61*4882a593Smuzhiyun 62*4882a593Smuzhiyunstart() { 63*4882a593Smuzhiyun test -x $DAEMON || exit 5 64*4882a593Smuzhiyun echo -n $"Starting $prog daemon: " 65*4882a593Smuzhiyun start-stop-daemon --start --quiet --exec $DAEMON 66*4882a593Smuzhiyun RETVAL=$? 67*4882a593Smuzhiyun [ $RETVAL -eq 0 ] && touch $lockdir/$prog 68*4882a593Smuzhiyun echo 69*4882a593Smuzhiyun} 70*4882a593Smuzhiyun 71*4882a593Smuzhiyunforce_stop() { 72*4882a593Smuzhiyun echo -n $"Stopping $prog daemon: " 73*4882a593Smuzhiyun killall $DAEMON 74*4882a593Smuzhiyun RETVAL=$? 75*4882a593Smuzhiyun [ $RETVAL -eq 0 ] && rm -f $lockdir/$prog 76*4882a593Smuzhiyun echo 77*4882a593Smuzhiyun} 78*4882a593Smuzhiyun 79*4882a593Smuzhiyunstop() { 80*4882a593Smuzhiyun root_dev=$(awk '{ if ($1 !~ /^[ \t]*#/ && $2 == "/") { print $1; }}' /etc/mtab) 81*4882a593Smuzhiyun dm_num=`dmsetup info -c --noheadings -o minor $root_dev 2> /dev/null` 82*4882a593Smuzhiyun if [ $? -eq 0 ]; then 83*4882a593Smuzhiyun root_dm_device="dm-$dm_num" 84*4882a593Smuzhiyun [ -d $syspath/$root_dm_device ] && teardown_slaves $syspath/$root_dm_device 85*4882a593Smuzhiyun fi 86*4882a593Smuzhiyun 87*4882a593Smuzhiyun force_stop 88*4882a593Smuzhiyun} 89*4882a593Smuzhiyun 90*4882a593Smuzhiyunrestart() { 91*4882a593Smuzhiyun stop 92*4882a593Smuzhiyun start 93*4882a593Smuzhiyun} 94*4882a593Smuzhiyun 95*4882a593Smuzhiyunforce_restart() { 96*4882a593Smuzhiyun force_stop 97*4882a593Smuzhiyun start 98*4882a593Smuzhiyun} 99*4882a593Smuzhiyun 100*4882a593Smuzhiyunreload() { 101*4882a593Smuzhiyun echo -n "Reloading $prog: " 102*4882a593Smuzhiyun trap "" SIGHUP 103*4882a593Smuzhiyun killall $DAEMON -s SIGHUP -v 104*4882a593Smuzhiyun RETVAL=$? 105*4882a593Smuzhiyun echo 106*4882a593Smuzhiyun} 107*4882a593Smuzhiyun 108*4882a593Smuzhiyuncase "$1" in 109*4882a593Smuzhiyunstart) 110*4882a593Smuzhiyun start 111*4882a593Smuzhiyun ;; 112*4882a593Smuzhiyunstop) 113*4882a593Smuzhiyun stop 114*4882a593Smuzhiyun ;; 115*4882a593Smuzhiyunforce-stop) 116*4882a593Smuzhiyun force_stop 117*4882a593Smuzhiyun ;; 118*4882a593Smuzhiyunforce-reload|reload) 119*4882a593Smuzhiyun reload 120*4882a593Smuzhiyun ;; 121*4882a593Smuzhiyunrestart) 122*4882a593Smuzhiyun restart 123*4882a593Smuzhiyun ;; 124*4882a593Smuzhiyunforce-restart) 125*4882a593Smuzhiyun force_restart 126*4882a593Smuzhiyun ;; 127*4882a593Smuzhiyuncondrestart|try-restart) 128*4882a593Smuzhiyun if [ -f $lockdir/$prog ]; then 129*4882a593Smuzhiyun restart 130*4882a593Smuzhiyun fi 131*4882a593Smuzhiyun ;; 132*4882a593Smuzhiyunstatus) 133*4882a593Smuzhiyun if pidof -o %PPID $DAEMON > /dev/null; then 134*4882a593Smuzhiyun echo "Running" 135*4882a593Smuzhiyun RETVAL=0 136*4882a593Smuzhiyun else 137*4882a593Smuzhiyun echo "Not running" 138*4882a593Smuzhiyun RETVAL=1 139*4882a593Smuzhiyun fi 140*4882a593Smuzhiyun ;; 141*4882a593Smuzhiyun*) 142*4882a593Smuzhiyun echo $"Usage: $0 {start|stop|force-stop|status|restart|force-restart|condrestart|reload}" 143*4882a593Smuzhiyun RETVAL=2 144*4882a593Smuzhiyunesac 145*4882a593Smuzhiyun 146*4882a593Smuzhiyunexit $RETVAL 147