linux网卡绑定脚本

2013-08-20 15:30:51

此脚本适用于CentOS5.x和CentOS6.x。

#!/bin/bash
#********************************************
#   Copyright (c) Beijing DaoWoo Times Technology Co., Ltd. 2011
#
#   Author      : Wu XuLei (wuxulei@daowoo.com)
#   FILE        : bonding.sh
#   USAGE       : bonding.sh -h
#   DESCRIPTION : A script that will bond the network adapters.
#   REQUIREMENTS: 
#                 1) The network adapters is available.  
#                 2) Please run the script in the console.               
#   HISTORY     :
#       09/26/2011 Wu XuLei written
#********************************************
usage()
{
        cat <<-END >&2
usage: ${0##*/} -i IPv4 -g IPv4-GATEWAY [ -n NETMASK ] [ -b BOND-NAME ] [ -m BOND-MODE ] [ -e ETHS ]
                         [ -I IPv6 ] [ -G IPv6-GATEWAY ] [ -r ] [ -f ] -h
   -i  IPv4             The local IPv4 address is a necessary option.
   -g  GATEWAY          Gateway is a necessary option.
   -n  NETMASK          The default netmask is 255.255.255.0 .
   -b  BOND-NAME        The default bond name is bond0.
   -m  BOND-MODE        The optional bond mode is 0 1 2 3 4 5 6.
   -e  ETHS             The network adapters will be bonded,the default is eth0 and eth1.
   -I  IPv6             The local IPv6 addresss.
   -G  IPv6-GATEWAY     The IPv6 gateway.
   -r                   To clear the all original network configuration.
   -f                   After running the script,reboot the host.
   -h                   Display this help and exit.
   eg: ${0##*/} -i 192.168.1.1 -g 192.168.31.254 -n 255.255.240.0 -b bond0 -m 6 -e "eth0 eth1 eth2"
                        -k -I 2001:da8:3000::183 -G 2001:da8:3000::1
END
exit $E_OPTERROR
}

#Defined function error
error()
{
error_num=$1
case $error_num in
        1)
        echo "You must specify -$pm parameter!" ;;
        2)
        echo "" ;;
        3)
        echo "Invalid IP address!" ;;
        4)
        echo "The cluster subnet mask is not valid. A subnet mask must be contiguous. Enter a valid subnet mask." ;;
        5)
        echo "The optional bond mode must be among 0,1,2,3,4,5 and 6." ;;
        6)
        echo "No such network adapter $eth." ;;
        7)
        echo "Name must be composed by uppercase and lowercase letters, numbers, dots and underscores, and the length of name ca
n not exceed 32 characters." ;;
        8)
        echo "The bond name $bn cat not be in network adapters $eths!" ;;
        9)
        echo "The value of -$Option parameter cat not be null!" ;;
        \*) usage ;;
esac
echo "Try '${0##*/} -h' for more information."
exit $error_num
}

nm=255.255.255.0
bn=bond0
bm=6    
eths="eth0 eth1"
f_flag=0 r_flag=0
#Parameter confirmation
while getopts "i:g:n:b:m:e:I:G:fhr" Option
do      
  case $Option in
    i)  ip=$OPTARG ;;
    g)  gw=$OPTARG ;;
    n)  nm=$OPTARG ;;
    b)  bn=$OPTARG ;;
    m)  bm=$OPTARG ;;
    e)  eths="$OPTARG" ;;
    I)  ipv6="$OPTARG" ;;
    G)  ipv6_gw="$OPTARG" ;;
    f)  f_flag=1;;
    h)  usage ;;
    r)  r_flag=1 ;;
    \?) usage ;;   # DEFAULT
  esac
done

#The nummber of parameters can not be zero.
[ $# -eq 0 ] && usage
ipv4_v()
{
        [ $# -eq 0 ] && echo "Please input IP." && exit 1
        for IP in $*
        do
                [ `echo $IP|awk -v RS='.' 'END{print NR-1}'` -ne 3 ] && error 3
                for i in `echo $IP | awk -F "." '{print $1, $2, $3, $4}'`
                do
                        echo $i|grep "^[0-9]*$" > /dev/null || error 3
                done
                echo $IP | awk -F "." '{if($1<=223&&$1>0&&$2<=255&&$2>=0&&$3<=255&&$3>=0&&$4<=255&&$4>=1&&NF=4){exit 0}else {exi
t 1}}' || error 3
        done
}   
    
