2017-07-16 00:47:10 garyond 阅读数 677
  • Shell脚本编写实战

    根据实际的案例讲解怎么编写Shell脚本,在什么场景下编写为讲解导向。 课程内容如下: 1.编写Shell脚本注意事项与编写打印字体颜色函数 2.批量创建用户 3.监控主机存活状态 4.监控CPU、内存、硬盘和网卡流量利用率 5.监控网站可用性

    2792 人正在学习 去看看 李振良

1. Bonding简述

双网卡配置设置虚拟为一个网卡实现网卡的冗余,其中一个网卡坏掉后网络通信仍可正常使用,实现网卡层面的负载均衡和高可用性

1.1 Bonding原理

网卡工作在混杂(promisc)模式,接收到达网卡的所有数据包,tcpdump工作用的也是混杂模式(promisc),将两块网卡的MAC地址修改为相同接收特定MAC的数据帧,然后把相应的数据帧传送给bond驱动程序进行处理。

1.2 Bonding模式

  • 轮询策略,值为0,按照设备顺序依次传输数据包,提供负载均衡和容错能力

  • 主备策略,值为1,只有主网卡处于工作状态,备网卡处于备用状态,主网卡坏掉后备网卡开始工作,提供容错能力

  • 异或策略,值为2,根据源MAC地址和目的MAC地址进行异或计算的结果来选择传输设备,提供负载均衡和容错能力

  • 广播策略,值为3,将所有数据包传输给所有接口通过全部设备来传输所有数据,一个报文会复制两份通过bond下的两个网卡分别发送出去,提供高容错能力

  • 动态链接聚合,值为4,按照802.3ad协议的聚合自动配置来共享相同的传输速度,网卡带宽最高可以翻倍,链路聚合控制协议(LACP)自动通知交换机聚合哪些端口,需要交换机支持 802.3ad协议,提供容错能力

  • 输出负载均衡模式,值为5,输出负载均衡模式,只有输出实现负载均衡,输入数据时则只选定其中一块网卡接收,需要网卡和驱动支持ethtool命令

  • 输入/输出负载均衡模式,值为6,输入和输出都实现负载均衡,需要网卡和驱动支持ethtool命令

2. 配置步骤

1. 进入网卡配置目录

# cd /etc/sysconfig/network-scripts

2. 创建双网卡绑定配置文件

# vi ifcfg-bond0
DEVICE=bond0
BOOTPROTO=none
IPADDR=192.168.1.3
NETMASK=255.255.255.0
#GATEWAY=192.168.1.254
ONBOOT=yes
USERCTL=no
MOCK=yes
NM_Cmock=no
BONDING_OPTS="mode=1 miimon=100"

3. 修改绑定网卡

建议:在网卡绑定前,先对先前的网卡配置信息进行备份

  • 修改网卡1配置
# vi ifcfg-em1
DEVICE=em1
BOOTPROTO=none
ONBOOT=yes
TYPE=Ethemet
USERCTL=no
MASTER=bond0
SLAVE=yes  
  • 修改网卡2配置
# vi ifcfg-em2
DEVICE=em2
BOOTPROTO=none
ONBOOT=yes
TYPE=Ethemet
USERCTL=no
MASTER=bond0
SLAVE=yes 

4. 配置modprobe参数

注意:redhat6 以后没有了modprobe.conf这个配置文件。

vi /etc/modprobe.d/dist.conf
alias bond0 bonding
-- options bond0中mode=1表示的是网卡互备
options bond0 mode=1 miimon=50 

5. 关闭网络管理程序

# service  NetworkManager stop 
# chkconfig NetworkManager off 

6. 重启网络

说明:如果重启网络后不能ping通网络, 需要重启一下机器。

# service network restart

7. 查看当前使用网卡信息

# cat /proc/net/bonding/bond0
2015-06-18 18:00:40 taiyang1987912 阅读数 6140
  • Shell脚本编写实战

    根据实际的案例讲解怎么编写Shell脚本,在什么场景下编写为讲解导向。 课程内容如下: 1.编写Shell脚本注意事项与编写打印字体颜色函数 2.批量创建用户 3.监控主机存活状态 4.监控CPU、内存、硬盘和网卡流量利用率 5.监控网站可用性

    2792 人正在学习 去看看 李振良

