一、open vswitch簡介
Open vSwitch是一個高質量的、多層虛擬交換機,使用開源Apache2.0許可協議,由Nicira Networks開發,主要實現代碼爲可移植的C代碼。它的目的是讓大規模網絡自動化可以通過編程擴展,同時仍然支持標準的管理接口和協議(例如NetFlow, sFlow, SPAN, RSPAN, CLI, LACP, 802.1ag)。此外,它被設計位支持跨越多個物理服務器的分佈式環境,類似於VMware的vNetwork分佈式vswitch或Cisco Nexus 1000 V。Open vSwitch支持多種linux 虛擬化技術,包括Xen/XenServer, KVM和irtualBox。當前最新代碼包主要包括以下模塊和特性:
- ovs-vswitchd 主要模塊,實現switch的daemon,包括一個支持流交換的Linux內核模塊;
- ovsdb-server 輕量級數據庫服務器,提供ovs-vswitchd獲取配置信息;
- ovs-brcompatd 讓ovs-vswitch替換Linuxbridge,包括獲取bridge ioctls的Linux內核模塊;
- ovs-dpctl 用來配置switch內核模塊;
一些Scripts and specs 輔助OVS安裝在Citrix XenServer上,作爲默認switch;
- ovs-vsctl 查詢和更新ovs-vswitchd的配置;
- ovs-appctl 發送命令消息,運行相關daemon;
- ovsdbmonitor GUI工具,可以遠程獲取OVS數據庫和OpenFlow的流表。
此外,OVS也提供了支持OpenFlow的特性實現,包括
- ovs-openflowd:一個簡單的OpenFlow交換機;
- ovs-controller:一個簡單的OpenFlow控制器;
- ovs-ofctl 查詢和控制OpenFlow交換機和控制器;
- ovs-pki :OpenFlow交換機創建和管理公鑰框架;
- ovs-tcpundump:tcpdump的補丁,解析OpenFlow的消息;
內核模塊實現了多個“數據路徑”(類似於網橋),每個都可以有多個“vports”(類似於橋內的端口)。每個數據路徑也通過關聯一下流表(flow table)來設置操作,而這些流表中的流都是用戶空間在報文頭和元數據的基礎上映射的關鍵信息,一般的操作都是將數據包轉發到另一個vport。當一個數據包到達一個vport,內核模塊所做的處理是提取其流的關鍵信息並在流表中查找這些關鍵信息。當有一個匹配的流時它執行對應的操作。如果沒有匹配,它會將數據包送到用戶空間的處理隊列中(作爲處理的一部分,用戶空間可能會設置一個流用於以後碰到相同類型的數據包可以在內核中執行操作)。
二、open vswitch常用操作
以下操作都需要root權限運行,在所有命令中br0表示網橋名稱,eth0爲網卡名稱。
添加網橋:
#ovs-vsctl add-br br0
列出open vswitch中的所有網橋:
#ovs-vsctl list-br
判斷網橋是否存在
#ovs-vsctl br-exists br0
將物理網卡掛接到網橋:
#ovs-vsctl add-port br0 eth0
列出網橋中的所有端口:
#ovs-vsctl list-ports br0
列出所有掛接到網卡的網橋:
#ovs-vsctl port-to-br eth0
查看open vswitch的網絡狀態:
刪除網橋上已經掛接的網口:
#vs-vsctl del-port br0 eth0
刪除網橋:
#ovs-vsctl del-br br0
三、使用open vswitch構建虛擬網絡
1、構建物理機和物理機相互連接的網絡
在安裝open vswitch的主機上有兩塊網卡,分別爲eth0、eth1,把這兩塊網卡掛接到open vswitch的網橋上,然後有兩臺物理機host1、host2分別連接到eth0和eth1上,實現這兩臺物理機的通信。構建結果圖如下:
執行以下命令:
#ovs-vsctl add-br br0 //建立一個名爲br0的open vswitch網橋 #ovs-vsctl add-port br0 eth0 //把eth0掛接到br0中 #ovs-vsctl add-port br0 eth1 //把eth1掛接到br0中
2、構建虛擬機與虛擬機相連的網絡
在安裝open vswitch的主機上安裝兩個虛擬機,把兩個虛擬機的網卡都掛接在open vswitch的網橋上,實現兩臺虛擬機的通信,構建結果圖如下:
執行以下命令:
# ovs-vsctl add-br br0 //建立一個名爲br0的open vswitch網橋
如果使用vbox或virt-manager把bridge設置爲br0即可,如果使用cli kvm則先創建兩個文件,用於虛擬網卡的添加於刪除。假設這兩個文件分別爲/etc/ovs-ifup和/etc/ovs-ifdown,則向這兩個文件中寫入以下內容
/etc/ovs-ifup
#!/bin/sh switch='br0' /sbin/ifconfig $1 0.0.0.0 up ovs-vsctl add-port ${switch} $1
/etc/ovs-ifdown
#!/bin/sh switch='br0' /sbin/ifconfig $1 0.0.0.0 down ovs-vsctl del-port ${switch} $1
使用以下命令建立虛擬機
kvm -m 512 -net nic,macaddr=00:11:22:33:44:55-net \ tap,script=/etc/ovs-ifup,downscript=/etc/ovs-ifdown-drive\ file=/path/to/disk-image,boot=on kvm -m 512 -net nic,macaddr=11:22:33:44:55:66-net \ tap,script=/etc/ovs-ifup,downscript=/etc/ovs-ifdown-drive\ file=/path/to/disk-image,boot=on
3、構建虛擬機與物理機相連的網絡
在裝有open vswitch的主機上有一個物理網卡eth0,一臺主機通過網線和eth0相連,在open vswitch的主機上還裝有一臺虛擬機,把此虛擬機和連接到eth0的主機掛接到同一個網橋上,實現兩者之間的通信,構建結果圖如下:
執行命令:
# ovs-vsctl add-br br0 //建立一個名爲br0的open vswitch網橋 # ovs-vsctl add-port br0 eth0 //把eth0掛接到br0中 # kvm -m 512 -net nic,macaddr=00:11:22:33:44:55-net \ tap,script=/etc/ovs-ifup,downscript=/etc/ovs-ifdown-drive\ file=/path/to/disk-image,boot=on //ovs-ifup和ovs-ifdown和上一節中相同
4、構建網橋和網橋相連的網絡
以上操作都是將多個主機(物理機或虛擬機)連接到同一個網橋上,實現它們之間的通信,但是要構建複雜的網絡,就需要多個網橋,在裝有open vswitch的主機上建立兩個網橋,實現它們之間的連接,構建結果如下:
執行命令:
ovs-vsctl add-br br 添加一個名爲br0的網橋 ovs-vsctl add-br br1 //添加一個名爲br0的網橋 ovs-vsctl add-port br0 patch-to-br1 //爲br0添加一個虛擬端口 ovs-vsctl set interface patch-to-br1type=patch //把patch-to-br1的類型設置爲patch ovs-vsctl set interface patch-to-br1 options:peer=patch-to-br0 把對端網橋和此網橋連接的端口名稱設置爲patch-to-br0 ovs-vsctl add-port br1 patch-to-br0 //爲br0添加一個虛擬端口 ovs-vsctl set interface patch-to-br0type=patch //把patch-to-br0的類型設置爲patch ovs-vsctl set interface patch-to-br0options:peer=patch-to-br1 //把對端網橋和此網橋連接的端口名稱設置爲patch-to-br1
ovs-vsctl set interface patch-to-br0type=patch 和ovs-vsctl set interface patch-to-br0 options:peer=patch-to-br1是對ovs-database的操作,有有興趣的同學可以參考ovs-vswitchd.conf.db.5
5、在不同的主機之間構建網橋之間的連接
在兩臺機器上分別安裝上open vswitch並創建網橋,分別爲兩個網橋添加物理網卡,然後通過網線連接兩個網橋,實現兩個網橋之間的互通。構建結果圖如下:
執行命令:
host1
#ovs-vsctl add-br br0 //添加名爲br0的網橋 #ovs-vsctl add-port br0 eth0 //把eth0掛接到br0上
host2
#ovs-vsctl add-br br0 //添加名爲br0的網橋 #ovs-vsctl add-port br0 eth0 //把eth0掛接到br0上
然後使用網線把host1的eth0和host2的eth0相連即可。
使用上邊五種方法的組合就可以構建出各種複雜的網絡,爲各種實驗提供網絡的支持。