Linux网络配置:如何绑定网卡? (linux 网卡bound)

网络是现代信息化社会中不可或缺的基础设施,Linux作为一个强大的操作系统,也同样具备优秀的网络功能。在实际应用中,为了满足高性能、可靠性以及负载平衡等需求,我们需要将多张网卡进行绑定。本文将介绍在Linux中如何绑定网卡。

一、什么是网卡绑定?

网卡绑定是指将多个物理网卡虚拟成一个逻辑网卡的操作。通过网卡绑定,可以提高系统的网络性能,增加带宽,提升网络传输速度和可靠性,实现负载均衡等功能。

二、绑定模式分类

在Linux系统中,网卡绑定分为四种模式:

1. 之一种是负载均衡模式(mode0),即Round Robin(轮询)模式。多个物理网卡将会被视为一个大的带宽,数据包将被依次分配到各个物理网卡上。

2. 第二种是Active-Backup模式(mode1),又称为Flover模式。该模式下,所有的网卡都是活动的,但只有其中一张网卡会被用作数据传输,当此网卡故障时,备份网卡将被自动激活,继续接收和发送数据。

3. 第三种是Balance XOR模式(mode2),又称为基于源MAC地址的负载均衡模式。该模式下,数据包中的源MAC地址和目标MAC地址将被用作哈希关键字,根据哈希结果,数据包将被分配到相应的物理网卡上。不同的数据流会被分配到不同的物理网卡上,从而实现负载均衡。

4. 第四种是Broadcast模式(mode3),即广播模式,数据包将被发送到所有的网卡,适用于数据包广播的场景。

三、绑定过程

以负载均衡模式为例,介绍在Linux中如何绑定网卡。

1. 在Linux中需要安onding驱动,以CentOS为例,可以使用以下命令进行安装:

yum install -y bonding

2. 安装完成后,在/etc/modprobe.d/bonding.conf中添加以下内容:

alias bond0 bonding

options bond0 mode=0 miimon=100 指定网卡绑定逻辑接口名称为bond0,绑定模式为0即Round Robin(轮询)模式,心跳检测为100

3. 在/etc/sysconfig/network-scripts/目录下创建ifcfg-bond0文件,内容如下:

TYPE=Bond

BONDING_MASTER=yes

DEVICE=bond0

BOOTPROTO=static 设置IP地址为静态

IPADDR=192.168.1.252 设置IP地址

NETMASK=255.255.255.0 设置网络掩码

USERCTL=no

BONDING_OPTS=”mode=0 miimon=100″ 指定绑定模式以及心跳检测时间

4. 配置物理网卡,以eth0和eth1为例,在/etc/sysconfig/network-scripts/目录下分别创建ifcfg-eth0和ifcfg-eth1文件,并设置以下内容:

DEVICE=eth0/eth1

ONBOOT=yes 设置开机自启动

BOOTPROTO=none

MASTER=bond0 网卡绑定逻辑接口名称为bond0

SLAVE=yes

5. 重启系统,使绑定生效。使用以下命令检测绑定状态:

cat /proc/net/bonding/bond0

四、

本文介绍了在Linux中通过绑定物理网卡实现负载均衡的过程。网卡绑定是一个十分实用的方法,可以大大提高网络性能和可靠性,但要注意对网卡适用的绑定模式以及心跳检测时间进行正确配置。希望本文能够对大家有所帮助,增加对Linux网络配置的理解。

相关问题拓展阅读:

请教Linux系统中网卡band以后的mac地址是什么?

输入/in/ifconfig后

ethLink encap:Ethernet HWaddr 00:1D:D8:B7:22:AF

后面显示的HWaddr后面派辩的就袭培是MAC地址拍羡唯

可以用ifconfig,这个命令跟windows下的ipconfig差不多

linux bonding 怎麼做到fast failover (技术)

Linux网卡bonding

随着科学技术的日益革新,数据的安全性已经逐渐体现出了它的重要意义。可以设想,当一个人所有的个人资料都不负存在,那手滚是多么可怕的事情。网络技术的深入使用,数据的网络化传输已经成为了重要,甚至主要的传输方式。所以数据服务器能够正常提供网络服务是所有供应商都需要考虑的问题。