双网卡绑定单个IP 地址 为了提供网络的高可用性,我们可能需要将多块网卡绑定成一块虚拟网卡对外提供服务,这样即使其中的一块物理网卡出现故障,也不会导致连接中断。多网卡绑。

为了提供网络的高可用性,我们可能需要将多块网卡绑定成一块虚拟网卡对外提供服务,这样即使其中的一块物理网卡出现故障,也不会导致连接中断。在Linux下叫bonding,IBM称为etherchanel,broadcom叫team,但是名字怎么变,效果都是将两块或更多的网卡当做一块网卡使用,在增加带宽的同时也可以提高冗余性。比如我们在CentOS 6.3下可以将eth0和eth1绑定成虚拟网卡bond0。

如图:

实验配置:

mode=1:表示fault-tolerance (active-backup)提供冗余功能,工作方式是主备的工作方式,其中一块网卡在工作(若eth0断掉),则自动切换到另一个块网卡(eth1做备份)。

系 统

设备名称

IP地址

子网掩码

 

CentOS 6.3_64bit

eth0

 

 

eth1

 

 

bond0

10.1.3.210

255.255.255.0

 

1、查看主机网卡

[root@web ~]# cd /etc/sysconfig/network-scripts/

[root@web1 network-scripts]# ll

total 200

-rw-r--r--. 1 root root   212 Mar 20 22:15 ifcfg-eth0

-rw-r--r--  1 root root   212 Mar 23 19:10 ifcfg-eth1

2、复制ifcfg-bond0

[root@web network-scripts]# cp ifcfg-eth0 ifcfg-bond0

[root@web network-scripts]# ll

total 204

-rw-r--r--  1 root root   212 Mar 23 19:12 ifcfg-bond0

-rw-r--r--. 1 root root   212 Mar 20 22:15 ifcfg-eth0

-rw-r--r--  1 root root   212 Mar 23 19:10 ifcfg-eth1

3、编辑ifcfg-bond0、ifcfg-eth0、ifcfg-eth1

[root@web network-scripts]# vim ifcfg-bond0

DEVICE=bond0

BOOTPROTO=static

IPADDR=10.1.3.210

NETMASK=255.255.255.0

GATEWAY=10.1.3.254

ONBOOT=yes

USERCTL=no

[root@web1 network-scripts]# vim ifcfg-eth0

DEVICE=eth0

ONBOOT=yes

BOOTPROTO=none

MASTER=bond0

SLAVE=yes

USERCTL=no

[root@web1 network-scripts]# vim ifcfg-eth1

DEVICE=eth1

ONBOOT=yes

BOOTPROTO=none

MASTER=bond0

SLAVE=yes

USERCTL=no

4、模块加载

[root@web1 ~]# vim /etc/modprobe.d/dist.conf 

在最后添加以下内容:

#加载bonding模块,对外虚拟网络接口设备为 bond0

alias bond0 bonding

options bond0 miimon=100 mode=1

[root@web1 ~]# grep bond0 /etc/modprobe.d/dist.conf

alias bond0 bonding

options bond0 miimon=100 mode=1

说明:

miimon是用来进行链路监测的。 比如:miimon=100,单位是ms(毫秒)这边的100,是100ms,即是0.1秒那么系统每100ms监测一次链路连接状态,如果有一条线路不通就转入另一条线路;mode的值表示工作模式,他共有0,1,2,3四种模式,常用的为0、1两种。 

mode共有七种(0~6),这里解释两个常用的选项。

mode=0:表示load balancing (round-robin)为负载均衡方式,两块网卡都在工作。

mode=1:表示fault-tolerance (active-backup)提供冗余功能,工作方式是主备的工作方式,其中一块网卡在工作(若eth0断掉),则自动切换到另一个块网卡(eth1做备份)。

bonding只能提供链路监测,即从主机到交换机的链路是否接通。如果只是交换机对外的链路down掉了,而交换机本身并没有故障,那么bonding会认为链路没有问题而继续使用。

