概述

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


适用范围

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

  • Redhat 5.x
  • CentOS 5.x
  • Kylin 3.x
  • KUX 2.x

脚本特点

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


使用说明

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

[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-eth2 DEVICE=eth2BOOTPROTO=none#HWADDR=08:00:27:41:b4:16ONBOOT=yesTYPE=EthernetUSERCTL=noIPV6INIT=noPEERDNS=yesSLAVE=yesMASTER=bond0 [root@node1 network-scripts]# cat ifcfg-eth3DEVICE=eth3BOOTPROTO=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 eth1 e1000alias eth2 e1000alias eth3 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) 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)

双网卡绑定信息:


脚本代码

#!/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_nu033[0m network cards available:033[31m${NIC_LIST[@]}033[0m" echo -e "The information you have entered:First NIC : $NIC1" echo -e "----------------------------------------------" break else info_print echo -e "033[031m$NIC_NAME_free_nu033[0m network cards available:033[31m${NIC_LIST[@]}033[0m" echo -e "----------------------------------------------" echo -e "033[31m${NIC1}033[0m is not available,Please enter another one." fi done #输入第二块网卡的名称 while true; do echo -e "Please select the second NIC:_bc" 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:First NIC : ${NIC1}Second NIC : ${NIC2}" echo -e "----------------------------------------------" break else info_print echo -e "033[031m$NIC_NAME_free_nu033[0m network cards available:033[31m${NIC_LIST[@]}033[0mThe information you have entered:First NIC : ${NIC1}" echo -e "----------------------------------------------" 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:033[31m${NIC_LIST[@]}033[0mThe information you have entered:First NIC : ${NIC1}" echo -e "----------------------------------------------" 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:First NIC : ${NIC1}Second NIC : ${NIC2}bond name : ${NAME_bond}" echo -e "----------------------------------------------" echo "The default first bond name is -- bond0." else while true; do echo -e "Please enter a bond name[bonN]:_bc" 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:First NIC : ${NIC1}Second NIC : ${NIC2}bond name : ${NAME_bond}" echo -e "----------------------------------------------" break else info_print "${NIC_NAME_bond}" echo -e "The information you have entered:First NIC : ${NIC1}Second NIC : ${NIC2}" echo -e "----------------------------------------------" 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:First NIC : ${NIC1}Second NIC : ${NIC2}" echo -e "----------------------------------------------" 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 "Please enter an IP address:_bc" 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:First NIC : ${NIC1}Second NIC : ${NIC2}bond name : ${NAME_bond}IP address : ${IP_bond}" echo -e "----------------------------------------------" break else info_print echo -e "The information you have entered:First NIC : ${NIC1}Second NIC : ${NIC2}bond name : ${NAME_bond}" echo -e "----------------------------------------------" echo -e "IP address: 033[31m${IP_bond}033[0m format errors, please re-enter." fi done #设置netmask while true; do echo -e "Pls enter the NETMASK[255.255.255.0]:_bc" 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:First NIC : ${NIC1}Second NIC : ${NIC2}bond name : ${NAME_bond}IP address : ${IP_bond}netmask : ${NETMASK_bond}" echo -e "----------------------------------------------" break else info_print echo -e "The information you have entered:First NIC : ${NIC1}Second NIC : ${NIC2}bond name : ${NAME_bond}IP address : ${IP_bond}" echo -e "----------------------------------------------" echo -e "Input error.Please enter the correct NETMASK or press ENTER to use 255.255.255.0." fi done#:< " 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.conf while true; do tput clear;tput cup 2cat <

以上就是本文所有内容,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。后面小编会分享更多运维方面的干货,感兴趣的朋友走一波关注哩~

linux更换网卡不识别_详解Linux双网卡绑定脚本的方法示例相关推荐

  1. linux 查看网络流量来源_详解Linux查看实时网卡流量的几种方式

    在工作中,我们经常需要查看服务器的实时网卡流量.通常,我们会通过这几种方式查看Linux服务器的实时网卡流量. 1. sar -n DEV 1 2 sar命令包含在sysstat工具包中,提供系统的众 ...

  2. linux 的中断 命令,linux skill命令参数及用法详解(linux中断进程执行命令)

    linux skill命令参数及用法详解(linux中断进程执行命令) 发布时间:2012-07-21 12:09:37   作者:佚名   我要评论 linux 冻结进程命令 skill 使用详解 ...

  3. linux中whoami命令的作用是,linux whoami命令参数及用法详解(linux查看登陆用户名)

    linux whoami命令参数及用法详解(linux查看登陆用户名) 2019年05月31日 | 萬仟网科技 | 我要评论 whoami 命令显示登录名.与使用命令 who 并指定 am i 不同, ...

  4. linux 内存 参数,linux free命令参数及用法详解(linux查看内存命令)

    linux free命令参数及用法详解(linux查看内存命令) 2019年05月31日 | 萬仟网科技 | 我要评论 free指令会显示内存的使用情况,包括实体内存,虚拟的交换文件内存,共享内存区段 ...

  5. linux中的su-命令的功能,linux su命令参数及用法详解(linux切换用户命令)

    linux su命令参数及用法详解(linux切换用户命令) 发布时间:2012-07-21 12:12:39   作者:佚名   我要评论 su的作用是变更为其它使用者的身份,超级用户除外,需要键入 ...

  6. linux命令优先级设置,linux renice命令参数及用法详解(linux修改程序运行优先级命令)...

    linux renice命令参数及用法详解(linux修改程序运行优先级命令) 发布时间:2012-07-21 12:45:32   作者:佚名   我要评论 renice指令可重新调整程序执行的优先 ...

  7. linux中fdisk的参数,Linux fdisk命令参数及用法详解--Linux磁盘分区管理命令fdisk

    fdisk 命令 linux磁盘分区管理 用途:观察硬盘之实体使用情形与分割硬盘用. 使用方法: 一.在 console 上输入 fdisk -l /dev/sda ,观察硬盘之实体使用情形. 二.在 ...

  8. mac双系统装mysql启动不了了_详解ubuntu双系统启动时卡死解决办法

    详解ubuntu双系统启动时卡死解决办法 ubuntu双系统启动时卡死解决办法(在ubuntu16.04和18.04测试无误) 问题描述: 在安装完ubuntu双系统后,第一次启动ubuntu系统时, ...

  9. linux下的arp刷新命令详解,linux arp 命令常用参数详解

    linux arp 命令常用参数详解 linux arp 命令常用参数详解 显示和修改地址解析协议(ARP)使用的"IP 到物理"地址转换表. ARP -s inet_addr e ...

最新文章

  1. 4.5 人脸验证与二分类-深度学习第四课《卷积神经网络》-Stanford吴恩达教授
  2. QUIC协议的演进之路
  3. Akka框架——第一节:并发编程简介
  4. mysql 语句检查_mysql查询语句
  5. c#读取整数空格_C ++程序声明,读取和打印动态整数数组
  6. iOS -一些常用的方法
  7. python嵩天ppt_嵩天python课程笔记1
  8. 太强了!GitHub中文开源项目榜单出炉,暴露了程序员的硬性需求!
  9. android png 图标制作,ico图标怎么制作?png图片文件转换成ico图标文件的教程
  10. Web—信息收集(非常全)
  11. JAVAFX_Effect效果介绍
  12. java连接redis设置密码_jedis设置密码连接Redis
  13. 网络安全笔记-26-Linux-基础
  14. 如何在手机上拍摄专业证件照片
  15. 第六十四章 Caché 函数大全 $STACK 函数
  16. 数据分析的五大用处,你都知道吗?
  17. 微信视频使用的是什么协议?—— udp协议的介绍
  18. Spark:java.net.URISyntaxException: Relative path in absolute URI: file:D:/XXX/SparkFaultBench/spark-
  19. 远程客户端登录终端服务器,没有终端服务器客户端访问许可证 远程会话被中断...
  20. python解码IP地址

热门文章

  1. Dapper基础知识一
  2. 关于 @ngrx/Store 下 obj 的扩展问题
  3. 动态生成能够局部刷新的验证码【AJAX技术】---看了不懂赔你钱
  4. JBPM4.4_jBPM4.4应用(与Spring集成自行控制事务等)
  5. ansible自己总结(playbook)
  6. linux环境: shell初始化文件, for TCSH, CSH
  7. form表单中method的get和post区别
  8. 减少科研文章写作错误的一点小技巧
  9. golang web 静态文件
  10. linux c size_t ssize_t 简介