linux双网卡绑定(2)

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/<bond>/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/<bond name>/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

你可能感兴趣的:(.net,linux,脚本,配置管理,SuSE)