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