Bonding

From openSUSE


WARNING!!!

This page is old and should not be used for current versions of SUSE Linux. Please see the following pages for more up-to-date information:

NOTE: 'current versions' is pretty close to meaningless. Just what does this mean it terms of openSUSE versions. Since we shouldn't throw away this info, what versions can these instructions be applied to?

http://support.novell.com/techcenter/sdb/en/2004/09/tami_sles9_bonding_setup.html
http://www.novell.com/coolsolutions/feature/17605.html

Load balance and failover with two network adapters

  • First you have to configure the same ip address on both network interfaces:
yast lan
  • You have to announce the new bond device to the kernel:
echo "alias bond0 bonding" >> /etc/modprobe.conf.local
  • Then you should reboot your system:
reboot
  • Create a new startup script calling /etc/init.d/bond:
cd /etc/init.d
touch bond
chmod 755 bond
vi bond
  • Paste the following into this bond file:
#! /bin/sh
# Copyright (c) 2002-2006 bpm consult ag, CH-Birsfelden. All rights reserved.
#               <support@bpm.ch>
#
### BEGIN INIT INFO
# Provides:          bond
# Required-Start:    $network
# Required-Stop:
# Default-Start:     3 5
# Default-Stop:
# Short-Description: bonding
# Description:       load balancing between two or more ethernet interfaces
# Version:           1.0.2  08.02.2006
### END INIT INFO
#
# init.d/bond
 
logfile="/var/log/bond.log"
ifs=""
ifcounter=0
for if in `ifconfig | cut -c1-5 | grep "^eth"`
do
  ifs="$ifs $if"
  ifcounter=`expr $ifcounter + 1`
done
if [ $ifcounter -le 1 ]
then
   echo "not enough interfaces for bonding"
   exit 1
fi
. /etc/rc.status
rc_reset
case "$1" in
  start)   # start bonding:
           echo -n "create bond interface "
           date > $logfile
           ip=`ifconfig eth0 | grep "inet addr" | cut -d":" -f2 | cut -d" " -f1`
           bc=`ifconfig eth0 | grep "inet addr" | cut -d":" -f3 | cut -d" " -f1`
           nm=`ifconfig eth0 | grep "inet addr" | cut -d":" -f4 | cut -d" " -f1`
           gw=`netstat -rn | grep ^0 | cut -c17-32`
           ifconfig bond0 $ip netmask $nm broadcast $bc >> $logfile 2>> $logfile
           rc_status -v
           echo -n "start bonding "
           ifenslave bond0 $ifs >> $logfile 2>> $logfile
           route add -net default gw $gw bond0
           rc_status -v
           ;;
  stop)    # stop bonding:
           echo -n "remove bond interface "
           date > $logfile
           ifconfig bond0 down >> $logfile 2>> $logfile
           rc_status -v
           echo -n "reactivate ethernet interfaces "
           for if in $ifs
           do
             ifconfig $if up >> $logfile 2>> $logfile
           done
           rc_status -v
           ;;
  status)  # check bonding:
           if [ `ifconfig | grep "^bond0" | wc -l` -eq 1 ]
           then
             echo "bond interface is loaded"
             mac=`ifconfig | grep "^bond0" | cut -c39-`
             for if in $ifs
             do
               if [ `ifconfig | grep "^$if" | cut -c39-` == $mac ]
               then
                 echo "$if used in bond0"
               fi
             done
           else
             echo "bonding is disabled"
           fi
           ;;
  *)       # invalid option:
           echo "error: invalid argument"
           echo "usage: $0 {start|stop|status}"
           exit 1
           ;;
esac
rc_exit
  • This will bind all interfaces on the machine to bond0. To bind specific interfaces remove the following:
for if in `ifconfig | cut -c1-5 | grep "^eth"`
do
  ifs="$ifs $if"
  ifcounter=`expr $ifcounter + 1`
done

and change:

ifs=""

to

ifs="{the interfaces you wish to bond}"

and

ifcounter=0

to

ifcounter={the number of interfaces to be bound} 

If your interfaces to be bound to bond0 do not include eth0 then these lines need to be edited also:

ip=`ifconfig eth0 | grep "inet addr" | cut -d":" -f2 | cut -d" " -f1`
bc=`ifconfig eth0 | grep "inet addr" | cut -d":" -f3 | cut -d" " -f1`
nm=`ifconfig eth0 | grep "inet addr" | cut -d":" -f4 | cut -d" " -f1`

Just change eth0 to the first interface to be bound in your list of $ifs.

  • Finally you can start the network bonding:
./bond start
create bond interface                                             done
start bonding                                                     done
./bond status
bond interface is loaded
eth0 used in bond0
eth1 used in bond0
  • To start it automatically at system start, use the following command:
insserv -d bond