热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

【§强档出场:Linuxbonding研究及实现§】

【§强档出场:Linuxbonding研究及实现§】本文介绍Linux(具体发行版本是CentOS5.6)下的双卡绑定的原理及实现。Linux双网卡绑定实现是使用两块网卡虚拟成为一块网卡设备,这简单

【§强档出场:Linux bonding研究及实现§】

本文介绍Linux(具体发行版本是CentOS5.6)下的双卡绑定的原理及实现。

Linux双网卡绑定实现是使用两块网卡虚拟成为一块网卡设备,这简单来说,就是两块网卡具有相同的IP地址而并行链接聚合成一个逻辑链路工作。这项技术在Sun和Cisco中分别被称为Trunking和Etherchannel技术,在Linux的2.4.x及其以后的内核则称为Bonding技术。

bonding的前提条件:网卡应该具备自己独立的BIOS芯片,并且各网卡芯片组型号相同。同一台服务器上的网卡毫无疑问是是符合这个条件的。

Bonding原理

bonding的原理:在正常情况下,网卡只接收目的硬件地址(MAC Address)是自身MAC的以太网帧,过滤别的数据帧,以减轻驱动程序的负担;但是网卡也支持另外一种被称为混杂promisc的模式,可以接收网络上所有的帧,bonding就运行在这种模式下,而且修改了驱动程序中的mac地址,将两块网卡的MAC地址改成相同,可以接收特定MAC的数据帧。然后把相应的数据帧传送给bond驱动程序处理。

为方便理解bonding的配置及实现,顺便阐述一下Linux的网络接口及其配置文件。在 Linux 中,所有的网络通讯都发生在软件接口与物理网络设备之间。与网络接口配置相关的文件,以及控制网络接口状态的脚本文件,全都位于 /etc/sysconfig/netwrok-scripts/ 目录下。网络接口配置文件用于控制系统中的软件网络接口,并通过这些接口实现对网络设备的控制。当系统启动时,系统通过这些接口配置文件决定启动哪些接口,以及如何对这些接口进行配置。接口配置文件的名称通常类似于 ifcfg-,其中 与配置文件所控制的设备的名称相关。 在所有的网络接口中,最常用的就是以太网接口ifcfg-eth0,它是系统中第一块网卡的配置文件。虽然在不同的系统之间,文件的类型和数量并不一定相同,但各种的网络设备都需要用到这些文件保证设备的正常运作。bonding技术,就是通过配置文件建立绑定接口,从而实现多个物理网卡绑定到一个虚拟网卡。

测试环境

本次作业环境中,使用的是CentOS5.6,其系统信息如下:
[root@support ~]# cat /etc/issue
CentOS release 5.6 (Final)
Kernel r on an m
[root@support ~]# uname -a
Linux support 2.6.18-238.9.1.el5 #1 SMP Tue Apr 12 18:10:13 EDT 2011 x86_64 x86_64 x86_64 GNU/Linux

可以通过modinfo bonding命令查看Linux是否支持bonding,据资料介绍,RHEL4已默认支持了,RHEL5、CentOS5毫无疑问也是支持的。系统有类似下面的信息输出,就说明已支持了。
[root@support ~]# modinfo bonding
filename:       /lib/modules/2.6.18-238.9.1.el5/kernel/drivers/net/bonding/bonding.ko
author:         Thomas Davis, tadavis@lbl.gov and many others
description:    Ethernet Channel Bonding Driver, v3.4.0-1
version:        3.4.0-1
license:        GPL
srcversion:     358EAAF5610876F44387AEF
depends:        ipv6
vermagic:       2.6.18-238.9.1.el5 SMP mod_unload gcc-4.1
parm:           max_bonds:Max number of bonded devices (int)
…… ……
parm:           debug:Print debug messages; 0 for off (default), 1 for on (int)
module_sig:     883f3504da4d65c2ddc58dbbe9356811249c0a0993d9c1c5b9055a7e4f2b4d86e86ebb2c5fbdbf09e2c41b93ca13b6b809914bc6a201c3cf694855143

Bonding配置

通过在 /etc/sysconfig/network-scripts/ 目录下创建 ifcfg-bond 配置文件,就能够创建绑定接口。文件名称中的 为接口的编号,如第一个通道绑定接口的名称一般为 ifcfg-bond0。ifcfg-bond 文件的内容与以太网接口的配置文件(如 ifcfg-eth0)基本相同,只是 DEVICE 选项的值,应该为 bond

Bonding接口创建以后,雨林木风xp系统下载被绑定的网卡必须在他们的设置文件里面添加MASTER和SLAVE两个参数。每个bonding接口的设置基本相同,具体配置如下:

