作者 主題: linux 實作 LACP ( 802.3ad ) Link Aggregation  (閱讀 34205 次)

0 會員 與 1 訪客 正在閱讀本文。

k1951223

  • 懷疑的國中生
  • **
  • 文章數: 58
    • 檢視個人資料
資料來源 http://www.geego.com.tw/tech/tech_word/20060821/index.htm#

Google 搜尋 linux 網路 Link Aggregation

(一) 前言

Linux 核心能支援的功能真的是不勝沒舉, Ben 哥跟大家說一個最近發生的故事,間接體會 Linux 無遠弗屆的威力。日前 Ben 哥在奇科電腦教授 LPI Level 2 的課程當中,有位在業界從事網路系統管理的學員問了 Ben 哥一個問題 --- 「如果在同一個區域網路,要架設一台比周圍電腦擁有更多網路頻寬的主機,我要花多少錢、買什麼樣的網路設備」。 Ben 哥回答他,你只要花不到 1 千塊的新台幣,買幾塊「螃蟹牌」的網路卡,就可以立即倍增一台 Linux 主機的網路頻寬!

其實「如何在 Linux 系統下結合多張網路卡來增加網路頻寬」,這個議題 Ben 哥以前便常拿來作教學的實作練習!此次藉由本期的技術專欄,跟各位讀者細述說明「在 Linux 下如何結合多張網卡,並配合相對應的頻寬來增加網路的傳輸速率」 ! 同時間還可以讓該台機器提供「連線備援」的機制 !! top!
本期技術文件所需
實驗設備
   

1. Linux 機器乙台, 兩張以上的乙太網路卡
2. Cisco 3550 交換機乙台
所需軟體
及Linux
核心
   

1. Linux 機器:核心 2.4.32 版, bonding 所需的指令:「 ifenslave 」
2. Cisco 3550 交換機的韌體 :「 c3500xl-c3h2s-mz.120-5.WC15.bin 」
基本知識
   

1. Linux 802.1Q 的設定 ( 詳見 Linux Guide 第十一期 ) 。
2. Cisco 3550 交換機上 Etherchannel 以及 802.1Q 的設定。

(二) Linux 中 Bonding 的意義

Bonding 的中文意義為「結合」,那到底要結合什麼東西呢?其實就是利用軟體的方式 (Linux Bonding 的技術 ) 來結合網路傳輸的頻寬!舉個例子來說,每張網卡傳輸速率為 100Mb ,假使我們 Bonding( 結合 ) 四張網卡,就可以把這四張網卡視同為一張,而這張網卡的傳輸速率則為 400Mb/s 。

(三) 如何讓 Linux 支援 Bonding

要使 Linux 能支援 Bonding 的功能,以及讓使用者能操作 Bonding 的指令,有幾個必備條件:

1.  Linux 核心必須支援 bonding 的功能。

    在核心的選項中,各位可以在主選單下的「 Network Device Support 」裡,選取「 Bonding driver support 」;在這裡要特別提醒各位的是,請選用與 Ben 哥相同的核心版本「 2.4.32 」。因為早期 Linux 核心版本的 bonding 支援能力,並不支援待會我們所需要用到的「 802.3a d 」通訊協定。另外要特別注意的一點是,在 Linux 中的 bonding 設定,其對於「 802.3a d 」的命名為「 PAgP 」,但在 Cisco 所屬的設定名詞中,「 PAgP 」並非指的是「 802.3a d 」,而是「 LACP 」;兩者是完全不相同的。因此,讀者們在使用 Cisco 交換機設備時,務必弄清楚不要搞錯了,不要選到「 PAgP 」。

2. 必須要有 ifenslave 指令。

    ifenslave 為設定 bonding 功能的唯一指令,與核心所使用的版本有相當高的倚賴性,如果各位使用的核心是 2.4.32 版本的話,可以在核心原始碼根目錄中「 Documentation/networking 」的目錄位置下,找到「 ifenslave 」的原始碼—「 ifenslave.c 」,同時間也可在上述同樣的目錄下找到「 bonding.txt 」的檔案,其中簡單的陳述了在此 Linux 版本中,支援了哪些功能。

    因此,我們可以進行編譯適合核心版本 2.4.32 的「 ifenslave 」指令。

    致此為止,我們已確定也必須確定系統的核心支援「 bonding 」功能,再者其核心版本為 2.4.32 ,且有相對應的「 ifenslave 」操作指令存在。

 

(四) Cisco 支援的連接埠整合控制協定介紹

Cisco 對於交換機連接埠的整合有幾種方式,其一是先前描述過的 LACP ( Link Aggregation Control Protocol) LACP 是 IEEE 標準規格「 802.3ad 」協定中的一部份, 802.3ad 協定規範了:交換機上許多不同的實體連接埠,可以邏輯性的共同結合在一起,進而視為一條實體線;除了 LACP 以外, Cisco 本身也有其他相類似的功能,例如: Etherchannel 以及 PAgP ( Port Aggregation Protocol) 。

