• Mininet在创建拓扑的过程中为什么不打印信息了——了解Mininet的log系统


    前言

    写这篇博客是为了给我的愚蠢和浪费的6个小时买单!

    过程原因分析

    我用Mininet创建过不少拓扑了,这次创建的拓扑非常简单,如下图,创建拓扑的代码见github。在以前的拓扑创建过程中,我都是用标准模板去修改一些逻辑,主要包括创建的拓扑逻辑和建好拓扑之后的一些测试代码,这次由于代码比较简单,所以基本都是从头开始写的。

    	                  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模块分六个等级:

    • notest
    • debug
    • info
    • warning
    • error
    • critical

    这些级别其实对应的都是一个值,在上面的六个等级中,从上到下值依次递增,比如从0到50,在Mininet中,除了上面六个,新增加了一个值为25d的OUTPUT层,而且这层是Mininet的默认log层,即在创建拓扑的代码中要是没有用setLogLevel()函数来指定其他的日志等级,那么OUTPUT便是默认的等,OUTPUT介于info和warning之间,Mininet称之为CLI info,即他只允许用户看到Mininet对自己命令的相应,也就是我上面说的在Mininet CLI界面下输入nodes这些命令,他是有输出信息的,所以提醒大家在使用Mininet的时候注意他的日志系统。

    刚刚有人咨询我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()
        
    
    

    总结

  • 相关阅读:
    pandas属性和方法
    os模块常用方法
    读/写xlsx文件
    读/写docx文件
    文件基本用法
    jieba.lcut方法
    移动端设置input属性disabled样式
    移动端日期选择,下拉框选择效果
    css背景色渐变代码
    拖动div元素
  • 原文地址:https://www.cnblogs.com/cotyb/p/5275718.html
Copyright © 2020-2023  润新知