千家信息网

怎么在Linux中实现双网卡绑定脚本

发表于:2024-12-04 作者:千家信息网编辑
千家信息网最后更新 2024年12月04日,怎么在Linux中实现双网卡绑定脚本?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。1.适用范围该shell脚本可在以下linux系统创建
千家信息网最后更新 2024年12月04日怎么在Linux中实现双网卡绑定脚本

怎么在Linux中实现双网卡绑定脚本?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。

1.适用范围

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

  • Redhat 5.x

  • CentOS 5.x

  • Kylin 3.x

  • KUX 2.x

2.脚本特点

---------------------------------------------------- Network Configuration Assistant ----------------------------------------------------The information you have entered:First NIC   :eth0Second NIC  :eth2bond name   :bond1IP address  :192.168.56.11netmask    :255.255.255.0bonding_mode :mode=1primary 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 eth2 eth3 eth4----------------------------------------------Please enter the First NIC:_

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

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

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

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

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

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

---------------------------------------------------- Network Configuration Assistant ----------------------------------------------------The information you have entered:First NIC   : eth3Second NIC  : eth4bond 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   : eth3Second NIC  : eth4bond name   : bond0IP 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   : eth3Second NIC  : eth4bond name   : bond0IP address  : 10.1.1.1netmask    : 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   :eth3Second NIC  :eth4bond name   :bond0IP address  :10.1.1.1netmask    :255.255.255.0bonding_mode :mode=1----------------------------------------------1-eth32-eth43-nonechoose 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   :eth3Second NIC  :eth4bond name   :bond0IP address  :10.1.1.1netmask    :255.255.255.0bonding_mode :mode=1primary NIC  :none----------------------------------------------Pls make sure its OK[y/n]:_

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

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

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

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

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

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

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

[root@node1 tmp]# cd /etc/sysconfig/network-scripts/[root@node1 network-scripts]# cat ifcfg-bond0 DEVICE=bond0BOOTPROTO=noneONBOOT=yesTYPE=EthernetUSERCTL=noIPV6INIT=noPEERDNS=yesIPADDR=10.1.1.1NETMASK=255.255.255.0BONDING_OPTS="miimon=100 mode=1"[root@node1 network-scripts]# cat ifcfg-eth3 DEVICE=eth3BOOTPROTO=none#HWADDR=08:00:27:41:b4:16ONBOOT=yesTYPE=EthernetUSERCTL=noIPV6INIT=noPEERDNS=yesSLAVE=yesMASTER=bond0[root@node1 network-scripts]# cat ifcfg-eth4DEVICE=eth4BOOTPROTO=none#HWADDR=08:00:27:6c:3d:0cONBOOT=yesTYPE=EthernetUSERCTL=noIPV6INIT=noPEERDNS=yesSLAVE=yesMASTER=bond0[root@node1 network-scripts]# cat /etc/modprobe.confalias scsi_hostadapter ata_piixalias scsi_hostadapter1 ahcialias net-pf-10 offalias ipv6 offoptions ipv6 disable=1alias snd-card-0 snd-intel8x0options snd-card-0 index=0options snd-intel8x0 index=0remove snd-intel8x0 { /usr/sbin/alsactl store 0 >/dev/null 2>&1 || : ; }; /sbin/modprobe -r --ignore-remove snd-intel8x0alias eth0 e1000alias eth2 e1000alias eth3 e1000alias eth4 e1000alias 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)eth2   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)eth3   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)eth4   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: NoneCurrently Active Slave: eth3MII Status: upMII Polling Interval (ms): 100Up Delay (ms): 0Down Delay (ms): 0Slave Interface: eth3MII Status: upSpeed: 1000 MbpsDuplex: fullLink Failure Count: 0Permanent HW addr: 08:00:27:41:b4:16Slave Interface: eth4MII Status: upSpeed: 1000 MbpsDuplex: fullLink Failure Count: 0Permanent 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 3if [[ -n $1 ]]; then cat </ {print $1}' | grep -wEv '^bond[0-9]+'`#已经存在的绑定网卡NIC_NAME_bond=`ifconfig -a | awk '/^\/ {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_LISTNIC_LIST=($NIC_NAME_free)info_print(){tput clear;tput cup 2cat < /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#:<    \n\n" exit 1fi#get device name and ip informationSLAVE1_DEV="$1"    #SLAVE1_DEV=ethxSLAVE2_DEV="$2"    #SLAVE2_DEV=ethxBOND_DEV="$3"     #BOND_DEV=bondxSLAVE1=ifcfg-"$1"SLAVE2=ifcfg-"$2"BOND=ifcfg-"$3"BOND_IPADDR="$4"BOND_NETMASK="$5"BOND_DIR=/etc/sysconfig/network-scriptsif [ -e $BOND_DIR/$BOND ]then echo $BOND_DIR/$BOND is already existelse #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.confwhile true; do tput clear;tput cup 2cat <

什么是Linux系统

Linux是一种免费使用和自由传播的类UNIX操作系统,是一个基于POSIX的多用户、多任务、支持多线程和多CPU的操作系统,使用Linux能运行主要的Unix工具软件、应用程序和网络协议。

看完上述内容,你们掌握怎么在Linux中实现双网卡绑定脚本的方法了吗?如果还想学到更多技能或想了解更多相关内容,欢迎关注行业资讯频道,感谢各位的阅读!

0