(五) 實驗目標

在此次的實驗中, Ben 哥需要讀者們把 Linux 的機器設定成為一個支援 802.3a d 的伺服器,以 802.3a d 的通訊協定方式與 Cisco Catalyst 3550 的交換機連結,最終達成連接埠整合的目的。

以上的網路拓墣為此次實驗的主要連接方式,我們以第二層 (Layer 2) 的連接為本次實驗的主軸,以下為實驗的步驟:



Step1:設定Linux伺服器
1.
首先, Ben 哥已經有一台 Linux 機器,其核心版本為 2.4.32 ,而且也已經有預先編譯好的 ifenslave 指令,該指令存於目錄「 /root 」中, Ben 哥使用一片有四個連接埠的網路卡 ( 附圖一 ) ,每個連接埠都有其獨立的 MAC 定址,因此可以將之視同為四張網卡,其設備代號各為: eth2 、 eth3 、 eth4 、 eth5 。

2.
確定了網路卡可以使用之後,接下來就必須建立一個虛擬的整合連接介面 (bond0) ,以便將 eth2 、 eth3 、 eth4 、 eth5 整合在一起。首先,我們必須安插支援 bonding 的核心模組,在安插模組的時候,同時通知核心待會在 bonding 時所要支援的模式,在這個版本 ( 2.4.32 ) 中,總共支援了 7 種模式,第四種模式就是「 802.3a d 」,因此在安插 bonding 模組的同時,需在其後加上『 mode= 802.3a d 』或是『 mode=4 』的命令參數 ( 兩者擇一使用皆可 ) ;另外,再加上一個用來「監控各個連接埠連接狀況」的參數,這個參數為『 miimon= 數字』 ( 數字表示多少 ms 之意 ) ,讀者們可以從下圖看到 Ben 哥如何確認核心是否支援 bonding 的功能,進而配合相關參數,安插 bonding 模組的整個過程。

3.
在核心支援 bonding 的功能後,在『 ifconfig –a 』指令的標準輸出中,會有一個名為「 bond0 」的介面設備,這個就是用來整合各張網路卡的介面,是以我們先對 bond0 介面設定其 IP 位址並將該介面啟動運作。

4.
啟動完 bond0 後,皆下來當然就是把各個實體網路卡整合到 bond0 中,這時就要使用剛剛 Ben 哥教大家預先編譯好的「 ifenslave 」指令!只要鍵入『 ./ifenslave –v bond0 eth2 eth3 eth4 eth5 』即可。

5.
到現在為止, Linux 伺服器已經設定好了,但是網路線另一端的 3550 交換器還沒有作任何的設定。是以我們先 ping 路由器的 IP 位址「 192.168.10.2 」,看看封包是否能夠到達路由器;結果當然是不行。因為交換器那一端並還沒有將 802.3a d 通訊協定設定進去,所以通訊協定不同,勢必就無法相互傳遞資料。

6.
觀察檔案內容完畢之後,再次鍵入『 ifconfig 』指令來確認是否包含剛剛所設定的各項設備。

7.
到現在為止, Linux 伺服器已經設定好了,但是網路線另一端的 3550 交換器還沒有作任何的設定。是以我們先 ping 路由器的 IP 位址「 192.168.10.2 」,看看封包是否能夠到達路由器;結果當然是不行。因為交換器那一端並還沒有將 802.3a d 通訊協定設定進去,所以通訊協定不同,勢必就無法相互傳遞資料。

觀看第2步驟!!>>


Step2:設定Cisco的交換器

1.
在這個階段的實驗中,我們使用 FastEthernet 連接埠 13 到 16 ,分別對應到 Linux 伺服器上的 eth2 、 eth3 、 eth4 、 eth5 ;在 Cisco 交換機的 IOS 文字使用介面下,可以使用範圍指令 (range) 來同時間對很多連接埠下達相同的指令。如下圖所示,我們利用範圍指令進入連接埠設定模式,設定步驟順序如下:

(1) 下達指定 VLAN 的 ID → ( 2) 設定連接埠的模式 → (3) 加入 802.3ad 的支援,也就是 LACP 。

2
設定完成後,鍵入『 show running 』指令,觀察一下 FastEthernet 連接埠 13 到 16 的設定狀況。 至此, Cisco 的交換器設定完畢。

觀看第3步驟!!>>


Step3:測試連線狀況

1.
在Linux伺服器以及Cisco交換器這兩台機器上,讀者們都已經完成了802.3ad的設定,接下來就是驗收設定成果的時候了。我們可以從Linux伺服器端ping交換器另一端的路由器,其結果是成功的,由此證明先前兩個設備的設定完全無誤。

 

