#!/usr/bin/ksh93 ################################################################ function usagemsg_vscsiPriority { print " Program: vscsiPriority Description: Script to assign priorty to vscsi paths based on even/odd numbers associated with each disk and each path to disk. This script is useful in a Virtualized environment utilizing VIO servers with MPIO on the client LPAR's. This script provides the system admin with the ability to manually load balance SAN traffic from client LPAR's between dual VIO servers. Usage: ${1##*/} [-?vV] [-s] [-r] [-o] [-i #] Where: -v = Verbose mode -V = Very Verbose Mode -s = Show commands being run -r = Reverse the priority values -i # = Health check interval value (integer) -o = ODM change only for health check interval Author: Dana French (dfrench@mtxia.com) Copyright 2005 \"AutoContent\" enabled " } ################################################################ function vscsiPriority { typeset TRUE="0" typeset FALSE="1" typeset VERBOSE="${FALSE}" typeset VERYVERB="${FALSE}" typeset SHOWCMD="${FALSE}" typeset REVERSE="${FALSE}" typeset ODM="" typeset HCHECK="20" typeset -r EVEN="02468acegikmoqsuwy" typeset -r ODD="13579bdfhjlnprtvxz" while getopts ":vVrsoi#" OPTION do case "${OPTION}" in 'v') VERBOSE="${TRUE}" SHOWCMD="${TRUE}";; 'V') VERYVERB="${TRUE}";; 's') SHOWCMD="${TRUE}";; 'r') REVERSE="${TRUE}";; 'o') ODM="-P";; 'i') HCHECK="${OPTARG}";; '?') usagemsg_vscsiPriority "${0}" && exit 1;; ':') usagemsg_vscsiPriority "${0}" && exit 1;; esac done shift $(( ${OPTIND} - 1 )) ################################################################ trap "usagemsg_vscsiPriority ${0}" EXIT trap "-" EXIT (( VERYVERB == TRUE )) && set -x ################################################################ # Extract the short hostname value and remove any suffixes following a # dash or underscore. typeset -l HNAME=$( hostname ) HNAME="${HNAME%%.*}" HNAME="${HNAME%%[_-]*}" # Define the numeric priority values of ONE and TWO. Allow user to # reverse these values by using the "-r" command line option. ONE="1" TWO="2" (( REVERSE == TRUE )) && ONE="2" TWO="1" # Define the priority levels for highest and lowest priority based on # whether the last digit of the hostname is an even or odd number. P1="${ONE}" P2="${TWO}" [[ "_${HNAME}" == _*[${ODD}] ]] && P1="${TWO}" P2="${ONE}" # Loop through each disk, setting the health check interval and priority # value. for DISK in $( lsdev -Cc disk -F name ) do (( SHOWCMD == TRUE )) && print -n "chdev -l ${DISK} -a hcheck_interval=${HCHECK} ${ODM} # " /usr/sbin/chdev -l ${DISK} -a hcheck_interval=${HCHECK} ${ODM} (( VERBOSE == TRUE )) && print -n "# " && /usr/sbin/lsattr -El ${DISK} -a hcheck_interval case ${DISK} in # Even Numbered disks *[${EVEN}] ) /usr/sbin/lspath -l ${DISK} | while read -r -- JUNK1 JUNK2 PATH do case ${PATH} in # Even numbered paths get highest priority for even numbered disks *[${EVEN}] ) (( SHOWCMD == TRUE )) && print -n -- "chpath -l ${DISK} -p ${PATH} -a priority=${P1} # " /usr/sbin/chpath -l ${DISK} -p ${PATH} -a priority=${P1} (( VERBOSE == TRUE )) && print -n "# " && /usr/sbin/lspath -AEl ${DISK} -p ${PATH} ;; # Odd numbered paths get lower priority for even numbered disks *[${ODD}] ) (( SHOWCMD == TRUE )) && print -n -- "chpath -l ${DISK} -p ${PATH} -a priority=${P2} # " /usr/sbin/chpath -l ${DISK} -p ${PATH} -a priority=${P2} (( VERBOSE == TRUE )) && print -n "# " && /usr/sbin/lspath -AEl ${DISK} -p ${PATH} ;; esac done ;; # Odd Numbered disks *[${ODD}] ) /usr/sbin/lspath -l ${DISK} | while read -r -- JUNK1 JUNK2 PATH do case ${PATH} in # Even numbered paths get lower priority for odd numbered disks *[${EVEN}] ) (( SHOWCMD == TRUE )) && print -n -- "chpath -l ${DISK} -p ${PATH} -a priority=${P2} # " /usr/sbin/chpath -l ${DISK} -p ${PATH} -a priority=${P2} (( VERBOSE == TRUE )) && print -n "# " && /usr/sbin/lspath -AEl ${DISK} -p ${PATH} ;; # Odd numbered paths get highest priority for odd numbered disks *[${ODD}] ) (( SHOWCMD == TRUE )) && print -n -- "chpath -l ${DISK} -p ${PATH} -a priority=${P1} # " /usr/sbin/chpath -l ${DISK} -p ${PATH} -a priority=${P1} (( VERBOSE == TRUE )) && print -n "# " && /usr/sbin/lspath -AEl ${DISK} -p ${PATH} ;; esac done ;; esac done } ################################################################ vscsiPriority "${@}"