bonding.txt
上传用户:lgb322
上传日期:2013-02-24
资源大小:30529k
文件大小:21k
源码类别:

嵌入式Linux

开发平台:

Unix_Linux

  1.                    Linux Ethernet Bonding Driver mini-howto
  2. Initial release : Thomas Davis <tadavis at lbl.gov>
  3. Corrections, HA extensions : 2000/10/03-15 :
  4.   - Willy Tarreau <willy at meta-x.org>
  5.   - Constantine Gavrilov <const-g at xpert.com>
  6.   - Chad N. Tindel <ctindel at ieee dot org>
  7.   - Janice Girouard <girouard at us dot ibm dot com>
  8. Note :
  9. ------
  10. The bonding driver originally came from Donald Becker's beowulf patches for
  11. kernel 2.0. It has changed quite a bit since, and the original tools from
  12. extreme-linux and beowulf sites will not work with this version of the driver.
  13. For new versions of the driver, patches for older kernels and the updated
  14. userspace tools, please follow the links at the end of this file.
  15. Installation
  16. ============
  17. 1) Build kernel with the bonding driver
  18. ---------------------------------------
  19. For the latest version of the bonding driver, use kernel 2.4.12 or above
  20. (otherwise you will need to apply a patch).
  21. Configure kernel with `make menuconfig/xconfig/config', and select
  22. "Bonding driver support" in the "Network device support" section. It is
  23. recommended to configure the driver as module since it is currently the only way
  24. to pass parameters to the driver and configure more than one bonding device.
  25. Build and install the new kernel and modules.
  26. 2) Get and install the userspace tools
  27. --------------------------------------
  28. This version of the bonding driver requires updated ifenslave program. The
  29. original one from extreme-linux and beowulf will not work. Kernels 2.4.12
  30. and above include the updated version of ifenslave.c in Documentation/network
  31. directory. For older kernels, please follow the links at the end of this file.
  32. IMPORTANT!!!  If you are running on Redhat 7.1 or greater, you need
  33. to be careful because /usr/include/linux is no longer a symbolic link
  34. to /usr/src/linux/include/linux.  If you build ifenslave while this is
  35. true, ifenslave will appear to succeed but your bond won't work.  The purpose
  36. of the -I option on the ifenslave compile line is to make sure it uses
  37. /usr/src/linux/include/linux/if_bonding.h instead of the version from
  38. /usr/include/linux.
  39. To install ifenslave.c, do:
  40.     # gcc -Wall -Wstrict-prototypes -O -I/usr/src/linux/include ifenslave.c -o ifenslave 
  41.     # cp ifenslave /sbin/ifenslave
  42. 3) Configure your system
  43. ------------------------
  44. Also see the following section on the module parameters. You will need to add
  45. at least the following line to /etc/conf.modules (or /etc/modules.conf):
  46. alias bond0 bonding
  47. Use standard distribution techniques to define bond0 network interface. For
  48. example, on modern RedHat distributions, create ifcfg-bond0 file in
  49. /etc/sysconfig/network-scripts directory that looks like this:
  50. DEVICE=bond0
  51. IPADDR=192.168.1.1
  52. NETMASK=255.255.255.0
  53. NETWORK=192.168.1.0
  54. BROADCAST=192.168.1.255
  55. ONBOOT=yes
  56. BOOTPROTO=none
  57. USERCTL=no
  58. (put the appropriate values for you network instead of 192.168.1).
  59. All interfaces that are part of the trunk, should have SLAVE and MASTER
  60. definitions. For example, in the case of RedHat, if you wish to make eth0 and
  61. eth1 (or other interfaces) a part of the bonding interface bond0, their config
  62. files (ifcfg-eth0, ifcfg-eth1, etc.) should look like this:
  63. DEVICE=eth0
  64. USERCTL=no
  65. ONBOOT=yes
  66. MASTER=bond0
  67. SLAVE=yes
  68. BOOTPROTO=none
  69. (use DEVICE=eth1 for eth1 and MASTER=bond1 for bond1 if you have configured
  70. second bonding interface). 
  71. Restart the networking subsystem or just bring up the bonding device if your
  72. administration tools allow it. Otherwise, reboot. (For the case of RedHat
  73. distros, you can do `ifup bond0' or `/etc/rc.d/init.d/network restart'.)
  74. If the administration tools of your distribution do not support master/slave
  75. notation in configuration of network interfaces, you will need to configure
  76. the bonding device with the following commands manually:
  77.     # /sbin/ifconfig bond0 192.168.1.1 up
  78.     # /sbin/ifenslave bond0 eth0
  79.     # /sbin/ifenslave bond0 eth1
  80. (substitute 192.168.1.1 with your IP address and add custom network and custom
  81. netmask to the arguments of ifconfig if required).
  82. You can then create a script with these commands and put it into the appropriate
  83. rc directory.
  84. If you specifically need that all your network drivers are loaded before the
  85. bonding driver, use one of modutils' powerful features : in your modules.conf,
  86. tell that when asked for bond0, modprobe should first load all your interfaces :
  87. probeall bond0 eth0 eth1 bonding
  88. Be careful not to reference bond0 itself at the end of the line, or modprobe will
  89. die in an endless recursive loop.
  90. 4) Module parameters.
  91. ---------------------
  92. The following module parameters can be passed:
  93.     mode=
  94. Possible values are 0 (round robin policy, default) and 1 (active backup
  95. policy), and 2 (XOR).  See question 9 and the HA section for additional info.
  96.     miimon=
  97. Use integer value for the frequency (in ms) of MII link monitoring. Zero value
  98. is default and means the link monitoring will be disabled. A good value is 100
  99. if you wish to use link monitoring. See HA section for additional info.
  100.     downdelay=
  101. Use integer value for delaying disabling a link by this number (in ms) after
  102. the link failure has been detected. Must be a multiple of miimon. Default
  103. value is zero. See HA section for additional info.
  104.     updelay=
  105. Use integer value for delaying enabling a link by this number (in ms) after
  106. the "link up" status has been detected. Must be a multiple of miimon. Default
  107. value is zero. See HA section for additional info.
  108.     arp_interval=
  109. Use integer value for the frequency (in ms) of arp monitoring.  Zero value 
  110. is default and means the arp monitoring will be disabled.  See HA section
  111. for additional info.   This field is value in active_backup mode only.
  112.     arp_ip_target=
  113. An ip address to use when arp_interval is > 0.  This is the target of the
  114. arp request sent to determine the health of the link to the target.  
  115. Specify this value in ddd.ddd.ddd.ddd format.
  116. If you need to configure several bonding devices, the driver must be loaded
  117. several times. I.e. for two bonding devices, your /etc/conf.modules must look
  118. like this:
  119. alias bond0 bonding
  120. alias bond1 bonding
  121. options bond0 miimon=100
  122. options bond1 -o bonding1 miimon=100
  123. 5) Testing configuration
  124. ------------------------
  125. You can test the configuration and transmit policy with ifconfig. For example,
  126. for round robin policy, you should get something like this:
  127. [root]# /sbin/ifconfig
  128. bond0     Link encap:Ethernet  HWaddr 00:C0:F0:1F:37:B4  
  129.           inet addr:XXX.XXX.XXX.YYY  Bcast:XXX.XXX.XXX.255  Mask:255.255.252.0
  130.           UP BROADCAST RUNNING MASTER MULTICAST  MTU:1500  Metric:1
  131.           RX packets:7224794 errors:0 dropped:0 overruns:0 frame:0
  132.           TX packets:3286647 errors:1 dropped:0 overruns:1 carrier:0
  133.           collisions:0 txqueuelen:0 
  134. eth0      Link encap:Ethernet  HWaddr 00:C0:F0:1F:37:B4  
  135.           inet addr:XXX.XXX.XXX.YYY  Bcast:XXX.XXX.XXX.255  Mask:255.255.252.0
  136.           UP BROADCAST RUNNING SLAVE MULTICAST  MTU:1500  Metric:1
  137.           RX packets:3573025 errors:0 dropped:0 overruns:0 frame:0
  138.           TX packets:1643167 errors:1 dropped:0 overruns:1 carrier:0
  139.           collisions:0 txqueuelen:100 
  140.           Interrupt:10 Base address:0x1080 
  141. eth1      Link encap:Ethernet  HWaddr 00:C0:F0:1F:37:B4  
  142.           inet addr:XXX.XXX.XXX.YYY  Bcast:XXX.XXX.XXX.255  Mask:255.255.252.0
  143.           UP BROADCAST RUNNING SLAVE MULTICAST  MTU:1500  Metric:1
  144.           RX packets:3651769 errors:0 dropped:0 overruns:0 frame:0
  145.           TX packets:1643480 errors:0 dropped:0 overruns:0 carrier:0
  146.           collisions:0 txqueuelen:100 
  147.           Interrupt:9 Base address:0x1400 
  148. Questions :
  149. ===========
  150. 1.  Is it SMP safe?
  151. Yes.  The old 2.0.xx channel bonding patch was not SMP safe.
  152. The new driver was designed to be SMP safe from the start.
  153. 2.  What type of cards will work with it?
  154. Any Ethernet type cards (you can even mix cards - a Intel
  155. EtherExpress PRO/100 and a 3com 3c905b, for example).
  156. You can even bond together Gigabit Ethernet cards!
  157. 3.  How many bonding devices can I have?
  158. One for each module you load. See section on module parameters for how
  159. to accomplish this.
  160. 4.  How many slaves can a bonding device have?
  161. Limited by the number of network interfaces Linux supports and the
  162. number of cards you can place in your system.
  163. 5.  What happens when a slave link dies?
  164. If your ethernet cards support MII status monitoring and the MII
  165. monitoring has been enabled in the driver (see description of module
  166. parameters), there will be no adverse consequences. This release
  167. of the bonding driver knows how to get the MII information and
  168. enables or disables its slaves according to their link status.
  169. See section on HA for additional information.
  170. For ethernet cards not supporting MII status, or if you wish to 
  171. verify that packets have been both send and received, you may
  172. configure the arp_interval and arp_ip_target.  If packets have
  173. not been sent or received during this interval, an arp request
  174. is sent to the target to generate send and receive traffic.  
  175. If after this interval, either the successful send and/or 
  176. receive count has not incremented, the next slave in the sequence
  177. will become the active slave.
  178. If neither mii_monitor and arp_interval is configured, the bonding
  179. driver will not handle this situation very well. The driver will 
  180. continue to send packets but some packets will be lost. Retransmits 
  181. will cause serious degradation of performance (in the case when one
  182. of two slave links fails, 50% packets will be lost, which is a serious
  183. problem for both TCP and UDP).
  184. 6.  Can bonding be used for High Availability?
  185. Yes, if you use MII monitoring and ALL your cards support MII link
  186. status reporting. See section on HA for more information.
  187. 7.  Which switches/systems does it work with?
  188. In round-robin mode, it works with systems that support trunking:
  189. * Cisco 5500 series (look for EtherChannel support).
  190. * SunTrunking software.
  191. * Alteon AceDirector switches / WebOS (use Trunks).
  192. * BayStack Switches (trunks must be explicitly configured). Stackable
  193.   models (450) can define trunks between ports on different physical
  194.   units.
  195. * Linux bonding, of course !
  196. In Active-backup mode, it should work with any Layer-II switches.
  197. 8.  Where does a bonding device get its MAC address from?
  198. If not explicitly configured with ifconfig, the MAC address of the
  199. bonding device is taken from its first slave device. This MAC address
  200. is then passed to all following slaves and remains persistent (even if
  201. the the first slave is removed) until the bonding device is brought
  202. down or reconfigured.
  203. If you wish to change the MAC address, you can set it with ifconfig:
  204.   # ifconfig bond0 ha ether 00:11:22:33:44:55
  205. The MAC address can be also changed by bringing down/up the device
  206. and then changing its slaves (or their order):
  207.   # ifconfig bond0 down ; modprobe -r bonding
  208.   # ifconfig bond0 .... up
  209.   # ifenslave bond0 eth...
  210. This method will automatically take the address from the next slave
  211. that will be added.
  212. To restore your slaves' MAC addresses, you need to detach them
  213. from the bond (`ifenslave -d bond0 eth0'), set them down
  214. (`ifconfig eth0 down'), unload the drivers (`rmmod 3c59x', for
  215. example) and reload them to get the MAC addresses from their
  216. eeproms. If the driver is shared by several devices, you need
  217. to turn them all down. Another solution is to look for the MAC
  218. address at boot time (dmesg or tail /var/log/messages) and to
  219. reset it by hand with ifconfig :
  220.   # ifconfig eth0 down
  221.   # ifconfig eth0 hw ether 00:20:40:60:80:A0
  222. 9.  Which transmit polices can be used?
  223. Round robin, based on the order of enslaving, the output device
  224. is selected base on the next available slave.  Regardless of
  225. the source and/or destination of the packet.
  226. XOR, based on (src hw addr XOR dst hw addr) % slave cnt.  This
  227. selects the same slave for each destination hw address.
  228. Active-backup policy that ensures that one and only one device will
  229. transmit at any given moment. Active-backup policy is useful for
  230. implementing high availability solutions using two hubs (see
  231. section on HA).
  232. High availability
  233. =================
  234. To implement high availability using the bonding driver, you need to
  235. compile the driver as module because currently it is the only way to pass
  236. parameters to the driver. This may change in the future.
  237. High availability is achieved by using MII status reporting. You need to
  238. verify that all your interfaces support MII link status reporting. On Linux
  239. kernel 2.2.17, all the 100 Mbps capable drivers and yellowfin gigabit driver
  240. support it. If your system has an interface that does not support MII status
  241. reporting, a failure of its link will not be detected!
  242. The bonding driver can regularly check all its slaves links by checking the
  243. MII status registers. The check interval is specified by the module argument
  244. "miimon" (MII monitoring). It takes an integer that represents the
  245. checking time in milliseconds. It should not come to close to (1000/HZ)
  246. (10 ms on i386) because it may then reduce the system interactivity. 100 ms
  247. seems to be a good value. It means that a dead link will be detected at most
  248. 100 ms after it goes down.
  249. Example:
  250.    # modprobe bonding miimon=100
  251. Or, put in your /etc/modules.conf :
  252.    alias bond0 bonding
  253.    options bond0 miimon=100
  254. There are currently two policies for high availability, depending on whether
  255. a) hosts are connected to a single host or switch that support trunking
  256. b) hosts are connected to several different switches or a single switch that
  257.    does not support trunking.
  258. 1) HA on a single switch or host - load balancing
  259. -------------------------------------------------
  260. It is the easiest to set up and to understand. Simply configure the
  261. remote equipment (host or switch) to aggregate traffic over several
  262. ports (Trunk, EtherChannel, etc.) and configure the bonding interfaces.
  263. If the module has been loaded with the proper MII option, it will work
  264. automatically. You can then try to remove and restore different links
  265. and see in your logs what the driver detects. When testing, you may
  266. encounter problems on some buggy switches that disable the trunk for a
  267. long time if all ports in a trunk go down. This is not Linux, but really
  268. the switch (reboot it to ensure).
  269. Example 1 : host to host at double speed
  270.           +----------+                          +----------+
  271.           |          |eth0                  eth0|          |
  272.           | Host A   +--------------------------+  Host B  |
  273.           |          +--------------------------+          |
  274.           |          |eth1                  eth1|          |
  275.           +----------+                          +----------+
  276.   On each host :
  277.      # modprobe bonding miimon=100
  278.      # ifconfig bond0 addr
  279.      # ifenslave bond0 eth0 eth1
  280. Example 2 : host to switch at double speed
  281.           +----------+                          +----------+
  282.           |          |eth0                 port1|          |
  283.           | Host A   +--------------------------+  switch  |
  284.           |          +--------------------------+          |
  285.           |          |eth1                 port2|          |
  286.           +----------+                          +----------+
  287.   On host A :                             On the switch :
  288.      # modprobe bonding miimon=100           # set up a trunk on port1
  289.      # ifconfig bond0 addr                     and port2
  290.      # ifenslave bond0 eth0 eth1
  291. 2) HA on two or more switches (or a single switch without trunking support)
  292. ---------------------------------------------------------------------------
  293. This mode is more problematic because it relies on the fact that there
  294. are multiple ports and the host's MAC address should be visible on one
  295. port only to avoid confusing the switches.
  296. If you need to know which interface is the active one, and which ones are
  297. backup, use ifconfig. All backup interfaces have the NOARP flag set.
  298. To use this mode, pass "mode=1" to the module at load time :
  299.     # modprobe bonding miimon=100 mode=1
  300. Or, put in your /etc/modules.conf :
  301.     alias bond0 bonding
  302.     options bond0 miimon=100 mode=1
  303. Example 1: Using multiple host and multiple switches to build a "no single
  304. point of failure" solution.
  305.                 |                                     |
  306.                 |port3                           port3|
  307.           +-----+----+                          +-----+----+
  308.           |          |port7       ISL      port7|          |
  309.           | switch A +--------------------------+ switch B |
  310.           |          +--------------------------+          |
  311.           |          |port8                port8|          |
  312.           +----++----+                          +-----++---+
  313.           port2||port1                           port1||port2
  314.                ||             +-------+               ||
  315.                |+-------------+ host1 +---------------+|
  316.                |         eth0 +-------+ eth1           |
  317.                |                                       |
  318.                |              +-------+                |
  319.                +--------------+ host2 +----------------+
  320.                          eth0 +-------+ eth1
  321. In this configuration, there are an ISL - Inter Switch Link (could be a trunk),
  322. several servers (host1, host2 ...) attached to both switches each, and one or
  323. more ports to the outside world (port3...). One an only one slave on each host
  324. is active at a time, while all links are still monitored (the system can
  325. detect a failure of active and backup links).
  326. Each time a host changes its active interface, it sticks to the new one until
  327. it goes down. In this example, the hosts are not too much affected by the
  328. expiration time of the switches' forwarding tables.
  329. If host1 and host2 have the same functionality and are used in load balancing
  330. by another external mechanism, it is good to have host1's active interface
  331. connected to one switch and host2's to the other. Such system will survive
  332. a failure of a single host, cable, or switch. The worst thing that may happen
  333. in the case of a switch failure is that half of the hosts will be temporarily
  334. unreachable until the other switch expires its tables. 
  335. Example 2: Using multiple ethernet cards connected to a switch to configure
  336.            NIC failover (switch is not required to support trunking). 
  337.           +----------+                          +----------+
  338.           |          |eth0                 port1|          |
  339.           | Host A   +--------------------------+  switch  |
  340.           |          +--------------------------+          |
  341.           |          |eth1                 port2|          |
  342.           +----------+                          +----------+
  343.   On host A :                                 On the switch :
  344.      # modprobe bonding miimon=100 mode=1     # (optional) minimize the time
  345.      # ifconfig bond0 addr                    # for table expiration
  346.      # ifenslave bond0 eth0 eth1
  347. Each time the host changes its active interface, it sticks to the new one until
  348. it goes down. In this example, the host is strongly affected by the expiration
  349. time of the switch forwarding table.
  350. 3) Adapting to your switches' timing
  351. ------------------------------------
  352. If your switches take a long time to go into backup mode, it may be
  353. desirable not to activate a backup interface immediately after a link goes
  354. down. It is possible to delay the moment at which a link will be
  355. completely disabled by passing the module parameter "downdelay" (in
  356. milliseconds, must be a multiple of miimon).
  357. When a switch reboots, it is possible that its ports report "link up" status
  358. before they become usable. This could fool a bond device by causing it to
  359. use some ports that are not ready yet. It is possible to delay the moment at
  360. which an active link will be reused by passing the module parameter "updelay"
  361. (in milliseconds, must be a multiple of miimon).
  362. A similar situation can occur when a host re-negotiates a lost link with the
  363. switch (a case of cable replacement).
  364. A special case is when a bonding interface has lost all slave links. Then the
  365. driver will immediately reuse the first link that goes up, even if updelay
  366. parameter was specified. (If there are slave interfaces in the "updelay" state,
  367. the interface that first went into that state will be immediately reused.) This
  368. allows to reduce down-time if the value of updelay has been overestimated.
  369. Examples :
  370.     # modprobe bonding miimon=100 mode=1 downdelay=2000 updelay=5000
  371.     # modprobe bonding miimon=100 mode=0 downdelay=0 updelay=5000
  372. 4) Limitations
  373. --------------
  374. The main limitations are :
  375.   - only the link status is monitored. If the switch on the other side is
  376.     partially down (e.g. doesn't forward anymore, but the link is OK), the link
  377.     won't be disabled. Another way to check for a dead link could be to count
  378.     incoming frames on a heavily loaded host. This is not applicable to small
  379.     servers, but may be useful when the front switches send multicast
  380.     information on their links (e.g. VRRP), or even health-check the servers.
  381.     Use the arp_interval/arp_ip_target parameters to count incoming/outgoing
  382.     frames.  
  383. Resources and links
  384. ===================
  385. Current developement on this driver is posted to:
  386.  - http://www.sourceforge.net/projects/bonding/
  387. Donald Becker's Ethernet Drivers and diag programs may be found at :
  388.  - http://www.scyld.com/network/
  389. You will also find a lot of information regarding Ethernet, NWay, MII, etc. at
  390. www.scyld.com.
  391. For new versions of the driver, patches for older kernels and the updated
  392. userspace tools, take a look at Willy Tarreau's site :
  393.  - http://wtarreau.free.fr/pub/bonding/
  394.  - http://www-miaif.lip6.fr/willy/pub/bonding/
  395. To get latest informations about Linux Kernel development, please consult
  396. the Linux Kernel Mailing List Archives at :
  397.    http://boudicca.tux.org/hypermail/linux-kernel/latest/
  398. -- END --