linux 之 bonding詳解

一、引言現今幾乎各行各業內部都建立了自己的服務器,由於服務器的特殊地位,它的可靠性、可用性及其 I/O 速度就顯得非常的重要, 保持服務器的高可用性和安全性是企業級IT 環境的重要指標,其中最重要的一點是服務器網絡連接的高可用性, 
爲實現這些要求,現在服務器大都採用多網卡配置,系統大都採用現在非常流行的 linux 作爲服務器工作的環境。現在帶寬已經不是服務質量提高的瓶頸了,相對的網絡設備和服務器的處理能力就漸漸成爲新的瓶頸。爲提高服務器的網絡連接的可用性和可靠性,目前Sun公司的Trunking技術、3Com 公司的 DynamicAccess 技術、Cisco 公司的Etherchannel技術等等都在研究將服務器的多個網卡接口綁定在一起的鏈路聚集技術,鏈路聚集技術將多個鏈路虛擬成一個邏輯鏈路進而提供了一種廉價、有效的方法擴展網絡設備和服務器的帶寬,提高網絡的靈活性與可用性。
    本文介紹 linux 下的 bonding 技術,linux 2.4.x 的內核中採用了這種技術,利用 bonding 技術可以將多塊網卡接口通過綁定虛擬成爲一塊網卡,在用戶看來這個聚合起來的設備好像是一個單獨的以太網接口設備,通俗點講就是多塊網卡具有相同的 IP 地址而並行連接聚合成一個邏輯鏈路工作。現在在關於linux bonding 技術中,有幾種算法來實現負載均衡的要求,此文針對這些算法,在此進行簡單分析與研究,討論其不足,並提出另外一種在此基礎上改進的一種基於傳輸協議的負載均衡實現方法。討論如何實現多個網絡接口的分在均衡及其故障接管。
    二、負載均衡技術和高可用技術介紹
    2.1 負載均衡技術負載均衡技術的主要思想就是如何根據某種算法將網絡的業務流量平均分配到不同的服務器和網絡設備上去,以減輕單臺服務器和網絡設備的負擔,從而提高整個系統的效率。負載均衡既可以由有負載均衡功能的硬件實現,也可以通過一些專用的軟件來實現,負載均衡是一種策略,它能讓多臺服務器或多條鏈路共同承擔一些繁重的計算或者 I/O 任務,從而以較低的成本消除網絡瓶頸,提高網絡的靈活性和可靠性。
    2.2 高可用技術實現負載均衡首先是基於網絡的高可用性提出來的,高可用技術是容錯技術的一個分支。實現系統的高可用性最簡單的一個辦法就是冗餘。完整的網絡負載均衡和高可用性網絡技術有兩個方面構成,一是多服務器的綁定和負載均衡,二是一個服務器內部的多網卡綁定的負載均衡,這裏主要討論一個服務器內部的多網卡綁定時的負載均衡。
    三、Linux 的 bonding 技術中負載均衡的簡單實現
    3.1 Linux的bonding技術Linux的bonding技術是網卡驅動程序之上、數據鏈路層之下實現的一個虛擬層,通過這種技術,服務器接在交換機上的多塊網卡不僅被綁定爲一個 IP,MAC 地址也被設定爲同一個,進而構成一個虛擬的網卡,工作站向服務器請求數據,服務器上的網卡接到請求後,網卡根據某種算法智能決定由誰來處理數據的傳輸。 Bonding技術可以提高主機的網絡吞吐量和可用性。
    3.2 Linux的幾種發送均衡算法目前 Linux 的發送算法最主要的有三種:輪轉算法(Round-Robin) 、備份算法(Active-Backup) 、MAC 地址異或算法(MAC-XOR) .下面對目前這三種主要算法進行簡單分析。
    3.2.1 輪轉算法該算法是基於公平原則進行的,它爲每個將要被髮送的數據包選擇發送接口,算法的主要思想是首先第一個數據包由一個接口發送,另一個數據包則由另外一個接口發送,下面依次進行循環選擇。通過分析我們可以看出這種算法比較比較簡單,在發送數據方面也比較公平,能保證網卡發送數據時候的負載均衡,資源利用率很高。但是我們知道如果一個連接或者會話的數據包從不同的接口發出的話,中途再經過不同的鏈路,在客戶端很有可能會出現數據包無序到達的問題,而無序到達的數據包需要重新要求被髮送,這樣網絡的吞吐量就會下降。
    3.2.2 備份算法該算法將多個網卡接口中的一個接口設定爲活動狀態,其他的接口處於備用狀態。當活動接口或者活動鏈路出現故障時,啓動備用鏈路,由此可見此算法的優點是可以提供高網絡連接的可用性,但是它的資源利用率較低,只有一個接口處於工作狀態,在有 N 個網絡接口的情況下,資源利用率爲1/N.
   3.2.3 MAC地址異或算法該算法的主要思想是:由服務器的 MAC 地址和客戶端的MAC 地址共同決定每個數據包的發送端口號,由源 MAC 地址和目的 MAC 地址進行異或計算,並將異或結果對接口數求餘計算。由於發送到同一個客戶端的數據流經過同一個鏈路,因此數據包能夠有序到達客戶端。此算法在只有一個客戶機訪問服務器或者服務器和客戶機不在同一子網的情況下,由算法思想得知這種情況下負載不會均衡,在只有一個客戶機訪問服務器的時候,資源的利用率也是 1/N(N爲接口數)。
