Linux 下实现网卡高可用性的几种方法

来源:百度文库 编辑:神马文学网 时间:2024/04/29 02:20:38
1
Linux 下实现网卡高可用性的几种方法
在当前的 IBM eServer xSeries 服务器产品中,有很多产品都集成了的千兆以太网卡,另外,在 xSeries 服务器产品的选件中,也提供了多种可以选配的以太网卡的选件,而当一台服务器配置了多块以太网卡时,我们通常都会考虑把多块网卡绑定在一起,做为一个网卡来使用,以此来提高网络的可用性和性能。对于 Windows 操作系统下,Intel 公司提供了 PROSet 工具来实现,Broadcom 公司提供了 BASP (Broadcom Advanced Server Program) 工具来实现,这些我们已经比较熟悉,而在 Linux 操作系统下,我们要如何来实现网卡的高可用性呢?下面,就介绍一下在Linux 下实现网卡高可用性的几种方法。
一、Linux Channel Bonding
目前在各个发行版本的 Linux 中,使用最普遍的内核版本应该就是 2.4.x的版本了,而 Linux Channel Bonding, 在 Linux 2.4 的内核中, 就提供了 bonding 的驱动, 可以支持把多个网络适配器集合在一起, 当作一个网络适配器来使用。
在 Linux 下,网卡的高可用性是通过 MII 或者 ETHTOOL 的状态监测来实现的,所以,需要检查系统中的网络适配器是否支持 MII 或者 ETHTOOL 的连状态监测。可以用命令 "ethtool eth0" 来检查,如果显示的 "Link detected:" 信息与实现的连接状态一致,就没有问题。如果系统中的网络适配器不支持 MII 或者 ETHTOOL 状态监测,当连接失效时,系统就不能检测到,同时,在 bonding 驱动加载时,会记录一条不支持 MII 和 ETHTOOL 的警告信息。
下面以 Red Hat 为例,简单介绍一下实现的基本方法:
首先,我们需要打开内核对 bonding 支持。
设置内核 ‘make menuconfig/xconfig/config‘,在"Network device support"区段中选择"Bonding driver support",建议设置该驱动程序为模块,这样才能支持给驱动传递参数和设置多个bonding设备。
生成并安装新的内核和模块。
Bonding 的设置
我们需要在 /etc/modules.conf 中加入一行,这样才可以在设置了 bond 设置后,系统启动的时候自动加载 bonding 的驱动程序
alias bond0 bonding
另外,在 /etc/sysconfig/network-scripts 目录中,创建一个名为 ifcfg-bond0 的文件。
DEVICE=bond0
IPADDR=192.168.1.1
NETMASK=255.255.255.0
NETWORK=192.168.1.0
BROADCAST=192.168.1.255
ONBOOT=yes
BOOTPROTO=none
USERCTL=no
在 bond 中的所有网络适配器的脚本中,都要有 SLAVE 和 MASTER 的定义。例如,如果要让eth0和eth1成为bond0的成员,它们对应的配置文件(ifcfg-eth0和ifcfg-eth1)就要仿照下面的内容进行更改:
DEVICE=eth0
USERCTL=no
ONBOOT=yes
MASTER=bond0
SLAVE=yes
BOOTPROTO=none
在脚本文件ifcfg-eth1中,把eth0替换成eth1,同时,根据需要还要加入IP地址方面的信息。如果需要设置另外的 bonding 设备(例如bond1),就把MASTER=bond0改成bond1,这样,该网络适配器就成为bond1的附属设备了。
使 bond 生效
用命令 ‘/etc/rc.d/init.d/network restart‘ 重新启动网络子系统,也可以重新启动系统来使 bond0 生效。
这样,bond 的设置就基本结束了,如果希望了解更详细的信息,可以参考 ‘/usr/src/linux-2.4/Documentation/networking/bonding.txt
二、Linux 下的 BASP(Broadcom Advanced Server Program)
Broadcom 公司不仅在 Windows 平台上提供了 BASP 工具来实现网卡的高可用性,同样,在 Linux 操作系统下,也提供了对应的工具来实现。下面,就介绍一下如何在 Linux 下利用 BASP 来实现多块 Broadcom 以太网卡的 teaming。
首先,BASP 是一个为 2.4.x 的内核设计的模块,通过由多个网卡创建的team,可以提供负载平衡(load-balancing),容错(fault-tolerance)和VLAN等功能。一个 team 可以包括1到8块网卡,每块网卡都可以被指定为主(Primary)或者是热备(hot-standby,只适用于SLB team)。team 中所有的主网卡都会通过发送和接收全部网络流量的一部分来参与负载平衡的工作,而热备的网卡会在所有的主网卡失去连接时进行接管。VLAN 可以添加到 team 中,通过不同的 VLAN ID 来实现多个 VLAN,每个 VLAN 都会创建一个虚拟设备。
通常,我们得到的 BASP 的打包文件中包括两个文件,一个是 RPM 包,一个是 TAR 格式的文档。
安装 TAR 文档
解压并展开 TAR 文档
% tar xzvf basplnx-{version}.{arch}.tgz
(1) 创建内核模块 "basp.o"
% make
(2) 创建设备文件并复制文件
% make install
(3) 更新模块信息
% depmod -a
(4) 加载驱动程序
% insmod basp
安装 RPM 包
(1) 安装 RPM 的源文件包
% rpm -i basplnx-{version}.src.{arch}.rpm
(2) 进入 RPM 的路径并为内核创建驱动程序
% cd /usr/src/redhat
% rpm -bb SPECS/basplnx.spec
注意:如果 Linux 的发行版本包含的是 RPM v4.1 或者更新版本,使用 rpmbuild 命令代替 "rpm"
(3) 安装刚刚创建的包
% rpm -i RPMS/i386/basplnx-{version}.{arch}.rpm
驱动程序和其它需要的文件会自动被安装。
(4) 加载驱动程序
% insmod basp
下面,以 Red Hat 为例,介绍一下配置信息
在 BASP 的包里面包含了一个工具和几个 team 配置的脚本,大部分的步骤要在第一次安装完驱动以后来做,而步骤"更改配置脚本",是只要需要更改 team 的配置,就可以参照着来操作。
由于 Linux 不会自动加载网络设备的驱动程序,除非该设备设置了IP地址,所以用户必须为 team中的所有的物理适配器手工配置一个网络脚本文件。这些网络脚本文件位于 /etc/sysconfig/network-scripts (Red Hat) 或者 /etc/sysconfig/ network (United Linux 1.x)。文件名必须以 "ifcfg-" 开头,然后跟着物理适配器的别名,如果是网卡 eth0,就应该创建一个文件,该文件的文件名是 ifcfg-eth0,然后加入下面的内容
DEVICE=eth0
BOOTPROTO=static
ONBOOT=yes
配置的过程包括下面几个步骤:
1. 可以从 "/etc/basp/samples" 目录中拷贝一个配置脚本到 "/etc/basp" 目录,注意,配置脚本的文件名必须是以 "team-" 开头。
2. 更改配置脚本:
(a) 更改 team 的类型
(b) 添加/删除物理网络适配器
(c) 添加/删除虚拟的网络适配器
(d) 为每个虚拟的网络适配器分配IP地址
配置脚本中的语法可以在 /etc/basp/sample/team-sample 脚本文件中查到。注意,在配置 Teaming 时,至少要有一个主适配器 (Primary Adapter
2
bonding
使用多块网卡虚拟成为一块网卡,具有相同的IP地址。这项技术其实在sun和cisco中已经存在,分别称为Trunking和etherchannel技术,在linux中,这种技术称为bonding。
bonding可以工作在倍速和兀余模式。倍速模式用来提供双倍或者更大的网络带宽,比如以多块100M网卡合并,提供千M网卡级的传输速度。兀余模式用来提供网卡失效情况下的备份线路。
在QEL4.0网吧版的内核中已经包含了bonding模块,不需要重新去编译内核了,只需要改动配置即可完成。
这里介绍将两个网卡设置成倍速模式,以提升带宽。
1、先建立/etc/sysconfig/network-scripts/ifcfg-bond0文件,内容如下:
代码:
DEVICE=bond0
NETMASK=255.255.255.0
BROADCAST=192.168.0.255
IPADDR=192.168.0.10
NETWORK=192.168.0.0
ONBOOT=yes
2、修改/etc/sysconfig/network-scripts/目录下原来的ifcfg-eth0和ifcfg-eth1文件,内容如下:
代码:
BOOTPROTO=none
TYPE=Ethernet
DEVICE=eth0
ONBOOT=yes
MASTER=bond0
代码:
BOOTPROTO=none
TYPE=Ethernet
DEVICE=eth1
ONBOOT=yes
MASTER=bond0
3、在/etc/modprobe.conf文件里增加两行:
代码:
alias bond0 bonding
options bond0 miimon=100 mode=0
现在已经基本完成,要在每次开机时自动执行双网卡绑定,在/etc/rc.d/rc.local文件里加一行:
代码:
ifenslave bond0 eth0 eth1
完成。