5、重启网络服务,使配置生效

[root@web1 ~]# service network restart

Shutting down interface eth0:                              [  OK  ]

Shutting down interface eth1:                              [  OK  ]

Shutting down loopback interface:                           [  OK  ]

Bringing up loopback interface:                             [  OK  ]

Bringing up interface bond0:  RTNETLINK answers: File exists

Error adding address 10.1.3.210 for bond0.

RTNETLINK answers: File exists                              [  OK  ]

6、查看bond0接口状态

[root@web1 ~]# cat /proc/net/bonding/bond0

Ethernet Channel Bonding Driver: v3.6.0 (September 26, 2009)

Bonding Mode: fault-tolerance (active-backup)

Primary Slave: None

Currently Active Slave: eth0       // eth0主模式

MII Status: up

MII Polling Interval (ms): 100

Up Delay (ms): 0

Down Delay (ms): 0

Slave Interface: eth0

MII Status: up

Speed: 1000 Mbps

Duplex: full

Link Failure Count: 0

Permanent HW addr: 00:0c:29:c9:6d:18

Slave queue ID: 0

Slave Interface: eth1

MII Status: up

Speed: 1000 Mbps

Duplex: full

Link Failure Count: 0

Permanent HW addr: 00:0c:29:c9:6d:22

Slave queue ID: 0

7、查看中路由表状态:

[root@web1 ~]#  route  -n

Kernel IP routing table

Destination     Gateway         Genmask         Flags Metric Ref    Use Iface

10.1.3.0        0.0.0.0         255.255.255.0   U     0      0        0 bond0

169.254.0.0     0.0.0.0         255.255.0.0     U     1004   0        0 bond0

0.0.0.0         10.1.3.254      0.0.0.0         UG    0      0        0 bond0

[root@web1 ~]# lsmod | grep bond

bonding               127060  0

8、测试

选择一台windows 7机器ping测试机,然后停掉当前使用的网卡eth0,查看是否能够继续ping通;

测试结果:丢失一个包。

查看bond0接口状态

[root@web1 ~]#cat /proc/net/bonding/bond0

Ethernet Channel Bonding Driver: v3.6.0 (September 26, 2009)

Bonding Mode: fault-tolerance (active-backup)

Primary Slave: None

Currently Active Slave: eth1      //eth1为主模式

MII Status: up

MII Polling Interval (ms): 100

Up Delay (ms): 0

Down Delay (ms): 0

Slave Interface: eth0

MII Status: down

Speed: Unknown

Duplex: Unknown

Link Failure Count: 1

Permanent HW addr: 00:0c:29:c9:6d:18

Slave queue ID: 0

Slave Interface: eth1

MII Status: up

Speed: 1000 Mbps

Duplex: full

Link Failure Count: 1

Permanent HW addr: 00:0c:29:c9:6d:22

Slave queue ID: 0

配置完成!

9、支持NetworkManager的centos系统

只需要通过界面配置即可以完成多块网卡的绑定

10、一个网桥、bond实例

/etc/sysconfig/network-scripts/下的文件:
(1)ifcfg-ebr
DEVICE=ebr
STP=yes
BRIDGING_OPTS=priority=128
TYPE=Bridge
BOOTPROTO=none
IPADDR=192.168.1.2
NETMASK=255.255.255.0
GATEWAY=192.168.1.1
DNS1=
DNS2=
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
NAME=ebr
UUID=1ce71742-a273-42fe-b358-3b0a0ee77c50
ONBOOT=yes
(2)ifcfg-ebrbond
DEVICE=ebrbond
BONDING_OPTS="miimon=100 mode=balance-alb"
TYPE=Bond
BONDING_MASTER=yes
BRIDGING_OPTS="priority=50 path_cost=33"
NAME=ebrbond
UUID=d0baebf0-282b-4dfe-b6d4-f6ff30ad81d1
ONBOOT=yes
BRIDGE=ebr
(3)ifcfg-eth0
DEVICE=eth0
HWADDR=90:B1:1C:6E:AE:09
TYPE=Ethernet
NAME=eth0
UUID=c2eee5d8-34ee-4c0c-8d77-90029520b249
ONBOOT=yes
MASTER=ebrbond
SLAVE=yes
(4)ifcfg-eth1
DEVICE=eth1
HWADDR=00:10:18:EA:9E:FC
TYPE=Ethernet
NAME=eth1
UUID=71ee5282-ce19-49f4-972d-37ab030b8011
ONBOOT=yes
MASTER=ebrbond
SLAVE=yes

