Mininet 使用攻略
本演練演示了大多數的mininet命令以及與wireshark揭破起一起使用的典型用法。
演練將假設您的基本系統是mininet VM,或安裝了所有Open Flow工具和mininet的Ubuntu系統
注意:如果您使用的是UbuntuMininet2.0.0d4軟件包,他會使用稍微不同的語法Topo() - 如:
add_switch_ 和addSwitch,等待。如果你檢查Mininet源碼,你可能希望看2.0.0d4 標簽去看代碼。
1. 日常mininet用法
關於在命令中的注釋語法:
- $ 代表shell下鍵入linux命令
- mininet> 應該是Mininet的CLI中輸入Mininet命令
- 在root shell下鍵入的Linux命令
在每種情況下,只需要在右側鍵入命令,然后鍵入Enter。
顯示啟動項
鍵入以下命令顯示Mininet啟動選項幫助信息:
$ sudo mn -h
Start wireshark
使用OpenFlow Wireshark 解剖器查看控制流量,請現在后台打開wireshark:
sudo wireshark &
在Wireshark界面的filter框中,輸入這個過濾規則,然后單擊apply:
of
單擊菜單欄中Capture,單擊interfaces選項,然后選擇 loopback(lo)接口。
現在,wireshark已經開始抓包,但是沒有Openflow數據包展示在主界面。
注意:wireshark 是Mininet VM 鏡像自動安裝的,如果你使用的系統沒有安裝Wireshark和OpenFlow擴展,你可以使用Mininet的 install.sh 腳本來按照以下命令安裝:
cd ~
git clone https://github.com/mininet/miniet # if it's not already there
mininet/util/install.sh -w
如果Wireshark已經安裝了,但是你仍然不能運行它(例如 發生了異常,如 ’$DISPLAY not set’,請咨詢FAQ:https://github.com/mininet/mininet/wiki/FAQ#wiki-x11-forwarding)
設置X11 立刻啟用將會允許你運行其他GUI程序和我們之后會用到的xterm終端仿真器。
主機和交換機交互
$ sudo mn
默認的拓撲圖是最小的拓撲圖,包含一個OpenFlow 核心交換機簡潔之兩個主機,擴展OpenFlow 控制器。使用--topo==minimal命令可以在命令行查看這個拓撲的具體說明。其他拓撲也可以從盒子中獲得;詳細信息請通過mn -h 查看 --topo 的詳細內容。
這四個實體(兩個主機進程,一個交換機進程,一個基礎控制器)已經運行在虛擬機中,這個控制器可以在虛擬機外部,並且知道底部設備。
如果沒有制定的測試被作為參數發送,Mininet CLI 將會出現。
在wireshark 窗口,你應該看到顆心交換機連接到了依賴的控制器。
展示Mininet CLI命令:
mininet> help
展示節點
mininet> nodes
展示連接
mininet> net
轉儲所有節點信息
mininet> dump
你將會看到交換機和兩個主機被列舉出來。
如果在Mininet CLI中輸出的第一個字符串是主機、交換機或者控制器的名字,命令在這個節點被執行。運行一個命令在主機進程:
mininet> h1 ifconfig -a
你應該看到主機的 h1-eth0 和loopback(lo)接口。注意h1-eth-接口不能夠被看到在出事的linux系統當ifconfig被運行時,因為它決定於主機進程的網絡命名空間。
相反,默認情況下,交換機在跟 root 網絡命名空間中運行,因此運行一個命令在“交換機”中,類似於運行它同常規終端:
mininet> s1 ifconfig -a
這將會展示交換機接口,擴展虛擬機的連接(eth0)。
其他的強調網絡主機已經隔離網絡狀態的示例,需要同時運行arp和route在s1和h1上。
這將可能安置每一個主機、交換機和控制器在它自己的網絡隔離命名空間,但是這是沒有真實網絡條件去這樣做,除非你希望復制一個復雜的多控制器網絡。mininet支持這樣做,查看 ‘--innamespace’選項。
注意:這僅僅是網絡虛擬化,每個主機進程有相同的進程集合和目錄。例如,從一個主機進程打印進程列表:
mininet> h1 ps -a
者應該和root network 命名空間完全相同:
mininet> s1 ps -a
這可能在linux容器中使用獨立的進程空間,但是當前的Mininet 不會這樣做。將所有事都運行在root進程命名空間是方便於測試,因為這允許你從命令行中通過ps、kill等命令查看所有的進程。
測試兩台主機之間的連通性。
現在將要證實你能夠從host0 ping通 host1:
mininet> h1 ping -c 1 h2
如果一個帶有節點名的字符串之后在命令行中出現,節點名將會被替換為其ip地址;這發生在h2上。
你應該看到OpenFlow 控制流量,第一個主機ARP用於尋找第二個主機的mac地址,造成了一個packet_in信息進入了控制器,控制器之后發送了packet_out信息泛洪(洪水廣播包)到交換機的其他接口(在這個例子中,只有其他的數據端口)。第二台主機看到了ARP請求並且大宋了一個響應。這個響應進入了控制器,然后發送到了第一個主機並且執行下一個流表(flow entry)。
現在,第一個主機知道了第二個主機的mac地址,可以發送他的ping 通過ICMP相應請求。這個請求,伴隨着來自第二台主機的相應地響應,都進入了控制器,並且最終進入了下一個流表(result in a flow entry pushed down)(伴隨着實際的包發送出去)。
重復請求ping:
mininet> h1 ping -c 1 h2
你會看到,第二次ping的時間是遠小於第一次(<100us)。一個預裝在交換機中的流表覆蓋了ICMP ping流量,所以沒有控制流量生成,數據包迅速通過交換機。
一個更簡單的方法去運行測試是使用mininet CLI 內置的pingall 命令,這個命令會執行所有成對機器的ping:
mininet> pingall
運行一個簡單的web服務和客戶端
記住,ping並不是唯一一個你可以運行在主機上的命令!mininet主機可與運行任何底層linux系統(或者虛擬機)和他的文件系統支持的命令或者應用程序。你亦可以加入任何的 bash 命令,包括任務控制(&,jobs,kill,等)
接下來,嘗試在h1上啟動一個簡單的HTTP 服務,在h2上發出請求,之后關閉web服務:
mininet> h1 python -m SimpleHTTPServer 80 &
mininet> h2 wget -O - h1
...
h1 kill %python
退出CLI
mininet> exit
清理
如果Mininet由於某些原因出了問題,清理它:
$sudo mn -c
高級啟動選項
Run a Regression Test
你不需要進入CLI;mininet也可以被用於運行獨立回歸測試。
運行回歸測試:
sudo mn --test pingpair
這個命令創建了一個最小的拓撲,啟動了OpenFlow飲用控制,運行了一個全對ping的測試,並且卸下拓撲和控制器(關閉拓撲和控制器)。
另一個有用的測試是iperf(大概10秒完成)
sudo mn --test iperf
這個命令創建了一個相同的mininet,在新創建的主機上運行一個iperf 客戶端,並且測試了網絡。
改變拓撲大小和類型
默認的拓撲時簡單的交換機連接着兩個主機,你可以使用 --topo、通過這些技術的創建參數將其轉變成不同的拓撲。例如,使用一個交換機和三個主機,證實all-pairs ping 連通:
運行一個回歸測試:
$ sudo mn --test pingall --topo single,3
再例如,使用線性拓撲(每個交換機有一個主機,所有的交換機連接在一個線上):
$ sudo mn --test pingall --topo linear,4
參數化拓撲時mininet最有用和強大的特征。
link 變量
mininet 2.0允許你設置連接參數。使用一下命令,參數甚至可以被自動設置
$ sudo mn --link tc,bw=10,delay=10ms
mininet > iperf
...
mininet > h1 ping -c10 h2
如果每個連接推遲10ms,一個回路時間(RTT, round trip time)應該推遲40ms,從ICMP請求經過兩條路(一個到交換機,一個到目的主機),並且ICMP回復經過兩條路在回來。
你可以通過Mininet’s python API 自定義每個連接,但是現在你需要繼續這個教程。
可調節的輸出長度
輸出部分詳細情況,顯示了mininet在啟動和關閉過程中干了什么。共有6個等級(info,warning,critical,error,debug,output)。我們可以使用 -v 變量
的形式進行修改 。默認的冗余等級是 info
- 嘗試使用
debug
查看其缺失的詳細信息。
$ sudo mn -v debug
- 嘗試使用output設置顯示CLI輸出:
$sudo mn -v output
mininet> exit
在CLI外,其他打印等級也可以被使用,例如 warning
就是使用回歸測試隱藏不需要的函數輸出。
自定義拓撲
自定義拓撲可以很輕松的使用簡單的python API完成。custom/topo-2sw-2host.py
就是一個例子。這個例子完成了兩個交換機直接連接、每個交換機連接有一台主機。
"""
注意⚠️,由於兼容問題,盡量不要打中文。
topo-2sw-2host.py
python
兩個直接連接的交換機,每個交換機上連接一個主機
host --- switch --- switch ---host
以鍵值對的方式加入到'topos'字典,生成我們全新定義的拓撲,允許從命令行通過’--topo=mytopo‘進入
"""
from minnet.topo import Topo
class MyTopo(Topo):
"Simple topology example."
def __init__(self):
"構造函數,創建自定義拓撲"
#initialize topology
Topo.__init__(self)
#增加主機和交換機
leftHost = self.addHost('h1')
rightHost = self.addHost('h2')
leftSwitch = self.addSwitch('s3')
rightSwitch = self.addSwitch('s4')
# 增加連接
self.addLink(leftHost, leftSwitch)
self.addLink(leftSwitch, rightSwitch)
self.addLink(rightSwitch, rightHost)
topos = {'mytopo':(lamabda:MyTopo())}
當提供自定的mininet文件,它可以增加一個新的拓撲、交換機類型和命令行測試。如:
$ sudo mn --custom ~/mininet/custom/topo-2sw-2host.py --topo mytopo --test pingall
ID = MAC
主機每次開機都有隨機分配的MAC地址。這可能導致調試困難,因為每次mininet被創建,Mac地址就該拜年。所以將流量控制和和特定的主機相關聯是比較困難的。
--mac
選項是極其有效的,設置主機MAC和ip地址設施的小巧、更容易讀的ID。
使用--mac
之前:
mininet> h1 ifconfig
h1-eth0 Link encap:Ethernet HWaddr 36:53:96:85:7a:7f
inet addr:10.0.0.1 Bcast:10.255.255.255 Mask:255.0.0.0
UP BROADCAST RUNNING 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:1000
RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)
使用后:
mininet> h1 ifconfig
h1-eth0 Link encap:Ethernet HWaddr 00:00:00:00:00:01
inet addr:10.0.0.1 Bcast:10.255.255.255 Mask:255.0.0.0
UP BROADCAST RUNNING 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:1000
RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)
相比之下,交換機數據端口的mac地址變化是linux隨機賦值的。你可以使用OpenFlow分配一個mac地址給數據端口。這里有些你現在可以忽略不計的微妙的點。
XTerm Display
更多復雜的測試,你可以啟動mininet並且擁有多個一個或者多個窗口。
通過-x
為每個主機和交換機啟動xterm:
$ sudo mn -x
稍等一下,xterms就會彈出,並且自動設置窗口名稱。
或者你也可以調取xterm如下所示:
默認情況下,只有主機被放入單獨的命名空間,每個交換機的窗口是不必要的(也就是說,相當於常規終端),但是可以是一個方便的地方去運行,剩下交換機調試命令,就像流量計數轉儲。
Xterms 也用於運行你可能會取消的、僅僅只想看輸出的交互命令。
以下事例在自己做實驗時不可運行。narkive 上的資料 顯示,dpctl屬於OpenFlow老舊的命令。但是網上也有資料顯示可以執行,如dpctl 命令實踐-heimafeitian。官方對於dpctl無法執行問題解答。
例如:
在標簽為“switch:s1(root)” xterm窗口中運行:
dpctl dump-flows tcp:127.0.0.1:6634
什么都不會顯示;交換機沒有流量流入。要和其他交換機一起用使用dpctl
,啟動冗余模式的mininet,當交換機被創建時查看他們的監聽端口。
現在,在標簽為host:h1
的xterm窗口中運行:
ping 10.0.0.2
返回到s1並且
轉儲流: # dpctl dump-flows tcp:127.0.0.1:6634
你會看到多個流量流入。或者(一般情況下更方便),你可以看到dpctl
冰凌構建進入了mininet CLI 而不需要任何xterm窗口或者特殊方法的交換機的Ip和端口。
你可以通過檢查ifconfig
判斷xterm是否在root命名空間下;如果所有的接口都顯示(包括eth0
),這是在root命名空間的。另外,其標題應該包含“(root)”。
從mininetCLI中關閉設置:
mininet> exit
這些xterm窗口應該自動關閉
如果以上實驗可能無法完成。使用 ovs-ofctl show s1
也能達到類似效果
tip: ovs-ofctl、ovs-dpctl和dpctl的區別
- ovs-ofctl :在所有的OpenFlow交換機上(不僅僅是OpenFlow vSwitch,而是任意OpenFlow switch)
- ovs-dpctl:工作於linux 內核 數據通路上。
- dpctl 是一個從OpenFlow參考實現的古董,它包含了部分ovs-ofctl 和 ova-dpctl it includes aspects of ovs-ofctl and ovs-dpctl.
官方對於dpctl無法使用的解決方案:
dpctl應該可以在斯坦福 OpenFlow參考時限或CPqD相同版本中正常使用。
但是你可能不想用dpctl,而是全部替換為ovs-ofctl。ovs-ofctl在安裝和在OVS中使用時非常方便的,重要的是,會真的轉出完整的流表(不像ovs-dpctl)
如果你想運行Open v S為 i 推出,或者需要開放在OVS或者參考交換機上打開監聽端口以便於你可以連接進入該端口,請繼續閱讀:
1.如果你想要使用Open vSwitch,shell提示符中正確的命令是:
$ sudo ovs-ofctl dump-flows s1
(如果你嘗試在Open vSwitch上使用ovs-dpctl,你只能看到在內核中的緩存流,而不是交換機中所有的流表)
2. 在mininet提示符中正確的命令是:
mininet> dpctl dump-flows
轉儲所有交換機的數據流,支持OVS 和部分涉及的交換機。
如果你運行的是OVS,你可以使用ovs-ofctl
命令,傳入交換機名字,通過文件系統進行連接到它:
mininet> sh ovs-ofctl dump-flows s1
或者,從shell提示符:
$ ovs-ofctl dump-flows s1
- 如果要在交換機上打開偵聽端口,你需要指定基本的監聽端口
net = Mininet(topo=topo, listenPort=6634 )
端口將會從你指定的值開始分配。
注意,如果你想要去轉儲流,則需要打開一個偵聽端口;然后你就可以使用dpctl:
$ dpctl dump-flows tcp:localhost:6634
注意ova-ofctl不能使用localhost,而應該使用127.0.0.1:
$ ovs-ofctl dump-flows tcp:127.0.0.1:6634
其他的交換類型
可以使用其他交換類型。例如,運行user-space交換機
$ sudo mn --switch user --test iperf
注意,相對之前使用內科的交換機,TCP iperf-reported 寬帶會低得多。
如果你之前做了ping測試顯示,你應該注意到高延遲,從現在數據包包必須經歷額外的內核到用戶空間的轉換。ping時間將會更加可變,表示主機的用戶空間進程可以由系統調度進出。
另一方面,用戶空間交換機可能是實現新功能一個很好的起點。尤其是軟件性能要求不高時。
另一個交換機類型的例子是Open vSwitch(OVS),這個交換機是預裝在Mininet虛擬機上的。Iperf-reported TCP 帶寬類似於OpenFlow核心模塊,也可能更快:
$ sudo mn --switch ovsk --test iperf
mininet 基准
使用--test none
記錄啟動和關閉拓撲的時間:
$ sudo mn --test none
所有信息都在自己的命名空間(僅限用戶交換機)
默認的,主機放在他們自己的命名空間,而交換機和控制器是在root命名空間。為了將交換機放入自己的命名空間,我們需要使用--innamespace
選項:
$ sudo mn --innamespace --switch user
替代使用loopback,交換機將通過單獨的控制橋連接與控制器對話。就其本身而言,這個選項不是十分有用,但是它提供了一個隔離不同交換機的方法。
注意,截止至2012年11月19日,此選項仍不可在Open vSwitch上使用。
part3 :mininet 命令行接口(CLI,Command-Line interface) 命令
為了查看CLI選項列表,請先啟動一個最小的拓撲並使他運行。建立mininet:
$ sudo mn
顯示選項:
mininet> help
python解釋器:
如果第一個mininet 命令行中,第一個短語是py,之后這個命令是用Python執行的。這對擴展mininet和談妥起內部工作方式是很有用的。每個主機、交換機和控制器都有關聯節點對象。
在Mininet CLI中運行:
mininet> py 'hello ' + 'world'
打印可訪問的本地變量:
mininet> py locals()
然后,查看變量擁有的方法和屬性,使用dir()
函數:
mininet> py dir(s1)
你可以通過使用help()
方法閱讀在線文檔,獲取每個節點可以調用的方法:
mininet> py help(h1)(press "q" to quit reading the documentation)
你也可以查詢變量的方法:
mininet> py h1.IP()
link UP/Down(接通/斷開)
為了容錯測試,建立/斷開連接可能是有幫助的。
斷開虛擬網絡的兩半:
mininet\> link s1 h1 down
你應該看到一個OpenFlow 端口狀態更改通知被生成。再將其調整為連接狀態:
mininet> link s1 h1 up
XTerm 展示
展示h1和h2的XTerm窗口:
mininet> xterm h1 h2
第四部分:Python API 示例
源碼中包含的示例目錄包含了如何使用Mininet‘s python API的例子,以及暫時沒有合並到住代碼的潛在有用的代碼。
注意:如開頭所述,本演練假定您使用的是Mininet VM,其中包含您所需要的所有內容,或者是用飽含所有相關工具的本地安裝。包括OpenFlow 參考實現的一部分—引用控制器controller
。如果您還沒有安裝,可以使用install.sh -f 安裝。
每個主機的SSH守護程序:
一個可能特別有用的例子,在每台主機上運行一個SSH守護程序
$ sudo ~/mininet/examples/sshd.py
從另一個終端,你可以ssh到任何主機並且運行交互式命令:
$ ssh 10.0.0.1
$ ping 10.0.0.2
推出SSH示例mininet:
$ exit
在你閱讀完了mininet 介紹 關於Python API的介紹后,你可能希望重訪這個例子。
第五部分:引導完成
恭喜,你已經完成mininet引導。請自由嘗試新的拓撲和控制器,或者查看源碼吧。
下一步掌握mininet
如果你還沒有完成,你應該繼續閱讀 OpenFlow 教程。
雖然使用Mininet CLI 是很明智的,但是當你掌握了Python API后,mininet 會更有用。mininet介紹 提供了Mininet和Python API的介紹。
如果你想知道如何使用遠程控制控制器(比如一個運行在外部的),我們將會在接下來的部分解釋。
附錄:補充資料
這些不是必要的知識,但是你會發現者很有用。
使用遠程控制器
注意,這一步不是默認的引導之一;主要用於在虛擬機外運行着一個控制器,例如在VM主機,或者一個單獨的PC。OPenFlow tutorial 使用 controller --remote
啟動一個您使用一個控制器框架,如POX,NOX,Beacon 或者Floodlight 創建的簡單學習交換機,。
當你啟動mininet網絡,每個交互那集可以連接到一個遠程控制器-可以在虛擬機、不在虛擬機而是你的主機、或者是世界上任意的地方。
這個安裝可能是方便的,如果你已經有一個自定義版本的控制器框架和開發工具安裝在你本地機器上,或者你想要測試一個控制器運行在不同的物理機器上(甚至可以運行在雲上)。
如果你想要試試,填寫主機IP 和/或 監聽端口:
$sudo mn controller=remote,ip=[controller IP],port=[controller listening port]
例如,運行一個POX框架的簡單學習交換機,你可以這樣做:
$ cd ~/pox
$ ./pox.py forwarding.12_learning
在這個窗口,同時在另一個窗口啟動mininet並且連接遠程交換機(實際上是本地運行,但是實在mininet控制之外)
$ sudo mn --controller=remote,ip=127.0.0.1,port=6633
注意,者實際上是默認Ip地址和端口信息
如果你生成了一些流量(如:h1 ping h2)你應該能夠觀察到一些在POX窗口觀察到一些輸出,交換機已經連接並且流表像已經被安裝。
很多OpenFlow 控制器框架都是現成,只要啟動他們,指定遠程控制器選項、填入正確的控制器運行機器Ip地址和艦艇端口,就可以輕松的和mininet一起工作。
NOX classic
mininet默認安裝(使用util/install.sh -a
)不會安裝NOX Classic。如果你想要安裝他,運行sudo ~/mininet/util/install.sh -x
。
注意,NOX Classic 已經被棄用,將來可能不受支持。
用Nox運行Nox app pyswitch
運行回歸測試,NOX_CORE_DIR
環境變量必須被設置包含Nox可執行命令的目錄。
首先,運行Nox:
cd $NOX_CORE_DIR
$ ./nox_core -v -i ptcp:
ctrl-C 結束Nox進程,然后運行一個帶有Nox pyswitch 的測試:
$ cd
$ sudo -E mn --controller=nox,pyswitch --test pingpair
注意,—controller選項有一個方便的語法為了指定控制器類型選項(在本例中,nox運行pyswitch)。
當Nox讀取和交換機連接時,需要等待幾秒,但是之后他應該可以完成ping操作。
注意,這是,我們通過sudo -E
調用mn,為了保證NOX_CORE_DIR
環境變量。如果你是運行nox 遠程交換機,使用--controller remote
,之后的-E
選項不再是必要的。相應的,你可以通過sudo visudo
改變/etc/sudoers
文件第一行,將env_reset
變為:
Defaults ~env_reset
這樣,運行sudo
的環境變量設知識就不會改變。
文中引用:
mininet walkthrough
mininet introduction GitHub
dpctl報錯問題: Error encountered on issuing dpctl to dump-flows
dpctl 命令實踐