聊聊网卡bond功能

如何查看机器中的网卡bonding情况

查看是否存在bond网卡:

ifconfig

如何发现有带有 bondX 名字的网卡,那么说明本机是存在网卡bonding情况的。

然后查看网卡bonding的情况:

cat /proc/net/bonding/bond1

cat这个节点会输出网络bonding的模式,已经由哪些物理网卡作为bonding slave。

查看bond网卡配置:

/etc/sysconfig/network-scripts/ifcfg-eth0
/etc/sysconfig/network-scripts/ifcfg-eth1
/etc/sysconfig/network-scripts/ifcfg-bond1

如何配置网卡bonding

查看内核是否支持网卡bonding功能:

modinfo bonding | more

确认是否加载了内核网卡bonding功能module,如果没有需要手动编译module并且加载。然后修改

/etc/sysconfig/network-scripts/ifcfg-eth0
/etc/sysconfig/network-scripts/ifcfg-eth1
/etc/sysconfig/network-scripts/ifcfg-bond1

各个网卡的配置,详细的不写了,网上很多范例。

bond需要设置slave网卡为混杂模式吗?

搜索到网络上很多文章,有一部分介绍提到网卡的混杂模式,我第一次看文章时,想当然的理解为,为了保证master能够接收到对应MAC地址的网络报文,需要slave网卡设置为混杂模式,这样即使slave网卡MAC地址和Master设置的MAC不同,依然会保证Slave可以接收到数据,并传送给Master。然而实际上这根本是不对的,如果把Slave网卡都设置为混杂模式,那么所有经过网卡的数据包都要做处理,对于一个云上的大流量服务器来说,这得有多大的处理量,这种方式无疑会降低系统的性能和处理效率,肯定是不可取的。

实际上对于一个物理网卡来说,它的MAC地址是可以修改的,当然出厂时网卡中已经存在一个固定的HW ADDR,如果在系统中不做修改,那么该固定 HW ADDR 就会成为网络中使用的MAC地址。

那么在bond架构下(这里针对同时工作的mode,而不是主备mode)就需要修改对应的slave物理网卡的MAC地址为相同的值,最终情况为bond master网卡、slave网卡1、slave网卡2三者的MAC地址都相同。可以通过 cat /proc/net/bonding/bond1 查看网卡的地址情况:

system mac address: a4:91:2b:5d:f6:4b
Permanent HW addr: a4:bc:2d:3d:e6:4b

如上所示,对于物理网卡,会存在两个信息,第一个表示MAC,它会和bond网卡的MAC相同,第二个就是固定 HW ADDR 地址。

bond模式

bonding的模式:0-6,即:7种模式

#define BOND_MODE_ROUNDROBIN    0
#define BOND_MODE_ACTIVEBACKUP  1
#define BOND_MODE_XOR       2
#define BOND_MODE_BROADCAST 3
#define BOND_MODE_8023AD        4
#define BOND_MODE_TLB           5
#define BOND_MODE_ALB       6 /* TLB + RLB (receive load balancing) */
  • Mode 0(balance-rr): Round-robin policy
    子网卡依次传输数据包, 此模式提供负载平衡和容错能力;同一个会话不同的网卡传输数据在客户端很有可能会出现数据包乱序到达的问题,因此可能会让网络的吞吐量下降一些。

  • Mode 1(active-backup): Active-backup policy
    主备模式,只有一个设备处于活动状态,出现异常后由另一个顶替。MAC地址是外部可见得,所有子设备MAC地址和Bond设备一致,以避免交换机发生混乱。此模式只提供了容错能力;此模式优点是提高网络可靠性,缺点是降低资源利用率,只有一个接口处于工作状态,资源利用率为1/n。

  • Mode 2(balance-xor): XOR policy
    基于指定的HASH策略传输数据包。默认的哈希策略是:(源MAC地址 XOR 目标MAC地址) % slave数量。其他的传输策略可以通过设置xmit_hash_policy指定,此模式提供负载平衡和容错能力。

  • Mode 3: broadcast
    在每个slave接口上传输每个数据包,提供强大的容错能力。

  • Mode 4(802.3ad): IEEE 802.3ad Dynamic link aggregation
    创建一个聚合组,共享同样的速率和双工设定。根据802.3ad规范将多个slave工作在同一个激活的聚合体下。外出流量的slave选举是基于hash策略,该策略可以通过xmit_hash_policy选项从缺省的XOR策略改变到其他策略。需要交换机支持

  • Mode 5(balance-tlb): Adaptive transmit load balancing
    不需要交换机进行特殊配置。在每个slave上根据当前的负载分配外出流量。如果正在处理数据的slave出故障了,另一个slave接管失败的slave的MAC地址。

  • Mode 6(balance-alb): Adaptive load balancing
    不需要交换机进行特殊配置,该模式包含了balance-tlb模式的优点,同时加上针对IPV4流量的接收负载均衡。