2014-06-14 15:12:10 u011640816 阅读数 674
  • Shell脚本编写实战

    根据实际的案例讲解怎么编写Shell脚本,在什么场景下编写为讲解导向。 课程内容如下: 1.编写Shell脚本注意事项与编写打印字体颜色函数 2.批量创建用户 3.监控主机存活状态 4.监控CPU、内存、硬盘和网卡流量利用率 5.监控网站可用性

    2792 人正在学习 去看看 李振良

在Linux下开发网络程序时,经常会遇到需要取本地网络接口名、IP、广播地址、子网掩码或者MAC地址等信息的需求,最常见的办法是配合SIOCGIFHWADDR、SIOCGIFADDR、SIOCGIFBRDADDR与SIOCGIFNETMASK作为参数调用函数ioctl分别获得MAC地址、IP地址、广播地址与子网掩码来实现。


struct ifreq

这个结构定义在include/net/if.h,用来配置ip地址,激活接口,配置MTU等接口信息的

/* Interface request structure used for socket ioctl's.  All interface
   ioctl's must have parameter definitions which begin with ifr_name.
   The remainder may be interface specific.  */

struct ifreq
  {
# define IFHWADDRLEN    6
# define IFNAMSIZ   IF_NAMESIZE
    union
      {   
    char ifrn_name[IFNAMSIZ];   /* Interface name, e.g. "en0".  */
      } ifr_ifrn;

    union
      {   
    struct sockaddr ifru_addr;
    struct sockaddr ifru_dstaddr;
    struct sockaddr ifru_broadaddr;
    struct sockaddr ifru_netmask;
    struct sockaddr ifru_hwaddr;
    short int ifru_flags;
    int ifru_ivalue;
    int ifru_mtu;
    struct ifmap ifru_map;
    char ifru_slave[IFNAMSIZ];  /* Just fits the size */
    char ifru_newname[IFNAMSIZ];
    __caddr_t ifru_data;
      } ifr_ifru;
  };  
# define ifr_name   ifr_ifrn.ifrn_name  /* interface name   */
# define ifr_hwaddr ifr_ifru.ifru_hwaddr    /* MAC address      */
# define ifr_addr   ifr_ifru.ifru_addr  /* address      */
# define ifr_dstaddr    ifr_ifru.ifru_dstaddr   /* other end of p-p lnk */
# define ifr_broadaddr  ifr_ifru.ifru_broadaddr /* broadcast address    */
# define ifr_netmask    ifr_ifru.ifru_netmask   /* interface net mask   */
# define ifr_flags  ifr_ifru.ifru_flags /* flags        */
# define ifr_metric ifr_ifru.ifru_ivalue    /* metric       */
# define ifr_mtu    ifr_ifru.ifru_mtu   /* mtu          */
# define ifr_map    ifr_ifru.ifru_map   /* device map       */
# define ifr_slave  ifr_ifru.ifru_slave /* slave device     */
# define ifr_data   ifr_ifru.ifru_data  /* for use by interface */
# define ifr_ifindex    ifr_ifru.ifru_ivalue    /* interface index      */
# define ifr_bandwidth  ifr_ifru.ifru_ivalue    /* link bandwidth   */
# define ifr_qlen   ifr_ifru.ifru_ivalue    /* queue length     */
# define ifr_newname    ifr_ifru.ifru_newname   /* New name     */
# define _IOT_ifreq _IOT(_IOTS(char),IFNAMSIZ,_IOTS(char),16,0,0)
# define _IOT_ifreq_short _IOT(_IOTS(char),IFNAMSIZ,_IOTS(short),1,0,0)
# define _IOT_ifreq_int _IOT(_IOTS(char),IFNAMSIZ,_IOTS(int),1,0,0)

