#!/bin/sh #---------------------------------------------------------------------------- # /etc/init.d/bonding - create bonding devices # # Creation: 20.10.2004 babel # eisfair version 22.05.2005 jv # Last Update: $Id$ # # Copyright (c) 2005 fli4l/eisfair Team # Copyright (c) 2014-@@YEAR@@ Holger Bruenjes, holgerbruenjes(at)gmx(dot)net # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. #---------------------------------------------------------------------------- . /etc/config.d/base . /etc/config.d/bonding # read functions . /etc/init.d/functions # --------------------------------------------------------------------------- # usage # --------------------------------------------------------------------------- usage() { cat < /run/bonding.pid # load kernelmodul modprobe bonding # read config bond_idx=1 while [ ${bond_idx} -le ${BONDING_N} ] do eval bond_arp_targets='$BONDING_'${bond_idx}'_ARP_IP_TARGET_N' # create device name ndev=$(/usr/bin/expr ${bond_idx} - 1) eval bond_dev_name='bond'$ndev eval bond_devn='$BONDING_'${bond_idx}'_DEV_N' eval bond_downdelay='$BONDING_'${bond_idx}'_DOWNDELAY' eval bond_mac='$BONDING_'${bond_idx}'_MAC' eval bond_miimon='$BONDING_'${bond_idx}'_MIIMON' eval bond_mode='$BONDING_'${bond_idx}'_MODE' eval bond_primary='$BONDING_'${bond_idx}'_PRIMARY' eval bond_updelay='$BONDING_'${bond_idx}'_UPDELAY' eval bond_use_carrier='$BONDING_'${bond_idx}'_USE_CARRIER' eval bond_ipaddr='$BONDING_'${bond_idx}'_IPADDR' eval bond_netmask='$BONDING_'${bond_idx}'_NETMASK' eval bond_gateway='$BONDING_'${bond_idx}'_GATEWAY' # set default if empty : ${bond_arp_targets:=0} : ${bond_downdelay:=0} : ${bond_mac:=''} : ${bond_miimon:=100} : ${bond_updelay:=0} : ${bond_use_carrier:=yes} : ${bond_ipaddr:=''} : ${bond_netmask:=''} : ${bond_gateway:=''} case "${bond_dev_name}" in bond0) : ;; *) echo "+${bond_dev_name}" > /sys/class/net/bonding_masters ;; esac # change in /sys dir cd /sys/class/net/${bond_dev_name}/bonding echo "${bond_mode}" > mode # bond_modparam="mode=$bond_mode" if [ ${bond_downdelay} -ne 0 ] then bond_downdelay=$(/usr/bin/expr ${bond_downdelay} \* ${bond_miimon}) echo "${bond_downdelay}" > downdelay # bond_modparam="$bond_modparam downdelay=$bond_downdelay" fi if [ ${bond_updelay} -ne 0 ] then bond_updelay=$(/usr/bin/expr ${bond_updelay} \* ${bond_miimon}) echo "${bond_updelay}" > updelay # bond_modparam="$bond_modparam updelay=$bond_updelay" fi if [ ${bond_use_carrier} = no ] then echo 0 > use_carrier # [ $bond_use_carrier = no ] && bond_modparam="$bond_modparam use_carrier=0" fi [ ${bond_primary} ] && echo "${bond_primary}" > primary # [ $bond_primary ] && bond_modparam="$bond_modparam primary=$bond_primary" if [ ${bond_mode} = balance-rr \ -o ${bond_mode} = 0 \ -o ${bond_mode} = balance-xor \ -o ${bond_mode} = 2 ] then if [ ${bond_arp_targets} -gt 0 ] then eval bond_arp_interval='$BONDING_'${bond_idx}'_ARP_INTERVAL' : ${bond_arp_interval:=200} echo "${bond_arp_interval}" > arp_interval bond_tmp_ip_targets='' bond_ddx=1 while [ ${bond_ddx} -le ${bond_arp_targets} ] do [ $bond_ddx -gt 1 ] && bond_tmp_ip_targets="${bond_tmp_ip_targets}," eval bond_tmp_ip_target=$\{BONDING_${bond_idx}_ARP_IP_TARGET_${bond_ddx}\} # bond_tmp_ip_targets="${bond_tmp_ip_targets}${bond_tmp_ip_target}" echo "+${bond_tmp_ip_target}" > arp_ip_target bond_ddx=$(/usr/bin/expr $bond_ddx + 1) done # bond_modparam="$bond_modparam arp_interval=$bond_arp_interval arp_ip_target=$bond_tmp_ip_targets" else echo "${bond_miimon}" > miimon # bond_modparam="$bond_modparam miimon=$bond_miimon" fi else echo "${bond_miimon}" > miimon # bond_modparam="$bond_modparam miimon=$bond_miimon" fi if [ ${bond_mode} = active-backup -o ${bond_mode} = 1 ] then [ ${bond_primary} ] && echo "${bond_primary}" > primary # [ ${bond_primary} ] && bond_modparam="${bond_modparam} primary=${bond_primary}" fi if [ ${bond_mode} = 802.3ad -o ${bond_mode} = 4 ] then eval bond_lacp_rate='$BONDING_'${bond_idx}'_LACP_RATE' : ${bond_lacp_rate:=slow} if [ ${bond_lacp_rate} = fast -o ${bond_lacp_rate} = 1 ] then bond_lacp_rate=fast # bond_modparam="${bond_modparam} lacp_rate=fast" fi echo "${bond_lacp_rate}" > lacp_rate fi # load kernelmodul # modprobe bonding $bond_modparam #insmod bonding -o ${bond_dev_name} ${bond_modparam} >/dev/null # set interface parameter if [ -n "${bond_mac}" ] then ifconfig ${bond_dev_name} hw ether ${bond_mac} fi # set ip parameter if missing if [ -z "${bond_ipaddr}" ] then bond_ipaddr="${IP_ETH_1_IPADDR}" fi if [ -z "${bond_netmask}" ] then bond_netmask="${IP_ETH_1_NETMASK}" fi if [ -z "${bond_gateway}" ] then bond_gateway="${IP_DEFAULT_GATEWAY}" fi bond_brc=$(/usr/local/bin/netcalc broadcast ${bond_ipaddr} ${bond_netmask}) #activat bond interface ifconfig ${bond_dev_name} ${bond_ipaddr} netmask ${bond_netmask} broadcast ${bond_brc} up eval bond_devn='$BONDING_'${bond_idx}'_DEV_N' bond_ddx=1 while [ ${bond_ddx} -le ${bond_devn} ] do # putting down the network interface eval ifconfig $\{BONDING_${bond_idx}_DEV_${bond_ddx}\} down # set interface to bonding eval ifenslave ${bond_dev_name} $\{BONDING_${bond_idx}_DEV_${bond_ddx}\} bond_ddx=$(/usr/bin/expr ${bond_ddx} + 1) done # add new default gateway route add default gw ${bond_gateway} bond_idx=$(/usr/bin/expr ${bond_idx} + 1) done # for output # check_bonding_status cat /proc/net/bonding/bond0 >/dev/null 2>&1 evaluate_retval fi } # --------------------------------------------------------------------------- # remove bonding # --------------------------------------------------------------------------- bonding_stop() { if check_bonding_status then boot_mesg " * Stopping Bonding ... " # get count of bond interfaces if [ -f /run/bonding.pid ] then n_idx=$(cat /run/bonding.pid) else n_idx=0 fi bond_idx=1 while [ ${bond_idx} -le ${n_idx} ] do # create device name ndev=$(expr ${bond_idx} - 1) eval bond_dev_name='bond'${ndev} # stop bond device ifconfig ${bond_dev_name} down bond_idx=$(/usr/bin/expr ${bond_idx} + 1) done # remove kernelmodul rmmod bonding evaluate_retval /etc/init.d/ip-eth start /etc/init.d/route start else if [ "$(tty)" != "/dev/console" ] then boot_mesg "Bonding is not runing ... " ${INFO} ${ECHO} -e "${NORMAL}" fi fi rm -f /run/bonding.pid } # --------------------------------------------------------------------------- # restart # --------------------------------------------------------------------------- bonding_restart() { bonding_stop sleep 2 bonding_start } # --------------------------------------------------------------------------- # status # --------------------------------------------------------------------------- bonding_status() { if check_bonding_status then boot_mesg "Bonding is running ..." ${INFO} ${ECHO} -e -n "${NORMAL}" echo "-----------------------------------------------------------------------------" ifconfig bond0 echo "-----------------------------------------------------------------------------" else boot_mesg "Bonding is not running ..." ${INFO} ${ECHO} -e -n "${NORMAL}" fi } # --------------------------------------------------------------------------- # main # --------------------------------------------------------------------------- while [ "${#}" -gt 0 ] do case "${1}" in --quiet) _quiet=true shift ;; *) _action="${1}" shift ;; esac done case "${_action}" in start) bonding_start ;; stop) bonding_stop ;; restart) bonding_restart ;; status) bonding_status ;; forcestart) start_force=true bonding_start ;; *) usage exit 1 ;; esac exit 0 # --------------------------------------------------------------------------- # end # ---------------------------------------------------------------------------