1. 程式人生 > >淺談Open vSwitch移植

淺談Open vSwitch移植

前一段時間自己私下一直學習Open vSwitch。起初學習Open vSwitch的目的,只是為了更好的學習OpenFlow協議,然而當我看到Open vSwitch處理OpenFlow協議的入口函式時(即handle_OpenFlow__),突然感覺這程式碼的寫的太NB啦。為什麼這麼說呢?因為Open vSwitch最新版本,號稱支援of1.0,of1.1,of1.2,of1.3,of1.4,of1.5。然而它只用一個switch-case解決了協議版本差異性,它是怎麼做到呢?帶著這種疑問,開始了我學習Open vSwitch原始碼之旅。

隨著學習一步一步的深入,發現了很多聞所未聞的新名詞,比如說:DPDK,NetLink,NUMA等。這些新的名詞(只是我沒有聽說過,其實業界早已不新鮮)令我產生了濃厚的興趣,這樣我就一點一點搜尋相關資料,慢慢了解。以上就是我學習Open vSwitch背景,或者緣由吧。

今天我不打算進行原始碼分析,今天主要是想說一下如何移植Open vSwitch。

很多人可能覺得移植Open vSwitch太難了,不知道應該如何移植?的確Open vSwitch這套程式碼太過於龐大,而且耦合度也比較大,要移植的確不容易。下面我把這兩年工作中積累的一點經驗和大家分享一下,如有不好之處,希望各位批評指出。

移植的時候我們需要考慮以下兩個大方向:
1、是簡單移植?還是將軟體做為公司產品的一個元件,即二次開發移植?
2、平臺。首先我們需要確定要移植到平臺,Window、x86、arm、mips、ios等。

I、簡單移植

如果只是簡單的移植,那就非常方便了,只需要將程式碼下載後放到對應平臺下,進行編譯即可。如果是移植到arm、mips平臺下,可能需要進行交叉編譯。公司一般都有交叉環境,我們只需要在configure過程中指定對應的平臺即可,例如:
./configure --build=i386-linux,--host=arm-linux,然後就可以執行make進行交叉編譯了。這些步驟對於大家應該不陌生,這裡不在多說了。

II、二次開發移植

相信很多公司都是基於開源軟體進行二次開發,並且將開源軟體作為公司產品的一個元件或一個服務而存在。那麼接下來的問題就是如何移植到自己產品中呢?移植後的軟體工作是否正常?

下面我們針對這兩個問題並結合Open vSwitch進行簡單剖析。接下來的一些分享內容,都是我提前準備好的,比如說編譯環境、截圖等。說句實在話,搞IT的,有些時候我們必須自己走一遍才可以,所以我私下移植了一下。

一、Open vSwitch框架

我們在移植一個軟體的時候,第一要務就是了解軟體架構,不必十分了解,最起碼能夠知道這個軟體由哪些元件組成。針對Open vSwitch架構圖,如下所示:


此圖是之前一位網友在群裡發出來,我覺得比較經典便儲存起來。通過上圖可知,Open vSwitch分為三層:

1)管理層即:ovs-dpctl、ovs-vsctl、ovs-ofctl、ovsdb-tool。
2)業務邏輯層即:vswitchd、ovsdb。
3)底層服務層即:datapath。

前兩個都是使用者態應用程式,最後一個是核心態應用程式。

我們移植一個軟體的時候有些時候只需要移植一部分,有些時候需要全部移植過去。通過圖1可知,Open vSwitch整個框架耦合度較大,若想單獨移植某一個模組,難度較大。好在大多數基於Open vSwitch進行二次開發都是全部移植。這裡呢,我只介紹一下如何移植vswitchd,起到拋磚引玉的效果。

二、正常編譯

大家都知道linux下面編譯一個軟體是,configure、make、make install。不同之處往往就是configure配置過程。還有一點,像Open vSwitch這樣一個非常成熟的一個軟體,網上有很多教程如何編譯它,因此我們不必花費心思去讀文件說明。對於一個新的軟體,網上可能沒有具體教程,那麼我們只能看官方提供的README檔案了。

