我们在这介绍的Linux网卡绑定实现是使用两块网卡虚拟成为一块网卡,这个聚合起来的设备看起来是一个单独的以太网接口设备,通俗点讲是两块网卡具有相同的IP地址而并行链接聚合成一个逻辑链路工作。其实这项技术在Sun和Cisco中早已存在,被称为Trunking和Etherchannel技术,在Linux的2.4.x的内核中也采用这这种技术,被称为bonding。
  bonding技术的早应用是在集群——beowulf上,为了提高集群节点间的数据传输而设计的。下面我们讨论一下bonding的原理,什么是bonding需要从网卡的混杂(promisc)模式说起。我们知道,在正常情况下,网卡只接收目的硬件地址(MACAddress)是自身Mac的以太网帧,对于别的数据帧都滤掉,以减轻驱动程序的负担。但是网卡也支持另外一种被称为混杂promisc的模式,可以接收网络上所有的帧,比如说tcpdump,是运行在这个模式下。bonding也运行在这个模式下,而且修改了驱动程序中的mac地址,将两块网卡的Mac地址改成相同,可以接收特定mac的数据帧。然后把相应的数据帧传送给bond驱动程序处理。
  直接给两块网卡设置同一IP地址是不可能的。Kernels2.4.12及以后的版本均供bonding模块,以前的版本可以通过patch实现。
  一、编辑虚拟网络接口配置文件,指定网卡IP
  假设eth0是对外服务的网卡,已经调试好网络;eth1是希望与eth0同时对外提供服务的网卡。
  # cd /etc/sysconfig/network-scripts/
  # vi ifcfg-bond0
  写入如下信息和原来 ifcfg-eth0的配置其实差不多。
  所以我建议执行如下语句,将ifcfg-eth0复制一份再改。
  # cp ifcfg-eth0 ifcfg-bon0
  将ifcfg-bon0的信息修改大致如下:
DEVICE=bond0
BOOTPROTO=static
IPADDR=[IP]
NETMASK=[MASK]
BROADCAST=[BROADCAST]
GATEWAY=[GATEWAY]
ONBOOT=yes
TYPE=Ethernet
  二、配置真实网卡
  修改ifcfg-eth0如下:
DEVICE=eth0
BOOTPROTO=none
ONBOOT=yes
MASTER=bond0 #如果不写,则必须做第四步
SLAVE=yes #如果不写,则必须做第四步
USERCTL=yes
  类似地修ifcfg-eth1如下:
DEVICE=eth1
BOOTPROTO=none
ONBOOT=yes
MASTER=bond0 #如果不写,则必须做第四步
SLAVE=yes #如果不写,则必须做第四步
USERCTL=yes