1、新建/etc/sysconfig/network-scripts/ifcfg-bond0文件,输入以下配置信息:
[root@support ~]# cat /etc/sysconfig/network-scripts/ifcfg-bond0
DEVICE=bond0
BOOTPROTO=static
IPADDR=10.8.0.231
NETMASK=255.255.0.0
NETWORK=10.8.0.0
BROADCAST=10.8.255.255
OnBOOT=yes
USERCTL=NO
BONDING_OPTS="mode=0 miimon=100"

说明:这里使用了BONDING_OPTS选项,则不需要再使用 /etc/modprobe.conf 配置文件对绑定设备进行配置。参数mode=0,指负载均衡模式,详见下文。miimon是用来进行链路监测的,其原理是检测网上的链路状态,一般将miimon值设为100,表示系统每100ms监测一次链路连接状态,如果有一条线路不通就转入另一条线路。

2、修改 /etc/sysconfig/network-scripts/ifcfg-eth0网卡属性
[root@support ~]# cat /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0
BOOTPROTO=none
HWADDR=00:30:48:56:DA:72
OnBOOT=yes
MASTER=bond0
SLAVE=yes

3、修改 /etc/sysconfig/network-scripts/ifcfg-eth1网卡属性
[root@support ~]# cat /etc/sysconfig/network-scripts/ifcfg-eth1
DEVICE=eth1
BOOTPROTO=none
HWADDR=00:30:48:56:DA:73
OnBOOT=yes
HOTPLUG=no
DHCP_HOSTNAME=support
MASTER=bond0
SLAVE=yes

说明:修改单个网卡配置,雨林木风xp系统下载主要是去掉IP 地址、子网掩码等信息。同时添加MASTER及SLAVE两项参数。
MASTER= 的值是以太网卡连接到的通道绑定接口的名称,这个指令与 SLAVE 指令配合使用。
SLAVE=:yes - 表示此设备可以由 MASTER 指令中配置的通道绑定接口进行控制。 no - 表示此设备不能由 MASTER 指令中配置的通道绑定接口进行控制。

4、编辑 /etc/modules.conf 文件,添加:alias bond0 bonding,以使系统在启动时加载bonding模块,对外虚拟网络接口设备为 bond0
[root@support ~]# cat /etc/modprobe.conf
alias bond0 bonding
alias eth0 e1000
alias eth1 e1000
alias scsi_hostadapter ata_piix
alias scsi_hostadapter1 usb-storage

注:在linux6下测试时,发现没有modprobe.conf这个文件,番茄家园需要进入modprobe.d文件夹创建bond0.conf,再将“alias bond0 bonding”添加到里面
[root@ara ~]# cat /etc/modprobe.d/bond0.conf
alias bond0 bonding

5、重启网络服务,以使用bond生效
[root@support ~]# service network restart

在网络设置可以看到bond0与eth0、eth1之间的主从关系
[root@support ~]# ifconfig
bond0     Link encap:Ethernet  HWaddr 00:30:48:56:DA:72  
         inet addr:10.8.0.231  Bcast:10.8.255.255  Mask:255.255.0.0
         inet6 addr: fe80::230:48ff:fe56:da72/64 Scope:Link
         UP BROADCAST RUNNING MASTER MULTICAST  MTU:1500  Metric:1
         RX packets:19015 errors:0 dropped:0 overruns:0 frame:0
         TX packets:4714 errors:0 dropped:0 overruns:0 carrier:0
         collisions:0 txqueuelen:0
         RX bytes:2557139 (2.4 MiB)  TX bytes:469585 (458.5 KiB)

eth0      Link encap:Ethernet  HWaddr 00:30:48:56:DA:72  
         UP BROADCAST RUNNING SLAVE MULTICAST  MTU:1500  Metric:1
         RX packets:10592 errors:0 dropped:0 overruns:0 frame:0
         TX packets:2011 errors:0 dropped:0 overruns:0 carrier:0
         collisions:0 txqueuelen:100
         RX bytes:1295667 (1.2 MiB)  TX bytes:209014 (204.1 KiB)

eth1      Link encap:Ethernet  HWaddr 00:30:48:56:DA:72  
         UP BROADCAST RUNNING SLAVE MULTICAST  MTU:1500  Metric:1
         RX packets:8423 errors:0 dropped:0 overruns:0 frame:0
         TX packets:2705 errors:0 dropped:0 overruns:0 carrier:0
         collisions:0 txqueuelen:100
         RX bytes:1261472 (1.2 MiB)  TX bytes:260887 (254.7 KiB)