我只做過x86平臺上的移植,所以下面介紹均是以x86平臺進行解說
1、檢視INSTALL.RHEL.md
每一個開源軟體都會有有一個README.md檔案,因此我們來看一下README.md檔案。在這個檔案裡面有下面這樣一句話,即Open vSwitch所支援的平臺以及對應平臺安裝說明。我的linux是Centos6.7即RedHad系列。

通過讀INSTALL.RHEL.md檔案,有三點需要說明:
1)Open vSwitch安裝方式預設是rpm包方式,對於我們移植來說顯然是不可取的。
2)安裝Open vSwitch必備條件,所以我們必須安裝這些軟體,才能保證編譯順利

3)通過閱讀說明檔案,能夠大致知道編譯順序,但是在第三步make dist需要修改成make。因為make dist命令編譯並打包即生成rpm。

2、檢視configure配置說明
通過檢視說明檔案,我們能夠清楚的知道編譯方式,但是為了能夠順利移植我們還需要檢視一下configure配置。
通過configure --help,可能會打印出很多內容,但是我們關心只有兩項Optional Features、Optional Packages。具體內容如下圖示:


上面內容都是一些特性選項,各個公司可能要求不一樣,可以根據公司要求開啟某些選項,在這裡不進行詳細介紹。這裡想說一下dpdk。如果我們想讓Open vSwitch支援dpdk,我們必須指定—with-dpdk即configure –with-dpdk=/usr/ pathxx/dpdk,這樣生成的makefile將會支援dpdk編譯。

3、執行編譯步驟(在編譯過程中可能會出現各種錯誤,也可能不會有錯,取決於你自己機器中是否安裝Open vSwitch所依賴的庫)

本想把一些錯誤記錄下來,拿出來和大家分享一下,可是在我編譯過程中比較走運,沒有任何錯誤!!

我們按照上面說的進行編譯,下面編譯過程都是我自己私下編譯過程的:
首先下載原始碼:

預設下載程式碼,git分支是master分支,master分支是主線分支,不是很穩定,因此我們進行分支切換,切換到

branch-2.5是釋出分支,是穩定分支。 一般公司都是基於釋出分支進行開發。



此處為了加速編譯,我指定了多執行緒編譯:make –j32


我這裡編譯的非常順利,沒有任何錯誤,這樣對於移植一個軟體來說,無疑是件好事。下面為了方便移植,我們需要重新編譯一次而且把編譯過程重定向到一個檔案中。如下命令列:

Shell
1 2 make clean make > build .out .txt    2 > & 1

4、檢視編譯過程build.out.txt

檢視編譯過程主要是為了確定,可執行程式連結哪些庫檔案,這樣在移植到我們自己產品中也需要連結對應的庫。如下圖所示:


通過連結過程可以清楚知道,某個程式需要哪些檔案,我們只需要把這些檔案移植到我們產品中就行了。

三、移植vswitchd模組

今天介紹一下我是如何進行vswtichd移植的。通過上面連結過程,vswitchd在連結過程會連結下面這些庫以及.o檔案:
下面是臨時檔案.o:

Shell
1 2 vswitchd / bridge .o    vswitchd / ovs - vswitchd .o vswitchd / system - stats .o    vswitchd / xenserver .o

下面是Open vSwitch自帶的靜態庫檔案:

Shell
1 2 3 ofproto / .libs / libofproto .a lib / .libs / libsflow .a lib / .libs / libOpen vSwitch .a

下面是系統庫:

Shell
1 - lssl - lcrypto - lcap - ng - lrt lm

以上檔案就是vswitchd所需要的檔案,然而上面那些靜態庫檔案我們是不知道由哪些原始檔組成?那好我們可以再看一下編譯過程,查詢一下這些靜態庫由哪些檔案組成。

如下圖所示:



