㈠ 如何讓ubuntu開機自動運行腳本ovs
可以在這文件里添加需要運行的腳本文件代碼,代碼要放在 exit 前面
可以用vi來進行編輯
vi/etc/rc.local
#!/bin/bash
pingwww..com(每次開機ping網路以下)
exit0
這個目錄存放的是一些腳本,一般是linux以rpm包安裝時設定的一些服務的啟動腳本。系統在安裝時裝了好多rpm包,這裡面就有很多對應的腳本。執行這些腳本可以用來啟動,停止,重啟這些服務。舉個例子來說,如果你要重新啟動 sendmail 的話,而且你的 sendmail 是以 rpm 來安裝的,那麼下達 /etc/rc.d/init.d/sendmail restart 就可以直接啟動 sendmail 啰!
前面說到,/etc/rc.d/init.d這個目錄下的腳本就類似與windows中的注冊表,在系統啟動的時候執行。程序運行到這里(init進程讀取了運行級別), 是該運行init.d里的腳本了,但是並不是直接運行,而是有選擇的因為系統並不需要啟動所有的服務。
那麼,系統是如何選擇哪些需要啟動哪些不要呢?這時剛才說的運行級別就起作用了。在決定了系統啟動的run level之後,/etc/rc.d/rc這個腳本先執行。在RH9和FC7的源碼中它都是一上來就check_runlevel()(雖然實現的代碼不一樣,也大同小異),知道了運行級別之後,對於每一個運行級別,在rc.d下都有一個子目錄分別是rc0.d,rc1.d ….. rc6.d。每個目錄下都是到init.d目錄的一部分腳本一些鏈接。每個級別要執行哪些服務就在相對應的目錄下,比如級別5要啟動的服務就都放在rc5.d下,但是放在這個rc5.d下的都是一些鏈接文件,鏈接到init.d中相對應的文件,真正幹活到init.d里的腳本。
linux /etc/rc.d/目錄的詳解
rc.d的內容如下:
init.d/ :各種伺服器和程序的二進制文件存放目錄。
rcx.d/: 各個啟動級別的執行程序連接目錄。里頭的東西都是指向init.d/的一些軟連接。具體的後邊敘述。
還有三個腳本:rc.sysinit, rc, rc.local
㈡ 如何在linux系統下使用ovs-vsctl
在正式下載安裝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/moles/`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 moles_install
# /sbin/modprobe 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的部署已經成功完成。如果中間步驟出現問題,請仔細檢查是否按步驟進行或有無單詞拼寫錯誤。
㈢ 如何使用Floodlight連接並管理Open vSwitch
Open vSwitch(下面簡稱為 OVS)是由 Nicira Networks 主導的,運行在虛擬化平台(例如 KVM,Xen)上的虛擬交換機。在虛擬化平台上,OVS 可以為動態變化的端點提供 2 層交換功能,很好的控制虛擬網路中的訪問策略、網路隔離、流量監控等等。
OVS 遵循 Apache 2.0 許可證, 能同時支持多種標準的管理介面和協議。OVS 也提供了對 OpenFlow 協議的支持,用戶可以使用任何支持 OpenFlow 協議的控制器對 OVS 進行遠程管理控制。
Open vSwitch 概述
在 OVS 中, 有幾個非常重要的概念:
Bridge: Bridge 代表一個乙太網交換機(Switch),一個主機中可以創建一個或者多個 Bridge 設備。
Port: 埠與物理交換機的埠概念類似,每個 Port 都隸屬於一個 Bridge。
Interface: 連接到 Port 的網路介面設備。在通常情況下,Port 和 Interface 是一對一的關系, 只有在配置 Port 為 bond 模式後,Port 和 Interface 是一對多的關系。
Controller: OpenFlow 控制器。OVS 可以同時接受一個或者多個 OpenFlow 控制器的管理。
datapath: 在 OVS 中,datapath 負責執行數據交換,也就是把從接收埠收到的數據包在流表中進行匹配,並執行匹配到的動作。
Flow table: 每個 datapath 都和一個「flow table」關聯,當 datapath 接收到數據之後, OVS 會在 flow table 中查找可以匹配的 flow,執行對應的操作, 例如轉發數據到另外的埠。
Open vSwitch 實驗環境配置
OVS 可以安裝在主流的 Linux 操作系統中,用戶可以選擇直接安裝編譯好的軟體包,或者下載源碼進行編譯安裝。
在我們的實驗環境中,使用的操作系統是 64 位 Ubuntu Server 12.04.3 LTS,並通過源碼編譯的方式安裝了 Open vSwitch 1.11.0
$ lsb_release -a
No LSB moles are available.
Distributor ID:Ubuntu
Description:Ubuntu 12.04.3 LTS
Release:12.04
Codename:precise
OVS 的源碼編譯安裝方式可以參考官方文檔 How to Install Open vSwitch on Linux, FreeBSD and NetBSD。
安裝完畢後,檢查 OVS 的運行情況:
$ ps -ea | grep ovs
12533 ? 00:00:00 ovs_workq
12549 ? 00:00:04 ovsdb-server
12565 ? 00:00:48 ovs-vswitchd
12566 ? 00:00:00 ovs-vswitchd
查看 OVS 的版本信息, 我們安裝版本的是 1.11.0
$ ovs-appctl --version
ovs-appctl (Open vSwitch) 1.11.0
Compiled Oct 28 2013 14:17:16
查看 OVS 支持的 OpenFlow 協議的版本
$ ovs-ofctl --version
ovs-ofctl (Open vSwitch) 1.11.0
Compiled Oct 28 2013 14:17:17
OpenFlow versions 0x1:0x4
基於 Open vSwitch 的 OpenFlow 實踐
OpenFlow 是用於管理交換機流表的協議,ovs-ofctl 則是 OVS 提供的命令行工具。在沒有配置 OpenFlow 控制器的模式下,用戶可以使用 ovs-ofctl 命令通過 OpenFlow 協議去連接 OVS,創建、修改或刪除 OVS 中的流表項,並對 OVS 的運行狀況進行動態監控。
㈣ Dpdk與OpenvSwitch
1、DPDK
DPDK是X86平台報文快速處理的庫和驅動的集合,大多數情況下運行在linux的用戶態空間。
2、Open vSwitch
簡稱OVS是一個虛擬交換軟體,主要用於虛擬機VM環境,作為一個虛擬交換機,支持Xen/XenServer, KVM, and VirtualBox多種虛擬化技術。
在這種某一台機器的虛擬化的環境中,一個虛擬交換機(vswitch)主要有兩個作用:傳遞虛擬機VM之間的流量,以及實現VM和外界網路的通信。
在 OVS 中, 有幾個非常重要的概念:
Bridge: Bridge 代表一個乙太網交換機(Switch),一個主機中可以創建一個或者多個 Bridge 設備。
Port: 埠與物理交換機的埠概念類似,每個 Port 都隸屬於一個 Bridge。
Interface: 連接到 Port 的網路介面設備。在通常情況下,Port 和 Interface 是一對一的關系, 只有在配置 Port 為 bond 模式後,Port 和 Interface 是一對多的關系。
Controller: OpenFlow 控制器。OVS 可以同時接受一個或者多個 OpenFlow 控制器的管理。
Datapath: 在 OVS 中,datapath 負責執行數據交換,也就是把從接收埠收到的數據包在流表中進行匹配,並執行匹配到的動作。
Flow table: 每個 datapath 都和一個「flow table」關聯,當 datapath 接收到數據之後, OVS 會在 flow table 中查找可以匹配的 flow,執行對應的操作, 例如轉發數據到另外的埠。
3、OVDK
㈤ openswitch安裝apt
1.更新系統sudoapt-getupdate,sudoapt-getupgrade2.安裝OVS,sudoapt-getinstallopenvswitch-switch3.驗證sudoovs-vsctlshow。
在補充的時候安裝libssl相關套件,以及其他需要的套件。
還有一種方法,首先更新可安裝的組件,安裝相關依賴,從ovs的git倉庫下載源碼文件,並進入到ovs文件中,在ovs目錄下執行,編譯安裝,最後啟動。
㈥ ovs-dpdk-docker部署VNF實踐
關於docker的基本概念相關,可以參考 官網介紹 ,介紹的挺全面的。另外這篇 文章 介紹的也很清晰,並附帶有可以直接上手的實例。
關於container和vm的對比,需要重點關注下,直接放圖如下:
由於我們公司大多的產品都是基於dpdk框架來實現,所以選取在docker中部署dpdk來進行預研。目前dpdk官網提供兩種方案來支持container,如下圖:
[圖片上傳失敗...(image-848e3f-1591447286699)]
上圖(1) 方案中需要NIC支持SR-IOV功能,物理NIC支持的VF個數也依賴於硬體資源;每個container的介面獨佔VF,多個VF共享下面的一個PF。基於這種方案實現的container,無論對硬體的依賴和綁定,還是container的遷移,支持性都做得不夠好。
上圖(2) 方案中需要在host中運行vswitch或者vRouter來將上層的containers和底層的物理NIC解耦,只要vswitch(當前比較流行的OVS+DPDK,將OVS放在用戶態來實現)的性能足夠,一樣可以實現高性能的container app了。
基於以上比較,本次預研主要選取第二種方案來實現,該方案中container中涉及的組件如下圖所示:
[圖片上傳失敗...(image-36e69c-1591447286699)]
方案中使用virtual device(包括virtio-user和vhost-user backend)來實現高性能的container App 或者IPC。Virtio使用共享內存的方式來收發報文,傳統的VM可以通過qemu來共享vhost後端的物理地址,但對container而言,作為系統的一個進程,使用這種方式則比較難。目前的思路是只能使用DPDK初始化的hugepages來進行內存共享。所以,要在container中使用dpdk,必須要分配足夠的大頁內存,且不同container在使用共享內存時要能夠分區使用,避免地址重復。
hugepage的配置(配置使用1G大小的hugepagesize,同時最多分配8個):
pktgen的安裝依賴於DPDK,安裝前確保RTE_SDK和RTE_TARGET環境變數設置正確。
可以檢查系統配置如下:
至此ovs就啟動並配置好了,vhost-user backend口已經創建好,相應的流表路由表項也已經添加好,接下來就該部署container了。
l2fwd和testpmd都屬於dpdk提供的app,使用同一個container即可。創建container時把之前build的dpdk目錄到docker中。
同理,把之前編譯好的pktgen映射到container中即可。此外需要注意的是,pktgen依賴libpcap,所以需要在container中安裝一份。使用時還發現運行container提示無法找到共享庫libpcap.so.1, 而安裝libpcap後只有libpcap.so,解決辦法就是做個軟鏈就可以了。
具體的配置步驟如下:
pktgen端:
pktgen端:
說明l2fwd已按照我們的預想進行了報文的轉發。
本次預研實踐主要還是集中在OVS上面的container App的互通以及container內部對dpdk的支持,分別驗證了在container內部運行testpmd和l2fwd來進行報文轉發。其中,dpdk app的運行模式可以為後續cneos平台server docker化提供一定的技術指導作用。
如果從更系統化的層面來考慮docker結合ovs以及dpdk的使用,更通用的使用場景應該是這樣的:在ovs的南向通過dpdk pmd和硬體平台上物理nic的PF或VF綁定,高速收發報文;在ovs的北向,通過virtual device和docker container來共享收發報文,進行上層業務的處理。 南北向之間的流量需要配置flow table來指導轉發。流量示意如下圖所示:
㈦ OVS(Open vSwitch)注包
OVS注包的場景:
UCloud的 SDN 網路是基於OVS做的。為了進行內網監控,需要 測試 用戶的兩台雲主機通信是否正常。但是,作為服務方我們是無法登陸到用戶的雲主機的。因此,採用了向源端的OVS中注入一個ping包的方法測試網路是否正常。
基本原理
實驗環境示意圖:實現不登陸進SRC VM的前提下,發送Ping的請求包給DST VM,並捕獲返回的應答包Ping Response。
染色:
用戶有可能自己也會發送Ping包,為了區分用戶的應答包和注入方式得到的應答包,需要對注入的Ping Request進行染色。首先看下ICMP包的格式,如下所示。
黃色標記起來的Identifier欄位含義如下(RFC 792)
The identifier and sequence number may be used by the echo sender to aid in matching the replies with the echo requests
通過設置Identifier的值,可以區分不同的請求對應的應答包。
這里我們設置Identifier=111,捕獲數據包時,需要指定ICMP包 icmp[4:2]=111,表明ICMP的第四、第五個位元組的值等於111.
注入Ping Request包
需要使用ovs-ofctl packet-out進行注包操作,命令格式如下:
ovs-ofctl packet-out switch in_port actions packet...
說明:
1、packet-out:連接到OVS,並且讓OVS對Packet執行某個Action
Connects to switch and instructs it to execute the OpenFlow actions on each packet
2、switch:交換機的名字,比如實驗環境中的br0
3、in_port:SRC VM連接到OVS的埠號,就是實驗環境示意圖中的In Port
4、packet:數據包,實驗中就是染了色的Ping Request數據包。
5、Action:關鍵是Action的選擇,我們採用的是resubmit,說明如下。resubmit會找到數據包對應的流表,然後更換掉in_port並執行流表中的Action。我們這里設置port=in_port。所以僅僅會執行流表中的Action。
resubmit([port],[table]):Re-searches this OpenFlow flow table with thein_portfield replaced byportand executes the actions found
捕獲Ping的Response包
採用tcpmp進行捕獲染了色的Ping數據包。命令如下
tcpmp -c 1 -iVIRTUAL_INTERFACEicmp and src hostSRC_IPand dst hostDST_IPand icmp[4:2]=111
1. VIRTUAL_INTERFACE: 雲主機使用虛擬網卡的名字
2. SRC_IP:源雲主機的IP地址
3. DST_IP:目的雲主機的IP地址
4. 111:染色標記
golang實現的主邏輯
injectICMPCmd=util.GetInjectICMPPacket(srcIp,dstIp,srcMac,dstMac)//構造染了色的Ping Request包,以及注入命令tcpDumpCmd=util.TcpDumpICMPCommand(iface,srcIp,dstIp)//構造tcpmp的抓包命令tcpDumpResponse:=make(chanstring)srcHostIp:="XXX"//宿主機的IP地址gofunc(){command:=fmt.Sprintf("ssh %s@%s %s","root",srcHostIp,tcpDumpCmd)util.SshRunWithChannelResponse(command,tcpDumpResponse)}()// inject Packet into OVStime.Sleep(100*time.Millisecond)gofunc(){command:=fmt.Sprintf("ssh %s@%s %s","root",srcHostIp,injectICMPCmd)util.SshRun(command)}()success:=trueselect{casemsg:=<-tcpDumpResponse:ifstrings.Contains(msg,dstIp){fmt.Printf("Checking Success, Response: %s\n",msg)}else{success=falsefmt.Printf("Checking Fail, Response: %s\n",msg)}}returnsuccess