Linux双网卡绑定脚本的方法示例
linux运维及配置工作中,常常会用到双网卡绑定,少数几台服务器的配置还好,如果是需要配置几十甚至上百台,难免会枯燥乏味,易于出错,我编写了这个双网卡绑定的辅助脚本,可傻瓜式地完成linux双网卡绑定工作,当然,该脚本主要还是用于小批量的系统配置,如需配置大量的服务器,可提取脚本中的bonding函数,稍作修改即可,你值得一试!
1.适用范围
该shell脚本可在以下linux系统创建多个绑定网卡,用于生产环境没问题的:
- Redhat5.x
- CentOS5.x
- Kylin3.x
- KUX2.x
2.脚本特点
---------------------------------------------- ------NetworkConfigurationAssistant------ ---------------------------------------------- Theinformationyouhaveentered: FirstNIC:eth0 SecondNIC:eth1 bondname:bond1 IPaddress:192.168.56.11 netmask:255.255.255.0 bonding_mode:mode=1 primaryNIC:none ---------------------------------------------- PlsmakesureitsOK[y/n]:y
如上,脚本在使用过程中,会依次提示输入需要绑定的子网卡名称、绑定网卡名称、IP地址和子网掩码、绑定模式、是否指定主网卡,并主动对系统中可用网卡进行识别并列出,供用户选择,同时会判断输入的各项信息的正确性,保障双网卡绑定顺利进行。
3.使用说明
首先将脚本上传至linux系统任意目录下,使用root用户执行:
[root@node1tmp]#shbonding_v2.0.sh ---------------------------------------------- ------NetworkConfigurationAssistant------ ---------------------------------------------- 4networkcardsavailable: eth0eth1eth2eth3 ---------------------------------------------- PleaseentertheFirstNIC:_
首先脚本会列出系统中有多少可用网卡,并提示输入需要绑定的第一块子网卡的名称,这里输入eth2。
无需担心输入错误,输入重复等问题,脚本会自动判断你的输入信息是否正确。
---------------------------------------------- ------NetworkConfigurationAssistant------ ---------------------------------------------- 4networkcardsavailable: eth0eth1eth2eth3 Theinformationyouhaveentered: FirstNIC:eth2 ---------------------------------------------- PleaseselectthesecondNIC:_
接着输入需要绑定的第二块网卡的名称eth3,如果输入错误会出现相应的提示,比如错输入为eth8,会提示需要重新输入:
---------------------------------------------- ------NetworkConfigurationAssistant------ ---------------------------------------------- 4networkcardsavailable: eth0eth1eth2eth3 Theinformationyouhaveentered: FirstNIC:eth2 ---------------------------------------------- eth8isnotavailable,Pleaseenteranotherone. PleaseselectthesecondNIC:_
正确输入需要绑定的第二块网卡eth3后,如果linux系统中之前不存在绑定网卡,则默认第一个绑定网卡的名称为bond0,如果系统中存在绑定网卡,脚本会提示输入bondN(N为数字):
---------------------------------------------- ------NetworkConfigurationAssistant------ ---------------------------------------------- Theinformationyouhaveentered: FirstNIC:eth2 SecondNIC:eth3 bondname:bond0 ---------------------------------------------- Thedefaultfirstbondnameis--bond0. PleaseenteranIPaddress:_
按照提示输入需要绑定的IP地址,比如10.1.1.1
脚本会自动判断输入的IP地址格式和范围是否正确,无需担心输入错误
---------------------------------------------- ------NetworkConfigurationAssistant------ ---------------------------------------------- Theinformationyouhaveentered: FirstNIC:eth2 SecondNIC:eth3 bondname:bond0 IPaddress:10.1.1.1 ---------------------------------------------- PlsentertheNETMASK[255.255.255.0]:_
输入IP地址后,会提示输入子网掩码,默认为255.255.255.0,直接回车即可,也可以输入自定义的子网掩码。
---------------------------------------------- ------NetworkConfigurationAssistant------ ---------------------------------------------- Theinformationyouhaveentered: FirstNIC:eth2 SecondNIC:eth3 bondname:bond0 IPaddress:10.1.1.1 netmask:255.255.255.0 ---------------------------------------------- Plsenterthebonding_mode[default:mode=1,active-backup]:_
这一步是输入网卡绑定级别,默认使用主备模式:mode=1,直接回车即可,也可以输入自定义的绑定级别(如输入mode=6),格式为:
mode={0,1,2,3,4,5,6} ---------------------------------------------- ------NetworkConfigurationAssistant------ ---------------------------------------------- Theinformationyouhaveentered: FirstNIC:eth2 SecondNIC:eth3 bondname:bond0 IPaddress:10.1.1.1 netmask:255.255.255.0 bonding_mode:mode=1 ---------------------------------------------- 1-eth2 2-eth3 3-none choosewhethertosetuptheprimaryNICornot[default:3-none]:_
此时脚本提示是否设置primary网卡,primary网卡的作用是在子网卡均正常时,primary网卡优先处于活动状态,这里默认为不设置primary网卡,也可以输入数字1或2选择一个网卡为primary网卡。
---------------------------------------------- ------NetworkConfigurationAssistant------ ---------------------------------------------- Theinformationyouhaveentered: FirstNIC:eth2 SecondNIC:eth3 bondname:bond0 IPaddress:10.1.1.1 netmask:255.255.255.0 bonding_mode:mode=1 primaryNIC:none ---------------------------------------------- PlsmakesureitsOK[y/n]:_
至此,所有信息输入完毕,脚本会让您判断输入的所有信息是否正确,正确则输入y,进行下一步操作,否则输入n,重新输入以上信息。
---------------------------------------------- ------NetworkConfigurationAssistant------ ---------------------------------------------- Complete! Filebackupdirectory:/etc/sysconfig/network-scripts/inspur_bak youcancheckthefileandthenrestartthenetworkservice. 1)servicenetworkrestart 2)exit ---------------------------------------------- Pleasemakeyourchoice:_
看到这里时,所有绑定网卡的配置文件已经修改完毕了,输入1重启网络服务;输入2直接退出脚本。
建议选择重启网络服务,如果直接退出脚本而不重启网络服务,修改的配置文件是不会生效的,并且在使用该脚本创建下一个绑定网卡时显示信息会出现异常(因为脚本通过ifconfig命令获取当前网卡信息)。
youcancheckthefileandthenrestartthenetworkservice. 1)servicenetworkrestart 2)exit ---------------------------------------------- Pleasemakeyourchoice:1 正在关闭接口eth0:[确定] 正在关闭接口eth1:[确定] 正在关闭接口eth2:[确定] 正在关闭接口eth3:[确定] 关闭环回接口:[确定] 弹出环回接口:[确定] 弹出界面bond0:RTNETLINKanswers:Fileexists 在bond0添加地址10.1.1.1时出错。 [确定] 弹出界面eth0:[确定] 弹出界面eth1:[确定]
第一次重启网络服务时可能会出现以上类似报错,无需担心,其实配置已经完成,再次重启网络服务即恢复正常。
在绑定过程中修改的配置文件如下:
[root@node1tmp]#cd/etc/sysconfig/network-scripts/ [root@node1network-scripts]#catifcfg-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=100mode=1" [root@node1network-scripts]#catifcfg-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@node1network-scripts]#catifcfg-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@node1network-scripts]#cat/etc/modprobe.conf aliasscsi_hostadapterata_piix aliasscsi_hostadapter1ahci aliasnet-pf-10off aliasipv6off optionsipv6disable=1 aliassnd-card-0snd-intel8x0 optionssnd-card-0index=0 optionssnd-intel8x0index=0 removesnd-intel8x0{/usr/sbin/alsactlstore0>/dev/null2>&1||:;};/sbin/modprobe-r--ignore-removesnd-intel8x0 aliaseth0e1000 aliaseth1e1000 aliaseth2e1000 aliaseth3e1000 aliasbond0bonding
网络配置信息如下:
[root@node1tmp]#ifconfig bond0Linkencap:EthernetHWaddr08:00:27:41:B4:16 inetaddr:10.1.1.1Bcast:10.1.1.255Mask:255.255.255.0 UPBROADCASTRUNNINGMASTERMULTICASTMTU:1500Metric:1 RXpackets:1197errors:0dropped:0overruns:0frame:0 TXpackets:125errors:0dropped:0overruns:0carrier:0 collisions:0txqueuelen:0 RXbytes:106338(103.8KiB)TXbytes:16662(16.2KiB) eth0Linkencap:EthernetHWaddr08:00:27:35:B4:81 inetaddr:192.168.56.11Bcast:192.168.56.255Mask:255.255.255.0 UPBROADCASTRUNNINGMULTICASTMTU:1500Metric:1 RXpackets:1487errors:0dropped:0overruns:0frame:0 TXpackets:1190errors:0dropped:0overruns:0carrier:0 collisions:0txqueuelen:1000 RXbytes:146576(143.1KiB)TXbytes:151787(148.2KiB) eth1Linkencap:EthernetHWaddr08:00:27:72:08:46 inetaddr:10.1.1.11Bcast:10.1.1.255Mask:255.255.255.0 UPBROADCASTRUNNINGMULTICASTMTU:1500Metric:1 RXpackets:193errors:0dropped:0overruns:0frame:0 TXpackets:455errors:0dropped:0overruns:0carrier:0 collisions:0txqueuelen:1000 RXbytes:31434(30.6KiB)TXbytes:22657(22.1KiB) eth2Linkencap:EthernetHWaddr08:00:27:41:B4:16 UPBROADCASTRUNNINGSLAVEMULTICASTMTU:1500Metric:1 RXpackets:591errors:0dropped:0overruns:0frame:0 TXpackets:93errors:0dropped:0overruns:0carrier:0 collisions:0txqueuelen:1000 RXbytes:55217(53.9KiB)TXbytes:10511(10.2KiB) eth3Linkencap:EthernetHWaddr08:00:27:41:B4:16 UPBROADCASTRUNNINGSLAVEMULTICASTMTU:1500Metric:1 RXpackets:606errors:0dropped:0overruns:0frame:0 TXpackets:32errors:0dropped:0overruns:0carrier:0 collisions:0txqueuelen:1000 RXbytes:51121(49.9KiB)TXbytes:6151(6.0KiB) loLinkencap:LocalLoopback inetaddr:127.0.0.1Mask:255.0.0.0 UPLOOPBACKRUNNINGMTU:16436Metric:1 RXpackets:3297errors:0dropped:0overruns:0frame:0 TXpackets:3297errors:0dropped:0overruns:0carrier:0 collisions:0txqueuelen:0 RXbytes:4725726(4.5MiB)TXbytes:4725726(4.5MiB)
双网卡绑定信息:
[root@node1tmp]#cat/proc/net/bonding/bond0 EthernetChannelBondingDriver:v3.4.0-2(October7,2008) BondingMode:fault-tolerance(active-backup) PrimarySlave:None CurrentlyActiveSlave:eth2 MIIStatus:up MIIPollingInterval(ms):100 UpDelay(ms):0 DownDelay(ms):0 SlaveInterface:eth2 MIIStatus:up Speed:1000Mbps Duplex:full LinkFailureCount:0 PermanentHWaddr:08:00:27:41:b4:16 SlaveInterface:eth3 MIIStatus:up Speed:1000Mbps Duplex:full LinkFailureCount:0 PermanentHWaddr:08:00:27:6c:3d:0c
4.脚本代码
#!/bin/bash #Date:2018-11-2614:28:45 #Author:ZhangJian #Mail:1037509307@qq.com #Func:ConfigureNetworkBonding #Version:2.0 #V1.6版本更新:不再将绑定的模式mode=x写入modprobe.conf文件,将其写入ifcfg-bond中,因为在modprobe.conf文件中时,修改了mode模式后,重启网络服务可能不生效。 #V2.0版本更新:将primary网卡设置为可选择项。 trap"tputclear;tputcup3;echo'AnyQuestions:SendamessagetoQQ1037509307.';tputcup6;exit"23 if[[-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-aNIC_LIST NIC_LIST=($NIC_NAME_free) info_print(){ tputclear;tputcup2 cat< /dev/null if[[$?-eq0]];then info_print echo-e"\033[031m$NIC_NAME_free_nu\033[0mnetworkcardsavailable:\n\033[31m${NIC_LIST[@]}\033[0m" echo-e"\nTheinformationyouhaveentered:\nFirstNIC:$NIC1" echo-e"----------------------------------------------\n" break else info_print echo-e"\033[031m$NIC_NAME_free_nu\033[0mnetworkcardsavailable:\n\033[31m${NIC_LIST[@]}\033[0m" echo-e"----------------------------------------------\n" echo-e"\033[31m${NIC1}\033[0misnotavailable,Pleaseenteranotherone." fi done #输入第二块网卡的名称 whiletrue;do echo-e"\nPleaseselectthesecondNIC:_\b\c" readNIC2 if[[${NIC1}!=${NIC2}]];then echo${NIC_LIST[@]}|grep-Fw"${NIC2}"&>/dev/null if[[$?-eq0]];then info_print"${NIC_NAME_bond}" echo-e"Theinformationyouhaveentered:\nFirstNIC:${NIC1}\nSecondNIC:${NIC2}" echo-e"----------------------------------------------\n" break else info_print echo-e"\033[031m$NIC_NAME_free_nu\033[0mnetworkcardsavailable:\n\033[31m${NIC_LIST[@]}\033[0m\n\nTheinformationyouhaveentered:\nFirstNIC:${NIC1}" echo-e"----------------------------------------------\n" echo-e"\033[31m${NIC2}\033[0misnotavailable,Pleaseenteranotherone." fi else info_print echo-e"\033[031m${NIC_NAME_free_nu}\033[0mnetworkcardsavailable:\n\033[31m${NIC_LIST[@]}\033[0m\n\nTheinformationyouhaveentered:\nFirstNIC:${NIC1}" echo-e"----------------------------------------------\n" echo-e"\033[31m${NIC2}\033[0misthefirstNIC,Pleaseenteranotherone." fi done #输入绑定网卡名称并进行合理性检查 if[[-z${NIC_NAME_bond}]];then NAME_bond=bond0 info_print echo-e"Theinformationyouhaveentered:\nFirstNIC:${NIC1}\nSecondNIC:${NIC2}\nbondname:${NAME_bond}" echo-e"----------------------------------------------\n" echo"Thedefaultfirstbondnameis--bond0." else whiletrue;do echo-e"\nPleaseenterabondname[bonN]:_\b\c" readNAME_bond #检查输入格式是否为bond+数字的格式。 echo"${NAME_bond}"|grep-wE'^bond[[:digit:]]+$'&>/dev/null if[[$?-eq0]];then echo"${NIC_NAME_bond}"|grep-Fw"${NAME_bond}"&>/dev/null if[[$?-ne0]];then info_print"${NIC_NAME_bond}" echo-e"Theinformationyouhaveentered:\nFirstNIC:${NIC1}\nSecondNIC:${NIC2}\nbondname:${NAME_bond}" echo-e"----------------------------------------------\n" break else info_print"${NIC_NAME_bond}" echo-e"Theinformationyouhaveentered:\nFirstNIC:${NIC1}\nSecondNIC:${NIC2}" echo-e"----------------------------------------------\n" echo"Youcannotuseanexistingname:${NAME_bond}" echo-e"\033[31m${NAME_bond}\033[0misnotavailable,Pleaseenteranotheronelike--bondN." fi else info_print"${NIC_NAME_bond}" echo-e"Theinformationyouhaveentered:\nFirstNIC:${NIC1}\nSecondNIC:${NIC2}" echo-e"----------------------------------------------\n" echo-e"\033[31m${NAME_bond}\033[0misnotavailable,Pleaseenteranotheronelike--bondN." fi done fi #设置IP地址 whiletrue;do echo-e"\nPleaseenteranIPaddress:_\b\c" readIP_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[[$?-eq0]];then info_print echo-e"Theinformationyouhaveentered:\nFirstNIC:${NIC1}\nSecondNIC:${NIC2}\nbondname:${NAME_bond}\nIPaddress:${IP_bond}" echo-e"----------------------------------------------\n" break else info_print echo-e"Theinformationyouhaveentered:\nFirstNIC:${NIC1}\nSecondNIC:${NIC2}\nbondname:${NAME_bond}" echo-e"----------------------------------------------\n" echo-e"IPaddress:\033[31m${IP_bond}\033[0mformaterrors,pleasere-enter." fi done #设置netmask whiletrue;do echo-e"\nPlsentertheNETMASK[255.255.255.0]:_\b\c" readNETMASK_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[[$?-eq0]];then info_print echo-e"Theinformationyouhaveentered:\nFirstNIC:${NIC1}\nSecondNIC:${NIC2}\nbondname:${NAME_bond}\nIPaddress:${IP_bond}\nnetmask:${NETMASK_bond}" echo-e"----------------------------------------------\n" break else info_print echo-e"Theinformationyouhaveentered:\nFirstNIC:${NIC1}\nSecondNIC:${NIC2}\nbondname:${NAME_bond}\nIPaddress:${IP_bond}" echo-e"----------------------------------------------\n" echo-e"Inputerror.\nPleaseenterthecorrectNETMASKorpressENTERtouse255.255.255.0.\n" fi done #:< \n\n" exit1 fi #getdevicenameandipinformation 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/$BONDisalreadyexist else #filebackup Check_BakFile"${BOND_DIR}/ifcfg-*""${BOND_DIR}/inspur_bak""-M" #getmacaddress 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|grepHWADDR>>$BOND_DIR/$SLAVE1 echo"#$SLAVE1_MAC">>$BOND_DIR/$SLAVE1 echoONBOOT=yes>>$BOND_DIR/$SLAVE1 echoTYPE=Ethernet>>$BOND_DIR/$SLAVE1 echoUSERCTL=no>>$BOND_DIR/$SLAVE1 echoIPV6INIT=no>>$BOND_DIR/$SLAVE1 echoPEERDNS=yes>>$BOND_DIR/$SLAVE1 echoSLAVE=yes>>$BOND_DIR/$SLAVE1 echoMASTER=$BOND_DEV>>$BOND_DIR/$SLAVE1 #modifySLAVE2 >$BOND_DIR/$SLAVE2 echo"DEVICE=$SLAVE2_DEV">>$BOND_DIR/$SLAVE2 echoBOOTPROTO=none>>$BOND_DIR/$SLAVE2 #cat$BOND_DIR/../ifcfg-bak/$SLAVE2|grepHWADDR>>$BOND_DIR/$SLAVE2 echo"#$SLAVE2_MAC">>$BOND_DIR/$SLAVE2 echoONBOOT=yes>>$BOND_DIR/$SLAVE2 echoTYPE=Ethernet>>$BOND_DIR/$SLAVE2 echoUSERCTL=no>>$BOND_DIR/$SLAVE2 echoIPV6INIT=no>>$BOND_DIR/$SLAVE2 echoPEERDNS=yes>>$BOND_DIR/$SLAVE2 echoSLAVE=yes>>$BOND_DIR/$SLAVE2 echoMASTER=$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_DEVbonding">>/etc/modprobe.conf whiletrue;do tputclear;tputcup2 cat< 以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。