以上所有檔案,就是我們需要的原始檔,將這些原始檔移植到自己平臺中即可。當然只單純的移植原始檔是無法編譯通過,還需要移植對應的標頭檔案,這些工作都是體力活,沒有什麼技巧。

如果有人需要移植ovsdb-server也可以參考上面過程,過程相似。

四、編譯引數

假設我們移植完所有原始檔和標頭檔案,接下來就需要編寫makefile。如果不熟悉makefile語法的同學,若想移植一個軟體估計是十分痛苦的。好在的是,公司有相應的編譯框架,我們完全可以依靠現有資源。這裡不想說makefile,而是說一下如何設定編譯引數。編譯引數對於編譯出來的可執行程式,起著至關重要的作用,甚至影響移植後軟體功能的準確性。那麼我們如何做到編譯引數正確性?其實很簡單,還是檢視編譯過程。下面我擷取一下編譯過程:

相關推薦

Open vSwitch移植

前一段時間自己私下一直學習Open vSwitch。起初學習Open vSwitch的目的,只是為了更好的學習OpenFlow協議,然而當我看到Open vSwitch處理OpenFlow協議的入口函式時(即handle_OpenFlow__),突然感覺這程式碼的寫的太NB啦。為什麼這麼說呢?因為

Linux核心移植

Linux核心簡介: 1.系統架構 (1)Linux是由使用者空間和核心空間構成的 (2)使用者空間主要是使用者應用程式以及一些C庫檔案,配置檔案。一般是看得見的。 (3)核心空間主要是系統呼叫介面,狹義上的核心,處理器架構相關的程式碼。 (4)劃分兩

計算機領域及職業憧憬

計算機科學 軟件工程師 計算機行業 雖然自己的專業是計算機,可是慚愧的說其實對這個行業的了解並不是很多,大多時候是通過網絡或者新聞才了解到的。據我所知,現在計算機行業是非常流行的行業,當然競爭也是十分激烈,信息化的時代我們的生活都離不開與計算機有關的東西,比如上學坐公共汽車,需要刷卡,這就是

Java學習筆記——數據結構與Java集合框架(第一篇、List)

技術分享 emp 鏈表 adc 下標 -c nod nal integer 橫看成嶺側成峰,遠近高低各不同。不識廬山真面目,只緣身在此山中。               ——蘇軾 這一塊兒學的是雲裏霧裏,咱們先從簡單的入手。逐漸的撥開迷霧見太陽。本次先做List集合的三

HTTP請求與響應

tcp 方法 刪除 請求 連接 客戶機 cin tex 文件 HTTP協議用於客戶端和服務器之間的通信,請求訪問的一段是客戶端,提供資源響應的一段是服務器端。 HTTP通信是采用請求應答的方式來進行的,客戶端發出請求,服務器響應。如果沒有客戶端的請求,服務器端是不進行任

C#解析網頁

多說 .text 了解 light path text load 所有 web 最近做了一個項目,要求獲取各大主流網頁上的關鍵信息,本人以前了解過網頁爬蟲的知識,所以想到了網頁爬蟲了實現功能 第一次嘗試: 采用webclient獲取遠程網頁的內容,然後采用正則表達式進行過濾

三層

數據交換 接受 數據庫 業務 傳輸數據 文本文 項目結構 三層架構 project 三層劃分 三層架構通常意義上就是將整個業務劃分為:表現層(UI),業務邏輯層(BLL),數據訪問層(DAL)。三層並非.net 的專利,而是一個廣譜的框架設計思想,根本上是為了解決高

io流

public 文件夾 parent 文章 IO流淺談 在這篇文章裏,我會分別和大家聊字節流和字符流 一字節流 File File:文件和目錄(文件夾)路徑名的抽象表示形式。 File的構造方法: File(String pathname):把一個路徑名稱封裝成F

【轉】一個網頁打開的全過程(涉及DNS、CDN、Nginx負載均衡等)

