3. 配置Bonding设备
=================================
你可以使用发行包里的网络初始化脚本配置bonding,或者手动通过ifenslave或sysfs配置。发行包通常包含一到两个包来支持网络初始化脚本:initscripts或sysconfig。最近的版本已经支持bonding,而稍早的版本不支持。
我们将会首先描述使用通过发行包配置bonding的选项,这将通过initscripts和sysconfig的bonding支持来实现,然后,我们会介绍如果在没有网络初始化脚本的情况下(较老版本的initscript或sysconfig)如何使用bonding功能。
如果你不确定是否你的发行包包含sysconfig或者initscripts,或不确定它们是否足够新,很简单,可以用下面的方法来知道。
首先,执行命令:
$ rpm -qf /sbin/ifup
它将会返回一行文本,以"initscripts"或"sysconfig,"开头,后面跟着一串数字。这就是提供网络初始化脚本的包。
下一步,为了确定你的安装是否支持bonding,执行命令:
$ grep ifenslave /sbin/ifup
如果返回任何匹配记录,则表示你的initscripts或sysconfig支持bonding。
3.1 使用Sysconfig配置
---------------------------------
本节只适用于那些发行包里使用sysconfig的用户,而且syconfig要能够支持bonding,比如,SuSE
Linux Enterprise Server 9。
SuSE SLES 9的网络配置系统支持bonding,但是,在写作时,YaST系统配置前端并没有提供任何方法来配置bonding设备,你可以手动的配置bonding设备,如下:
首先,如果这些设备还没有配置,先把它们配置正确。在SLES 9上,通过运行yast2 sysconfig配置工具你可以很容易地做到。目标是为每一个slave设备创建一个ifcfg-id文件,达到该目标最简单的方法是把设备配置为DHCP(这只会创建出ifcfg-id文件,下文会提到DHCP的一些问题)。每个设备的配置文件名应该是如下的格式:
ifcfg-id-xx:xx:xx:xx:xx:xx
这里"xx"部份会使用设备的物理MAC地址里的数字替换掉。
一旦这组ifcfg-id-xx:xx:xx:xx:xx:xx文件创建成功,现在就可以为slave设备编辑配置文件(通过
MAC地址找到对应的slave设备)。在编辑之前,文件里应该已经存在一些内容,看起来如下:
BOOTPROTO='dhcp'
STARTMODE='on'
USERCTL='no'
UNIQUE='XNzu.WeZGOGF+4wE'
_nm_name='bus-pci-0001:61:01.0'
改变BOOTPROTO和STARTMODE:
BOOTPROTO='none'
STARTMODE='off'
不要改变UNIQUE和_nm_name的值,把其他行移除掉(USERCTL等)。
一旦ifcfg-id-xx:xx:xx:xx:xx:xx文件被修改,现在就可以为bonding设备本身创建配置文件了。该文件被命名为ifcfg-bondX,这里X表示创建的bonding设备数量,从0开始。这一个这样的文件名是ifcfg-bond0,第二个是ifcfg-bond1,依此类推。sysconfig网络配置系统会根据该配置正确地启动多个bonding实例。
ifcfg-bondX文件的内容看起来如下:
BOOTPROTO="static"
BROADCAST="10.0.2.255"
IPADDR="10.0.2.10"
NETMASK="255.255.0.0"
NETWORK="10.0.2.0"
REMOTE_IPADDR=""
STARTMODE="onboot"
BONDING_MASTER="yes"
BONDING_MODULE_OPTS="mode=active-backup miimon=100"
BONDING_SLAVE0="eth0"
BONDING_SLAVE1="bus-pci-0000:06:08.1"
请根据你网络的正确配置替换该示例里的BROADCAST,IPADDR,NETMASK和NETWORK值。
STARTMODE参数指定何时设备进入在线状态。可能的取值包括:
onboot: 设备在开机时启动。如果你不确定它的取值,这可能是你期望的取值。
manual: 设备只在ifup被手动调用时启动。bonding设备可能会被配置为该模式,如果因为某些原因你不希望他们在开机时启动。
off or ignore: 设备的配置被忽略。
BONDING_MASTER='yes'这一行表示该设备时一个bonding主设备。唯一有效的取值为"yes"。
BONDING_MODULE_OPTS的内容由该设备的bonding模块的实例提供。在这里可以指定bonding模式、链路侦听等等的选项。不要包含max_bonds这个bonding参数,如果你有多个bonding设备,该参数将会使配置系统混乱。
最后,为每个slave提供一个参数BONDING_SLAVEn="slave device",这里"n"是一个递增的值,每个slave有一个值。"slave device"可以是一个接口名,比如"eth0",或者一个网络设备的设备标志,接口名可能更容易找到,但是"ethN"可能在启动的时候有改动,比如在其中一个设备加载失败时;而设备标志(上例中的bus-pci-0000:06:08.1)指定一个物理的网络设备,除非该设备的总线位置改动(比如从一个PCI插槽移到另一个),否则该标志永远不会改变。上面的例子里出于演示目的各使用一种类型,实际的配置只会选择其中对所有slave某种进行配置。
当所有配置文件都已经正确地修改或创建后,必须要重启网络来使配置生效。这可以通过执行下面的命令:
# /etc/init.d/network restart
需要注意的是,网络控制脚本(/sbin/ifdown)将会在断开网络的过程中同时移除bonding模块,因此在模块的参数变化时不需要手工移除。
另外,在写作时,YaST/YaST2不会管理bonding设备(它们不会把bonding接口显示在它们的网络设备列表里),因此需要手工修改配置文件来改变bonding的配置。
关于ifcfg文件格式更多的选项和细节可以在ifcfg模版文件示例里找到:
/etc/sysconfig/network/ifcfg.template
注意这个模版文件里没有把上文提到的不同的BONDING_设置描述清楚,但描述了很多其他的选项。
3.1.1 利用Sysconfig使用DHCP
---------------------------------
在sysconfig下,把一个设备配置为BOOTPROTO='dhcp'将会导致该设备查询DHCP来获取它的IP地址信息。在写作时,这个功能对于bonding设备是无效的,脚本会优先尝试从DHCP上获取该设备地址,然后再把slave设备加入,而没有可用的slave设备,DHCP请求也就不能发送到网络上。
3.1.2 利用Sysconfig配置多个Bonds
---------------------------------
sysconfig网络初始化系统可以处理多个bonding设备。你需要做的只是为每个bonding实例配置正确的ifcfg-bondX配置文件(如上文描述)。不要对任何bonding实例指定"max_bonds"参数,否则将会使sysconfig混淆。如果你需要多个bonding设备有不同的参数,那么你可以创建多个ifcfg-bondX文件。因为sysconfig脚本在ifcfg-bondX文件中提供了bonding模块的选项,因此不需要再把它们增加到系统的/etc/modules.conf或者/etc/modprobe.conf配置文件。
3.2 使用Initscripts配置
---------------------------------
本节针对使用支持bonding的initscripts的发行包,比如Red Hat Linux 9或Red Hat Enterprise
Linux version 3或4。在这些系统上,网络初始化脚本拥有bonding的知识,可以配置来控制bonding设备。
这些发行包不会自动加载网络适配驱动除非ethX驱动配置了IP地址。因为这个限制,用户需要手工为每一个物理的适配器配置网络脚本,如果你希望把它加入bondX链接。网络脚本文件位于如下的目录:
/etc/sysconfig/network-scripts
文件名必须以"ifcfg-eth"开头,以适配器的物理适配号结尾。比如,针对eth0的脚本名为/etc/sysconfig/network-scripts/ifcfg-eth0,在文件中输入以下文本:
DEVICE=eth0
USERCTL=no
ONBOOT=yes
MASTER=bond0
SLAVE=yes
BOOTPROTO=none
"DEVICE="这一行对每个ethX设备会不一样,而且必须和文件名相对应,比如,ifcfg-eth1必须有一
行"DEVICE=eth1"。"MASTER="这一行也依赖于你用于bonding的接口名,和其他的网络设备一样,它们
一般也从0开始,每个设备加1,第一个bonding实例是bond0,第二个是bond1,依此类推。
下一步,创建一个bond网络脚本,脚本文件名应该是/etc/sysconfig/network-scripts/ifcfg-
bondX,这里X表示bond的数值。对于bond0文件名是"ifcfg-bond0",对于bond1文件名是"ifcfg-bond1",依此类推。在文件中输入以下内容:
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
确保把网络相关行的配置修改掉(IPADDR,NETMASK,NETWORK以及BROADCAST)以满足你的网络配置情况。
最后,需要编辑/etc/modules.conf(或者是/etc/modprobe.conf,依你的发行包而定),用以在bond0接口启动时以你指定的配置加载bonding模块。在/etc/modules.conf(或者modprobe.conf)输
入下面的行将会加载bonding模块,并且选择它的选项:
alias bond0 bonding
options bond0 mode=balance-alb miimon=100
把示例里的参数替换为对应于你的配置的正确的选项即可。
最后,以root权限运行"/etc/rc.d/init.d/network restart",这将会重启网络子系统,然后你的bond链接就会被启动并运行。
3.2.1 利用Initscripts使用DHCP
---------------------------------
最近版本的initscripts(在Fedora Core 3和Red Hat Enterprise Linux 4中的可以工作)可以支
持通过DHCP给bonding设备获取IP信息。
为了配置使用DHCP,需要把bonding照上文描述的那样配置,除了把"BOOTPROTO=none"这一行替换为"BOOTPROTO=dhcp",并且加上一行"TYPE=Bonding",需要注意TYPE的值是大小写敏感的。
3.2.2 利用Initscripts配置多个Bonds
---------------------------------
本文写作时,initscripts包不直接支持多次加载bonding驱动,因此这里的过程与"手动配置多个
Bonds"一节中的描述是一样的。
注意:某些Red Hat提供的内核不能在加载时对模块进行重命名(通过"-o bond1"部分),尝试传递到 modprobe 该选项将生成一个"Operation not permitted"错误。这已报告在某些Fedora Core内核中,也曾出现在RHEL 4上。在内核出现该问题时,表示我们无法通过不同的参数配置多个bonds。
3.3 通过Ifenslave手动配置Bonding
---------------------------------
本节适用于某些发行包,它们的网络初始化脚本(sysconfig或initscripts包)没有bonding相关的知识。SuSE Linux Enterprise Server 版本8就是这样的一个发行包。
对于这些系统一般的方法是,把bonding模块的参数放进/etc/modules.conf或者/etc/modprobe.conf(针对不同的安装发行包),然后在系统的全局初始化脚本里增加modprobe和/
或ifenslave命令。对于sysconfig,全局初始化脚本是/etc/init.d/boot.local,而对于initscripts,它是/etc/rc.d/rc.local。
比如,如果你想要实现一个简单的带两个e100设备(比如eth0和eth1)的bond,而且希望它在重启后还能存在,那么编辑对应的文件(/etc/init.d/boot.local或/etc/rc.d/rc.local),在里面加上:
modprobe bonding mode=balance-alb miimon=100
modprobe e100
ifconfig bond0 192.168.1.1 netmask 255.255.255.0 up
ifenslave bond0 eth0
ifenslave bond0 eth1
把示例里bonding模块参数以及bond0的网络配置(IP地址,掩码等)修改为你系统的正确配置。
不幸的是,这个方法不体动对bond设备上的ifup和ifdown脚本支持,为了重新加载bonding配置,你必须运行初始化脚本,比如:
# /etc/init.d/boot.local
或者
# /etc/rc.d/rc.local
针对这种情况,理想的做法是,创建一个独立的脚本用于初始化bonding配置,然后在boot.local中调用这个独立的脚本,这样就可以不重启整个全局初始化脚本就打开bonding。
为了关闭bonding设备,你首先需要把bonding设备标记为正在关闭,然后移除对应的设备驱动模块。针对我们上面的例子,你可以这样关闭:
# ifconfig bond0 down
# rmmod bonding
# rmmod e100
同样的,方便起见,最好把这些命令创建在一个独立的脚本里。
3.3.1 手动配置多个Bonds
---------------------------------
本节针对那些网络初始化脚本缺少对多bonds配置支持的系统,这里介绍了通过不同的选项配置多bonding设备的方法。
如果你需要配置多bonding设备,但所有设备使用同样的选项,你可能希望使用"max_bonds"模块参数,就像上文描述的一样。
为了创建多个不同选项的bonding设备,需要多次加载bonding驱动。要说明的是,当前版本的sysconfig网络初始化脚本自动处理这些,如果你的发行包这些脚本,你不需要额外的操作,参看上文的"配置Bonding驱动",如果你不确定你的网络初始化脚本是否支持。
为了加载模块的多个实例,需要为每个实例指定一个不同的名字(模块加载系统需要每个加载的模块有唯一的名字,即便它们是同一个模块的不同实例)。这可以通过在/etc/modprobe.conf中指定多个bonding选项,比如:
alias bond0 bonding
options bond0 -o bond0 mode=balance-rr miimon=100
alias bond1 bonding
options bond1 -o bond1 mode=balance-alb miimon=50
这将会两次加载bonding模块。第一个实例命名为"bond0",将会以balance-rr模式创建bond0设备,同时使用参数miimon为100。第二个实例命名为"bond1",将会以balance-alb模式创建bond1设备,同时使用参数miimon为50。
在某些情况下(通常是较老的发行包),上述参数不能工作,第二个bonding实例不会用到它的选项。在这种情况下,第二个选项可以用如下的选项替换:
install bond1 /sbin/modprobe --ignore-install bonding -o bond1 \
mode=balance-alb miimon=50
这些选项可以重复任意次,以指定任意多个bonding实例,只需要为每个依次的实例指定一个唯一的名字,以替换bond1即可。
3.4 通过Sysfs手工配置Bonding
---------------------------------
从版本3.0开始,Channel Bonding可以通过sysfs接口进行配置。sysfs接口允许在不卸载模块的情况下动态配置所有bonds,它也可以在运行时增加和移处bonds。Ifenslave已经不再需要了,尽管它还被支持。
使用sysfs接口允许你在不重新加载模块的情况下,对多个bonds使用不同的配置;也允许你使用多个不同配置的bonds,在bonding被编译进内核的时候。
你必须mount了sysfs文件系统,以配置bonding。本文里的示例假定你标准的sysfs的mount点,即/sys,如果你的sysfs文件系统被mount在其他地方,你需要对应地调整示例里的路径。创建和销毁Bonds
---------------------------------
增加一个新的bond(foo):
# echo +foo > /sys/class/net/bonding_masters
移除一个已存在的bond(bar):
# echo -bar > /sys/class/net/bonding_masters
显示所有存在的bonds:
# cat /sys/class/net/bonding_masters
注意:由于sysfs文件的4K大小限制,如果你好多bonds,这个列表可能被截断。这在通常的情况下并不常见。
增加和移除Slaves
---------------------------------
通过使用文件/sys/class/net//bonding/slaves,我们可以把网络接口从属于某个bond,这
个文件的语义和bonding_masters文件是完全相同的。
把eth0加入bond(bond0):
# ifconfig bond0 up
# echo +eth0 > /sys/class/net/bond0/bonding/slaves
从bond(bond0)里移除eth0:
# echo -eth0 > /sys/class/net/bond0/bonding/slaves
注意:bond必须在slave加入之前启动,所有slave必须在bond接口断开前移除。
当一个网络接口加入某个bond,sysfs文件系统里会在两者间创建符号链接,在这时,你可以看到/sys/class/net/bond0/slave_eth0指向/sys/class/net/eth0,而/sys/class/net/eth0/master指
向/sys/class/net/bond0。
这意味着你可以通过查看master的符号链接很快地知道一个接口有没有被加入。这样的话:
# echo -eth0 > /sys/class/net/eth0/master/bonding/slaves
将会把eth0正确地从它所从属的bond上移除,而不需要指定bond接口的名字。
改变Bond的配置
---------------------------------
每个bond可以独立地配置,通过操纵位于/sys/class/net//bonding下的文件。
这些文件的名字直接对应于本文里描述的命令行参数,除了arp_ip_target是个例外,它们总是接受同样的值。你可以直接把对应文件cat出来看当前的设置。
这里会给出一些例子,对于每个参数特定的使用指南,请参考本文里对应的章节。
把bond0配置为balance-alb模式:
# ifconfig bond0 down
# echo 6 > /sys/class/net/bond0/bonding/mode
- 或者 -
# echo balance-alb > /sys/class/net/bond0/bonding/mode
注意:在修改模式前,请先断开bond接口。
在bond0上启用MII监控,使用1秒的时间间隔:
# echo 1000 > /sys/class/net/bond0/bonding/miimon
注意:如果ARP监控被启用,当MII监控启用时它会被禁止,反之亦然。
增加ARP目的地址:
# echo +192.168.0.100 > /sys/class/net/bond0/bonding/arp_ip_target
# echo +192.168.0.101 > /sys/class/net/bond0/bonding/arp_ip_target
注意:最多可以指定十个目的地址。
移除ARP目的地址:
# echo -192.168.0.100 > /sys/class/net/bond0/bonding/arp_ip_target
配置示例
---------------------
我们从和3.3节相同的例子开始,但是使用sysfs,而不是ifenslave。
为了生成一个简单的带两个e100设备(假定为eth0和eth1)的bond,而且希望它在重启后依然存在,你可以编辑对应的文件(/etc/init.d/boot.local or /etc/rc.d/rc.local),加入如下内容:
modprobe bonding
modprobe e100
echo balance-alb > /sys/class/net/bond0/bonding/mode
ifconfig bond0 192.168.1.1 netmask 255.255.255.0 up
echo 100 > /sys/class/net/bond0/bonding/miimon
echo +eth0 > /sys/class/net/bond0/bonding/slaves
echo +eth1 > /sys/class/net/bond0/bonding/slaves
下面增加第二个bond,带有两个e1000接口,工作于active-backup模式,使用ARP监控,把如下内容加入到你的初始化脚本里:
modprobe e1000
echo +bond1 > /sys/class/net/bonding_masters
echo active-backup > /sys/class/net/bond1/bonding/mode
ifconfig bond1 192.168.2.1 netmask 255.255.255.0 up
echo +192.168.2.100 /sys/class/net/bond1/bonding/arp_ip_target
echo 2000 > /sys/class/net/bond1/bonding/arp_interval
echo +eth2 > /sys/class/net/bond1/bonding/slaves
echo +eth3 > /sys/class/net/bond1/bonding/slaves
阅读(1447) | 评论(0) | 转发(0) |