寫這篇博客是爲了給個人愚蠢和浪費的6個小時買單!node
我用Mininet建立過很多拓撲了,此次建立的拓撲很是簡單,以下圖,建立拓撲的代碼見github。在之前的拓撲建立過程當中,我都是用標準模板去修改一些邏輯,主要包括建立的拓撲邏輯和建好拓撲以後的一些測試代碼,此次因爲代碼比較簡單,因此基本都是從頭開始寫的。python
1 3 |---------sw2--------| | |2 | 1|2 | |1 h1------sw1 | sw4-------h2 |3 | 3| 2 | |3 | |---------sw3--------| 1 2
很快寫好了源碼,直接運行,卻發如今通過一小段時間時候直接跳入Mininet交互界面,我輸入了nodes,也顯示出了全部的交換機主機和控制器,輸入links也顯示鏈路正常,可是卻不出現之前熟悉的adding hosts, adding switches等這些熟悉的提示信息,因此覺得拓撲建的有問題,修改了一些無傷大雅的代碼以後,發現仍是一樣的問題,因此拿出了以前的代碼,比較,修改,運行,比較,修改,運行,可是卻老是不打印信息,搞了很久,終於在最後注意到了平時的一句代碼setLogLevel("info"),而我一直忽略他,因此就順便了解下Mininet的log結構。
Mininet的log等級並無什麼難度,直接使用的python的logging模塊,python的logging模塊分六個等級:git
這些級別其實對應的都是一個值,在上面的六個等級中,從上到下值依次遞增,好比從0到50,在Mininet中,除了上面六個,新增長了一個值爲25d的OUTPUT層,並且這層是Mininet的默認log層,即在建立拓撲的代碼中要是沒有用setLogLevel()函數來指定其餘的日誌等級,那麼OUTPUT即是默認的等,OUTPUT介於info和warning之間,Mininet稱之爲CLI info,即他只容許用戶看到Mininet對本身命令的相應,也就是我上面說的在Mininet CLI界面下輸入nodes這些命令,他是有輸出信息的,因此提醒你們在使用Mininet的時候注意他的日誌系統。github
剛剛有人諮詢我Mininet創建拓撲的問題,對於熟悉Mininet的人來講,用Mininet模擬網絡更多的工做是如何組織拓撲,如何利用list,dict或者其餘文件處理數據來達到本身的目的,但對於初學者,簡單的拓撲可能更便於學習,因此我將這個簡單拓撲的源碼附在下面:網絡
#coding="utf-8" from os import getuid from mininet.log import lg, info, setLogLevel from mininet.cli import CLI from mininet.net import Mininet from mininet.topo import Topo from mininet.link import Link, Intf from mininet.node import Host, OVSKernelSwitch, Controller, RemoteController class LisaTopo( Topo ): "Topology for LISA" def __init__( self ): #super(LisaTopo, self).__init__() Topo.__init__(self) # Set topology info hosts = [1, 2] switches = [1, 2, 3, 4] links = [{(1, 2):(2, 1)}, {(1, 3):(3, 1)}, {(2, 3):(2, 3)}, {(2, 4):(3, 1)}, {(3, 4):(2, 3)}] links_sw_host = [{(1, 1):(1, 1)}, {(2, 4):(1, 2)}] # Wire up switches for link in links: s1 = self.addSwitch("s%s" % link.keys()[0][0]) s2 = self.addSwitch("s%s" % link.keys()[0][1]) self.addLink(s1, s2 , link.values()[0][0], link.values()[0][1]) # Wire up hosts for link in links_sw_host: h1 = self.addHost("h%s" % link.keys()[0][0]) s2 = self.addSwitch("s%s" % link.keys()[0][1]) self.addLink(h1, s2 , link.values()[0][0], link.values()[0][1]) def LisaTopoTest(): topo = LisaTopo() main_controller = lambda a:RemoteController(a, ip="localhost",port=6633) net = Mininet( topo=topo, switch=OVSKernelSwitch, controller=main_controller) net.start() CLI( net ) net.stop() if __name__ == '__main__': if getuid()!=0: print "Please run this script as root / use sudo." exit(-1) setLogLevel("info") LisaTopoTest()