struct  ifconf

通常是用来保存所有接口信息的

/* Structure used in SIOCGIFCONF request.  Used to retrieve interface
   configuration for machine (useful for programs which must know all
   networks accessible).  */

struct ifconf
  {
    int ifc_len;            /* Size of buffer.  */
    union
      {
    __caddr_t ifcu_buf;
    struct ifreq *ifcu_req;
      } ifc_ifcu;
  };
# define ifc_buf    ifc_ifcu.ifcu_buf   /* Buffer address.  */
# define ifc_req    ifc_ifcu.ifcu_req   /* Array of structures.  */
# define _IOT_ifconf _IOT(_IOTS(struct ifconf),1,0,0,0,0) /* not right */
完整代码如下:

/*============================================================================
 Name        : Exercise.cbp
 Author      : Haier
 Version     : 1.01
 Copyright   : Copyright (c) 2014
 Description : File Encryption in C, Ansi-style, Compile by Code::Block
 ============================================================================*/
#include <stdio.h>
#include <string.h>
#include <net/if.h>
#include <sys/ioctl.h>
#include <arpa/inet.h>
#include <errno.h>

int getLocalInfo(void)
{
   int fd;
   int interfaceNum = 0;
   struct ifreq buf[16];
   struct ifconf ifc;
   struct ifreq ifrcopy;
   char mac[16] = {0};
   char ip[32] = {0};
   char broadAddr[32] = {0};
   char subnetMask[32] = {0};

   if ((fd = socket(AF_INET, SOCK_DGRAM, 0)) < 0)
   {
      perror("socket");
      close(fd);
      return -1;
   }

   ifc.ifc_len = sizeof(buf);
   ifc.ifc_buf = (caddr_t)buf;
   if (!ioctl(fd, SIOCGIFCONF, (char *)&ifc))
   {
      interfaceNum = ifc.ifc_len / sizeof(struct ifreq);
      printf("interface num = %d\n", interfaceNum);
      while (interfaceNum-- > 0)
      {
             printf("\ndevice name: %s\n", buf[interfaceNum].ifr_name);

             //ignore the interface that not up or not runing
             ifrcopy = buf[interfaceNum];
             if (ioctl(fd, SIOCGIFFLAGS, &ifrcopy))
             {
                printf("ioctl: %s [%s:%d]\n", strerror(errno), __FILE__, __LINE__);
                close(fd);
                return -1;
             }

             //get the mac of this interface
             if (!ioctl(fd, SIOCGIFHWADDR, (char *)(&buf[interfaceNum])))
             {
                memset(mac, 0, sizeof(mac));
                snprintf(mac, sizeof(mac), "%02x%02x%02x%02x%02x%02x",
                            (unsigned char)buf[interfaceNum].ifr_hwaddr.sa_data[0],
                            (unsigned char)buf[interfaceNum].ifr_hwaddr.sa_data[1],
                            (unsigned char)buf[interfaceNum].ifr_hwaddr.sa_data[2],
                            (unsigned char)buf[interfaceNum].ifr_hwaddr.sa_data[3],
                            (unsigned char)buf[interfaceNum].ifr_hwaddr.sa_data[4],
                            (unsigned char)buf[interfaceNum].ifr_hwaddr.sa_data[5]);
                printf("device mac: %s\n", mac);
             }
            else
            {
                printf("ioctl: %s [%s:%d]\n", strerror(errno), __FILE__, __LINE__);
                close(fd);
                return -1;
            }

            //get the IP of this interface
            if (!ioctl(fd, SIOCGIFADDR, (char *)&buf[interfaceNum]))
            {
                snprintf(ip, sizeof(ip), "%s",
                            (char *)inet_ntoa(((struct sockaddr_in *)&(buf[interfaceNum].ifr_addr))->sin_addr));
                printf("device ip: %s\n", ip);
            }
            else
            {
                printf("ioctl: %s [%s:%d]\n", strerror(errno), __FILE__, __LINE__);
                close(fd);
                return -1;
            }

            //get the broad address of this interface
            if (!ioctl(fd, SIOCGIFBRDADDR, &buf[interfaceNum]))
            {
                snprintf(broadAddr, sizeof(broadAddr), "%s",
                            (char *)inet_ntoa(((struct sockaddr_in *)&(buf[interfaceNum].ifr_broadaddr))->sin_addr));
                printf("device broadAddr: %s\n", broadAddr);
            }
            else
            {
                printf("ioctl: %s [%s:%d]\n", strerror(errno), __FILE__, __LINE__);
                close(fd);
                return -1;
            }

            //get the subnet mask of this interface
            if (!ioctl(fd, SIOCGIFNETMASK, &buf[interfaceNum]))
            {
                snprintf(subnetMask, sizeof(subnetMask), "%s",
                            (char *)inet_ntoa(((struct sockaddr_in *)&(buf[interfaceNum].ifr_netmask))->sin_addr));
                printf("device subnetMask: %s\n", subnetMask);
            }
            else
            {
                printf("ioctl: %s [%s:%d]\n", strerror(errno), __FILE__, __LINE__);
                close(fd);
                return -1;
            }
        }
    }
    else
    {
        printf("ioctl: %s [%s:%d]\n", strerror(errno), __FILE__, __LINE__);
        close(fd);
        return -1;
    }

    close(fd);

    return 0;
}