lo        Link encap:Local Loopback  
         inet addr:127.0.0.1  Mask:255.0.0.0
         inet6 addr: ::1/128 Scope:Host
         UP LOOPBACK RUNNING  MTU:16436  Metric:1
         RX packets:1178 errors:0 dropped:0 overruns:0 frame:0
         TX packets:1178 errors:0 dropped:0 overruns:0 carrier:0
         collisions:0 txqueuelen:0
         RX bytes:2054820 (1.9 MiB)  TX bytes:2054820 (1.9 MiB)

至此,完成了bonding配置,电脑桌面壁纸系统已经在网卡的负载均衡模式下运行,随意拔掉一个网卡口的网线,网线依然正常。

Bonding工作模式

bonding的模式一共有7种,常用的为0、1两种:
round-robin(balance-rr)  0  网卡的负载均衡模式
active-backup  1 网卡的容错模式
balance-xor  2 需要交换机支持
broadcast  3 广播模式
ieee802.3ad  4 动态链路聚合模式,需要交换机支持
mode-tlb  5 自适应模式
mode-alb  6 网卡虚拟化方式

mode=0表示load balancing(round-robin)为负载均衡方式,两块网卡都工作。在这种模式下,能在提供带宽的负载均衡的同时提供失效保护。B

mode=1表示fault-tolerance(active-backup)提供冗余功能,工作方式是主备的工作方式,也就是说默认情况下只有一块网卡工作,另一块做备份。bonding定义了网卡的4个链路状态:正常状态(BOND_LINK_UP)、网卡出现故障(BOND_LINK_FAIL)、失效状态(BOND_LINK_DOWN)及网上恢复状态(BOND_LINK_BACK)。mii的作用就是依次检查网卡链路状态是否处于这些状态,然后通过标记某个变量来说明当前是否需要切换slave网卡。在这种模式下,两块网卡有一块是不工作的,同时,bond虚设备的MAC地址均一致,所以这张备用网卡不会被外界察觉,交换机也不存在向该端口发包的情况。当bond的mii检测到当前的active设备失效了以后,bonding会迅速将另外一块网卡设置为首选slave设备。

在以上模式中,虚拟网卡的MAC地址始终是第一个slave网卡的MAC。由于外界学习到的服务器MAC地址始终是不变的,在网络上确定了IP和MAC的唯一对应关系,保证了上层业务传输的逻辑一致性,所以链路的状态不会受很大的影响。

Bonding工作情况

1、工作在模式0时

通过查看bond0的工作状态查询能详细的掌握bonding的工作情况,电脑桌面壁纸正常状态下的/proc/net/bonding/bond0文件:
[root@support ~]# cat /proc/net/bonding/bond0
Ethernet Channel Bonding Driver: v3.4.0-1 (October 7, 2008)

Bonding Mode: load balancing (round-robin)
MII Status: up
MII Polling Interval (ms): 100
Up Delay (ms): 0
Down Delay (ms): 0

Slave Interface: eth0
MII Status: up
Speed: 100 Mbps
Duplex: full
Link Failure Count: 1
Permanent HW addr: 00:30:48:56:da:72

Slave Interface: eth1
MII Status: up
Speed: 100 Mbps
Duplex: full
Link Failure Count: 2
Permanent HW addr: 00:30:48:56:da:73

从win7 ping,番茄家园通过拔插网线查看结果,不存在丢包

通过日志查看网卡工作情况
[root@support ~]# tail -f /var/log/messages
May 29 08:01:41 support kernel: e1000: eth0 NIC Link is Up 100 Mbps Full Duplex, Flow Control: RX/TX
May 29 08:01:41 support kernel: bonding: bond0: link status definitely up for interface eth0.
May 29 08:01:48 support kernel: e1000: eth1 NIC Link is Down
May 29 08:01:48 support kernel: bonding: bond0: link status definitely down for interface eth1, disabling it
May 29 08:02:18 support kernel: e1000: eth1 NIC Link is Up 100 Mbps Full Duplex, Flow Control: RX/TX
May 29 08:02:18 support kernel: bonding: bond0: link status definitely up for interface eth1.
May 29 08:08:49 support kernel: e1000: eth0 NIC Link is Down
May 29 08:08:49 support kernel: bonding: bond0: link status definitely down for interface eth0, disabling it
May 29 08:08:56 support kernel: e1000: eth0 NIC Link is Up 100 Mbps Full Duplex, Flow Control: RX/TX
May 29 08:08:56 support kernel: bonding: bond0: link status definitely up for interface eth0.

2、工作在模式1时

正常状态下的/proc/net/bonding/bond0文件:
[root@support ~]# cat /proc/net/bonding/bond0
Ethernet Channel Bonding Driver: v3.4.0-1 (October 7, 2008)