在这个背景下,单网卡的应用已经捉襟见肘,设备冗余技术的普及已是枝繁叶吵薯悄茂。本文之后就引用Linux操作系统下的多升渣网卡bonding技术来阐述这一容错概念。

负载均衡功能也是网卡bonding的另一个功能,它可以实现多网卡同时工作,提高系统网络处理的吞吐能力。

一、网卡的负载均衡模式(mode = BOND_MODE_ROUNDROBIN)

1)建立bond虚设备

建立一个ifcfg-bond0的设备,然后配置如下信息即可。

DEVICE=bond0

BOOTPROTO=static

IPADDR=172.16.64.208

NETMASK=255.255.224.0

ONBOOT=yes

TYPE=Ethernet

2)配置接口文件

由于使用一个虚拟的ip地址,所以,其他接口设备都不配置ip信息。

3)配置bonding工作方式

打开/etc/modprobe.conf文件,将bonding的工作模式配置为如下模式。

alias bond0 bonding

options bond0 mode=0 arp_interval=500 arp_ip_target=172.16.64.86

4)启动bonding

需要添加路由来制定发送规则,这个可以自定义添加。配置完后重启设备即可。

ifenslave bond0 eth0 eth1

route add -net 0/0 gw 172.16.64.254

bond0 Link encap:Ethernet HWaddr 00:14:10:70:00:25

inet addr:172.16.64.208 Bcast:172.16.95.255 Mask:255.255.224.0

inet6 addr: fe80::200:ff:fe00:0/64 Scope:Link

UP BROADCAST RUNNING MASTER MULTICAST MTU:1500 Metric:1

RX packets:39335 errors:0 dropped:0 overruns:0 frame:0

TX packets:3178 errors:0 dropped:0 overruns:0 carrier:0

collisions:0 txqueuelen:0

RX bytes:(2.8 MiB) TX bytes:(263.4 KiB)

ethLink encap:Ethernet HWaddr 00:14:10:70:00:25

UP BROADCAST RUNNING SLAVE MULTICAST MTU:1500 Metric:1

RX packets:18208 errors:0 dropped:0 overruns:0 frame:0

TX packets:5 errors:0 dropped:0 overruns:0 carrier:0

collisions:0 txqueuelen:1000

RX bytes:(1.3 MiB) TX bytes:378 (378.0 b)

ethLink encap:Ethernet HWaddr 00:14:10:70:00:25

UP BROADCAST RUNNING SLAVE MULTICAST MTU:1500 Metric:1

RX packets:21128 errors:0 dropped:0 overruns:0 frame:0

TX packets:3174 errors:0 dropped:0 overruns:0 carrier:0

collisions:0 txqueuelen:100

RX bytes:(1.5 MiB) TX bytes:(263.1 KiB)

如上图所示,这种模式下bonding模块会将虚接口和所有的slave接口的MAC地址设置为一致。通过定时器,每个slave接口不断发送ARP包来不断更换交换机端口与MAC的对应关系。

这样使得每个网卡都在进行工作。这个ARP的发送规则是:

每arp_interval(MS)间隔向arp_ip_target发送arp请求。也可以向多个arp_ip_target发送arp请求。

观察交换机端口上所学习到的MAC地址,发现MAC会在两个端口上反复切换。

在BOND_MODE_ROUNDROBIN模式下,bonding对于发送和接收数据的处理逻辑是不一致的,对于数据的接收,bonding基本不做任何处理,纯粹依靠交换机端口与MAC的变化来实现交替接收数据。发送的话,交换机会根据数据的源MAC来学习端口和MAC之间的关系,所以bonding做到的就是选择不一样的网卡发送。

对于数据的发送,

static inline void bond_set_mode_ops(struct net_device *bond_dev, int mode)