位置 filters 產生 多種方法 tps windows cnblogs 這就是 廣東 1、概要   從用戶在瀏覽器輸入域名開始,到web頁面加載完畢,這是一個說復雜不復雜,說簡單不簡單的過程,下文暫且把這個過程稱作網頁加載過程。下面我將依靠自己的經驗,總結一下整個過程

Qt之二十一log調試日誌

gms 生成文件 _file__ ica 沒有 rest delet mar 排除 一、簡單介紹 近期因調試code時,想了解程序的流程,但苦於沒有一個簡易的日誌記錄,不停使用qDebug打印輸出,而終於提交代碼時得去多次刪除信息打印,有時還會出現新改動

C# if判斷

else if mic 要求 用戶輸入 if判斷 span 常用 switch 數字 目前學習了C#中很多語句: if判斷 switch選擇 while循環 do while循環 for循環 foreach循環 它們是C#中經常用到的一些語句。 if判斷:

mmap()和ioremap()的用法與區別

12只 設備 gpa 我們 之間 mmap ioremap shared set 一、mmap()mmap()函數是用來將設備內存線性地址映射到用戶地址空間。(1)首先映射基地址,再通過偏移地址尋址;(2)unsigned char *map_cru_base=(unsig

NIO原理剖析與Netty初步----高性能服務器開發(一)

返回 創建 基於 register 訪問 io操作 nbsp info class 除特別註明外,本站所有文章均為原創,轉載請註明地址 在博主不長的工作經歷中,NIO用的並不多,由於使用原生的Java NIO編程的復雜性,大多數時候我們會選擇Netty,m

反射入門-反射用途_根據Ado遊標對象創建list集合

cep exists _id tostring ogr param char typeof scala 本人大二菜鳥一只,今天在上課期間有個同學看著C#反射的內容說反射沒什麽用,一時之間也想不到什麽更好的例子,就寫了個根據泛型類型和遊標反射創建List集合的Demo. 首先

老司機linux系統學習技巧

windowsLinux起源於20世紀70年代,是一種優秀的操作系統系統。初次接觸到linux這個系統是在大學期間,這樣才發現除了windows外的另外一個有趣系統。開始抱著好奇的心態去了解,隨著深入學習,筆者被它獨有的魅力所吸引。即使它的可視化窗口操作模式並不如Windows操作系統那樣完美,可是它的可維護

awk命令

log 次數 循環 alfred 數值 字符串 int 所有 進行 簡介 awk是一個強大的文本分析工具,相對於grep、sed命令,awk在其對數據分析並生成報告時,顯得尤為強大。簡單來說awk就是把文件逐行的讀入,然後將每行切片,再對切開的部分進行處理。 awk有3個不

軟件銷售工作

級別 區分 eas 沒有 這樣的 呵呵 萬塊 div 最好 自技術領域轉做銷售有幾年了。由於長期耕耘在技術領域,對於銷售的角色進入有點晚,只是近期幾年也逐漸的摸出些門道,而且按照這些門道來指導團隊的實踐,確實可以看到比較可喜的進步,在此總結一下。跟大家一起分享一下。銷售分

WCF

net 平臺 訪問控制 代碼 進行 erl 狀態 系統集成 數據源 什麽是WCF 先看看官方說法: Windows Communication Foundation (WCF) 是用於構建面向服務的應用程序的框架。借助 WCF,可以將數據作為異步消息從一個服務終結點發送

一下web移動端基本

5.5 相關 過程 部件 位圖 都是 3.5 柵格 開發 屏幕尺寸、屏幕分辨率、屏幕像素密度 屏幕尺寸: 指屏幕的對角線的長度,單位是英寸,1英寸=2.54厘米。 常見的屏幕尺寸有2.4、2.8、3.5、3.7

Kotlin(三):類

ide pos 中一 androi 文件 rri object 淺談 spa 淺談Kotlin(一):簡介及Android Studio中配置 淺談Kotlin(二):基本類型、基本語法、代碼風格 前言:   已經學習了前兩篇文章,對Kotlin有了一個基本的認識,往後