MAC地址配置

除了TLB和ALB模式之外,其他的模式中所有的子设备MAC地址配置应该都与bond设备MAC地址相同,那么我们知道两个MAC地址相同的设备是不能处于同一个交换机下的子网的,这会带来MAC地址冲突,使这两个设备的网络异常,由于MAC地址相同,交换机可能会把需要转发到PORT1上的包转发到PORT2上,或者把PORT2的包转发到PORT1上。

那么对于一个bond的网卡,两个子网卡是否可以放于同一个交换机子网中呢?

在bonding场景下是合情合理的,由于多个网口都属于同一个host,因此不管交换机把指定MAC地址的包从哪一个口传递给bond slave设备,最终都会汇聚到bond驱动中,不但不会出现包的丢失,还扩大了网络的带宽。

动态添加或者删除slave

echo +eth0 > /sys/class/net/bond0/bonding/slaves
echo -eth0 > /sys/class/net/bond0/bonding/slaves

https://www.kernel.org/doc/Documentation/networking/bonding.txt

### Linux 中网卡绑定(bonding)的配置 #### 查看系统内核是否支持 bonding 为了确认当前使用的内核版本是否已经包含了 bonding 功能的支持,可以执行如下命令: ```bash modprobe --first-time bonding ``` 如果上述命令返回错误信息 `FATAL: Module bonding not found.` 则表示当前内核未加载 bonding 模块;反之则说明已成功加载该模块[^1]。 对于那些需要自行编译内核的情况,在内核配置菜单中应确保选中了以下路径中的选项: - **Device Drivers** - *Network device support* - *Bonding driver support* 完成这些设置后重新编译并安装新内核即可获得对 bonding 的支持[^3]。 #### 创建 Bonding 接口 通过编辑 `/etc/sysconfig/network-scripts/` 下的相关文件来进行 bond 接口的定义。假设要创建名为 `bond0` 的 bonded interface,则需新建或修改对应名称开头的 ifcfg 文件,比如 `ifcfg-bond0`: ```plaintext TYPE=Bond NAME=bond0 DEVICE=bond0 BONDING_OPTS="mode=active-backup miimon=100" BOOTPROTO=static ONBOOT=yes IPADDR=x.x.x.x NETMASK=x.x.x.x GATEWAY=x.x.x.x DNS1=x.x.x.x DNS2=x.x.x.x ``` 这里设置了静态 IP 地址分配方式,并指定了活动备份模式 (`mode=active-backup`) 和链路监测间隔时间 (miimon)[^4]。 #### 绑定物理网卡Bond Interface 上 针对每一块想要加入到这个 bond group 当中的实际网卡设备,同样也需要调整它们各自的配置文件。例如 eth0 和 eth1 将分别位于两个不同的文件里——`ifcfg-eth0`, `ifcfg-eth1`. 修改这两份文档的内容使其指向同一个虚拟接口 `bond0` : ```plaintext # For both ifcfg-eth0 and ifcfg-eth1 files, set the following lines: DEVICE=bond0 MASTER=bond0 SLAVE=yes BOOTPROTO=none ONBOOT=yes ``` 这一步骤使得两张实体网卡成为 bond0 成员的一部分. 最后记得保存所做的全部更改,并重启网络服务让新的设定生效: ```bash systemctl restart network ``` 此时应该能够看到一个新的逻辑网卡被创建出来,并且所有指定给它的子成员都处于正常工作状态之中.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值