int main(void)
{
    getLocalInfo();

    return 0;
}
使用ioctl函数虽然可以获取所有的信息,但是使用起来比较麻烦,如果不需要获取MAC地址,那么使用getifaddrs函数来获取更加方便与简洁。值得一提的是,在MacOS或iOS系统上(如iPhone程序开发),上述iotcl函数没法获得mac地址跟子网掩码,这个使用,使用getifaddrs函数便更有优势了。下面是使用getiaddrs函数获取网卡信息的C语言代码实现。
/*============================================================================
 Name        : Exercise.cbp
 Author      : Haier
 Version     : 1.01
 Copyright   : Copyright (c) 2014
 Description : File Encryption in C, Ansi-style, Compile by Code::Block
 ============================================================================*/
#include <stdio.h>
#include <ifaddrs.h>
#include <arpa/inet.h>

int getSubnetMask()
{
    struct sockaddr_in *sin = NULL;
    struct ifaddrs *ifa = NULL, *ifList;

    if (getifaddrs(&ifList) < 0) return -1;

    for (ifa = ifList; ifa != NULL; ifa = ifa->ifa_next)
    {
        if(ifa->ifa_addr->sa_family == AF_INET)
        {
            printf("\n>>> interfaceName: %s\n", ifa->ifa_name);

            sin = (struct sockaddr_in *)ifa->ifa_addr;
            printf(">>> ipAddress: %s\n", inet_ntoa(sin->sin_addr));

            sin = (struct sockaddr_in *)ifa->ifa_dstaddr;
            printf(">>> broadcast: %s\n", inet_ntoa(sin->sin_addr));

            sin = (struct sockaddr_in *)ifa->ifa_netmask;
            printf(">>> subnetMask: %s\n", inet_ntoa(sin->sin_addr));
        }
    }

    freeifaddrs(ifList);

    return 0;
}

int main(void)
{
    getSubnetMask();

    return 0;
}


2019-10-27 22:27:11 lpb2019 阅读数 41
  • Shell脚本编写实战

    根据实际的案例讲解怎么编写Shell脚本,在什么场景下编写为讲解导向。 课程内容如下: 1.编写Shell脚本注意事项与编写打印字体颜色函数 2.批量创建用户 3.监控主机存活状态 4.监控CPU、内存、硬盘和网卡流量利用率 5.监控网站可用性

    2792 人正在学习 去看看 李振良


  网卡bond是通过把多张网卡绑定为一个逻辑网卡,实现本地网卡的冗余,带宽扩容和负载均衡。
  将多块网卡绑定同一IP地址对外提供服务,可以实现高可用或者负载均衡。直接给两块网卡设置同一IP地址是不可以的。 通过bonding,虚拟一块网卡对外提供连接,物理网卡的被修改为相同的MAC地址,在应用部署中是一种常用的技术。
