http://www.cnblogs.com/qmfsun/p/3810905.html
Linux網卡綁定探析
2013-08-20 15:39:31
現在很多服務器都自帶雙千兆網口,利用網卡綁定既能增加網絡帶寬,同時又能做相應的冗余,目前應用於很多的場景。linux操作系統下自帶的網卡綁定模式,Linux bonding驅動提供了一個把多個網絡接口設備捆綁為單個網絡接口設置來使用,用於網絡負載均衡及網絡冗余。當然現在網卡產商也會出一些針對windows操作系統網卡管理軟件來做網卡綁定(windows操作系統沒有網卡綁定功能 需要第三方支持)。
我們公司是做分布式文件系統的,很多項目都用到網卡綁定來提高性能。在網絡找了很多資料,也做了大量的測試,下面就網卡綁定談一下自己的看法。
一、 Bonding的應用
1、 網絡負載均衡
對於bonding的網絡負載均衡是我們在文件服務器中常用到的,比如把三塊網卡,當做一塊來用,解決一個IP地址,流量過大,服務器網絡壓力過大的問題。如果在內網中,文件服務器為了管理和應用上的方便,大多是用同一個IP地址。對於一個百M的本地網絡來說,文件服務器在多個用戶同時使用的情況下,網絡壓力是極大的,為了解決同一個IP地址,突破流量的限制,畢竟網線和網卡對數據的吞吐量是有限制的。如果在有限的資源的情況下,實現網絡負載均衡,最好的辦法就是bonding 。
2、 網絡冗余
對於服務器來說,網絡設備的穩定也是比較重要的,特別是網卡。大多通過硬件設備的冗余來提供服務器的可靠性和安全性,比如電源。bonding 也能為網卡提供冗余的支持。把網個網卡綁定到一個IP地址,當一塊網卡發生物理性損壞的情況下,另一塊網卡也能提供正常的服務。
二、 Bonding的原理
什么是bonding需要從網卡的混雜(promisc)模式說起。我們知道,在正常情況下,網卡只接收目的硬件地址(MAC Address)是自身Mac的以太網幀,對於別的數據幀都濾掉,以減輕驅動程序的負擔。但是網卡也支持另外一種被稱為混雜promisc的模式,可以接 收網絡上所有的幀,比如說tcpdump,就是運行在這個模式下。bonding也運行在這個模式下,而且修改了驅動程序中的mac地址,將兩塊網卡的 Mac地址改成相同,可以接收特定mac的數據幀。然后把相應的數據幀傳送給bond驅動程序處理。
三、 Bonding的模式
linux有七種網卡綁定模式:
模式代號 |
模式名稱 |
模式方式 |
說明 |
0 |
(balance-rr) Round-robin policy |
輪詢策略 |
該策略是按照設備順序依次傳輸數據包,直到最后一個設備。這種模式提供負載均衡和容錯能力。 |
1 |
(active-backup) Active-backup policy |
主備策略 |
該策略只有一個設備處於活動狀態。 一個宕掉另一個馬上由備份轉換為主設備。mac地址是外部可見的。 此模式提供了容錯能力。 |
2 |
(balance-xor) XOR policy |
異或策略 |
該策略是根據MAC地址異或運算的結果來選擇傳輸設備,提供負載均衡和容錯能力。 |
3 |
Broadcast policy |
廣播策略 |
該策略將所有數據包傳輸給所有接口通過全部設備來傳輸所有數據,提供容錯能力。 |
4 |
(802.3ad) IEEE 802.3ad Dynamic link aggregation |
動態鏈接聚合 |
該策略通過創建聚合組來共享相同的傳輸速度,需要交換機也支持 802.3ad 模式,提供容錯能力。 |
5 |
(balance-tlb) Adaptive transmit load balancing |
適配器傳輸負載均衡 |
該策略是根據當前的負載把發出的數據分給每一個設備,由當前使用的設備處理收到的數據。本策略的通道聯合不需要專用的交換機支持,提供負載均衡和容錯能力。
|
6 |
(balance-alb) Adaptive load balancing |
適配器負載均衡 |
該策略在IPV4情況下包含適配器傳輸負載均衡策略,由ARP協商完成接收的負載,通道聯合驅動程序截獲ARP在本地系統發送出的請求,用其中一個設備的硬件地址覆蓋從屬設備的原地址。 |
1.編輯虛擬網卡band0的配置文件ifcfg-bond0,加入以下內容:
2、編輯各個網卡的配置文件,這里用eth1和eth2。
3、修改/etc/modprobe.conf 文件,加入以下內容:
注:
(1)、miimon 是鏈路監測的時間間隔單位是毫秒,miimon=100的意思就是,每100毫秒檢測網卡和交換機之間是否連通,如不通則使用另外的鏈路。
(2)、mode=0 表示負載均衡方式,兩塊網卡都工作,需要交換機作支持。
mode=1 表示冗余方式,網卡只有一個工作,一個出問題啟用另外的。
mode=6 表示負載均衡方式,兩塊網卡都工作,不需要交換機作支持。
4、重啟網絡:
5、查看bond0的工作狀態:
6、查看綁定后的結果:
總之,網卡綁定就是多張網卡邏輯上作為一張網卡用。可分為,負載均衡綁定和冗余綁定兩種。
Redhat Linux網卡配置與綁定
Redhat Linux的網絡配置,基本上是通過修改幾個配置文件來實現的,雖然也可以用ifconfig來設置IP,用route來配置默認網關,用hostname來配置主機名,但是重啟后會丟失。
相關的配置文件
/ect/hosts 配置主機名和IP地址的對應
/etc/sysconfig/network 配置主機名和網關
/etc/sysconfig/network-scripts/ifcfg-eth0 eth0配置文件,eth1則文件名為ifcfg-eth1,以此類推
一、網卡配置
假設我們要配置主機名為test,eth0的IP地址192.168.168.1/24,網關地址192.168.168.250
則/etc/sysconfig/network文件內容如下:
NETWORKING=yes
HOSTNAME=test
GATEWAY=192.168.168.250
eth0對應的配置文件/etc/sysconfig/network-scripts/ifcfg-eth0內容如下:
DEVICE=eth0
BOOTPROTO=static
IPADDR=192.168.168.1
NETMASK=255.255.255.0
TYPE=Ethernet
ONBOOT=yes
二、單網卡綁定多個IP
有時,我們需要在一塊網卡上配置多個IP,例如,在上面的例子中,我們還需要為eth0配置IP 192.168.168.2和192.168.168.3。那么需要再在/etc/sysconfig/network-scripts下新建兩個配置文件:
ifcfg-eth0:0內容如下:
DEVICE=eth0:0
BOOTPROTO=static
IPADDR=192.168.168.2
NETMASK=255.255.255.0
ONBOOT=yes
ifcfg-eth0:1內容如下:
DEVICE=eth0:1
BOOTPROTO=static
IPADDR=192.168.168.3
NETMASK=255.255.255.0
ONBOOT=yes
三、多個網卡綁定成一塊虛擬網卡
為了提供網絡的高可用性,我們可能需要將多塊網卡綁定成一塊虛擬網卡對外提供服務,這樣即使其中的一塊物理網卡出現故障,也不會導致連接中斷。比如我們可以將eth0和eth1綁定成虛擬網卡bond0
首先在/etc/sysconfig/network-scripts/下創建虛擬網卡bond0的配置文件ifcfg-bond0,內容如下
DEVICE=bond0
BOOTPROTO=none
BROADCAST=192.168.168.255
IPADDR=192.168.168.1
NETMASK=255.255.255.0
NETWORK=192.168.168.0
ONBOOT=yes
TYPE=Ethernet
GATEWAY=192.168.168.250
USERCTL=no
然后分別修改eth0和eth1的配置文件
ifcfg-eth0內容:
DEVICE=eth0
BOOTPROTO=none
ONBOOT=yes
USERCTL=no
MASTER=bond0
SLAVE=yes
ifcfg-eth1內容
DEVICE=eth1
BOOTPROTO=none
ONBOOT=yes
USERCTL=no
MASTER=bond0
SLAVE=yes
因為linux的虛擬網卡是在內核模塊中實現的,所以需要安裝的時候已經裝好該module。在/etc/modules.conf文件中添加如下內容(如果沒有該文件,則新建一個):
alias bond0 bonding
options bond0 miimon=100 mode=1 primary=eth0
其中miimon=100表示每100ms檢查一次鏈路連接狀態,如果不通則會切換物理網卡
mode=1表示主備模式,也就是只有一塊網卡是active的,只提供失效保護。如果mode=0則是負載均衡模式的,所有的網卡都是active,還有其他一些模式很少用到
primary=eth0表示主備模式下eth0為默認的active網卡
最后,在/etc/rc.local中加入
modprobe bonding miimon=100 mode=1
重啟機器后可以看到虛擬網卡已經生效,可以通過插拔兩個物理網卡的網線來進行測試,不過linux中網卡接管的時間好象比較長
Linux系統下雙網卡bonding的配置方法
進入 /etc/sysconfig/network-scripts 目錄下創建一個文件 ifcfg-bond0或cp ifcfg-eth0 ifcfg-bond0
Vi ifcfg-bond0 編輯內容如下
DEVICE=bond0
BOOTPROTO=static
IPADDR=192.168.10.1
NETMASK=255.255.255.0
GATEWAY=192.168.10.254
ONBOOT=yes
TYPE=Ethernet
VI ifcfg-eth0 編輯內容如下
DEVICE=eth0
BOOTPROTO=static
ONBOOT=yes
MASTER=bond0
SLAVE=yes
VI ifcfg-eth1 編輯內容如下
DEVICE=eth1
BOOTPROTO=static
ONBOOT=yes
MASTER=bond0
SLAVE=yes
編輯 vi /etc/ modprobe.conf
在最后面加入
alias bond0 bonding
options bond0 miimon=100 mode=0
說明:miimon是用來進行鏈路監測的。 比如:miimon=100,那么系統每100ms監測一次鏈路連接狀態,如果有一條線路不通就轉入另一條線路;mode的值表示工作模式,他共有0,1,2,3四種模式,常用的為0,1兩種。mode=0表示load balancing (round-robin)為負載均衡方式,兩塊網卡都工作。mode=1表示fault-tolerance (active-backup)提供冗余功能,工作方式是主備的工作方式,也就是說默認情況下只有一塊網卡工作,另一塊做備份. bonding只能提供鏈路監測,即從主機到交換機的鏈路是否接通。如果只是交換機對外的鏈路down掉了,而交換機本身並沒有故障,那么bonding會認為鏈路沒有問題而繼續使用,Bond配置完成
重啟網絡即可 service network restart
查看 /proc/net/bonding/目錄下bond0文件,能看到雙網卡的運行狀態
-----------------------------------------------------
linux雙網卡綁定概念以及介紹:
linux設置bond網卡綁定
Linux雙網卡綁定實現就是使用兩塊網卡虛擬成為一塊網卡;linux設置bond網卡綁定---有些用。
|
CentOS6.2網卡綁定配置
下面主要介紹在CentOS6.2下使用系統自帶的bonding進行網卡綁定的詳細步驟,在此之前你可以看一下Linux網卡綁定探析,你也可以使用網卡綁定的腳本進行網卡綁定操作。
注意:請在配置前關閉NetworkManager服務
[root@h63 ~]# service NetworkManager status && service NetworkManager start
網卡綁定一次可以綁定多個網卡,你可以使用ifconfig -a查看你的網卡信息,例如:
[root@h63 ~]# ifconfig -a
em1 Link encap:Ethernet HWaddr 78:2B:CB:30:08:03
UP BROADCAST RUNNING SLAVE MULTICAST MTU:1500 Metric:1
RX packets:48236002 errors:0 dropped:0 overruns:0 frame:0
TX packets:16156472 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:4838973371 (4.5 GiB) TX bytes:1301118550 (1.2 GiB)
Interrupt:36 Memory:d6000000-d6012800
em2 Link encap:Ethernet HWaddr 78:2B:CB:30:08:05
UP BROADCAST RUNNING SLAVE MULTICAST MTU:1500 Metric:1
RX packets:42385720 errors:0 dropped:0 overruns:0 frame:0
TX packets:7283526 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:4307780986 (4.0 GiB) TX bytes:466840625 (445.2 MiB)
Interrupt:48 Memory:d8000000-d8012800
em3 Link encap:Ethernet HWaddr 78:2B:CB:30:08:07
BROADCAST MULTICAST MTU:1500 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:0 (0.0 b) TX bytes:0 (0.0 b)
Interrupt:32 Memory:da000000-da012800
em4 Link encap:Ethernet HWaddr 78:2B:CB:30:08:09
BROADCAST MULTICAST MTU:1500 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:0 (0.0 b) TX bytes:0 (0.0 b)
Interrupt:42 Memory:dc000000-dc012800
這里有4個網卡,分別是em1、em2、em3和em4,我們把em1和em2做一個綁定,綁定模式為6(關於網卡綁定模式的介紹請看Linux網卡綁定探析),首先我給給網卡綁定后的設備起個名字bond0(名稱可以自定義),並創建:
[root@h63 ~]# vim /etc/sysconfig/network-scripts/ifcfg-bond0
DEVICE=bond0 #設備名稱
BOOTPROTO=static #靜態IP
ONBOOT=yes #自動啟動
IPADDR=172.16.16.63 #設備綁定的IP
GATEWAY=172.16.23.254 #設備綁定的網關
NETMASK=255.255.248.0 #設備綁定的掩碼
TYPE=Ethernet #設備綁定的類型
編輯需要綁定的網卡:
[root@h63 ~]# vim /etc/sysconfig/network-scripts/ifcfg-em1
DEVICE=em1
BOOTPROTO=none
ONBOOT=yes
MASTER=bond0 #綁定后的設備名稱
SLAVE=yes
TYPE=Ethernet
[root@h63 ~]# vim /etc/sysconfig/network-scripts/ifcfg-em2
DEVICE=em2
BOOTPROTO=none
ONBOOT=yes
MASTER=bond0 #綁定后的設備名稱
SLAVE=yes
TYPE=Ethernet
說明:配置網卡時不要填寫IP地址和MAC地址
配置加載模式設置:
[root@h63 ~]# vim /etc/modprobe.conf
alias bond0 bonding
options bond0 miimon=100 mode=6
說明:mode是網卡綁定的模式,此處是模式6
也可以在/etc/modprobe.d/下創建一個文件:
[root@h63 ~]# vim /etc/modprobe.d/bond
alias bond0 bonding
options bond0 miimon=100 mode=6
綁定配置完成,重啟網絡服務
[root@h63 ~]#service network restart
查看網卡綁定的情況:
[root@h63 ~]# cat /proc/net/bonding/bond0
Ethernet Channel Bonding Driver: v3.6.0 (September 26, 2009)
Bonding Mode: adaptive load balancing
Primary Slave: None
Currently Active Slave: em1
MII Status: up
MII Polling Interval (ms): 100
Up Delay (ms): 0
Down Delay (ms): 0
Slave Interface: em1
MII Status: up
Speed: 1000 Mbps
Duplex: full
Link Failure Count: 0
Permanent HW addr: 78:2b:cb:30:08:03
Slave queue ID: 0
Slave Interface: em2
MII Status: up
Speed: 1000 Mbps
Duplex: full
Link Failure Count: 0
Permanent HW addr: 78:2b:cb:30:08:05
Slave queue ID: 0
至此,網卡綁定就完成了。
修改三類文件:
/etc/sysconfig/network-scripts/下的ifcfg-*文件
/etc/modprobe.conf文件
/etc/init.d/rc.local文件
設置方法:
1. 環境:windows xp+vmware, centos 5.3, 4塊網卡,做兩組綁定。
當前網卡:eth0-3
綁定后虛擬網卡:bond0-1
eth0、eth2綁定為bond0,eth1、eth3綁定為bond1,不同網段。
2. 修改ifcfg-*文件
增加ifcfg-bond0、ifcfg-bond1兩個文件:
文件內容:
[root@localhost network-scripts]# cat ifcfg-bond0
# Advanced Micro Devices [AMD] 79c970 [PCnet32 LANCE]
DEVICE=bond0
BOOTPROTO=none
IPADDR=192.168.100.101
NETMASK=255.255.255.0
NETWORK=192.168.100.0
ONBOOT=yes
USERCTL=no
TYPE=Ethernet
GATEWAY=192.168.100.101
[root@localhost network-scripts]# cat ifcfg-bond1
# Advanced Micro Devices [AMD] 79c970 [PCnet32 LANCE]
DEVICE=bond1
BOOTPROTO=none
IPADDR=172.16.0.1
NETMASK=255.255.255.0
NETWORK=172.16.0.0
ONBOOT=yes
USERCTL=no
#TYPE=Ethernet
TYPE=Ethernet
修改ifcfg-eth0、ifcfg-eth1、ifcfg-eth2、ifcfg-eth3四個網卡配置文件:
內容:
[root@localhost network-scripts]# cat ifcfg-eth0
# Advanced Micro Devices [AMD] 79c970 [PCnet32 LANCE]
DEVICE=eth0
BOOTPROTO=none
ONBOOT=yes
USERCTL=no
MASTER=bond0
SLAVE=yes
TYPE=Ethernet
[root@localhost network-scripts]# cat ifcfg-eth1
# Advanced Micro Devices [AMD] 79c970 [PCnet32 LANCE]
DEVICE=eth1
BOOTPROTO=none
ONBOOT=yes
USERCTL=no
MASTER=bond1
SLAVE=yes
TYPE=Ethernet
[root@localhost network-scripts]# cat ifcfg-eth2
# Advanced Micro Devices [AMD] 79c970 [PCnet32 LANCE]
DEVICE=eth2
BOOTPROTO=none
ONBOOT=yes
USERCTL=no
MASTER=bond0
SLAVE=yes
TYPE=Ethernet
[root@localhost network-scripts]# cat ifcfg-eth3
# Advanced Micro Devices [AMD] 79c970 [PCnet32 LANCE]
DEVICE=eth3
BOOTPROTO=none
ONBOOT=yes
USERCTL=no
MASTER=bond1
SLAVE=yes
TYPE=Ethernet
3. 修改/etc/modprobe.conf文件
[root@localhost network-scripts]# cat /etc/modprobe.conf
alias eth0 pcnet32
alias eth1 pcnet32
alias scsi_hostadapter mptbase
alias scsi_hostadapter1 mptspi
alias scsi_hostadapter2 ata_piix
alias eth2 pcnet32
alias eth3 pcnet32
alias bond0 bonding
options bond0 miimon=100 mode=0
alias bond1 bonding
options bond1 miimon=100 mode=0
4. 修改/etc/rc.d/rc.local文件
[root@localhost network-scripts]# cat /etc/rc.d/rc.local
#!/bin/sh
#
# This script will be executed *after* all the other init scripts.
# You can put your own initialization stuff in here if you don't
# want to do the full Sys V style init stuff.
touch /var/lock/subsys/local
modprobe bonding miimon=100 mode=0
5. 測試
方法1:檢查網絡配置是否正常,是否可啟動
/etc/init.d/network restart
方法2:檢查系統啟動時虛擬網卡是否正常啟動
reboot
方法3:檢查綁定網卡是負載均衡模式,還是主備冗余模式
cat /proc/net/bonding/bond0
cat /proc/net/bonding/bond1
6. 說明
如果是主備冗余模式,需將
options bond0 miimon=100 mode=0中
mode 改為1
其它改為
options bond0 miimon=100 mode=1 primary=eth0
primary=eth0表示當前主網卡為eth0
其它在/etc/rc.d/rc.local中也修改
modprobe bonding miimon=100 mode=1
Linux雙網卡綁定——理論與實踐(實踐篇)
Linux雙網卡綁定的主要實現步驟為:
1. 配置一個虛擬的網卡bond0
2. 配置eth0,eth1為slave模式
3. 加載bonding模塊
4. 重啟系統
下面將詳細介紹每個步驟
一. 配置虛擬網卡bond0
新建/etc/sysconfig/network-scripts/ifcfg-bond0文件,內容如下:
DEVICE=bond0
BOOTPROTO=static
IPADDR=192.168.0.100
NETMASK=255.255.255.0
BROADCAST=192.168.0.255
GATEWAY=192.168.0.1
ONBOOT=yes
TYPE=Ethernet
二. 配置eth0,eth1為slave模式
更改配置文件/etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0
BOOTPROTO=none
SLAVE=yes
MASTER=bond0
USERCTL=yes
更改配置文件/etc/sysconfig/network-scripts/ifcfg-eth1
DEVICE=eth1
BOOTPROTO=none
SLAVE=yes
MASTER=bond0
USERCTL=yes
三. 加載bonding模塊
修改模塊配置文件/etc/modprobe.conf,在最后加入以下內容:
options bond0 miimon=100 mode=0
四. 重啟系統
重啟之后,測試bonding是否正常運行,運行ifconfig命令,結果如下
bond0 Link encap:Ethernet HWaddr 00:0C:29:45:B4:D1
inet addr:192.168.0.100 Bcast:192.168.0.255 Mask:255.255.255.0
inet6 addr: fe80::20c:29ff:fe45:b4d1/64 Scope:Link
UP BROADCAST RUNNING MASTER MULTICAST MTU:1500 Metric:1
RX packets:100 errors:0 dropped:0 overruns:0 frame:0
TX packets:130 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:17527 (17.1 KiB) TX bytes:20937 (20.4 KiB) eth0 Link encap:Ethernet HWaddr 00:0C:29:45:B4:D1
inet addr:192.168.0.100 Bcast:192.168.0.255 Mask:255.255.255.0
UP BROADCAST RUNNING SLAVE MULTICAST MTU:1500 Metric:1
RX packets:65 errors:0 dropped:0 overruns:0 frame:0
TX packets:99 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:10340 (10.0 KiB) TX bytes:15317 (14.9 KiB)
Interrupt:18 Base address:0x1080 eth1 Link encap:Ethernet HWaddr 00:0C:29:45:B4:D1
inet addr:192.168.0.100 Bcast:192.168.0.255 Mask:255.255.255.0
UP BROADCAST RUNNING SLAVE MULTICAST MTU:1500 Metric:1
RX packets:40 errors:0 dropped:0 overruns:0 frame:0
TX packets:40 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:7487 (7.3 KiB) TX bytes:7022 (6.8 KiB)
Interrupt:19 Base address:0x1400
運行cat /proc/net/bonding/bond0,結果如下:
Ethernet Channel Bonding Driver: v3.3.0 (June 10, 2008)
Bonding Mode: load balancing (round-robin)
MII Status: up
MII Polling Interval (ms): 100
Up Delay (ms): 0
Down Delay (ms): 0
Slave Interface: eth0
MII Status: up
Link Failure Count: 0
Permanent HW addr: 00:0c:29:45:b4:d1
MII Status: up
Link Failure Count: 0
Permanent HW addr: 00:0c:29:45:b4:db