觀看第4步驟!!>>


Step4:測試連線的備援機制(Redundancy)

1.
連接埠整合的另一個好處就是可以提供連線的備援機制,以本實驗為例,我們使用了四個網路連接埠連接到交換器,理應獲得 400M b/s 的總頻寬;順帶的這種網路連線機制也提供了連線備援的可能。簡單來說,四個網路通路中,如有其中 一兩 個連線有問題,這個連線機制 ( 802.3a d) 會偵測到連線的狀況,讓另外兩條正常工作的連線接替其他工作。 為了讓讀者實地觀察到這個狀況, Ben 哥先從 Linux 的伺服器 ping 路由器,然後在第 4 個 icmp 答應時, Ben 哥把 eth2 以及 eth3 的連線拔掉,各位可以從下圖『 mii-tool 』的指令輸出中,看到 eth2 及 eth3 是沒有連線的,當下,經由 eth2 以及 eth3 的封包就到達不了路由器,但是過了一分多鐘之後,在第 77 個 icmp 的封包之後,連線則自行恢復。

實驗步驟完畢!!

k1951223

  • 懷疑的國中生
  • **
  • 文章數: 58
    • 檢視個人資料
Linux 實作 VLAN ( 802.1q )
« 回覆 #1 於: 2006-11-24 22:09 »
配合 Linux 實作 VLAN ( 802.1q )
http://phorum.study-area.org/viewtopic.php?t=43041
可以增加不少功能和彈性

資料來源 http://windtear.net/archives/2005/07/18/000720.html


vconfig - Linux 下的 802.1q 實現配置工具
http://windtear.net/archives/2005/07/18/000720.html

研究過 /sbin/ifup 的話 會發現 ifup 腳本有 vconfig 和 VLAN 支持的判斷
(當時搞 ifup 的 bridge 支持也patch過這個腳本
 2005-04-08 19:01 hBridge - Linux Ethernet bridging)

# Ethernet 802.1Q VLAN support
if [ -x /sbin/vconfig -a "${VLAN}" = "yes" ]; then
    if echo ${DEVICE} | LANG=C egrep -v '(:)' | LANG=C egrep -q 'eth[0-9][0-9]*\.[0-9][0-9]?[0-9]?[0-9]?' ; then
        if [ ! -d /proc/net/vlan ]; then
            if modprobe 8021q >/dev/null 2>&1 ; then
                /sbin/vconfig set_name_type DEV_PLUS_VID_NO_PAD >/dev/null 2>&1 || {
                    echo $"Could not set 802.1Q VLAN parameters."
                }
            else
                echo $"No 802.1Q VLAN support available in kernel for device ${DEVICE}"
                exit 1
            fi
        fi
        VID="`echo ${DEVICE} | \
            LANG=C egrep 'eth[0-9]+\.[0-9][0-9]?[0-9]?[0-9]?$' | \
            LANG=C sed 's/^[a-z0-9]*\.//g;s/^0*//'`"
        PHYSDEV="`echo ${DEVICE} | \
            LANG=C egrep 'eth[0-9]+\.[0-9][0-9]?[0-9]?[0-9]?$' | \
            LANG=C sed 's/\.[a-z0-9]*$//g'`"

        is_available ${PHYSDEV} || {
            if [ "$?" = "1" ] ; then
                echo $"$alias device ${DEVICE} does not seem to be present, delaying initialization."
                exit 1
            else
                exit 0
            fi
        }

        # Link on Physical device needs to be up but no ip required
        check_device_down ${PHYSDEV} && {
            ip -o link set dev ${PHYSDEV} up
        }

        if [ ! -f /proc/net/vlan/${DEVICE} ]; then
            /sbin/vconfig add ${PHYSDEV} ${VID} || {
                (logger -p daemon.info -t ifup \
                    $"ERROR: could not add vlan ${VID} as ${DEVICE} on dev ${PHYSDEV}" &)&
                echo $"ERROR: could not add vlan ${VID} as ${DEVICE} on dev ${PHYSDEV}"
                exit 1
            }
        fi

        if [ -f /proc/net/vlan/${DEVICE} ]; then
            case "$REORDER_HDR" in
                yes|1)
                    /sbin/vconfig set_flag ${DEVICE} 1 1 || {
                        (logger -p daemon.info -t ifup \
                            "WARNING: vconfig not able to enable REORDER_HDR on ${DEVICE}" &)&
                    }
                    ;;
                no|0)
                    /sbin/vconfig set_flag ${DEVICE} 1 0 || {
                        (logger -p daemon.info -t ifup \
                            $"WARNING: vconfig not able to disable REORDER_HDR on ${DEVICE}" &)&
                    }
                    ;;
            esac
        fi
    fi
