On Wed, Aug 04, 2010 at 10:54:48AM -0700, Mike Vallaly wrote:
> Sorry for the lateness in my reply. Just stumbled across this
> thread.. ;)
> 
> Part of the problem with MPIO in linux with two (or more) interfaces
> connected to the same Ethernet segment is "arp flux". Essentially all
> traffic will by default only exit out one path (mac address) on a
> multi-homed network. The fix for this is to explicitly tie the
> interface to a route rule which ensures traffic leaves via the
> interface the application intended.
> 
> Here is the script we use in Debian to properly set the interface
> routes for MPIO with equallogic. (IE: /etc/scripts/san-interface)
> 

Uhm, why not just use open-iscsi 'ifaces' feature to bind each 
iscsi iface/session to specific ethernet interface?

-- Pasi

> <snip>
> #!/bin/bash
> 
> # Michael Vallaly (Feb 2008)
> 
> # This script configures local interfaces for use CNU's MP-IO iSCSI
> SAN Network
> # NOTE: This script may be called from /etc/network/interfaces without
> parameters
> 
> SAN_NETWORKS="10.99.99.0/24"
> SAN_MTU="9000"
> 
> IP_BIN="/bin/ip"
> ETHTOOL_BIN="/usr/sbin/ethtool"
> 
> ########################################################################################
> 
> # Check for required binaries
> for req_bin in $IP_BIN $ETHTOOL_BIN; do
>   if [ ! -x "$req_bin" ]; then
>     echo "Can't execute ${req_bin}! Aborting.."
>     exit 1
>   fi
> done
> 
> usage="Usage: $0 -i <interface> -m <add/del>"
> 
> while getopts "i:m:" options; do
>   case $options in
>     i ) interfaces+=" $OPTARG";;
>     m ) action=$OPTARG;;
>     \? ) echo $usage
>          exit 1;;
>      * ) echo $usage
>           exit 1;;
>   esac
> done
> 
> # Check for ifup/down enviornment variables
> if [[ -n $MODE && -n $IFACE ]]; then
>    interfaces=$IFACE
>    action=$MODE
> fi
> 
> # Figure out what we are doing
> case $action in
>    start ) action="add";;
>      add ) action="add";;
>     stop ) action="del";;
>      del ) action="del";;
>        * ) echo $usage
>            exit 1;;
> esac
> 
> for interface in $interfaces; do
> 
>   # Check that the interface exists before we go playing with it
>   if ! ($IP_BIN addr |egrep -nqe "inet.*$interface" && $IP_BIN link |
> egrep -nqe "$interface.*,UP"); then
>     continue
>   fi
>   table_num=$((`echo ${interface} |tr -d [[:alpha:]]` + 10))
>   interface_ip=`$IP_BIN route show scope link proto kernel dev $
> {interface} |awk '{print $3}'`
> 
>   if [ $table_num -gt 252 ]; then
>     echo "Invalid SAN interface (${table_num}) specified!"
>     exit 1
>   fi
> 
>   for network in $SAN_NETWORKS; do
> 
>     # Configure our remote SAN networks
> 
>     localnet=`$IP_BIN route |grep "${interface}  proto kernel" |cut -
> d" " -f1`
>     existing_san_iface=`$IP_BIN route show ${network} |grep -we "via" |
> awk '{print $5}'`
> 
>     # Don't add networks if they are locally connected
>     if [[ "$localnet" == "$network" ]]; then
>       continue
>     else
> 
>       # Set our default gateway for remote networks
>       local=`echo $localnet |cut -d. -f1-3`
> 
>       if [[ "$action" == "add" ]]; then
> 
>         # Create a unique route table
>         $IP_BIN route add ${localnet} dev ${interface} table $
> {table_num}
>         $IP_BIN route add ${network} via ${local}.1 dev ${interface}
> table ${table_num}
>         $IP_BIN rule add from ${interface_ip}/32 lookup ${table_num}
>         route_match=`echo $existing_san_iface $interface |tr -t ' '
> '\n'|sort -u`
> 
>       else
> 
>         # Delete the route table
>         $IP_BIN rule del from ${interface_ip}/32 lookup ${table_num}
> 2> /dev/null
>         route_match=`echo $existing_san_iface $interface |tr -t ' '
> '\n'|sort -u |grep -v ${interface}`
> 
>       fi
> 
>       # Generate required next hops
>       route_opt=""
>       for dev in $route_match; do
>         route_opt="$route_opt nexthop via ${local}.1 dev ${dev}"
>       done
> 
>       # Cleanup default route
>       $IP_BIN route del ${network} via ${local}.1 2> /dev/null
> 
>       # Add/ReAdd the default route
>       if [ "${route_opt}" != "" ]; then
>         eval $IP_BIN route add ${network} scope global ${route_opt}
>       fi
> 
>     fi
> 
>   done
> 
>   # Flush the routing cache
>   $IP_BIN route flush cache
> 
>   # Configure our local network interfaces
>   # Configure our local network interfaces
> 
>   if [[ "$action" == "add" ]]; then
> 
>     # Set the proper MTU for the network interface (note this may take
> the interface offline!)
>     if [ "$($IP_BIN link show $interface |grep "mtu" |cut -d" " -f
> 5)" != "9000" ]; then
>       $IP_BIN link set $interface mtu $SAN_MTU
>     fi
> 
>     # Force flowcontrol on
>     $ETHTOOL_BIN --pause $interface autoneg off rx on tx on
> 
>     # Only ARP for local interface
>     echo "1" > /proc/sys/net/ipv4/conf/${interface}/arp_ignore
> 
> else
> 
>     # Set the proper MTU for the network interface (note this may take
> the interface offline!)
>     if [ "$($IP_BIN link show $interface |grep "mtu" |cut -d" " -f 5)"
> == "9000" ]; then
>        $IP_BIN link set $interface mtu 1500
>     fi
> 
>     # Force flowcontrol autoneg
>     $ETHTOOL_BIN --pause $interface autoneg on
> 
>     # ARP for any interface
>     echo "0" > /proc/sys/net/ipv4/conf/${interface}/arp_ignore
> 
> fi
> 
> done
> 
> </snip>
> 
> You can then add something similar to this in your /etc/network/
> interface file:
> 
> <snip>
> # The First SAN interface
> iface eth1 inet static
>    address 10.99.99.100
>    netmask 255.255.255.0
>    post-up /etc/scripts/san-interface
>    pre-down /etc/scripts/san-interface
> 
> # The Second SAN interface
> iface eth2 inet static
>    address 10.99.99.101
>    netmask 255.255.255.0
>    post-up /etc/scripts/san-interface
>    pre-down /etc/scripts/san-interface
> 
> </snip>
> 
> Cheers..
> 
> -Mike
> 
> 
> -- 
> You received this message because you are subscribed to the Google Groups 
> "open-iscsi" group.
> To post to this group, send email to [email protected].
> To unsubscribe from this group, send email to 
> [email protected].
> For more options, visit this group at 
> http://groups.google.com/group/open-iscsi?hl=en.
> 

-- 
You received this message because you are subscribed to the Google Groups 
"open-iscsi" group.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to 
[email protected].
For more options, visit this group at 
http://groups.google.com/group/open-iscsi?hl=en.

Reply via email to