Bond的工作室模式有以下七种,常用的是0 1 6

  • Mode=0(balance-rr) 轮询策略round-robin(即:第1个包走eth0,下一个包就走eth1….一直循环下去,直到最后一个传输完毕),本模式提供负载均衡和容错的能力,和交换机的聚合强制不协商的方式配合,从头到尾顺序的在每一个slave接口上面发送数据包
  • Mode=1(active-backup) 表示主备模式,只有一块网卡是active,另外一块是备的standby,这时如果交换机配的是捆绑,将不能正常工作,因为交换机往两块网卡发包,有一半包是丢弃的。只有一个slave被激活,当且仅当活动的slave接口失败时才会激活其他slave.为了避免交换机发生混乱,此时绑定的MAC地址只有一个外部端口上可见
  • Mode=2(balance-xor) 表示XOR Hash负载分担,和交换机的聚合强制不协商方式配合。(需要xmit_hash_policy)
  • Mode=3(broadcast) 表示所有包从所有interface发出,这个不均衡,只有冗余机制…和交换机的聚合强制不协商方式配合。
  • Mode=4(802.3ad) 表示支持802.3ad协议,和交换机的聚合LACP方式配合(需要xmit_hash_policy)
  • Mode=5(balance-tlb) 是根据每个slave的负载情况选择slave进行发送,接收时使用当前轮到的slave
  • Mode=6(balance-alb) 在5的tlb基础上增加了rlb。

  5和6不需要交换机端的设置,网卡能自动聚合。4需要支持802.3ad。0,2和3理论上需要静态聚合方式,但实测中0可以通过mac地址欺骗的方式在交换机不设置的情况下不太均衡地进行接收。


用文件来配置来实现Bonding

  • 创建bonding设备的配置文件
vim /etc/sysconfig/network-scripts/ifcfg-bond0
DEVICE=bond0
BOOTPROTO=none
BOND_OPTS="millon=100 mode=0"
vim /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=bond0
BOOTPROTO=none
MASTER=bond0
SLAVE=yes
USERCTL=no
  • 查看bond0的状态
    cat /proc /net /bonding /bond0
  • miimon 是用来进行链路监测的。如果miimon=100,那么系统每100ms 监测
    一次链路连接状态,如果有一条线路不通就转入另一条线路
  • 删除bond0配置
    ifconfig bond0 down
    rmmod bonding

用nmcli实现bonding

  • 添加bonding接口
nmcli con add type bond con-name mybond0 ifname bond0 mode active-backup
  • 添加从属接口
nmcli con add type bond-slave ifname ens7 master bond0
nmcli con add type bond-slave ifname ens3 master bond0
注:如无为从属接口提供连接名,则该名称是接口名称加类型构成
  • 要启动绑定,则必须首先启动从属接口
nmcli con up bond-slave-eth0
nmcli con up bond-slave-eth1
  • 启动绑定
nmcli con up mybond0

实验多网卡绑定

  实验网卡绑定,先做绑定然后再把绑定后的网卡配置成桥接:

  • 准备一个虚拟机并增加一块网卡
    在这里插入图片描述
  • 配置bond0
cd /etc/sysconfig/network-scripts/
cp ifcfg-eth0 ifcfg-bond0
vim ifcfg-bond0
DEVICE=bond0
NAME=bond0
ONBOOT=yes
BOOTPROTO=dhcp
BONDING_OPTS="miimon=100 mode=1"
  • 配置eth0
cd /etc/sysconfig/network-scripts/
vim ifcfg-eth0
TYPE=Ethernet
DEVICE=eth0
NAME=eth0
MASTER=bond0
SLAVE=yes
ONBOOT=yes
  • 配置eth1
cd /etc/sysconfig/network-scripts/
cp ifcfg-eth0 ifcfg-eth1
vim ifcfg-eth1
DEVICE=eth1
NAME=eth1
TYPE=Ethernet
ONBOOT=yes
MASTER=bond0
SLAVE=yes
  • 重启网络服务
service network restart   #这里用的是centos6做的实验
  • 查看bond0状态
cat /proc/net/bonding/bond0
  • 删除bond0
ifconfig bond0 down
rmmod bonding

**完**
没有更多推荐了,返回首页