1. 什麼是bonding;
Linux bonding 驅動提供了一個把多個網路介面裝置捆綁為單個的網路介面設定來使用,用於網路負載平衡及網路冗餘。 The Linux bonding driver provides a method for aggregating multiple network interfaces into a single logical bonded interface. The behavior of the bonded interfaces depends upon the mode; generally speaking, modes provide either hot standby or load balancing services. Additionally, link integrity monitoring may be performed.
2.bonding 應用方向;
2.1 網路負載平衡;
對於bonding的網路負載平衡是我們在檔案伺服器中常用到的,比如把三塊網卡,當做一塊來用,解決一個IP地址,流量過大,伺服器網路壓力過大的問題。對於檔案伺服器來說,比如NFS或SAMBA檔案伺服器,沒有任何一個管理員會把內部網的檔案伺服器的IP地址弄很多個來解決網路負載的問題。如果在內網中,檔案伺服器為了管理和應用上的方便,大多是用同一個IP地址。對於一個百M的本網來說,檔案伺服器在多個使用者同時使用的情況下,網路壓力是極大的,特別是SAMABA和NFS伺服器。為瞭解決同一個IP地址,突破流量的限制,畢竟網線和網卡對資料的輸送量是有限制的。如果在有限的資源的情況下,實現網路負載平衡,最好的辦法就是 bonding ;
2.2 網路冗餘;
對於伺服器來說,網路裝置的穩定也是比較重要的,特別是網卡。在生產型的系統中,網卡的可靠性就更為重要了。在生產型的系統中,大多通過硬體裝置的冗餘來提供伺服器的可靠性和安全性,比如電源。bonding 也能為網卡提供冗餘的支援。把網個網卡綁定到一個IP地址,當一塊網卡發生物理性損壞的情況下,另一塊網卡也能提供正常的服務。
3. 網路負載平衡應用執行個體;
3.1 系統內容及實現目標 ;
作業系統環境:Slackware 11.0,核心 2.6.20
網卡:三張;
實現目標:讓三張網卡eth0、eth1、eth2 綁定為一張,實現網路負載平衡。通過Google能找到好多bonding的文檔,但大多是洋文的,國內也有一篇吧,好象是在Redhat/Fedora 環境下的應用,也就是說對於System V風格的init指令碼啟動指令碼的。對於BSD風格的啟動服務的指令碼的Linux作業系統,網上並沒有太多的現成文檔。對於Debian 、Fedora、Redhat、Ubuntu都是System V風格的。對於Slackware來說則是BSD-like風格的。除了在Slackware的官方文檔中,提到bonding的用法以外,網上的文檔比較少。我為此走了不少彎路。最主要的原因是我還是沒讀懂Slackware,雖然Slackware用起來簡單,但如果不讀文檔,一樣解決不了問題。看來官方文檔對我來說是多麼重要了,如果你解決不了呢?是不是也和我一樣不去讀DOC?如果和我一樣,還是象我一樣,老老實實的讀官方DOC吧,只要是應用的問題,大多是可以解決的。
3.2 對於System V的風格Linux系統的解決辦法;
對於Debian 、Fedora、Redhat、Ubuntu都是System V風格的系統,您可以參考 《Bonding》
3.3 在Slackware下通過bonding來實現網路負載平衡;
本文主要是解決網路負載平衡,並非是通過bonding 來實現到網路裝置冗餘的實現;
3.31 判斷核心版本;[root@linuxsir:/home/beinan#] uname -a
Linux linuxsir 2.6.20 #7 SMP Sun May 6 00:20:14 CST 2007 x86_64 x86_64 x86_64 GNU/Linux
根本核心版本來安裝您的核心源碼包,一般發行版都有提供。安裝好後,一般是放在/usr/src目錄中。如果您是自己編譯的,你應該知道你的源碼包放的位置;比如我把源碼包放在了 /usr/src/linux-2.6.20。
3.32 編譯bonding;
bonding 是需要編譯才能用的,Linux的核心預設是否已經支援了,可以通過 modinfo bonding 來查看;
[root@linuxsir:/home/beinan#] /sbin/modinfo modinfo
如果沒有詳細的資訊輸出,可能就不支援了,您應該自己編譯;要把Bonding driver support以模組方式編譯; 核心編譯方法,請參考《》 掛載bonding 模組的方法;
[root@linuxsir:/home/beinan#] modprobe bonding
3.33 編譯 ifenslave ;
在Linux 比較新的核心中,ifenslave 並不是預設被核心支援的,需要我們自己編譯;我們要進入核心源碼包中類似如下的位置;
[root@linuxsir:/home/beinan#] cd /usr/src/linux-2.6.20/Documentation/networking
[root@linuxsir:/home/networking#] gcc -Wall -Wstrict-prototypes -O -I/usr/src/linux-2.6.20/include ifenslave.c -o ifenslave
[root@linuxsir:/home/networking#] cp ifenslave /sbin/ifenslave
3.34 修改網路相關設定檔;
在Slackware 中,我們首先要修改 /etc/rc.d/rc.inet 檔案;找到 如下一行;
. /etc/rc.d/rc.inet1.conf
加入下面一段;
# bonding conf
/sbin/ifenslave bond0 eth0
/sbin/ifenslave bond0 eth1
/sbin/ifenslave bond0 eth2
這樣做的目的是,讓多個網卡都綁定到bond0裝置上;修改/etc/rc.d/rc.inet1.conf,把關於eth0、eth1……等網卡設定都關掉,不設定任何值;比如eth0的設定不讓他生效應該是
IPADDR[0]=""
NETMASK[0]=""
USE_DHCP[0]=""
DHCP_HOSTNAME[0]=""GATEWAY="192.168.1.1"
#註:網關的ip地址,區域網路都通過192.168.1.1 出去,可以自己根本情況來設定 ;
IFNAME[4]="bond0" #註:bond0 網路裝置
HWADDR[4]="00:13:72:25:f3:6c" #註:eth0 網卡的物理地址;
IPADDR[4]="" #註:如果您用指定IP地址,就可以設定為您所指定的IP地址,要放在""之間;
NETMASK[4]="" #註:bond0的掩碼,比如 255.255.255.0 類似的,這個也是根據自己的情況來設定;
USE_DHCP[4]="yes" #註:是否用DHCP,我是用DHCP ,所以我就要設定為yes ;
DHCP_HOSTNAME[4]="192.168.1.1 "
#註:DHCP 伺服器主機名稱,比如dns.linuxsir.org也行,當然您得做DHCP 伺服器了,如果沒做,就用IP地址也可以 。
這樣做的目的是讓bond0裝置自動通過DHCP伺服器位址,如果指定地址,也是一樣的;修改 /etc/rc.d/rc.modules,加入;
/sbin/modprobe bonding
alias bond0 bonding
options bonding mode=0 miimon=100
這樣做的目的是,bonding 模組,在開機後自動掛載;
3.35 嘗試綁定多個網卡為一個裝置bond0;
首先,我們要把所有網卡掛掉;
[root@linuxsir:/home/beinan#]modprobe bonding
註:掛載bonding 模組;
[root@linuxsir:/home/beinan#] /sbin/ifconfig eth0 down
[root@linuxsir:/home/beinan#] /sbin/ifconfig eth0 down
[root@linuxsir:/home/beinan#] /sbin/ifconfig eth0 down
然後運行如下命令來綁定網卡到bond0上;
[root@linuxsir:/home/beinan#] /sbin/ifenslave bond0 eth0
[root@linuxsir:/home/beinan#] /sbin/ifenslave bond0 eth1
[root@linuxsir:/home/beinan#] /sbin/ifenslave bond0 eth2
綁定是否成功?是不是bond0裝置和eth0、eth1、eth2的網卡的物理地址都一樣???
[root@linuxsir:/home/beinan#] /sbin/ifconfig
bond0 Link encap:Ethernet HWaddr 00:23:00:a5:b3:3C
inet addr:192.168.1.171 Bcast:192.168.1.255 Mask:255.255.255.0
inet6 addr: fe80::213:72ff:fe25:f36c/64 Scope:Link
UP BROADCAST NOTRAILERS RUNNING MASTER MULTICAST MTU:1500 Metric:1
RX packets:601775 errors:0 dropped:0 overruns:0 frame:0
TX packets:421244 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:866655472 (826.5 Mb) TX bytes:26175996 (24.9 Mb)
eth0 Link encap:Ethernet HWaddr 00:23:00:a5:b3:3C
inet6 addr: fe80::213:72ff:fe25:f36c/64 Scope:Link
UP BROADCAST RUNNING SLAVE MULTICAST MTU:1500 Metric:1
RX packets:192677 errors:0 dropped:0 overruns:0 frame:0
TX packets:138863 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:278360897 (265.4 Mb) TX bytes:9486604 (9.0 Mb)
Interrupt:17
eth1 Link encap:Ethernet HWaddr 00:23:00:a5:b3:3C
inet6 addr: fe80::213:72ff:fe25:f36c/64 Scope:Link
UP BROADCAST RUNNING SLAVE MULTICAST MTU:1500 Metric:1
RX packets:206372 errors:0 dropped:0 overruns:0 frame:0
TX packets:141191 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:296700989 (282.9 Mb) TX bytes:8348311 (7.9 Mb)
Interrupt:18 Base address:0xae00
eth2 Link encap:Ethernet HWaddr 00:23:00:a5:b3:3C
inet6 addr: fe80::213:72ff:fe25:f36c/64 Scope:Link
UP BROADCAST RUNNING SLAVE MULTICAST MTU:1500 Metric:1
RX packets:202726 errors:0 dropped:0 overruns:0 frame:0
TX packets:141190 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:291593586 (278.0 Mb) TX bytes:8341081 (7.9 Mb)
Interrupt:16 Base address:0xcf00
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
inet6 addr: ::1/128 Scope:Host
UP LOOPBACK RUNNING MTU:16436 Metric:1
RX packets:4 errors:0 dropped:0 overruns:0 frame:0
TX packets:4 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:200 (200.0 b) TX bytes:200 (200.0 b)