ovs源碼
1. open vswitch和網橋的區別
下載完後輸入以下命令解壓
[root@localhost ~]# tar –xzvf openvswitch-1.1.0pre2.tar.gz
進入解壓後目錄,輸入以下命令配置Open vSwitch工程,生成Makefile文件。
[root@localhost ~]# ./configure --with-linux=/lib/moles/`uname -r`/build
–with- linux:生成內核模式的Open vSwitch時需指定的內核源碼編譯目錄
指定Open
vSwitch的安裝位置加參數:–prefix=/…
如有其他問題可參考源碼根目錄下的幫助文件:INSTALL.Linux
編譯、鏈接、生成和安裝Open vSwitch,命令如下,make install目錄只安裝Open vSwitch除內核模塊外的其他所有模塊,如ovs-vsctl、ovs-vswitchd、ovs-ofctl等
[root@localhost ~]# make[root@localhost ~]# make install
卸載原有虛擬網橋模塊,命令如下,如果Xend正常啟動,將自動載入linux虛擬網橋模塊bridge.ko。
[root@localhost ~]# rmmod bridge
如果無法卸載,可用「lsmod」命令查看已載入的依賴於bridge的內核模塊,並用「rmmod 模塊名」卸載,常見的無法卸載的情況可通過預先執行下面兩條命令解決。
[root@localhost ~]# /etc/init.d/iptables stop[root@localhost ~]# rmmod xt_physdev
載入Open
vSwitch內核模塊openvswitch_mod.ko和linux虛擬網橋兼容模塊brcompat_mod.ko
[root@localhost ~]# insmod openvswitch-1.1.0pre2/datapath/linux-2.6/openvswitch_mod.ko[root@localhost ~]# insmod openvswitch-1.1.0pre2/datapath/linux-2.6/brcompat_mod.ko
根據ovsdb模板vswitch.ovsschema創建ovsdb資料庫ovs-vswitchd.conf.db,用於存儲虛擬交換機的配置信息,只需第一次運行Open
vSwitch時創建
[root@localhost ~]# ovsdb-tool create/usr/local/etc/ovs-vswitchd.conf.dbopenvswitch-1.1.0pre2/vswitchd/vswitch.ovsschema
啟動ovsdb資料庫伺服器,Open vSwitch虛擬網橋模塊將通過ovsdb-server獲得虛擬交換機配置信息,「—detach」表示以後台方式運行, ovsdb-server其他參數請參考「ovsdb-server –help」
[root@localhost ~]# ovsdb-server/usr/local/etc/ovs-vswitchd.conf.db--remote=punix:/usr/local/var/run/openvswitch/db.sock--remote=db:Open_vSwitch,manager_options--private-key=db:SSL,private_key--certificate=db:SSL,certificate--bootstrap-ca-cert=db:SSL,ca_cert--detach
初始化Open
vSwitch控制介面,以便用ovs-vsctl管理配置虛擬交換機
[root@localhost ~]#
ovs-vsctl –no-wait init
啟動Open
vSwitch用戶態模塊,unix:後的文件為socket文件,為ovsdb-server監聽的socket文件。
[root@localhost ~]#
ovs-vswitchd unix:/usr/local/var/run/openvswitch/db.sock –detach
啟動linux原有虛擬網橋兼容模塊用戶態組件ovs-brcompatd,該模塊必須在ovsdb-server和ovs-vswitchd啟動後才能啟動。
[root@localhost ~]# ovs-brcompatd--pidfile--detach
2.2 apt-get安裝
$apt-get install openvswitch-*
注意:使用deb安裝openvswitch-datapath*也是需要依賴/lib/moles/`uname -r`/build,否則無法編譯內核模塊
2. 如何使用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 的運行狀況進行動態監控。
3. 如何讓ubuntu開機自動運行腳本ovs
1. /etc/rc.local 文件添加 語句
可以在這文件里添加需要運行的腳本文件代碼,代碼要放在 exit 前面
可以用vi來進行編輯
vi/etc/rc.local
#!/bin/bash
pingwww..com(每次開機ping網路以下)
exit0
2. /etc/init.d
這個目錄存放的是一些腳本,一般是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
4. 誰知道數據結構順序棧的插入和刪除運算源代碼啊
關於二十四點游戲的編程思路與基本演算法
漫長的假期對於我來說總是枯燥無味的,閑來無聊便和同學玩起童年時經常玩的二十四點牌游戲來。此游戲說來簡單,就是利用加減乘除以及括弧將給出的四張牌組成一個值為24的表達式。但是其中卻不乏一些有趣的題目,這不,我們剛玩了一會兒,便遇到了一個難題——3、6、6、10(其實後來想想,這也不算是個太難的題,只是當時我們的腦筋都沒有轉彎而已,呵呵)。
問題既然出現了,我們當然要解決。冥思苦想之際,我的腦中掠過一絲念頭——何不編個程序來解決這個問題呢?文曲星中不就有這樣的程序嗎?所以這個想法應該是可行。想到這里我立刻開始思索這個程序的演算法,最先想到的自然是窮舉法(後來發現我再也想不到更好的方法了,悲哀呀,呵呵),因為在這學期我曾經寫過一個小程序——計算有括弧的簡單表達式。只要我能編程實現四個數加上運算符號所構成的表達式的窮舉,不就可以利用這個計算程序來完成這個計算二十四點的程序嗎?確定了這個思路之後,我開始想這個問題的細節。
首先窮舉的可行性問題。我把表達式如下分成三類——
1、 無括弧的簡單表達式。
2、 有一個括弧的簡單表達式。
3、 有兩個括弧的較復4、 雜表達式。
窮舉的開始我對給出的四個數進行排列,其可能的種數為4*3*2*1=24。我利用一個嵌套函數實現四個數的排列,演算法如下:
/* ans[] 用來存放各種排列組合的數組 */
/* c[] 存放四張牌的數組 */
/* k[] c[]種四張牌的代號,其中k[I]=I+1。
用它來代替c[]做處理,考慮到c[]中有可能出現相同數的情況 */
/* kans[] 暫存生成的排列組合 */
/* j 嵌套循環的次數 */
int fans(c,k,ans,kans,j)
int j,k[],c[];char ans[],kans[];
{ int i,p,q,r,h,flag,s[4],t[4][4];
for(p=0,q=0;p<4;p++)
{ for(r=0,flag=0;r if(k[p]!=kans[r]) flag++;
if(flag==j) t[j][q++]=k[p];
}
for(s[j]=0;s[j]<4-j;s[j]++)
{ kans[j]=t[j][s[j>;
if(j==3) { for(h=0;h<4;h++)
ans[2*h]=c[kans[h]-1]; /* 調整生成的排列組合在最終的表
達式中的位置 */
for(h=0;h<3;h++)
symbol(ans,h); /* 在表達式中添加運算符號 */
}
else { j++;
fans(c,k,ans,kans,j);
j--;
}
}
}
正如上面函數中提到的,在完成四張牌的排列之後,在表達式中添加運算符號。由於只有四張牌,所以只要添加三個運算符號就可以了。由於每一個運算符號可重復,所以計算出其可能的種數為4*4*4=64種。仍然利用嵌套函數實現添加運算符號的窮舉,演算法如下:
/* ans[],j同上。sy[]存放四個運算符號。h為表達式形式。*/
int sans(ans,sy,j,h)
char ans[],sy[];int j,h;
{ int i,p,k[3],m,n; char ktans[20];
for(k[j]=0;k[j]<4;k[j]++)
{ ans[2*j+1]=sy[k[j>; /* 剛才的四個數分別存放在0、2、4、6位
這里的三個運算符號分別存放在1、3、5位*/
if(j==2)
{ ans[5]=sy[k[j>;
/* 此處根據不同的表達式形式再進行相應的處理 */
}
else
}
}
好了,接下來我再考慮不同表達式的處理。剛才我已經將表達式分為三類,是因為添加三個括弧對於四張牌來說肯定是重復的。對於第一種,無括弧自然不用另行處理;而第二種情況由以下代碼可以得出其可能性有六種,其中還有一種是多餘的。
for(m=0;m<=4;m+=2)
for(n=m+4;n<=8;n+=2)
這個for循環給出了添加一個括弧的可能性的種數,其中m、n分別為添加在表達式中的左右括弧的位置。我所說的多餘的是指m=0,n=8,也就是放在表達式的兩端。這真是多此一舉,呵呵!最後一種情況是添加兩個括弧,我分析了一下,發現只可能是這種形式才不會是重復的——(a b)(c d)。為什麼不會出現嵌套括弧的情況呢?因為如果是嵌套括弧,那麼外面的括弧肯定是包含三個數字的(四個沒有必要),也就是說這個括弧裡麵包含了兩個運算符號,而這兩個運算符號是被另外一個括弧隔開的。那麼如果這兩個運算符號是同一優先順序的,則肯定可以通過一些轉換去掉括弧(你不妨舉一些例子來試試),也就是說這一個括弧沒有必要;如果這兩個運算符號不是同一優先順序,也必然是這種形式((a+-b)*/c)。而*和/在這幾個運算符號中優先順序最高,自然就沒有必要在它的外面添加括弧了。
綜上所述,所有可能的表達式的種數為24*64*(1+6+1)=12288種。哈哈,只有一萬多種可能性(這其中還有重復),這對於電腦來說可是小case喲!所以,對於窮舉的可行性分析和實現也就完成了。
接下來的問題就是如何對有符號的簡單表達式進行處理。這是棧的一個著名應用,那麼什麼是棧呢?棧的概念是從日常生活中貨物在貨棧種的存取過程抽象出來的,即最後存放入棧的貨物(堆在靠出口處)先被提取出去,符合「先進後出,後進先出」的原則。這種結構猶如子彈夾。
在棧中,元素的插入稱為壓入(push)或入棧,元素的刪除稱為彈出(pop)或退棧。
棧的基本運算有三種,其中包括入棧運算、退棧運算以及讀棧頂元素,這些請參考相關數據結構資料。根據這些基本運算就可以用數組模擬出棧來。
那麼作為棧的著名應用,表達式的計算可以有兩種方法。
第一種方法——
首先建立兩個棧,操作數棧OVS和運算符棧OPS。其中,操作數棧用來記憶表達式中的操作數,其棧頂指針為topv,初始時為空,即topv=0;運算符棧用來記憶表達式中的運算符,其棧頂指針為topp,初始時,棧中只有一個表達式結束符,即topp=1,且OPS(1)=『;』。此處的『;』即表達式結束符。
然後自左至右的掃描待處理的表達式,並假設當前掃描到的符號為W,根據不同的符號W做如下不同的處理:
1、 若W為操作數
2、 則將W壓入操作數棧OVS
3、 且繼續掃描下一個字元
4、 若W為運算符
5、 則根據運算符的性質做相應的處理:
(1)、若運算符為左括弧或者運算符的優先順序大於運算符棧棧頂的運算符(即OPS(top)),則將運算符W壓入運算符棧OPS,並繼續掃描下一個字元。
(2)、若運算符W為表達式結束符『;』且運算符棧棧頂的運算符也為表達式結束符(即OPS(topp)=』;』),則處理過程結束,此時,操作數棧棧頂元素(即OVS(topv))即為表達式的值。
(3)、若運算符W為右括弧且運算符棧棧頂的運算符為左括弧(即OPS(topp)=』(『),則將左括弧從運算符棧談出,且繼續掃描下一個符號。
(4)、若運算符的右不大於運算符棧棧頂的運算符(即OPS(topp)),則從操作數棧OVS中彈出兩個操作數,設先後彈出的操作數為a、b,再從運算符棧OPS中彈出一個運算符,設為+,然後作運算a+b,並將運算結果壓入操作數棧OVS。本次的運算符下次將重新考慮。
第二種方法——
首先對表達式進行線性化,然後將線性表達式轉換成機器指令序列以便進行求值。
那麼什麼是表達式的線性化呢?人們所習慣的表達式的表達方法稱為中綴表示。中綴表示的特點是運算符位於運算對象的中間。但這種表示方式,有時必須藉助括弧才能將運算順序表達清楚,而且處理也比較復雜。
1929年,波蘭邏輯學家Lukasiewicz提出一種不用括弧的邏輯符號體系,後來人們稱之為波蘭表示法(Polish notation)。波蘭表達式的特點是運算符位於運算對象的後面,因此稱為後綴表示。在對波蘭表達式進行運算,嚴格按照自左至右的順序進行。下面給出一些表達式及其相應的波蘭表達式。
表達式 波蘭表達式
A-B AB-
(A-B)*C+D AB-C*D+
A*(B+C/D)-E*F ABCD/+*EF*-
(B+C)/(A-D) BC+AD-/
OK,所謂表達式的線性化是指將中綴表達的表達式轉化為波蘭表達式。對於每一個表達式,利用棧可以把表達式變換成波蘭表達式,也可以利用棧來計算波蘭表達式的值。
至於轉換和計算的過程和第一種方法大同小異,這里就不再贅述了。
下面給出轉換和計算的具體實現程序——
/* first函數給出各個運算符的優先順序,其中=為表達式結束符 */
int first(char c)
{ int p;
switch(c)
{ case '*': p=2; break;
case '/': p=2; break;
case '+': p=1; break;
case '-': p=1; break;
case '(': p=0; break;
case '=': p=-1; break;
}
return(p);
}
/* 此函數實現中綴到後綴的轉換 */
/* M的值宏定義為20 */
/* sp[]為表達式數組 */
int mid_last()
{ int i=0,j=0; char c,sm[M];
c=s[0]; sm[0]='='; top=0;
while(c!='\0')
{ if(islower(c)) sp[j++]=c;
else switch(c)
{ case '+':
case '-':
case '*':
case '/': while(first(c)<=first(sm[top]))
sp[j++]=sm[top--];
sm[++top]=c; break;
case '(': sm[++top]=c; break;
case ')': while(sm[top]!='(')
sp[j++]=sm[top--];
top--; break;
default :return(1);
}
c=s[++i];
}
while(top>0) sp[j++]=sm[top--];
sp[j]='\0'; return(0);
}
/* 由後綴表達式來計算表達式的值 */
int calc()
{ int i=0,sm[M],tr; char c;
c=sp[0]; top=-1;
while(c!='\0')
{ if(islower(c)) sm[++top]=ver[c-'a'];/*在轉換過程中用abcd等來代替數,
這樣才可以更方便的處理非一位數,
ver數組中存放著這些字母所代替的數*/
else switch(c)
{ case '+': tr=sm[top--]; sm[top]+=tr; break;
case '-': tr=sm[top--]; sm[top]-=tr; break;
case '*': tr=sm[top--]; sm[top]*=tr; break;
case '/': tr=sm[top--];sm[top]/=tr;break;
default : return(1);
}
c=sp[++i];
}
if(top>0) return(1);
else
}
這樣這個程序基本上就算解決了,回過頭來拿這個程序來算一算文章開始的那個問題。哈哈,算出來了,原來如此簡單——(6-3)*10-6=24。
最後我總結了一下這其中容易出錯的地方——
1、 排列的時候由於一個數只能出現一次, 所以必然有一個判斷語句。但是用什麼來判斷,用大小顯然不行,因為有可能這四個數中有兩個或者以上的數是相同的。我的方法是給每一個數設置一個代號,在排列結束時,通過這個代號找到這個數。
2、在應用嵌套函數時,需仔細分析程序的執行過程,並對個別變數進行適當的調整(如j的值),程序才能正確的執行。
3、在分析括弧問題的時候要認真仔細,不要錯過任何一個可能的機會,也要盡量使程序變得簡單一些。不過我的分析可能也有問題,還請高手指點。
4、在用函數對一個數組進行處理的時候,一定要注意如果這個數組還需要再應用,就必須將它先保存起來,否則會出錯,而且是很嚴重的錯誤。
5、在處理用戶輸入的表達式時,由於一個十位數或者更高位數是被分解成各位數存放在數組中,所以需對它們進行處理,將它們轉化成實際的整型變數。另外,在轉化過程中,用一個字母來代替這個數,並將這個數存在一個數組中,且它在數組中的位置和代替它的這個字母有一定的聯系,這樣才能取回這個數。
6、由於在窮舉過程難免會出現計算過程中有除以0的計算,所以我們必須對calc函數種對於除的運算加以處理,否則程序會因為出錯而退出(Divide by 0)。
7、最後一個問題,本程序尚未解決。對於一些比較著名的題目,本程序無法解答。比如說5、5、5、1或者8、8、3、3。這是由於這些題目在計算的過程用到了小數,而本程序並沒有考慮到小數。
5. 如何在Linux發行版上安裝和配置KVM和Open vSwitch
首先,安裝用於構建OVS的依賴項。
$ sudo apt-get install build-essential libssl-dev linux-headers-$(uname -r)
通過源代碼來構建OVS,如下所示。下列步驟將構建OVS內核模塊以及OVS用戶空間工具。
$ wget http://openvswitch.org/releases/openvswitch-1.9.3.tar.gz
$ tar xvfvz openvswitch-1.9.3.tar.gz
$ cd openvswitch-1.9.3
$ ./configure --with-linux=/lib/moles/`uname -r`/build
$ make
接下來,繼續在/usr/local/share/下安裝OVS用戶空間組件:
$ sudo make install
下一步是,測試OVS內核模塊(安裝該模塊之前)。為此,先在內核中裝入內核模塊。
$ sudo insmod ./datapath/linux/openvswitch.ko
證實OVS內核模塊已成功裝入。
$ lsmod | grep openvswitch
openvswitch 97934 0
一旦你證實openvswitch.ko已成功裝入到內核中,繼續安裝內核模塊,如下所示。
$ sudo make moles_install
配置和啟動Open vSwitch
創建一個框架式OVS配置資料庫。
$ sudo mkdir /etc/openvswitch
$ sudo ovsdb-tool create /etc/openvswitch/conf.db ./vswit
chd/vswitch.ovsschema
啟動OVS資料庫伺服器。
$ sudo ovsdb-server --remote=punix:/usr/local/var/run/ope
nvswitch/db.sock - remote=db:Open_vSwitch,manager_options
--pidfile --detach
OVS配置資料庫初始化。
$ sudo ovs-vsctl --no-wait init
最後,啟動OVS守護程序。
$ sudo ovs-vswitchd --pidfile --detach
將KVM安裝在Ubuntu或Debian上
使用apt-get命令,安裝KVM和必要的用戶空間工具。
$ sudo apt-get install qemu-kvm libvirt-bin bridge-utils
virt-manager
將一個普通的非根用戶(如alice)添加到libvirtd群組,那樣該用戶不需要根用戶許可權,就能啟動虛擬機。
$ sudo adser alice libvirtd
退出,重新以該用戶身份登錄,讓群組成員的變更生效。
運行下面這個命令。如果你看到空空如也的虛擬機列表,這意味著KVM已成功設置完畢。
$ virsh -c qemu:///system list
Id Name State
為KVM配置Open vSwitch
現在是時候創建OVS網橋啟動腳本了,那樣啟動或終止虛擬機時,OVS就能自動配置。
安裝依賴項(用戶模式Linux實用工具),這些依賴項將用於處理Linux網橋模式。
$ sudo apt-get install uml-utilities
創建網橋啟動腳本,如下所示。
$ sudo vi /etc/openvswitch/ovs-ifup
#!/bin/sh
switch='br0'
/sbin/ifconfig $1 0.0.0.0 up
ovs-vsctl add-port ${switch} $1
$ sudo vi /etc/openvswitch/ovs-ifdown
#!/bin/sh
switch='br0'
/sbin/ifconfig $1 0.0.0.0 down
ovs-vsctl del-port ${switch} $1
$ sudo chmod +x /etc/openvswitch/ovs-if*
然後,創建一個默認的網橋br0,並添加一個物理網路介面,虛擬機將通過這個介面與外部網路進行聯系。在該教程中,我假設這類網路介面是eth5。
$ sudo ovs-vsctl add-br br0
$ sudo ovs-vsctl add-port br0 eth5
藉助KVM啟動虛擬機
現在你可以准備啟動訪客虛擬機了。
我假設,你已經准備好了一個訪客虛擬機映像(比如ubuntu-client.img)。使用下面這個命令,啟動訪客虛擬機。
$ sudo kvm -m 1024 -net nic,macaddr=11:11:11:EE:EE:EE -ne
t tap,script=/etc/openvswitch/ovs-ifup,downscript=/etc/op
envswitch/ovs-ifdown -vnc :1 -drive file=/home/dev/images
/ubuntu-client.img,boot=on
這會創建並啟動一個訪客虛擬機;一旦訪客虛擬機啟動,其虛擬介面就自動添加到OVS網橋br0。
你可以使用ovs-vsctl這個命令,核實OVS的狀態
6. openvswitch源碼 從哪個文件開始看
建議先去了解下ovs的架構,ovs代碼本身較為混亂,並且數據包處理(datapath)在內核空間,較為復雜。
大概了解模塊結構後,可以去看看網上相關的源碼分析,比自己看更快。
如果是自己去看,建議從一個bridge的創建到運行開始逐步深入,需要注意bridge的主循環中ctrlplane和dataplane沒有分離,大量代碼都是處理用戶配置修改。
7. ovs 刪除openflow流表
有如下三種方法可以刪除openflow流表:
a. controller/ovs-ofctl主動發命令(OFPFC_DELETE or OFPFC_DELETE_STRICT)刪除流表。OFPFC_DELETE_STRICT和OFPFC_DELETE 的區別是前者需要匹配所有的欄位才能刪除(包括優先順序),並且一次只能刪除一條流表,後者要求指定的欄位必須是流表的一個子集(不能指定優先順序),可以一次刪除多個流表。
b. 流表的超時機制: 添加流表時如果指定idle_timeout或者hard_timeout參數,則流表超時後將被刪除。如果不指定這倆參數,則默認不會被超時機制刪除。hard_timeout指定的超時時間是從創建流表,或者修改流表開始計時,超時時間到後,不管此流表有沒有被使用,都會被刪除。idle_timeout指定流表空閑超時時間,從最近流表被使用開始計時,如果指定時間內此流表沒有被使用,則被刪除。
c. 強制回收機制: 添加流表時,如果當前流表個數大於等於最大流表個數,則判斷是否可以強制回收之前添加的流表。可以通過Flow_Table里的overflow_policy參數指定當前流表個數大於等於最大流表個數時的行為,如果為refuse則拒絕添加新流表,如果為evict則強制刪除即將超時的流表。強制回收只考慮指定了超時時間的流表。
添加流表時,如果指定了超時時間,並且流表指定的field包含group指定的field,則會將流表添加到一個分組中。具體為根據group指定的這些field計算hash值,再根據hash值到table->eviction_groups_by_id查找struct eviction_group。然後根據超時時間計算優先順序,根據優先順序將此流表插入struct eviction_group
針對強制刪除流表,可以做如下實驗
下面分析下這三種情況下的源碼
controller/ovs-ofctl主動刪除流表
將流表從分類器中刪除
超時機制
添加流表時,如果指定了超時時間,則會將流表掛到鏈表ofproto->expirable上,在ovs-vswitchd的主循環中,會周期性的調用ofproto-dpif.c中的run函數,此函數會遍歷鏈表ofproto->expirable判斷流表是否超時,如果超時則將流表刪除。
evict強制刪除
添加流表時會將流表插入eviction_group中
當再次添加流表時,如果當前流表個數超過最大流表個數,則
8. 如何載入open vswitch kernel moudel
將Open vSwitch安裝在Ubuntu或Debian上
雖然OVS以程序包的方式出現在Ubuntu或Debian上,但我在此還是通過源代碼來構建OVS,這將擁有最新的功能特性和修正版。
首先,安裝用於構建OVS的依賴項。
$ sudo apt-get install build-essential libssl-dev linux-headers-$(uname -r)
通過源代碼來構建OVS,如下所示。下列步驟將構建OVS內核模塊以及OVS用戶空間工具。
9. openstack 基礎 什麼是ovs
使用的是Python和C++。 OpenStack是一個由NASA(美國國家航空航天局)和Rackspace合作研發並發起的,以Apache許可證授權的自由軟體和開放源代碼項目。 OpenStack是一個旨在為公共及私有雲的建設與管理提供軟體的開源項目。它的社區擁有超過130家...