OVS初級教程:使用open vswitch構建虛擬網路(轉載)
一、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的網路狀態:
#ovs-vsctl show刪除網橋上已經掛接的網口:
#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相連即可。
使用上邊五種方法的組合就可以構建出各種複雜的網路,為各種實驗提供網路的支援。