{

switch (mode) {

case BOND_MODE_ROUNDROBIN:

bond_dev->hard_start_xmit = bond_xmit_roundrobin;

break;

bond的发送函数被注册为bond_xmit_roundrobin。通过bond_xmit_roundrobin的实现可以发现

static int bond_xmit_roundrobin(struct sk_buff *skb, struct net_device *bond_dev)

{

read_lock(&bond->curr_slave_lock);

slave = start_at = bond->curr_active_slave;

read_unlock(&bond->curr_slave_lock);

bond_for_each_slave_from(bond, slave, i, start_at) {

if (IS_UP(slave->dev) &&

(slave->link == BOND_LINK_UP) &&

(slave->state == BOND_STATE_ACTIVE)) {

res = bond_dev_queue_xmit(bond, skb, slave->dev);

write_lock(&bond->curr_slave_lock);

bond->curr_active_slave = slave->next;

write_unlock(&bond->curr_slave_lock);

break;

}

bond_xmit_roundrobin会通过curr_active_slave指针所指向的设备来进行发送,当然curr_active_slave会在调用bond_dev_queue_xmit完成实际的发送之后指向下一个slave设备。bond_dev_queue_xmit实际是调用通用的发送函数dev_queue_xmit来进行的,它传递给dev_queue_xmit的是一个skb,在传递之前skb->dev就被指定为了当前的slave设备,这样内核就会找到对应的真实网卡设备来进行发送,最后curr_active_slave指针的轮询切换,实现了bonding的负载均衡工作模式。

从这种模式可以看到,bonding实现了一个类似网卡驱动的模块,对应的bond0设备是一个纯粹的虚设备,数据发送虽然说经过了它,但通过一系列调用,转了一圈之后才回到真正的网卡设备那里进行发送,无疑会消耗一定的系统性能。

简单用100Mbps速率的UDP数据包测试了一下BOND_MODE_ROUNDROBIN模式。

测试过程中发现接收端会有较多的乱序包,观察交换机端口情况,端口之间的切换频率不规则,这个和交换机的配置或者性能应该有很大联系,有必要的话需要进一步研究。数据的正确性和时序性能否保证需要进一步仔细测试。

2、网卡的容错模式(mode = BOND_MODE_ACTIVEBACKUP)

容错模式的配置方法和负载均衡模式基本差不多,只不过修改一下/etc/modprobe.conf即可。

alias bond0 bonding

options bond0 mode=1 miimon=100

这里使用的是mii链路检测方式,与之前arp检测方式不同。当然这两种链路检测方式在各种mode下都是可以使用的,但要注意不能同时使用。

介绍一下bonding的mii检测实现。首先和arp-monitor一样,mii也是定时器触发

if (bond->params.miimon) { /* link check interval, in milliseconds. */

init_timer(mii_timer);

mii_timer->expires = jiffies + 1;

mii_timer->data = (unsigned long)bond_dev;

mii_timer->function = (void *)&bond_mii_monitor;

add_timer(mii_timer);

}

bond_mii_monitor函数其本质的原理就是检测网卡的链路状态,bonding定义网卡有4个链路状态:

BOND_LINK_UP: 正常状态(处于该状态的网卡是是潜在的发送数据包的候选者)

BOND_LINK_FAIL: 网卡出现故障,向状态BOND_LINK_DOWN 切换中

BOND_LINK_DOWN: 失效状态

BOND_LINK_BACK:网卡恢复,向状态BOND_LINK_UP切换中

从上到下,表示了网卡链路从正常到失效再到恢复状态。bond_mii_monitor函数就是依次检查网卡的链路状态是否处于这些状态,然后通过标记do_failover变量来说明当前是否需要切换slave网卡。代码篇幅较大,但逻辑还是很清晰的,故此处不罗列了。

在BOND_MODE_ACTIVEBACKUP模式下,两块网卡其实有一块是不工作的,被设置为IFF_NOARP的状态。同时,bond虚设备,还有slave设备的MAC地址均一致,所以这张网卡不会被外界察觉存在。交换机也不存在想该端口发包的情况。当bond的mii检测发现当前的active设备失效了之后,会切换到这个备份设备上。

在bond_change_active_slave函数中

if (bond->params.mode == BOND_MODE_ACTIVEBACKUP) {

if (old_active) {

bond_set_slave_inactive_flags(old_active);

}

if (new_active) {

bond_set_slave_active_flags(new_active);

}

}

这个就是在BOND_MODE_ACTIVEBACKUP模式下的切换逻辑,很简单,需要注意的是,在bond_set_slave_inactive_flags(old_active)中,需要将接口的状态设置为IFF_NOARP,不然交换机就可能会把数据包发送到一个错误的端口上。

BOND_MODE_ACTIVEBACKUP模式下的数据发送非常简单,可想而知curr_active_slave指针始终都指向当前可用的设备,所以直接发送就可以,没有之前BOND_MODE_ROUNDROBIN模式下slave设备切换的过程。

3、网卡虚拟化方式(mode = BOND_MODE_ALB)

经过考察,许多磁盘阵列设备采用了网卡虚拟化方式进行多网卡应用。实际就是Linux的bonding技术。它采用了mode = BOND_MODE_ALB的方式。

BOND_MODE_ALB的实现方式比较复杂,还有一些不理解的地方,就不做深入分析了。其核心思想可以用下图解释:

从这个图中可以看到,客户端A与服务器的传输使用的是MAC A;而客户端B与服务器传输使用的是MAC B,但对于IP层来说,客户端A与B都与服务器X.X.X.X 的IP地址进行通讯,并不感知底层传输接口的变化。这样,服务器对于客户端整体上的工作模式就处于负载均衡的状态。当然,这个过程的控制就是bonding模块所完成的。

通过测试发现两台客户端展现的arp表是一致的,如下(服务器端地址为172.16.64.208,服务器端首选接口的MAC为-25)

CLIENT A

172.16.64.5 dynamic

CLIENT B

172.16.64.5 dynamic

通过抓包可以看到,两次回复的ARP应答的源MAC地址是不一样的,分别为

-25和

-26。

所以说,能够实现这种处理方法的原因就是bonding修改了ARP应答的源地址导致,使得外界并不感知服务器存在多网卡的状态,在网络上确定了IP和MAC的唯一对应关系,保证了上层业务传输的逻辑一致性。同时内部的处理又交给不同的网卡,实现了负载均衡。

另外,也给了我们一定的容错性,当一个接口失效后,bonding会迅速将另外一块网卡设置为首选slave设备,并修改其MAC地址。由于外界学习到的服务器MAC地址始终是不变的,所以链路的状态不会受很大影响。

Bonding的模式一共有7种:

#define BOND_MODE_ROUNDROBIN

#define BOND_MODE_ACTIVEBACKUP 1

#define BOND_MODE_XOR2

#define BOND_MODE_BROADCAST

#define BOND_MODE_8023AD

#define BOND_MODE_TLB5

#define BOND_MODE_ALB6

每种方式都有它的特点,有些需要交换机支持,比如 BOND_MODE_8023AD和BOND_MODE_XOR。本文就介绍了3种方式,可以在无需交换机支持或者简单配置交换机的情况下运行。

怎样查看 linux 的网卡信息

如何详细查看硬盘信息fdisk-l:查看分1如何查看内存信息,大概有以下几种方式2如棚搜何查看CPU信息cat/斗判proc/cpuinfo:通3如何查空和改看网卡,显卡等板卡信息

查看 linux 的网卡信息步骤如下:

工具原料:linux操作薯贺举系统

①启动 linux 操作系统,进入到桌面;

②启动终端;

③终端输入命令 ifconfig eth0,回车;

④linux 的网卡信息解读:

1.查看网卡生产厂商和信号:

查看基本信息:lspci

查看详细信数碧息:lspci -vvv  # 3个小写的v

查看网卡信息:lspci | grep Ethernet;

2.查看网卡驱动:

查看网卡驱动信息:lspci -vvv # 找到网卡设备的详细信息,包括网卡驱动

# lod    列出加载的所有驱动,包括网卡驱动;

3.查看网卡驱动版本

查看模块信息:modifo  # 其中包含version信拍御息或 # ethtool-i ;

4.查看网络接口队列数

查看网卡接口的中断信息:#cat /proc/interrupts | grep eth0或 # ethtool-S eth0;

5.查看网卡驱动源码的版本号

解压Intel网卡驱动源码,打开解压缩目录下的*.spec文件查看驱动的版本;

关于linux 网卡bound的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。


数据运维技术 » Linux网络配置:如何绑定网卡? (linux 网卡bound)