fi


vconfig 就是 Linux 下 802.1Q VLAN 實現配置工具
Name        : vconfig                      Relocations: (not relocatable)
Version     : 1.6                               Vendor: Red Hat, Inc.
Release     : 2                             Build Date: Sat 01 Feb 2003 06:20:05 AM CST
Install Date: Tue 01 Jun 2004 04:55:57 PM CST      Build Host: porky.devel.redhat.com
Group       : System Environment/Base       Source RPM: vconfig-1.6-2.src.rpm
Size        : 170822                           License: LGPL
Signature   : DSA/SHA1, Mon 24 Feb 2003 02:05:29 PM CST, Key ID 219180cddb42a60e
Packager    : Red Hat, Inc.
URL         : http://www.candelatech.com/~greear/vlan.html
Summary     : Linux 802.1q VLAN configuration utility.
Description :
The vconfig program configures and adjusts 802.1q VLAN parameters.
/sbin/vconfig
/usr/share/doc/vconfig-1.6
/usr/share/doc/vconfig-1.6/CHANGELOG
/usr/share/doc/vconfig-1.6/README
/usr/share/doc/vconfig-1.6/contrib
/usr/share/doc/vconfig-1.6/contrib/CVS
/usr/share/doc/vconfig-1.6/contrib/CVS/Entries
/usr/share/doc/vconfig-1.6/contrib/CVS/Repository
/usr/share/doc/vconfig-1.6/contrib/CVS/Root
/usr/share/doc/vconfig-1.6/contrib/README
/usr/share/doc/vconfig-1.6/contrib/vlan_2.2-full.patch
/usr/share/doc/vconfig-1.6/contrib/vlan_2.2-module.patch
/usr/share/doc/vconfig-1.6/vlan.html
/usr/share/doc/vconfig-1.6/vlan_test.pl
/usr/share/man/man8/vconfig.8.gz

% vconfig
Expecting argc to be 3-5, inclusive.  Was: 1

Usage: add             [interface-name] [vlan_id]
       rem             [vlan-name]
       set_flag        [interface-name] [flag-num]       [0 | 1]
       set_egress_map  [vlan-name]      [skb_priority]   [vlan_qos]
       set_ingress_map [vlan-name]      [skb_priority]   [vlan_qos]
       set_name_type   [name-type]

* The [interface-name] is the name of the ethernet card that hosts
  the VLAN you are talking about.
* The vlan_id is the identifier (0-4095) of the VLAN you are operating on.
* skb_priority is the priority in the socket buffer (sk_buff).
* vlan_qos is the 3 bit priority in the VLAN header
* name-type:  VLAN_PLUS_VID (vlan0005), VLAN_PLUS_VID_NO_PAD (vlan5),
              DEV_PLUS_VID (eth0.0005), DEV_PLUS_VID_NO_PAD (eth0.5)
* bind-type:  PER_DEVICE  # Allows vlan 5 on eth0 and eth1 to be unique.
              PER_KERNEL  # Forces vlan 5 to be unique across all devices.
* FLAGS:  1 REORDER_HDR  When this is set, the VLAN device will move the
            ethernet header around to make it look exactly like a real
            ethernet device.  This may help programs such as DHCPd which
            read the raw ethernet packet and make assumptions about the
            location of bytes.  If you don't need it, don't turn it on, because
            there will be at least a small performance degradation.  Default
            is OFF.

----->   在eth0接口配置兩個vlan  如果沒有加載模塊會自動加載8021q模塊
vconfig add eth0 11
vconfig add eth0 21

----->   設置參數 REORDER_HDR (默認就是)
vconfig set_flag eth0.11 1 1
vconfig set_flag eth0.21 1 1

----->   查看一下
cat /proc/net/vlan/eth0.11
cat /proc/net/vlan/eth0.21

----->   改接口啟動配置文件
cd /etc/sysconfig/network-scripts/
cp ifcfg-eth0 ifcfg-eth0.11
perl -pi -e 's/DEVICE=eth0/DEVICE=eth0.11/g' ifcfg-eth0.11
cp ifcfg-eth0 ifcfg-eth0.21
perl -pi -e 's/DEVICE=eth0/DEVICE=eth0.21/g' ifcfg-eth0.21

perl -pi -e 's/IPADDR=/#IPADDR=/g' ifcfg-eth0
perl -pi -e 's/NETMASK=/#NETMASK=/g' ifcfg-eth0
......

----->   手工切換 這時需要更改交換機配置
ifdown eth0;ifup eth0;ifup eth0.11;ifup eth0.21

----->   設置下次啟動自動加載 8021q 模塊
echo VLAN=yes >> /etc/sysconfig/network