Bonding Mode: fault-tolerance (active-backup)
Primary Slave: None
Currently Active Slave: eth0
MII Status: up
MII Polling Interval (ms): 100
Up Delay (ms): 0
Down Delay (ms): 0


推荐阅读
  • 本文介绍了数据库的存储结构及其重要性,强调了关系数据库范例中将逻辑存储与物理存储分开的必要性。通过逻辑结构和物理结构的分离,可以实现对物理存储的重新组织和数据库的迁移,而应用程序不会察觉到任何更改。文章还展示了Oracle数据库的逻辑结构和物理结构,并介绍了表空间的概念和作用。 ... [详细]
  • 本文介绍了Swing组件的用法,重点讲解了图标接口的定义和创建方法。图标接口用来将图标与各种组件相关联,可以是简单的绘画或使用磁盘上的GIF格式图像。文章详细介绍了图标接口的属性和绘制方法,并给出了一个菱形图标的实现示例。该示例可以配置图标的尺寸、颜色和填充状态。 ... [详细]
  • oracle安装时找不到启动,Oracle没有开机自启是怎么回事?这一步骤很重要
    重启Oracle数据库重启Oracle数据库包括启动Oracle数据库服务进程和启动Oracle数据库两步,大家继续往下看。按照《【Oracle】什么?作为DBA&# ... [详细]
  • 在Docker中,将主机目录挂载到容器中作为volume使用时,常常会遇到文件权限问题。这是因为容器内外的UID不同所导致的。本文介绍了解决这个问题的方法,包括使用gosu和suexec工具以及在Dockerfile中配置volume的权限。通过这些方法,可以避免在使用Docker时出现无写权限的情况。 ... [详细]
  • 本文介绍了在rhel5.5操作系统下搭建网关+LAMP+postfix+dhcp的步骤和配置方法。通过配置dhcp自动分配ip、实现外网访问公司网站、内网收发邮件、内网上网以及SNAT转换等功能。详细介绍了安装dhcp和配置相关文件的步骤,并提供了相关的命令和配置示例。 ... [详细]
  • 阿,里,云,物,联网,net,core,客户端,czgl,aliiotclient, ... [详细]
  • Java学习笔记之面向对象编程(OOP)
    本文介绍了Java学习笔记中的面向对象编程(OOP)内容,包括OOP的三大特性(封装、继承、多态)和五大原则(单一职责原则、开放封闭原则、里式替换原则、依赖倒置原则)。通过学习OOP,可以提高代码复用性、拓展性和安全性。 ... [详细]
  • mac php错误日志配置方法及错误级别修改
    本文介绍了在mac环境下配置php错误日志的方法,包括修改php.ini文件和httpd.conf文件的操作步骤。同时还介绍了如何修改错误级别,以及相应的错误级别参考链接。 ... [详细]
  • Java SE从入门到放弃(三)的逻辑运算符详解
    本文详细介绍了Java SE中的逻辑运算符,包括逻辑运算符的操作和运算结果,以及与运算符的不同之处。通过代码演示,展示了逻辑运算符的使用方法和注意事项。文章以Java SE从入门到放弃(三)为背景,对逻辑运算符进行了深入的解析。 ... [详细]
  • ***byte(字节)根据长度转成kb(千字节)和mb(兆字节)**parambytes*return*publicstaticStringbytes2kb(longbytes){ ... [详细]
  • 概述H.323是由ITU制定的通信控制协议,用于在分组交换网中提供多媒体业务。呼叫控制是其中的重要组成部分,它可用来建立点到点的媒体会话和多点间媒体会议 ... [详细]
  • k8s+springboot+Eureka如何平滑上下线服务
    k8s+springboot+Eureka如何平滑上下线服务目录服务平滑上下线-k8s版本目录“上篇介绍了springboot+Euraka服务平滑上下线的方式,有部分小伙伴反馈k ... [详细]
  • Thisissuewasoriginallyopenedbyashashicorp/terraform#5664.Itwasmigratedhe ... [详细]
  • php网站设计实验报告,php网站开发实训报告
    本文目录一览:1、php动态网站设计的关键技术有哪些软件,及搭建步骤需要哪些页面,分别完成 ... [详细]
  • 在Xamarin XAML语言中如何在页面级别构建ControlTemplate控件模板
    本文介绍了在Xamarin XAML语言中如何在页面级别构建ControlTemplate控件模板的方法和步骤,包括将ResourceDictionary添加到页面中以及在ResourceDictionary中实现模板的构建。通过本文的阅读,读者可以了解到在Xamarin XAML语言中构建控件模板的具体操作步骤和语法形式。 ... [详细]
author-avatar
瑶看瀑布挂前川
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有