Linux2.2.18環境下實現多網卡Bonding
2024-07-21 02:37:36
供稿:網友
將多塊網卡虛擬成為一塊網卡,使其具有相同的ip地址,來實現提升主機的網絡吞吐量或者是提高可用性,這種技術被稱作bonding。這項技術其實在sun和cisco中已經存在,分別稱為Trunking和etherchannel技術,在linux中,這種技術稱為bonding。
bonding驅動最早來自于Donald Becker的beowulf對kernel2.0的補丁。但是已經有了很大的改進和變化,最早來自于extreme-linux和beowulf的工具已經不適用于現在版本的驅動了。
對于新版本的驅動,請參考本文最后的鏈結地址。
1、安裝
1) 編譯帶有bonding driver的內核
對于最新版本的bonding驅動,使用內核2.2.18或以上版本(否則需要對內核打補丁)。
使用make menUConfig/xconfig/config來編譯內核,并在"Network device support"部分選擇"Bonding driver support",這里推薦配置該驅動為模塊方式,因為目前這是傳遞給參數給驅動并配置多個bonding設備的唯一方法。
編譯和安裝新的內核和模塊:
make dep;make clean;make bzImage;make modules;make modules_install;
2) 獲取并安裝用戶治理工具
這個版本的bonding驅動需要新的ifenslave程序。來自extreme-linux和beowulf的原始工具程序不能在這里使用。內核2.2.18及其以上版本在Documentation/network中包含文件ifenslave.c。對于更老的內核,請參考文章最后的資源鏈結部分的內容。
安裝ifenslave.c:
# gcc -O2 -s -o ifenslave ifenslave.c
# cp ifenslave /sbin/ifenslave
3) 配置系統
參考下一部分關于模塊參數的內容。首先需要在/etc/conf.modules中添加如下內容:
alias bond0 bonding
使用標準的發布技術來定義bond0這個網絡接口,例如在redhat發布中,在/etc/sysconfig/network-scripts目錄中添加ifcfg-bond0文件:
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
(使用適當的值來替代IP地址192.168.1)
所有屬于bond的接口動必須被定義為SLAVE或MASTER。例如,在Redhat中,假如希望定義eth0和eth1定義為屬于接口bond0的一部分,那么它們的配置文件(ifcfg-eth0, ifcfg-eth1,等)間如下所示:
DEVICE=eth0
USERCTL=no
ONBOOT=yes
MASTER=bond0
SLAVE=yes
BOOTPROTO=none
(對于eth1使用DEVICE=eth1;假如定義bond2,那么使用MASTER=bond1)。
假如治理工具支持可以重新啟動網絡子系統或者僅僅啟動bonding設備,否則重新啟動機器。(對于redhat發布,使用`ifup bond0'或`/etc/rc.d/init.d/network restart')
假如你的發布提供的治理工具不支持在網絡接口配置中定義master/slave,則需要使用下面的命令手工配置bonding設備:
# /sbin/ifconfig bond0 192.168.1.1 up
# /sbin/ifenslave bond0 eth0
# /sbin/ifenslave bond0 eth1
(根據網絡實際情況定義IP地址等參數)
當然也可以將這些命令定義為一個腳本,以方便執行。
4) 模塊參數
下面的模塊參數可能被傳遞:
mode=
可能的值為0(默認的輪轉模式round robin policy),或者1(熱備份模式),參考下面的HA部分來得到更多的相關信息。
miimon=
整數值,定義MII鏈路監測頻率(單位為頻率)。默認值為0,表示關閉鏈路監測。假如希望使用鏈路監測,一個合適的值為100。參考HA部分得到更多信息。
downdelay=
在發現鏈路故障時,這里規定的整數值定義disable一個鏈路的延遲(單位為毫秒)。必須是miimon的整數倍。默認值為0。參考HA部分得到更多信息。
updelay=
偵測到"link up"狀態時,這里規定的整數值定義了enable一個鏈路的延遲。必須是miimon的整數倍。默認值為0。參考HA部分得到更多信息。
假如需要定義多個bonding設備,驅動必須被多次加載。例如,對于有兩個bonding設備的情況,/etc/conf.modlues必須包含如下內容:
alias bond0 bonding
alias bond1 bonding
options bond0 miimon=100
options bond1 -o bonding1 miimon=100
5) 測試配置
可以通過ifconfig命令來監測配置和傳輸策略,例如對于輪轉策略,你應該得到如下信息:
[root]# /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
inet addr:XXX.XXX.XXX.YYY Bcast:XXX.XXX.XXX.255 Mask:255.255.252.0
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
inet addr:XXX.XXX.XXX.YYY Bcast:XXX.XXX.XXX.255 Mask:255.255.252.0
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:0x1400
問題:
1. bonding會不會和SMP沖突?
不會,老的2.0.xx版本配合SMP使用會發生沖突,而新的內核不會發生問題。
2. 哪種類型的網卡可以用作bonding?
任何類型的網卡(甚至可以使用混合類型的網卡-一個Intel的therEXPress PRO/100和a 3com 3c905b),甚至可以將兩個Gigabit以太網卡bond在一起使用。
3. 我可以擁有多少個bonding設備?
對應于加載的一個模塊,就可以擁有一個bonding設備,參考模塊參數部分來了解如何實現。
4. 一個bonding設備可以有多少個salve網卡?
受限于linux可以支持的網卡數量和系統可以插接的網卡數量。
5. 當一個slave鏈路出現故障,會發生什么問題?
假如你的以太網卡支持MII狀態監控,并且MII監測已經在驅動中被使用(參考模塊參數部分內容),那么就不會出現什么不幸的結果。這個版本的bonding驅動能得到MII信息并且根據鏈路狀態來enable或者disable某個slave網卡。參考HA部分得到更多信息。
所有不能報告自己的鏈路狀態的以太驅動不能很好地處理這種情況。bonding驅動不能連續發送數據報,而導致某些數據報丟失。而重傳可能會引起嚴重的性能問題(假如一塊網卡丟失,那么可能會對TCP或UDP帶來嚴重的性能影響)。
6. bonding能被用作高可用性項目么?
當然可以,假如使用了MII監測,并且你所有的網卡驅動都支持MII鏈路狀態匯報。參考HA部分內容。
7. bonding能適用于哪種類型的switches/systems?
在輪轉模式,它和下面支持trunking的系統能一起工作:
* Cisco 5500 series (參考EtherChannel支持相關內容)。
* SunTrunking software.
* Alteon AceDirector switches / WebOS (使用Trunks).
* BayStack Switches (trunks必須被配置). 可堆疊的模塊(450)能在不同的物理單元的端口中定義
* Linux bonding.
對于熱備份模式下,它能和一切二層交換機工作。
8. 一個bonding設備的MAC來自于哪個網卡?
假如沒有明顯使用ifconfig來配置指定,bonding設備的MAC地址從它的第一個slave中得到。這個MAC地址隨即被傳遞個所有其他的slave設備,這些其他的slave設備將具有這個MAC,即使第一個Slave設備被去除。只有bonding設備重起或者down了,MAC地址才會改變。
假如希望修改MAC地址,可以使用ifconfig來設置:
# ifconfig bond0 ha ether 00:11:22:33:44:55
可以通過up/down設備,然后修改其slave的順序來改變bonding設備的MAC地址:
# ifconfig bond0 down ; modprobe -r bonding
# ifconfig bond0 .... up
# ifenslave bond0 eth...
這個方法將自動從下一個將被添加的slave中得到地址。
為了恢復slave的MAC地址,需要將其從bonding設備中分離出來(`ifenslave -d bond0 eth0'),down掉該設備(`ifconfig eth0 down'),去除模塊(`rmmod 3c59x'),然后重載其以使其從其eeproms中得到其MAC地址。若一個驅動被多個設備所擁有,那么需要將其全部down掉。另外一種方法是察看啟動時該卡的MAC地址(dmesg或 tail /var/log/messages),并使用ifconfig來reset它:
# ifc