• 企业400电话
  • 微网小程序
  • AI电话机器人
  • 电商代运营
  • 全 部 栏 目

    企业400电话 网络优化推广 AI电话机器人 呼叫中心 网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    Linux双网卡绑定脚本的方法示例

    linux运维及配置工作中,常常会用到双网卡绑定,少数几台服务器的配置还好,如果是需要配置几十甚至上百台,难免会枯燥乏味,易于出错,我编写了这个双网卡绑定的辅助脚本,可傻瓜式地完成linux双网卡绑定工作,当然,该脚本主要还是用于小批量的系统配置,如需配置大量的服务器,可提取脚本中的bonding函数,稍作修改即可,你值得一试!

    1.适用范围

    该shell脚本可在以下linux系统创建多个绑定网卡,用于生产环境没问题的:

    2.脚本特点

    ----------------------------------------------
    ------ Network Configuration Assistant ------
    ----------------------------------------------
    
    The information you have entered:
    
    First NIC   :eth0
    Second NIC  :eth1
    bond name   :bond1
    IP address  :192.168.56.11
    netmask    :255.255.255.0
    bonding_mode :mode=1
    primary NIC  :none
    ----------------------------------------------
    
    Pls make sure its OK[y/n]:y
    

    如上,脚本在使用过程中,会依次提示输入需要绑定的子网卡名称、绑定网卡名称、IP地址和子网掩码、绑定模式、是否指定主网卡,并主动对系统中可用网卡进行识别并列出,供用户选择,同时会判断输入的各项信息的正确性,保障双网卡绑定顺利进行。

    3.使用说明

    首先将脚本上传至linux系统任意目录下,使用root用户执行:

    [root@node1 tmp]# sh bonding_v2.0.sh 
    
    ----------------------------------------------
    ------ Network Configuration Assistant ------
    ----------------------------------------------
    
     
    4 network cards available:
    eth0 eth1 eth2 eth3
    ----------------------------------------------
    
    Please enter the First NIC:_
    

    首先脚本会列出系统中有多少可用网卡,并提示输入需要绑定的第一块子网卡的名称,这里输入eth2。

    无需担心输入错误,输入重复等问题,脚本会自动判断你的输入信息是否正确。

    ----------------------------------------------
    ------ Network Configuration Assistant ------
    ----------------------------------------------
    
    4 network cards available:
    eth0 eth1 eth2 eth3
    
    The information you have entered:
    First NIC   : eth2
    ----------------------------------------------
    
    Please select the second NIC:_
    
    

    接着输入需要绑定的第二块网卡的名称eth3,如果输入错误会出现相应的提示,比如错输入为eth8,会提示需要重新输入:

    ----------------------------------------------
    ------ Network Configuration Assistant ------
    ----------------------------------------------
    
    4 network cards available:
    eth0 eth1 eth2 eth3
    
    The information you have entered:
    First NIC   : eth2
    ----------------------------------------------
    
    eth8 is not available,Please enter another one.
    
    Please select the second NIC:_
    
    

    正确输入需要绑定的第二块网卡eth3后,如果linux系统中之前不存在绑定网卡,则默认第一个绑定网卡的名称为bond0,如果系统中存在绑定网卡,脚本会提示输入bondN(N为数字):

    ----------------------------------------------
    ------ Network Configuration Assistant ------
    ----------------------------------------------
    
    The information you have entered:
    First NIC   : eth2
    Second NIC  : eth3
    bond name   : bond0
    ----------------------------------------------
    
    The default first bond name is -- bond0.
    
    Please enter an IP address:_
    
    

    按照提示输入需要绑定的IP地址,比如10.1.1.1

    脚本会自动判断输入的IP地址格式和范围是否正确,无需担心输入错误

    ----------------------------------------------
    ------ Network Configuration Assistant ------
    ----------------------------------------------
    
    The information you have entered:
    First NIC   : eth2
    Second NIC  : eth3
    bond name   : bond0
    IP address  : 10.1.1.1
    ----------------------------------------------
    
    Pls enter the NETMASK[255.255.255.0]:_
    
    

    输入IP地址后,会提示输入子网掩码,默认为255.255.255.0,直接回车即可,也可以输入自定义的子网掩码。

    ----------------------------------------------
    ------ Network Configuration Assistant ------
    ----------------------------------------------
    
    The information you have entered:
    First NIC   : eth2
    Second NIC  : eth3
    bond name   : bond0
    IP address  : 10.1.1.1
    netmask    : 255.255.255.0
    ----------------------------------------------
    
    Pls enter the bonding_mode[default:mode=1,active-backup]:_
    
    

    这一步是输入网卡绑定级别,默认使用主备模式:mode=1,直接回车即可,也可以输入自定义的绑定级别(如输入 mode=6),格式为:

    mode={0,1,2,3,4,5,6}
    
    ----------------------------------------------
    ------ Network Configuration Assistant ------
    ----------------------------------------------
    
    The information you have entered:
    
    First NIC   :eth2
    Second NIC  :eth3
    bond name   :bond0
    IP address  :10.1.1.1
    netmask    :255.255.255.0
    bonding_mode :mode=1
    ----------------------------------------------
    
    1-eth2
    2-eth3
    3-none
    choose whether to set up the primary NIC or not[default:3-none]:_
    
    

    此时脚本提示是否设置primary网卡,primary网卡的作用是在子网卡均正常时,primary网卡优先处于活动状态,这里默认为不设置primary网卡,也可以输入数字1或2选择一个网卡为primary网卡。

    ----------------------------------------------
    ------ Network Configuration Assistant ------
    ----------------------------------------------
    
    The information you have entered:
    
    First NIC   :eth2
    Second NIC  :eth3
    bond name   :bond0
    IP address  :10.1.1.1
    netmask    :255.255.255.0
    bonding_mode :mode=1
    primary NIC  :none
    ----------------------------------------------
    
    Pls make sure its OK[y/n]:_
    
    

    至此,所有信息输入完毕,脚本会让您判断输入的所有信息是否正确,正确则输入y,进行下一步操作,否则输入n,重新输入以上信息。

    ----------------------------------------------
    ------ Network Configuration Assistant ------
    ----------------------------------------------
    
    Complete!
    File backup directory: /etc/sysconfig/network-scripts/inspur_bak
    
    you can check the file and then restart the network service.
    
    1 ) service network restart
    2 ) exit
    ----------------------------------------------
    Please make your choice:_
    
    

    看到这里时,所有绑定网卡的配置文件已经修改完毕了,输入1重启网络服务;输入2直接退出脚本。

    建议选择重启网络服务,如果直接退出脚本而不重启网络服务,修改的配置文件是不会生效的,并且在使用该脚本创建下一个绑定网卡时显示信息会出现异常(因为脚本通过ifconfig命令获取当前网卡信息)。

    you can check the file and then restart the network service.
    
    1 ) service network restart
    2 ) exit
      ----------------------------------------------
    Please make your choice:1
    正在关闭接口 eth0:                    [确定]
    正在关闭接口 eth1:                    [确定]
    正在关闭接口 eth2:                    [确定]
    正在关闭接口 eth3:                    [确定]
    关闭环回接口:                       [确定]
    弹出环回接口:                       [确定]
    弹出界面 bond0: RTNETLINK answers: File exists
    在 bond0 添加地址 10.1.1.1 时出错。
                                  [确定]
    弹出界面 eth0:                      [确定]
    弹出界面 eth1:                      [确定]
    
    

    第一次重启网络服务时可能会出现以上类似报错,无需担心,其实配置已经完成,再次重启网络服务即恢复正常。

    在绑定过程中修改的配置文件如下:

    [root@node1 tmp]# cd /etc/sysconfig/network-scripts/
    [root@node1 network-scripts]# cat ifcfg-bond0 
    DEVICE=bond0
    BOOTPROTO=none
    ONBOOT=yes
    TYPE=Ethernet
    USERCTL=no
    IPV6INIT=no
    PEERDNS=yes
    IPADDR=10.1.1.1
    NETMASK=255.255.255.0
    BONDING_OPTS="miimon=100 mode=1"
    
    [root@node1 network-scripts]# cat ifcfg-eth2 
    DEVICE=eth2
    BOOTPROTO=none
    #HWADDR=08:00:27:41:b4:16
    ONBOOT=yes
    TYPE=Ethernet
    USERCTL=no
    IPV6INIT=no
    PEERDNS=yes
    SLAVE=yes
    MASTER=bond0
    
    [root@node1 network-scripts]# cat ifcfg-eth3
    DEVICE=eth3
    BOOTPROTO=none
    #HWADDR=08:00:27:6c:3d:0c
    ONBOOT=yes
    TYPE=Ethernet
    USERCTL=no
    IPV6INIT=no
    PEERDNS=yes
    SLAVE=yes
    MASTER=bond0
    
    [root@node1 network-scripts]# cat /etc/modprobe.conf
    alias scsi_hostadapter ata_piix
    alias scsi_hostadapter1 ahci
    alias net-pf-10 off
    alias ipv6 off
    options ipv6 disable=1
    alias snd-card-0 snd-intel8x0
    options snd-card-0 index=0
    options snd-intel8x0 index=0
    remove snd-intel8x0 { /usr/sbin/alsactl store 0 >/dev/null 2>&1 || : ; }; /sbin/modprobe -r --ignore-remove snd-intel8x0
    alias eth0 e1000
    alias eth1 e1000
    alias eth2 e1000
    alias eth3 e1000
    alias bond0 bonding

    网络配置信息如下:

    [root@node1 tmp]# ifconfig 
    bond0   Link encap:Ethernet HWaddr 08:00:27:41:B4:16 
         inet addr:10.1.1.1 Bcast:10.1.1.255 Mask:255.255.255.0
         UP BROADCAST RUNNING MASTER MULTICAST MTU:1500 Metric:1
         RX packets:1197 errors:0 dropped:0 overruns:0 frame:0
         TX packets:125 errors:0 dropped:0 overruns:0 carrier:0
         collisions:0 txqueuelen:0 
         RX bytes:106338 (103.8 KiB) TX bytes:16662 (16.2 KiB)
    
    eth0   Link encap:Ethernet HWaddr 08:00:27:35:B4:81 
         inet addr:192.168.56.11 Bcast:192.168.56.255 Mask:255.255.255.0
         UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
         RX packets:1487 errors:0 dropped:0 overruns:0 frame:0
         TX packets:1190 errors:0 dropped:0 overruns:0 carrier:0
         collisions:0 txqueuelen:1000 
         RX bytes:146576 (143.1 KiB) TX bytes:151787 (148.2 KiB)
    
    eth1   Link encap:Ethernet HWaddr 08:00:27:72:08:46 
         inet addr:10.1.1.11 Bcast:10.1.1.255 Mask:255.255.255.0
         UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
         RX packets:193 errors:0 dropped:0 overruns:0 frame:0
         TX packets:455 errors:0 dropped:0 overruns:0 carrier:0
         collisions:0 txqueuelen:1000 
         RX bytes:31434 (30.6 KiB) TX bytes:22657 (22.1 KiB)
    
    eth2   Link encap:Ethernet HWaddr 08:00:27:41:B4:16 
         UP BROADCAST RUNNING SLAVE MULTICAST MTU:1500 Metric:1
         RX packets:591 errors:0 dropped:0 overruns:0 frame:0
         TX packets:93 errors:0 dropped:0 overruns:0 carrier:0
         collisions:0 txqueuelen:1000 
         RX bytes:55217 (53.9 KiB) TX bytes:10511 (10.2 KiB)
    
    eth3   Link encap:Ethernet HWaddr 08:00:27:41:B4:16 
         UP BROADCAST RUNNING SLAVE MULTICAST MTU:1500 Metric:1
         RX packets:606 errors:0 dropped:0 overruns:0 frame:0
         TX packets:32 errors:0 dropped:0 overruns:0 carrier:0
         collisions:0 txqueuelen:1000 
         RX bytes:51121 (49.9 KiB) TX bytes:6151 (6.0 KiB)
    
    lo    Link encap:Local Loopback 
         inet addr:127.0.0.1 Mask:255.0.0.0
         UP LOOPBACK RUNNING MTU:16436 Metric:1
         RX packets:3297 errors:0 dropped:0 overruns:0 frame:0
         TX packets:3297 errors:0 dropped:0 overruns:0 carrier:0
         collisions:0 txqueuelen:0 
         RX bytes:4725726 (4.5 MiB) TX bytes:4725726 (4.5 MiB)
    
    

    双网卡绑定信息:

    [root@node1 tmp]# cat /proc/net/bonding/bond0 
    Ethernet Channel Bonding Driver: v3.4.0-2 (October 7, 2008)
    
    Bonding Mode: fault-tolerance (active-backup)
    Primary Slave: None
    Currently Active Slave: eth2
    MII Status: up
    MII Polling Interval (ms): 100
    Up Delay (ms): 0
    Down Delay (ms): 0
    
    Slave Interface: eth2
    MII Status: up
    Speed: 1000 Mbps
    Duplex: full
    Link Failure Count: 0
    Permanent HW addr: 08:00:27:41:b4:16
    
    Slave Interface: eth3
    MII Status: up
    Speed: 1000 Mbps
    Duplex: full
    Link Failure Count: 0
    Permanent HW addr: 08:00:27:6c:3d:0c
    

    4.脚本代码

    #!/bin/bash
    # Date:2018-11-26 14:28:45
    # Author:ZhangJian
    # Mail:1037509307@qq.com
    # Func:Configure Network Bonding
    # Version:2.0
    #V1.6版本更新:不再将绑定的模式mode=x写入modprobe.conf文件,将其写入ifcfg-bond中,因为在modprobe.conf文件中时,修改了mode模式后,重启网络服务可能不生效。
    #V2.0版本更新:将primary网卡设置为可选择项。
    
    trap "tput clear;tput cup 3;echo 'Any Questions: Send a message to QQ 1037509307.';tput cup 6;exit" 2 3
    if [[ -n $1 ]]; then
     cat <<EOF
    
    Network Configuration Assistant
              --- Configure Network Bonding v1.5
    
    Usage:
    
        sh $0
        chmod +x $0 && ./$0
    
    EOF
    exit 0
    fi
    
    if [[ $UID -ne 0 ]]; then
     tput clear
     tput cup 6 20
     echo -e "You must use the user: \033[31mROOT\033[0m"
     tput cup 10
     exit
    fi
    
    ERROR(){
    tput cup $1 $2;tput ed
    echo 'Input error,Try again pls.'
    echo -e 'Press ENTER to continue..._\b\c'
    read inputA
    }
    
    Check_BakFile(){
    #文件备份函数
    #使用方法:
    #Check_BakFile 要备份的文件名 备份目录 -x(按什么时间格式备份)
    case ${3} in
      -d ) #按天备份
        Bak_Date=`date '+%Y-%m-%d'`
        ;;
      -H ) #按小时备份
        Bak_Date=`date '+%Y-%m-%d_%H'`
        ;;
      -M ) #按分钟备份
        Bak_Date=`date '+%Y-%m-%d_%H:%M'`
        ;;
      -m ) #按月备份
        Bak_Date=`date '+%Y-%m'`
        ;;
      -Y ) #按年备份
        Bak_Date=`date '+%Y'`
        ;;
      * ) #默认按分钟备份
        Bak_Date=`date '+%Y-%m-%d_%H:%M'`
        ;;
    esac
    #Bak_Date=`date '+%Y-%m-%d-%H:%M'`
    
    [[ -d ${2}/${Bak_Date} ]] || mkdir -p ${2}/${Bak_Date}
    cp -ra ${1} ${2}/${Bak_Date}
    }
    
    bonding_pre(){
    #双网卡绑定前导函数,判定网卡、IP等合法性并引导用户正确输入参数。
    #全部真实网卡
    NIC_NAME_all=`ifconfig -a | awk '/\&;Ethernet\&;/ {print $1}' | grep -wEv '^bond[0-9]+'`
    #已经存在的绑定网卡
    NIC_NAME_bond=`ifconfig -a | awk '/^\&;bond[0-9]+\&;/ {print $1}'`
    
    #打印出已经是SLAVE的网卡
    NIC_NAME_slave=`ifconfig -a | sed -n '/SLAVE/{g;1!p;};h' | awk '{print $1}'`
    NIC_NAME_slave=${NIC_NAME_slave:=NULL}
    #打印出可用网卡
    NIC_NAME_free=`echo "$NIC_NAME_all" | grep -Fwv "$NIC_NAME_slave"`
    #可用网卡数量
    NIC_NAME_free_nu=`echo "$NIC_NAME_free" | wc -w`
    
    declare -a NIC_LIST
    NIC_LIST=($NIC_NAME_free)
    
    info_print(){
    tput clear;tput cup 2
    cat <<EOF
    ----------------------------------------------
    ------ Network Configuration Assistant ------
    ----------------------------------------------
    EOF
    tput cup 7
    if [[ -n ${1} ]]; then
     echo -e "Already existing Channel Bonding Interface of the system:\n\033[31m${1}\033[0m\n"
    fi
    }
    
    if [[ "$NIC_NAME_free_nu" -gt 1 ]]; then
     info_print
     echo -e "\033[031m$NIC_NAME_free_nu\033[0m network cards available:"
     echo -e "\033[31m${NIC_LIST[@]}\033[0m"
     echo -e "----------------------------------------------\n"
     #输入第一块网卡的名称
     while true; do
      echo -e "\nPlease enter the First NIC:_\b\c"
      read NIC1
      echo ${NIC_LIST[@]} | grep -Fw "$NIC1" &> /dev/null
      if [[ $? -eq 0 ]]; then
       info_print
       echo -e "\033[031m$NIC_NAME_free_nu\033[0m network cards available:\n\033[31m${NIC_LIST[@]}\033[0m"
       echo -e "\nThe information you have entered:\nFirst NIC   : $NIC1"
       echo -e "----------------------------------------------\n"
       break
      else
       info_print
       echo -e "\033[031m$NIC_NAME_free_nu\033[0m network cards available:\n\033[31m${NIC_LIST[@]}\033[0m"
       echo -e "----------------------------------------------\n"
       echo -e "\033[31m${NIC1}\033[0m is not available,Please enter another one."
      fi
     done
     #输入第二块网卡的名称
     while true; do
      echo -e "\nPlease select the second NIC:_\b\c"
      read NIC2
      if [[ ${NIC1} != ${NIC2} ]]; then
       echo ${NIC_LIST[@]} | grep -Fw "${NIC2}" &> /dev/null
       if [[ $? -eq 0 ]]; then
        info_print "${NIC_NAME_bond}"
        echo -e "The information you have entered:\nFirst NIC   : ${NIC1}\nSecond NIC  : ${NIC2}"
        echo -e "----------------------------------------------\n"
        break
       else
        info_print
        echo -e "\033[031m$NIC_NAME_free_nu\033[0m network cards available:\n\033[31m${NIC_LIST[@]}\033[0m\n\nThe information you have entered:\nFirst NIC   : ${NIC1}"
        echo -e "----------------------------------------------\n"
        echo -e "\033[31m${NIC2}\033[0m is not available,Please enter another one."
       fi
      else
       info_print
       echo -e "\033[031m${NIC_NAME_free_nu}\033[0m network cards available:\n\033[31m${NIC_LIST[@]}\033[0m\n\nThe information you have entered:\nFirst NIC   : ${NIC1}"
       echo -e "----------------------------------------------\n"
       echo -e "\033[31m${NIC2}\033[0m is the first NIC,Please enter another one."
      fi
     done
    
     #输入绑定网卡名称并进行合理性检查
     if [[ -z ${NIC_NAME_bond} ]]; then
      NAME_bond=bond0
      info_print
      echo -e "The information you have entered:\nFirst NIC   : ${NIC1}\nSecond NIC  : ${NIC2}\nbond name   : ${NAME_bond}"
      echo -e "----------------------------------------------\n"
      echo "The default first bond name is -- bond0."
     else
      while true; do
       echo -e "\nPlease enter a bond name[bonN]:_\b\c"
       read NAME_bond
       #检查输入格式是否为bond+数字的格式。
       echo "${NAME_bond}" | grep -wE '^bond[[:digit:]]+$' &> /dev/null
       if [[ $? -eq 0 ]]; then
        echo "${NIC_NAME_bond}" | grep -Fw "${NAME_bond}" &> /dev/null
        if [[ $? -ne 0 ]]; then
         info_print "${NIC_NAME_bond}"
         echo -e "The information you have entered:\nFirst NIC   : ${NIC1}\nSecond NIC  : ${NIC2}\nbond name   : ${NAME_bond}"
         echo -e "----------------------------------------------\n"
         break
        else
         info_print "${NIC_NAME_bond}"
         echo -e "The information you have entered:\nFirst NIC   : ${NIC1}\nSecond NIC  : ${NIC2}"
         echo -e "----------------------------------------------\n"
         echo "You can not use an existing name: ${NAME_bond}"
         echo -e "\033[31m${NAME_bond}\033[0m is not available,Please enter another one like -- bondN."
        fi
       else
        info_print "${NIC_NAME_bond}"
        echo -e "The information you have entered:\nFirst NIC   : ${NIC1}\nSecond NIC  : ${NIC2}"
        echo -e "----------------------------------------------\n"
        echo -e "\033[31m${NAME_bond}\033[0m is not available,Please enter another one like -- bondN."
       fi
      done
     fi
    
     #设置IP地址
     while true; do
      echo -e "\nPlease enter an IP address:_\b\c"
      read IP_bond
      echo "${IP_bond}" | grep -owE '^(([1-9]|[1-9][0-9]|1[0-9]{2}|2[0-5]{2})\.){3}([1-9]|[1-9][0-9]|1[0-9]{2}|2[0-5]{2})$' &> /dev/null
      if [[ $? -eq 0 ]]; then
       info_print
       echo -e "The information you have entered:\nFirst NIC   : ${NIC1}\nSecond NIC  : ${NIC2}\nbond name   : ${NAME_bond}\nIP address  : ${IP_bond}"
       echo -e "----------------------------------------------\n"
       break
      else
       info_print
       echo -e "The information you have entered:\nFirst NIC   : ${NIC1}\nSecond NIC  : ${NIC2}\nbond name   : ${NAME_bond}"
       echo -e "----------------------------------------------\n"
       echo -e "IP address: \033[31m${IP_bond}\033[0m format errors, please re-enter."
      fi
     done
     #设置netmask
     while true; do
      echo -e "\nPls enter the NETMASK[255.255.255.0]:_\b\c"
      read NETMASK_bond
      NETMASK_bond=${NETMASK_bond:="255.255.255.0"}  #当变量为NETMASK_bond为空时,给其赋默认值255.255.255.0
      echo "$NETMASK_bond" | grep -owE '^(128|192|224|240|248|252|254|255)\.((0|128|192|224|240|248|252|254|255)\.){2}(0|128|192|224|240|248|252|254|255)$' &> /dev/null
      if [[ $? -eq 0 ]]; then
       info_print
       echo -e "The information you have entered:\nFirst NIC   : ${NIC1}\nSecond NIC  : ${NIC2}\nbond name   : ${NAME_bond}\nIP address  : ${IP_bond}\nnetmask    : ${NETMASK_bond}"
       echo -e "----------------------------------------------\n"
       break
      else
       info_print
       echo -e "The information you have entered:\nFirst NIC   : ${NIC1}\nSecond NIC  : ${NIC2}\nbond name   : ${NAME_bond}\nIP address  : ${IP_bond}"
       echo -e "----------------------------------------------\n"
       echo -e "Input error.\nPlease enter the correct NETMASK or press ENTER to use 255.255.255.0.\n"
      fi
     done
    #:<<!zhushi! #批量注释,如果开启批量注释,默认mode=1
     while true; do
      echo -e "\nPls enter the bonding_mode[default:mode=1,active-backup]:_\b\c"
      read mode_bond
      mode_bond=${mode_bond:="mode=1"}  #当变量为mode_bond为空时,给其赋默认值1
      if [[ ! ${mode_bond} =~ "mode=[0-6]" ]]; then
       info_print
       echo -e "The information you have entered:\nFirst NIC   : ${NIC1}\nSecond NIC  : ${NIC2}\nbond name   : ${NAME_bond}\nIP address  : ${IP_bond}\netmask    : ${NETMASK_bond}"
       echo -e "----------------------------------------------\n"
       echo "Invalid answer: ${mode_bond}"
       echo "Eg: mode={0,1,2,3,4,5,6}"
      else
       info_print
       echo -e "The information you have entered:\n"
       echo -e "First NIC   :${NIC1}\nSecond NIC  :${NIC2}\nbond name   :${NAME_bond}\nIP address  :${IP_bond}\nnetmask    :${NETMASK_bond}\nbonding_mode :${mode_bond}"
       echo -e "----------------------------------------------\n"
       break
      fi
     done
    #!zhushi!
    
     #选择是否设置primary网卡
     while true; do
      echo "1-${NIC1}"
      echo "2-${NIC2}"
      echo "3-none"
      echo -e "choose whether to set up the primary NIC or not[default:3-none]:_\b\c"
      read get_primary_NIC
      get_primary_NIC=${get_primary_NIC:="none"}
        case ${get_primary_NIC} in
        1 )
         get_primary_NIC=${NIC1}
         #echo "--$get_primary_NIC"
         break
         ;;
        2 )
         get_primary_NIC=${NIC2}
          #echo "--$get_primary_NIC"
         break
         ;;
        3 )
         get_primary_NIC=none
          #echo "--$get_primary_NIC"
         break
         ;;
        none )
         break
         ;;
        * )
          #echo "--$get_primary_NIC"
         info_print
         echo -e "The information you have entered:\nFirst NIC   : ${NIC1}\nSecond NIC  : ${NIC2}\nbond name   : ${NAME_bond}\nIP address  : ${IP_bond}\nnetmask    : ${NETMASK_bond}"
         echo -e "----------------------------------------------\n"
         echo "Invalid answer: ${get_primary_NIC}"
         echo "Pls input a number in {1,2,3} or press ENTER to set up primary NIC none."
         continue
         ;;
       esac
    
       info_print
       echo -e "The information you have entered:\n"
       echo -e "First NIC   :${NIC1}\nSecond NIC  :${NIC2}\nbond name   :${NAME_bond}\nIP address  :${IP_bond}\nnetmask    :${NETMASK_bond}\nbonding_mode :${mode_bond}\nprimary NIC  :${get_primary_NIC}"
       echo -e "----------------------------------------------\n"
       break
     done
    
     #最终输入信息确认
     while true; do
      info_print
      echo -e "The information you have entered:\n"
      echo -e "\033[31mFirst NIC   :${NIC1}\nSecond NIC  :${NIC2}\nbond name   :${NAME_bond}\nIP address  :${IP_bond}\nnetmask    :${NETMASK_bond}\nbonding_mode :${mode_bond}\nprimary NIC  :${get_primary_NIC}\033[0m"
      echo -e "----------------------------------------------\n"
      echo -e "Pls make sure its OK[y/n]:_\b\c"
      read input
      case ${input} in
       [Yy]|[Yy][Ee][Ss] )
        bonding "$NIC1" "$NIC2" "$NAME_bond" "$IP_bond" "$NETMASK_bond"
        break
        ;;
       [Nn]|[Nn][Oo] )
        bonding_pre
       ;;
       * )
        tput cup 7;tput ed
        ERROR 7 10
       ;;
      esac
     done
    else
      info_print
      echo -e "You have \033[031m${NIC_NAME_free_nu}\033[0m network cards available:\n"
      #将重点显示的“网卡名”标示为红色
      echo -e "\033[31m${NIC_LIST[@]}\033[0m\n"
      echo -e "There are \033[31mnot enough\033[0m network cards to make bonding"
      echo -e "Pls check it......\n"
      echo -e 'Press ENTER to exit..._\b\c'
      read answer
      exit 1
    fi
    }
    
    bonding(){
    if [[ $# -lt 5 ]]
    then
     echo 'Bonding failed! Please provide enough information!'
     echo -e "\nUsage:\n    sh bonding.sh <NIC1_name> <NIC2_name> <bond_name> <IP> <NETMASK>\n\n"
     exit 1
    fi
    #get device name and ip information
    SLAVE1_DEV="$1"    #SLAVE1_DEV=ethx
    SLAVE2_DEV="$2"    #SLAVE2_DEV=ethx
    BOND_DEV="$3"     #BOND_DEV=bondx
    SLAVE1=ifcfg-"$1"
    SLAVE2=ifcfg-"$2"
    BOND=ifcfg-"$3"
    BOND_IPADDR="$4"
    BOND_NETMASK="$5"
    BOND_DIR=/etc/sysconfig/network-scripts
    if [ -e $BOND_DIR/$BOND ]
    then
     echo $BOND_DIR/$BOND is already exist
    else
     #file backup
     Check_BakFile "${BOND_DIR}/ifcfg-*" "${BOND_DIR}/inspur_bak" "-M"
    
    #get mac address
     SLAVE1_MAC=`grep 'HWADDR' ${BOND_DIR}/${SLAVE1}`
     SLAVE2_MAC=`grep 'HWADDR' ${BOND_DIR}/${SLAVE2}`
    
     # modify $BOND
     touch $BOND_DIR/$BOND
     echo "DEVICE=${BOND_DEV}" >> $BOND_DIR/$BOND
     echo "BOOTPROTO=none" >> $BOND_DIR/$BOND
     echo "ONBOOT=yes" >> $BOND_DIR/$BOND
     echo "TYPE=Ethernet" >> $BOND_DIR/$BOND
     echo "USERCTL=no" >> $BOND_DIR/$BOND
     echo "IPV6INIT=no" >> $BOND_DIR/$BOND
     echo "PEERDNS=yes" >> $BOND_DIR/$BOND
     echo "IPADDR=${BOND_IPADDR}" >> $BOND_DIR/$BOND
     echo "NETMASK=${BOND_NETMASK}" >> $BOND_DIR/$BOND
     if [[ ${get_primary_NIC} == none ]]; then
       echo "BONDING_OPTS=\"miimon=100 ${mode_bond}\"" >> $BOND_DIR/$BOND
     else
       echo "BONDING_OPTS=\"miimon=100 ${mode_bond} primary=$(echo ${SLAVE1} | cut -d'-' -f2)\"" >> $BOND_DIR/$BOND
     fi
    
     # modify $SLAVE1
     > $BOND_DIR/$SLAVE1
     echo "DEVICE=${SLAVE1_DEV}" >> $BOND_DIR/$SLAVE1
     echo 'BOOTPROTO=none' >> $BOND_DIR/$SLAVE1
     #cat $BOND_DIR/../ifcfg-bak/$SLAVE1 |grep HWADDR >> $BOND_DIR/$SLAVE1
     echo "#$SLAVE1_MAC" >> $BOND_DIR/$SLAVE1
     echo ONBOOT=yes >> $BOND_DIR/$SLAVE1
     echo TYPE=Ethernet >> $BOND_DIR/$SLAVE1
     echo USERCTL=no >> $BOND_DIR/$SLAVE1
     echo IPV6INIT=no >> $BOND_DIR/$SLAVE1
     echo PEERDNS=yes >> $BOND_DIR/$SLAVE1
     echo SLAVE=yes >> $BOND_DIR/$SLAVE1
     echo MASTER=$BOND_DEV >> $BOND_DIR/$SLAVE1
    
     # modify SLAVE2
     > $BOND_DIR/$SLAVE2
     echo "DEVICE=$SLAVE2_DEV" >> $BOND_DIR/$SLAVE2
     echo BOOTPROTO=none >> $BOND_DIR/$SLAVE2
     #cat $BOND_DIR/../ifcfg-bak/$SLAVE2 |grep HWADDR >> $BOND_DIR/$SLAVE2
     echo "#$SLAVE2_MAC" >> $BOND_DIR/$SLAVE2
     echo ONBOOT=yes >> $BOND_DIR/$SLAVE2
     echo TYPE=Ethernet >> $BOND_DIR/$SLAVE2
     echo USERCTL=no >> $BOND_DIR/$SLAVE2
     echo IPV6INIT=no >> $BOND_DIR/$SLAVE2
     echo PEERDNS=yes >> $BOND_DIR/$SLAVE2
     echo SLAVE=yes >> $BOND_DIR/$SLAVE2
     echo MASTER=$BOND_DEV >> $BOND_DIR/$SLAVE2
    
     [[ -e /etc/modprobe.conf.bak ]] && cp /etc/modprobe.conf /etc/modprobe.conf.bak.new || cp /etc/modprobe.conf /etc/modprobe.conf.bak
     echo "alias $BOND_DEV bonding" >> /etc/modprobe.conf
    
    while true; do
     tput clear;tput cup 2
    cat <<EOF
    ----------------------------------------------
    ------ Network Configuration Assistant ------
    ----------------------------------------------
    
    Complete!
    File backup directory: ${BOND_DIR}/inspur_bak
    
    you can check the file and then restart the network service.
    
    1 ) service network restart
    2 ) exit
    ----------------------------------------------
    EOF
      echo -e "Please make your choice:_\b\c"
      read answer
       case ${answer} in
        1 )
         service network restart
         exit 0
         ;;
        2 )
         exit 0
         ;;
       esac
    
     done
    fi
    }
    
    main(){
     while true; do
      bonding_pre
     done
    }

    以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

    上一篇:Docker部署Node.js的方法步骤
    下一篇:Linux Crontab Shell脚本实现秒级定时任务的方法
  • 相关文章
  • 

    © 2016-2020 巨人网络通讯

    时间:9:00-21:00 (节假日不休)

    地址:江苏信息产业基地11号楼四层

    《增值电信业务经营许可证》 苏B2-20120278

    Linux双网卡绑定脚本的方法示例 Linux,双,网卡,绑定,脚本,