nm_v()  
{   
        [ $# -ne 1 ] && error 4
        IP=$1
        [ `echo $IP|awk -v RS='.' 'END{print NR-1}'` -eq 3 ] || error 4
        echo $IP | awk -F "." '{if($1<=223&&$1>0&&$2<=255&&$2>=0&&$3<=255&&$3>=0&&$4<=255&&$4>=1&&NF=4){exit 0}else {exit 1}}'
        IP1=`echo $IP|awk -F "." {'print $1'}`
        IP2=`echo $IP|awk -F "." {'print $2'}`
        IP3=`echo $IP|awk -F "." {'print $3'}`
        IP4=`echo $IP|awk -F "." {'print $4'}`
        num1=`echo "obase=2;$IP1"|bc|awk '{printf "%08d\n",$0}'`
        num2=`echo "obase=2;$IP2"|bc|awk '{printf "%08d\n",$0}'`
        num3=`echo "obase=2;$IP3"|bc|awk '{printf "%08d\n",$0}'`
        num4=`echo "obase=2;$IP4"|bc|awk '{printf "%08d\n",$0}'`
        num=$num1$num2$num3$num4
        flag1=1 
        flag2=1 
        NUM=`echo $num|wc -m`
        for (( i=0;i<`expr $NUM - 1`;i++ ))
        do 
                if [ `echo ${num:$i:1}` -eq 1 ];then
                        [ $flag1 -eq $flag2 ] || error 4
                fi
                [ `echo ${num:$i:1}` -eq 0 ] && flag2=0
        done
}
name_v()
{
        [ $# -ne 1 ] && error 7
        STRING=$1
        [ `echo $STRING|wc -c` -gt 32 ] && error 7
        if test "$(expr "${STRING}" : "[A-Za-z0-9_.]*")" -ne "$(expr length "${STRING}")" ; then
                error 7
        fi
}

[ -z $ip ] && pm="i" && error 1
[ -z $gw ] && pm="g" && error 1
ipv4_v $ip
ipv4_v $gw
nm_v $nm
echo $bn|grep "bond[0-9]" > /dev/null || exit 1
if [ ! -z $ipv6 ];then
        [ ! -f ip_v.pl ] && echo "No such file ip_v.pl" && exit 1
        which perl > /dev/null 2>&1 || exit 1
        perl ip_v.pl $ipv6
        [ $? -ne 6 ] && error 3
        if [ ! -z $ipv6_gw ];then
                perl ip_v.pl $ipv6_gw
                [ $? -ne 6 ] && error 3
        fi
else
        [ ! -z $ipv6_gw ] && echo "You must specify -I parameter!" && exit 1
fi      
        
[ `echo $bm|wc -m` -eq 2 ] && echo $bm|grep "^[0-6]$" > /dev/null 2>&1 || error 5
for eth in $eths
do              
        ifconfig -a|grep $eth > /dev/null 2>&1 || error 6
done
echo "$eths"|grep $bn > /dev/null 2>&1 && error 8

#To modify the modprobe.conf
cat /etc/modprobe.conf |grep "alias $bn bonding" > /dev/null 2>&1
if [ $? -eq 0 ];then
        sed -i "s/.*alias $bn bonding.*$/alias $bn bonding/g" /etc/modprobe.conf
else
        echo "alias $bn bonding" >> /etc/modprobe.conf
fi      
cat /etc/modprobe.conf |grep "options $bn" > /dev/null 2>&1
if [ $? -eq 0 ];then
        sed -i "s/^options $bn.*$/options $bn miimon=100 mode=$bm/g" /etc/modprobe.conf
else
        echo "options $bn miimon=100 mode=$bm" >> /etc/modprobe.conf
fi
echo "/etc/modprobe.conf:"
cat /etc/modprobe.conf

for i in $eths
do
        rm -f /etc/sysconfig/network-scripts/ifcfg-$i
done

#To set bond
echo "DEVICE=$bn" > /etc/sysconfig/network-scripts/ifcfg-$bn
echo "BOOTPROTO=static" >> /etc/sysconfig/network-scripts/ifcfg-$bn
echo "ONBOOT=yes" >> /etc/sysconfig/network-scripts/ifcfg-$bn
echo "IPADDR=$ip" >> /etc/sysconfig/network-scripts/ifcfg-$bn
echo "GATEWAY=$gw" >> /etc/sysconfig/network-scripts/ifcfg-$bn
echo "NETMASK=$nm" >> /etc/sysconfig/network-scripts/ifcfg-$bn
echo "TYPE=Ethernet" >> /etc/sysconfig/network-scripts/ifcfg-$bn
#echo "USERCTL=no" >> /etc/sysconfig/network-scripts/ifcfg-$bn
if [ ! -z $ipv6 ] ;then
        echo "IPV6INIT=yes" >> /etc/sysconfig/network-scripts/ifcfg-$bn
        echo "IPV6ADDR=$ipv6" >> /etc/sysconfig/network-scripts/ifcfg-$bn
        echo "IPV6PREFIX=64" >> /etc/sysconfig/network-scripts/ifcfg-$bn
        echo "IPV6_AUTOCONF=no" >> /etc/sysconfig/network-scripts/ifcfg-$bn
        grep NETWORKING_IPV6 /etc/sysconfig/network > /dev/null
        if [ $? -eq 0 ];then
                sed -i "s/NETWORKING_IPV6=no/NETWORKING_IPV6=yes/" /etc/sysconfig/network
        else
                echo NETWORKING_IPV6=yes >> /etc/sysconfig/network
        fi
fi
[ ! -z $ipv6_gw ] && echo "IPV6_DEFAULTGW=$ipv6%$bn" >> /etc/sysconfig/network-scripts/ifcfg-$bn
echo    
echo "ifcfg-$bn:"
cat /etc/sysconfig/network-scripts/ifcfg-$bn
#To set eth
for i in $eths
do
        echo "DEVICE=$i" > /etc/sysconfig/network-scripts/ifcfg-$i
        echo "BOOTPROTO=none" >> /etc/sysconfig/network-scripts/ifcfg-$i
        echo "ONBOOT=yes" >> /etc/sysconfig/network-scripts/ifcfg-$i
        echo "MASTER=$bn" >> /etc/sysconfig/network-scripts/ifcfg-$i
        echo "SLAVE=yes" >> /etc/sysconfig/network-scripts/ifcfg-$i
        echo "TYPE=Ethernet" >> /etc/sysconfig/network-scripts/ifcfg-$i
#       echo "USERCTL=no" >> /etc/sysconfig/network-scripts/ifcfg-$i
        echo
        echo "ifcfg-$i:"
        cat /etc/sysconfig/network-scripts/ifcfg-$i
done


#解除原有bond
if [ ! -z "`ls /sys/class/net`" ];then
        for i in `ls /sys/class/net`
        do
                [ ! -d "/sys/class/net/$i" ] || [ "$i" == lo ] || [ "$i" == sit0 ] && break
                j="`cat /sys/class/net/$i/bonding/slaves 2> /dev/null`"
                if [ -z "$j" ] ;then
                        if [ `echo $i|grep bond` ]  && [ $i != $bn ];then
                                ifdown $i down
                                rm -f /etc/sysconfig/network-scripts/ifcfg-$i
                                sed -i "/.*alias $i bonding.*$/d" /etc/modprobe.conf
                                sed -i "/^options $i.*$/d" /etc/modprobe.conf
                        fi
                        continue
                fi
                if [ "$i" == "$bn" ] ;then
                        for k in $j
                        do
                                if [ ! "`echo $eths|grep $k`" ];then
                                        echo "DEVICE=$k" > /etc/sysconfig/network-scripts/ifcfg-$k
                                        echo "BOOTPROTO=none" >> /etc/sysconfig/network-scripts/ifcfg-$k
                                        echo "ONBOOT=no" >> /etc/sysconfig/network-scripts/ifcfg-$k
                                        echo "TYPE=Ethernet" >> /etc/sysconfig/network-scripts/ifcfg-$k
                                        #echo "USERCTL=no" >> /etc/sysconfig/network-scripts/ifcfg-$k
                                fi
                        done
                else
                        for k in $eths
                        do
                                j="`echo $j|sed "s/$k//g"`"
                                l="`echo $j|sed "s/ //g"`"
                                if [ -z "$l" ];then
                                        ifdown $i down 
                                        rm -f /etc/sysconfig/network-scripts/ifcfg-$i
                                        sed -i "/.*alias $i bonding.*$/d" /etc/modprobe.conf
                                        sed -i "/^options $i.*$/d" /etc/modprobe.conf
                                        break
                                fi
                        done
                fi
        done    
fi                      
                        
if [ $r_flag -eq 1 ];then       
        for i in `ifconfig -a|grep bond|awk {'print $1'}`
        do  
                if [ $i != $bn ];then
                        ifconfig $i down
                        rm -f /etc/sysconfig/network-scripts/ifcfg-$i
                        sed -i "/.*alias $i bonding.*$/d" /etc/modprobe.conf
                        sed -i "/^options $i.*$/d" /etc/modprobe.conf
                fi
        done
        for i in `ifconfig -a|grep eth|awk {'print $1'}`
        do
                e_flag=0
                for j in $eths
                do
                        if [ $i == $j ];then
                                e_flag=1 && break
                        fi
                done
                if [ $e_flag -eq 0 ];then
                        echo "DEVICE=$i" > /etc/sysconfig/network-scripts/ifcfg-$i
                        echo "BOOTPROTO=none" >> /etc/sysconfig/network-scripts/ifcfg-$i
                        echo "ONBOOT=no" >> /etc/sysconfig/network-scripts/ifcfg-$i
                        echo "USERCTL=no" >> /etc/sysconfig/network-scripts/ifcfg-$i
                echo "TYPE=Ethernet" >> /etc/sysconfig/network-scripts/ifcfg-$i
                fi
                echo "ifcfg-$i:"
                cat /etc/sysconfig/network-scripts/ifcfg-$i
        done    
fi                      
                        
chkconfig NetworkManager off
service NetworkManager stop 
chkconfig network on
service network restart
        
if [ $f_flag -eq 1 ] ;then
        echo -e "\033[40;31mThe host will reboot.\033[0m"
        reboot &
else            
        echo -e "\033[40;31mPlease reboot the host.\033[0m"
fi                              
echo "The network adapters have been bonded."
exit 0  

 

 

 

posted @ 2013-08-20 15:38 吴绪磊 阅读(...) 评论(...) 编辑 收藏