首先是你要內核支持,如果不支持,請你自己重新編譯,在編譯的時候把網絡設備選項中的Bonding driver support選中就可以了。
簡介
=============================

Linux bonding驅動提供了一種方法,用以把多個網絡接口(network interface)組合成一個邏輯的"bonded"接口。Bonded接口的工作方式取決於驅動的模式:不同的模式提供了熱備份或負載均衡等不同的服務。此外,驅動還會監控鏈路的可用性。

Bonding驅動最早來自Donald Becker針對Linux 2.0內核的beowulf補丁。現在已經有了很多的變化,最早的來自beowulf網站的工具已經不能和現在的驅動一起使用。

如果你希望得到最新的版本,或者最新的用戶工具,或者尋求相關的幫助,請留意本文末尾的鏈接。

目錄


=================================

1. Bonding驅動簡介
=================================
大多數目前發佈的Linux內核都以模塊(module)方式帶了bonding驅動,ifenslave工具也都已經安裝好。如果你的Linux沒有,或者你確實需要自己來編譯bonding(比如要配置或安裝自己的Linux內核),請參考如下步驟:

1.1 配置並編譯支持bonding的內核
---------------------------------

當前版本的bonding驅動位於Linux內核源碼(從http://kernel.org下載)的drivers/net/bonding子目錄中。你可以在kerenl.org下載到最新版本的內核源碼。

通過"make menuconfig"(或"make xconfig" "make config")配置內核,在“Network device support”下選擇“Bonding driver support”。建議你將bonding驅動配置爲模塊(module)方式,因爲如果你要給驅動傳遞參數或者希望配置多個bonding驅動,只有通過模塊方式。

編譯並安裝新的內核和編譯出的模塊,然後參照下面的步驟安裝ifenslave。

1.2 安裝ifenslave控制工具
--------------------------------

ifenslave控制工具也在內核源碼中:Documentation/networking/ifenslave.c。一般建議最好使用和內核匹配的 ifenslave(同一份源碼中或同一個發佈中),然而較老的內核中的ifenslave也應該能夠正常工作(較新的一些功能將不能使用),不過更新的內核中的ifenslave將可能不能工作。

參照如下步驟以安裝ifenslave:

# gcc -Wall -O -I/usr/src/linux/include ifenslave.c -o ifenslave
# cp ifenslave /sbin/ifenslave

如果你的內核源碼不在“/usr/src/linux”下,請將上面的“/usr/src/linux/include”替換成相應的正確目錄。

如果希望備份現有的/sbin/ifenslave,或者只是試用一下,你可以把ifenslave文件名加上內核版本信息(比如,/sbin/ifenslave-2.6.10)

重要提示:

如果你忽略了"-I"參數或者指定了一個不正確的目錄,你可能會得到一個和內核不兼容的ifenslave。有些發佈(比如Red Hat 7.1之前的版本)沒有/usr/include/linux符號鏈接指向當前內核的include目錄。

另一個重要提示:
如果你打算使用sysfs來配置bonding,你不需要使用ifenslave。

2. Bonding驅動選項
=================================

Bonding驅動的選項是通過在加載時指定參數來設定的。可以通過insmod或modprobe命令的命令行參數來指定,但通常在/etc /modules.conf或/etc/modprobe.conf配置文件中指定,或其他的配置文件中(下一節將會提及幾個具體的細節)

下面列出可用的bonding驅動參數。如果參數沒有指定,驅動會使用缺省參數。剛開始配置bond的時候,建議在一個終端窗口中運行"tail -f /var/log/messages"來觀察bonding驅動的錯誤信息【譯註:/var/log/messages一般會打印內核中的調試信息】。

有些參數必須要正確的設定,比如miimon、arp_interval和arp_ip_target,否則在鏈接故障時會導致嚴重的網絡性能退化。很少的設備不支持miimon,因此沒有任何理由不使用它們。

有些選項不僅支持文本值的設定,出於兼容性的考慮,也支持數值的設定,比如,"mode=802.3ad"和"mode=4"效果是一樣的。

具體的參數列表:

arp_interval

指定ARP鏈路監控頻率,單位是毫秒(ms)。如果APR監控工作於以太兼容模式(模式0和模式2)下,需要把switch(交換機)配置爲在所有鏈路上均勻的分發網絡包。如果switch(交換機)被配置爲以XOR方式分發網絡包,所有來自ARP目標的應答將會被同一個鏈路上的其他設備收到,這將會導致其他設備的失敗。ARP監控不應該和miimon同時使用。設定爲0將禁止ARP監控。缺省值爲0。

arp_ip_target

指定一組IP地址用於ARP監控的目標,它只在arp_interval > 0時有效。這些IP地址是ARP請求發送的目標,用於判定到目標地址的鏈路是否工作正常。該設定值爲ddd.ddd.ddd.ddd格式。多個IP地址通過逗號分隔。至少指定一個IP地址。最多可以指定16個IP地址。缺省值是沒有IP地址。

downdelay

指定一個時間,用於在發現鏈路故障後,等待一段時間然後禁止一個slave,單位是毫秒(ms)。該選項只對miimon監控有效。downdelay值應該是miimon值的整數倍,否則它將會被取整到最接近的整數倍。缺省值爲0。

lacp_rate

指定在802.3ad模式下,我們希望的鏈接對端傳輸LACPDU包的速率。可能的選項:

slow 或者 0
    請求對端每30s傳輸LACPDU

fast 或者 1
    請求對端每1s傳輸LACPDU

缺省值是slow

max_bonds

爲bonding驅動指定創建bonding設備的數量。比如,如果max_bonds爲3,而且bonding驅動還沒有加載,那麼bond0,bond1,bond2將會被創建。缺省值爲1。

miimon

指定MII鏈路監控頻率,單位是毫秒(ms)。這將決定驅動檢查每個slave鏈路狀態頻率。0表示禁止MII鏈路監控。100可以作爲一個很好的初始參考值。下面的use_carrier選項將會影響如果檢測鏈路狀態。更多的信息可以參考“高可靠性”章節。缺省值爲0。

mode

指定bonding的策略。缺省是balance-rr (round robin,循環賽)。可選的mode包括:

balance-rr 或者 0

    Round-robin(循環賽)策略:按順序傳輸數據包,從第一個可用的slave到最後一個可用的slave。該模式提供了負載均衡和容錯機制。

active-backup 或者 1

    Active-backup(激活-備份)策略:只有一個slave是激活的(active)。其他的slave只有在當前激活的slave故障後纔會變爲激活的(active)。從外面看來,bond的MAC地址是唯一的,以避免switch(交換機)發生混亂。

    在bonding 2.6.2和以後的版本中,如果在active-backup模式下出現failover【譯註:指一個slave發生故障,另一個slave變爲激活的設備】,bonding將會在新的slave上發出一個或多個ARP請求,其中一個ARP請求針對bonding master接口及它上面配置的每個VLAN接口,從而保證該接口至少配置了一個IP地址。針對VLAN接口的ARP請求將會被打上相應的VLAN id。

----------------------------------------------------------------------------------------
        In bonding version 2.6.2 or later, when a failover
        occurs in active-backup mode, bonding will issue one
        or more gratuitous ARPs on the newly active slave.
        One gratuitous ARP is issued for the bonding master
        interface and each VLAN interfaces configured above
        it, provided that the interface has at least one IP
        address configured. Gratuitous ARPs issued for VLAN
        interfaces are tagged with the appropriate VLAN id.
----------------------------------------------------------------------------------------

    該模式提供了容錯機制。下面的primary選項將會影響該工作模式的行爲。

balance-xor 或者 2

    XOR策略:基於指定的傳輸HASH策略傳輸數據包。缺省的策略是:(源MAC地址 XOR 目標MAC地址) % slave數量。其他的傳輸策略可以通過xmit_hash_policy選項指定,下文將會對之介紹。

    該模式提供了負載均衡和容錯機制。

broadcast 或者 3

    Broadcase(廣播)策略:在每個slave接口上傳輸每個數據包。該模式提供了容錯機制。

802.3ad 或者 4

    IEEE 802.3ad Dynamic link aggregation(動態鏈接聚合)。創建一個聚合組,它們共享同樣的速率和雙工設定。根據802.3ad規範將多個slave工作在同一個激活的聚合體下。

    外出流量的slave選舉是基於傳輸hash策略,該策略可以通過xmit_hash_policy選項從缺省的XOR策略改變到其他策略。需要注意的是,並不是所有的傳輸策略都是802.3ad適應的,尤其考慮到在802.3ad標準43.2.4章節提及的包亂序問題。不同的實現可能會有不同的適應性。

    必要條件:

    1. ethtool支持獲取每個slave的速率和雙工設定;

    2. switch(交換機)支持IEEE 802.3ad Dynamic link aggregation。

    大多數switch(交換機)需要經過特定配置才能支持802.3ad模式。

balance-tlb 或者 5

    自適應的傳輸負載均衡:不需要任何特別的switch(交換機)支持的通道bonding。在每個slave上根據當前的負載(根據速度計算)分配外出流量。如果正在接受數據的slave出故障了,另一個slave接管失敗的slave的MAC地址。

    必要條件:

    ethtool支持獲取每個slave的速率。

balance-alb 或者 6

    自適應均衡負載:該模式包含了balance-tlb模式,同時加上針對IPV4流量的接收負載均衡(receive load balance, rlb),而且不需要任何switch(交換機)的支持。接收負載均衡是通過ARP協商實現的。bonding驅動截獲本機發送的ARP應答,並把源硬件地址改寫爲bond中某個slave的唯一硬件地址,從而使得不同的對端使用不同的硬件地址進行通信。

    來自服務器端的接收流量也會被均衡。當本機發送ARP請求時,bonding驅動把對端的IP信息從ARP包中複製並保存下來。當ARP應答從對端到達時,bonding驅動把它的硬件地址提取出來,併發起一個ARP應答給bond中的某個slave。使用ARP協商進行負載均衡的一個問題是:每次廣播 ARP請求時都會使用bond的硬件地址,因此對端學習到這個硬件地址後,接收流量將會全部劉翔當前的slave。這個問題通過給所有的對端發送更新(ARP應答)來解決,應答中包含他們獨一無二的硬件地址,從而導致流量重新分佈。當新的slave加入到bond中時,或者某個未激活的slave重新激活時,接收流量也要重新分佈。接收的負載被順序地分佈(round robin)在bond中最高速的slave上。

    當某個鏈路被重新接上,或者一個新的slave加入到bond中,接收流量在所有當前激活的slave中全部重新分配,通過使用指定的MAC地址給每個 client發起ARP應答。下面介紹的updelay參數必須被設置爲某個大於等於switch(交換機)轉發延時的值,從而保證發往對端的ARP應答不會被switch(交換機)阻截。

    必要條件:

    1. ethtool支持獲取每個slave的速率;

    2. 底層驅動支持設置某個設備的硬件地址,從而使得總是有個slave(curr_active_slave)使用bond的硬件地址,同時保證每個bond 中的slave都有一個唯一的硬件地址。如果curr_active_slave出故障,它的硬件地址將會被新選出來的 curr_active_slave接管。

primary

指定哪個slave成爲主設備(primary device),取值爲字符串,如eth0,eth1等。只要指定的設備可用,它將一直是激活的slave。只有在主設備(primary device)斷線時纔會切換設備。這在希望某個slave設備優先使用的情形下很有用,比如,某個slave設備有更高的吞吐率。

primary選項只對active-backup模式有效。

updelay

指定當發現一個鏈路恢復時,在激活該鏈路之前的等待時間,以毫秒計算。該選項只對miimon鏈路偵聽有效。updelay應該是miimon值的整數倍,如果不是,它將會被向下取整到最近的整數。缺省值爲0。

use_carrier

指定miimon是否需要使用MII或者ETHTOOL ioctls還是netif_carrier_ok()來判定鏈路狀態。MII或ETHTOOL ioctls更低效一些,而且使用了內核裏廢棄的舊調用序列;而netif_carrier_ok()依賴於設備驅動來維護狀態(判斷載波),在本文寫作時,大多數但不是全部設備驅動支持這個特性。

如果bonding總是認爲鏈路是通的,但實際上是斷的,這有可能是由於你的網絡設備驅動不支持netif_carrier_on/off。因爲 netif_carrier的缺省狀態是"carrier on",因此如果驅動不支持netif_carrier,則會顯示鏈路永遠正常。在這種情況下,把use_carrier設爲0,從而讓bonding使用MII/ETHTOOL ictl來判定鏈路狀態。

該選項設爲1會使用netif_carrier_ok(),而設爲0則會使用廢棄的MII/ETHTOOL ioctls,缺省值是1。

xmit_hash_policy

在balance-xor和802.3ad模式下選擇不同的hash模式,以用於slave選舉。可能的取值有:

layer2

    使用硬件MAC地址的XOR來生成hash。公式爲:

    (源MAC地址 XOR 目的MAC地址)% slave數目

    該算法會將某個網絡對(network peer)上所有的流量全部分配到同一個slave上。

layer3+4

    該策略在可能的時候使用上層協議的信息來生成hash。這將允許特定網絡對(network peer)的流量分攤到多個slave上,儘管同一個連接(connection)不會分攤到多個slave上。

    針對未分片的TCP和UDP包的計算公式爲:

    ((源端口 XOR 目的端口) XOR ((源IP XOR 目的IP) AND 0xFFFF) % slave數目

    對於已分片TCP或UDP包,以及其他的IP包,源端口和目的端口的信息被忽略了;對於非IP流量,採用和layer2一樣的hash策略。

    該策略期望模仿某些交換機的行爲,比如帶PFC2的Cisco交換機,以及某些Foundry和IBM的產品。

    該算法不完全適應802.3ad,一個單一的TCP或UDP會話同時包含有分片和未分片的包將會導致包在兩個接口上傳遞,這將會導致投遞亂序。大多數流量不會滿足這種條件,正如TCP很少分片,而大多數UDP流量不會在長期的會話中存在。其他的802.3ad實現有可能不能容忍這樣的不適應性。

缺省設置是layer2。該選項在bonding 2.6.3加入,在早期版本中,該參數不存在,只只是layer2策略。


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

4. 查詢Bonding配置
=================================

4.1 Bonding配置
---------------------------------

每個bonding設備對應於一個只讀文件,存在於/proc/net/bonding目錄,文件內容包括bonding配置的信息,選項以及每個slave的狀態。

例如,在使用參數mode=0,miimon=1000時,加載驅動後,/proc/net/bonding/bond0的內容爲:

    Ethernet Channel Bonding Driver: 2.6.1 (October 29, 2004)
        Bonding Mode: load balancing (round-robin)
        Currently Active Slave: eth0
        MII Status: up
        MII Polling Interval (ms): 1000
        Up Delay (ms): 0
        Down Delay (ms): 0

        Slave Interface: eth1
        MII Status: up
        Link Failure Count: 1

        Slave Interface: eth0
        MII Status: up
        Link Failure Count: 1

根據你配置、狀態、以及bonding驅動版本的差異,上述內容的精確格式和內容有可能不同。

4.2 網路配置
---------------------------------

網絡配置可以通過ifconfig命令查看,Bonding設備會設上MASTER標記,slave設備會設上SLAVE標記。ifconfig的輸出不包含哪個slave關聯於哪個master的關係。

在上例中,bond0接口是master(MASTER),而eth0和eth0是slave(SLAVE)。注意除了TLB和ALB模式外,所有 bond0的slave和bond0有着同樣的MAC地址(HWaddr),TLB和ALB需要每個slave有獨立的MAC地址。

# /sbin/ifconfig
bond0     Link encap:Ethernet HWaddr 00:C0:F0:1F:37:B4
          inet addr:XXX.XXX.XXX.YYY Bcast:XXX.XXX.XXX.255 Mask:255.255.252.0
          UP BROADCAST RUNNING MASTER MULTICAST MTU:1500 Metric:1
          RX packets:7224794 errors:0 dropped:0 overruns:0 frame:0
          TX packets:3286647 errors:1 dropped:0 overruns:1 carrier:0
          collisions:0 txqueuelen:0

eth0      Link encap:Ethernet HWaddr 00:C0:F0:1F:37:B4
          UP BROADCAST RUNNING SLAVE MULTICAST MTU:1500 Metric:1
          RX packets:3573025 errors:0 dropped:0 overruns:0 frame:0
          TX packets:1643167 errors:1 dropped:0 overruns:1 carrier:0
          collisions:0 txqueuelen:100
          Interrupt:10 Base address:0x1080

eth1      Link encap:Ethernet HWaddr 00:C0:F0:1F:37:B4
          UP BROADCAST RUNNING SLAVE MULTICAST MTU:1500 Metric:1
          RX packets:3651769 errors:0 dropped:0 overruns:0 frame:0
          TX packets:1643480 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:100
          Interrupt:9 Base address:

gentoo(2.6.39.4)實踐:

在/etc/conf.d/net中,添加

        slave_bond0="eth0 eth1 eth2"
config_bond0="null"
mode_bond0="6"
miimon_bond0="100"


在/etc/init.d/中創建

ln -sf net.lo net.bond0

emerge ifenslave

modprobe bond0 bonding mode=6

ifenslave bond0 eth0 eth1 eth2

dhclient -v bond0(ifconfig bond0 ... ... ...) 


Centos6.2環境
vi /etc/modprobe.d/hhc-bonding.conf
alias bond0 bonding 
options bond0 miimon=100 mode=5 max_bonds=4
說明: 
    miimon表示鏈路檢查間隔,單位爲毫秒;mode的值表示工作模式,他共有0、1、2、3、4、5、6七種模式,
    0:負載均衡模式,RR方式,全負載均衡,需要Switch側做Trunk,可失效一網卡; 
    1模式:熱備模式,不需要Switch側支持;
    2模式:負載均衡模式,XOR方式,根據來源MAC; 
    3模式:廣播模式,所有網卡一起收發數據包,可失效一網卡;
    4模式:802.3ad模式,需要Switch支持802.3ad Dynamic Link Aggregation;
    5模式:負載均衡模式,TLB方式,半負載均衡,發送爲負載均衡,接收爲動態分配,不需要Switch側支持,可失效一網卡;
    6模式:負載均衡模式,ALB方式,全負載均衡,網卡需支持動態更改MAC,不需要Switch側支持,可失效一網卡;
    max_bonds : 多bonding時參數,如果BOND在一個以上最好加上這參數限制BOND最大加載幾個,如果沒有加載這個參數會網絡重啓的時候會報類似於“找不到BOND1參數,BOND1加載失敗的錯誤”

轉載自:http://blog.csdn.net/balderfan/article/details/7630944

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章