簡介
搭建SDN環境少不了SDN交換機,SDN交換機跟普通交換機最大的區別就是將普通交換機的數據平面和控制平面相分離,SDN交換機只負責數據的轉發,而控制指令則由更上一級的控制器下發。
Open vSwitch(下面簡稱OVS)是一個高質量的、多層虛擬交換機。OVS遵循開源Apache2.0許可,通過可編程擴展,OVS可以實現大規模網絡的自動化(配置、管理、維護),同時支持現有標准管理接口和協議(比如NetFlow、sFlow、SPAN、RSPAN、CLI、LACP、802.1ag等)。此外OVS支持多種linux虛擬化技術,包括Xen/XenServer, KVM,和 VirtualBox等。
本文通過Ubuntu平台安裝部署OVS,並介紹OVS上的一些常用操作,讓讀者進一步了解OpenFLow交換機。
實驗環境
1. 本文基於下列環境安裝:
- 虛擬機Vmware Workstation 10.0.3;
- Ubuntu13.10(內核版本3.11);
- OVS選擇截稿前最新的Open vSwitch 2.3.0版本(2014年8月14日發布)。
2. OVS2.3.0版本最新特性及改進如下:
- OpenFlow 1.1,1.2,和1.3協議現在在OVS vswitchd中默認啟用。
- Linux內核數據面現在提供一個優化的流匹配過程的精確匹配緩存。
- 數據面流現在有部分通配符tranport端口匹配字段。這減少了用戶空間的向上調用,但會增加數據面中不同的掩模數。
- 提供megaflows在Linux內核下數據平面的操作。
- 添加IPFIX支持SCTP流和模板ICMPv4 / V6流。
- Linux內核支持到3.14。
- 添加dpdk實驗支持。
3. OVS各版本支持的Linux內核如下,可以根據下表選擇適合的Linux系統安裝。
表1. OVS與Linux內核版本對應關系
4. OVS各模塊簡要介紹如下:
- ovs-vswitchd:主要模塊,實現switch的daemon,包括一個支持流交換的Linux內核模塊;
- ovsdb-server:輕量級數據庫服務器,提供ovs-vswitchd獲取配置信息;
- ovs-dpctl:用來配置switch內核模塊;
- 一些Scripts and specs 輔助OVS安裝在Citrix XenServer上,作為默認switch;
- ovs-vsctl:查詢和更新ovs-vswitchd的配置;
- ovs-appctl:發送命令消息,運行相關daemon。
此外,OVS也提供了支持OpenFlow的特性實現,包括:
- ovs-ofctl:查詢和控制OpenFlow交換機和控制器;
- ovs-pki:OpenFlow交換機創建和管理公鑰框架;
- ovs-tcpundump:tcpdump的補丁,解析OpenFlow的消息。
准備工作
在正式下載安裝OVS之前我們需要安裝一些系統組件及庫文件以作為OVS正確運行的環境依賴。請切換至root用戶進行操作。
# apt-get update # apt-get install -y build-essential
注:正常運行使用OVS只需要安裝上述依賴即可,如果需要進一步開發OVS可能需要其他環境依賴,可以自行度娘。
部署Open vSwitch 2.3.0
1.下載OVS 2.3.0安裝包。
2. 解壓OVS 2.3.0安裝包。
# wget http://openvswitch.org/releases/openvswitch-2.3.0.tar.gz
# tar -xzf openvswitch-2.3.0.tar.gz
3. 構建基於Linux內核的交換機。
# cd openvswitch-2.3.0 # make clean # ./configure --with-linux=/lib/modules/`uname -r`/build 2>/dev/null
4. 編譯並安裝OVS 2.3.0。
# make && make install
5. 如果需要OVS支持VLAN功能,還需要加載openvswitch.ko模塊,如果不需要,此步可以忽略。
# modprobe gre
# insmod datapath/linux/openvswitch.ko
6. 我們需要安裝並加載構建的內核模塊。
# make modules_install # /sbin/modprobe openvswitch
注:若重啟機器導致openvswitch沒有啟動(lsmod |grep openvswitch),如果重新加載。
7. 使用ovsdb工具初始化配置數據庫。
# mkdir -p /usr/local/etc/openvswitch # ovsdb-tool create /usr/local/etc/openvswitch/conf.db vswitchd/vswitch.ovsschema
注:vswitchd/vswitch.ovsschema 指的是當前openvswitch工程目錄下的。
至此,如果沒有報錯的話OVS的部署已經成功完成。如果中間步驟出現問題,請仔細檢查是否按步驟進行或有無單詞拼寫錯誤。
啟動Open vSwitch 2.3.0
1.在啟動OVS之前,我們需要先啟動ovsdb-server配置數據庫。注意后面的命令大部分是由兩個短“-”組成的。
# ovsdb-server -v --remote=punix:/usr/local/var/run/openvswitch/db.sock --remote=db:Open_vSwitch,Open_vSwitch,manager_options --private-key=db:Open_vSwitch,SSL,private_key --certificate=db:Open_vSwitch,SSL,certificate --bootstrap-ca-cert=db:Open_vSwitch,SSL,ca_cert --pidfile --detach --log-file
2.首次用ovsdb-tool創建數據庫時需用ovs-vsctl命令初始化下數據庫。
# ovs-vsctl --no-wait init
3. 啟動OVS主進程
# ovs-vswitchd --pidfile --detach --log-file
4. 查看OVS進程是否啟動。
root@ubuntu:/home/chulk/sdn/openvswitch-2.3.1# ps aux|grep ovs root 1719 0.0 0.2 21212 2092 ? Ss 02:53 0:00 ovsdb-server -v --remote=punix:/usr/local/var/run/openvswitch/db.sock --remote=db:Open_vSwitch,Open_vSwitch,manager_options --private-key=db:Open_vSwitch,SSL,private_key --certificate=db:Open_vSwitch,SSL,certificate --bootstrap-ca-cert=db:Open_vSwitch,SSL,ca_cert --pidfile --detach --log-file root 1724 0.3 0.2 243068 2452 ? Ssl 02:53 0:12 ovs-vswitchd --pidfile --detach --log-file root 2640 0.0 0.0 21072 572 ? S<s 03:53 0:00 ovsdb-server: monitoring pid 2641 (healthy)
5. 我們可以通過如下命令查看所安裝OVS的版本號。
# ovs-vsctl --version
如果到這步你都沒有問題,那么恭喜,你已經成功安裝並啟動了OVS 2.3.0。下面我們會介紹一些常用的操作命令。
Open vSwitch基本操作
1. OVS連接控制器
如果我們想讓啟動好的OVS連接一個控制器,我們可以按如下步驟做。相關控制器的安裝部署可以參考之前的技術專欄相關文章:《常用SDN控制器安裝部署之Floodlight篇》,《SDN常用控制器安裝部署之POX篇》,《OpenDaylight與Mininet應用實戰之基本環境搭建(一)》。這里我們以Floodlight控制器為例。
首先添加一個名為br0的網橋。
# ovs-vsctl add-br br0
列出所有網橋。
# ovs-vsctl list-br
啟用該網橋。
# ifconfig br0 up
此時再用ifconfig命令能在網絡設備列表里看到名為br0的網橋即啟動成功。
root@ubuntu:/home/chulk/sdn/openvswitch-2.3.1# ifconfig -a br0 Link encap:Ethernet HWaddr a6:0c:7f:2e:0a:47 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:0 RX bytes:0 (0.0 B) TX bytes:0 (0.0 B) eth0 Link encap:Ethernet HWaddr 00:50:56:2c:4f:1d inet addr:172.16.26.136 Bcast:172.16.26.255 Mask:255.255.255.128 inet6 addr: fe80::250:56ff:fe2c:4f1d/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:21635 errors:0 dropped:0 overruns:0 frame:0 TX packets:3669 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:3550892 (3.5 MB) TX bytes:536821 (536.8 KB) 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:65536 Metric:1 RX packets:6197 errors:0 dropped:0 overruns:0 frame:0 TX packets:6197 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes:1925113 (1.9 MB) TX bytes:1925113 (1.9 MB) ovs-system Link encap:Ethernet HWaddr fa:6e:dd:da:2e:a7 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:0 RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)
我們可以用下面的命令將br0網橋連接至一個指定的控制器。
# ovs-vsctl set-controller br0 tcp:<controller IP>:<port>
這里本文使用的控制器地址為172.16.26.136,端口為6653。即:
# ovs-vsctl set-controller br0 tcp:172.16.26.136:6653
查看OVS是否連接上控制器。
root@ubuntu:/home/chulk/sdn/openvswitch-2.3.1# ovs-vsctl show
b784c584-f000-49c9-9c54-3b599cc8ad41
Bridge "br0"
Controller "tcp:172.16.26.136:6653"
is_connected: true
Port "br0"
Interface "br0"
type: internal
ovs_version: "2.3.1"
2. 交換機相關操作
查看虛擬交換機的信息。
root@ubuntu:/home/chulk/sdn/openvswitch-2.3.1# ovs-ofctl show br0 OFPT_FEATURES_REPLY (xid=0x2): dpid:0000a60c7f2e0a47 n_tables:254, n_buffers:256 capabilities: FLOW_STATS TABLE_STATS PORT_STATS QUEUE_STATS ARP_MATCH_IP actions: OUTPUT SET_VLAN_VID SET_VLAN_PCP STRIP_VLAN SET_DL_SRC SET_DL_DST SET_NW_SRC SET_NW_DST SET_NW_TOS SET_TP_SRC SET_TP_DST ENQUEUE LOCAL(br0): addr:a6:0c:7f:2e:0a:47 config: PORT_DOWN state: LINK_DOWN speed: 0 Mbps now, 0 Mbps max OFPT_GET_CONFIG_REPLY (xid=0x4): frags=normal miss_send_len=0
查看br0上各交換機端口的狀態。
root@ubuntu:/home/chulk/sdn/openvswitch-2.3.1# ovs-ofctl dump-ports br0
OFPST_PORT reply (xid=0x2): 1 ports
port LOCAL: rx pkts=0, bytes=0, drop=0, errs=0, frame=0, over=0, crc=0
tx pkts=0, bytes=0, drop=0, errs=0, coll=0
查看br0上所有的流規則
root@ubuntu:/home/chulk/sdn/openvswitch-2.3.1# ovs-ofctl dump-flows br0 NXST_FLOW reply (xid=0x4): cookie=0xb, duration=423.374s, table=0, n_packets=0, n_bytes=0, idle_age=423, priority=122,dl_dst=00:00:00:00:00:02 actions=LOCAL cookie=0x0, duration=1629.020s, table=0, n_packets=0, n_bytes=0, idle_age=1629, priority=3,dl_dst=00:00:00:00:00:00 actions=drop cookie=0xa, duration=1530.457s, table=0, n_packets=0, n_bytes=0, idle_age=1530, priority=123,dl_dst=00:00:00:00:00:01 actions=LOCAL cookie=0x9, duration=1628.981s, table=0, n_packets=0, n_bytes=0, idle_age=1628, priority=65535,ip,nw_proto=2 actions=CONTROLLER:65535 cookie=0x0, duration=1629.097s, table=0, n_packets=0, n_bytes=0, idle_age=1629, priority=0 actions=drop cookie=0x0, duration=1628.981s, table=0, n_packets=0, n_bytes=0, idle_age=1628, priority=3,dl_src=00:00:00:00:00:00 actions=drop cookie=0x0, duration=1628.981s, table=0, n_packets=0, n_bytes=0, idle_age=1628, priority=3,dl_src=ff:ff:ff:ff:ff:ff actions=drop cookie=0x0, duration=1629.061s, table=1, n_packets=0, n_bytes=0, idle_age=1629, priority=0 actions=drop
3. 網橋管理
之前已經添加了一個名為br0的網橋。
現在可以將網絡接口eth0掛接到網橋br0上。
ovs-vsctl add-port br0 eth0
列出掛接到網橋br0上的所有網絡接口。
ovs-vsctl list-ports br0
查看結果,如圖所示:
ovs-vsctl show
刪除網橋br0上掛接的eth0網絡接口。
ovs-vsctl del-port br0 eth0
刪除名為br0的網橋。
ovs-vsctl del-br br0
4. OVS其它常用命令及選項如下表所示:
表2. ovs-vsctl常用命令及選項
表3. ovs-ofctl常用命令及選項
參考:http://www.sdnlab.com/3166.html
編譯安裝或升級 :源代碼目錄 INSTALL
ubuntu apt-get 安裝及操作: http://blog.csdn.net/sdnexplorer/article/details/26053713




