[基于Mininet 1.0]
在openflow的实验中,Mininet可以说是一款非常有用,也是功能非常强大的模拟软件。相对于拿ns2来进行of仿真,自带Open Flow协议(1.0版),利用Open VSwitch作为虚拟平台,并将NOX控制器一并收入的Mininet显然可以让人省下很多精力。另外,Mininet的拓扑搭建异常简单,并且还有一个图形化的拓扑生成app(可惜是测试版的,不能把已经画好的拓扑存下来…)。正式因此,在弯曲评论的一篇文章中,Mininet被描述成“‘懒惰’网络研究者的福音”。所以赶快拿起电话吧!拨打800-xxx-xxx电话订购热线,更能享受6折优惠!

不过我在使用Mininet的时候,感觉控制台可以使用的命令少了点,也没有留出比较简单的api来支持用户自定义命令。这样,如果想在一个虚拟host较多的虚拟环境中做一些批量的事请就需要非常大的工作量,比如互ping(不过,这个功能倒是有)。

于是,为了找一个比较好的解决方法,我看了看Mininet的控制台部分的代码。出乎意料的事,控制台部分,乃至整个Mininet的基本架构都是用Python写出来的,于是花了一个下午做了个Mininet命令行用户自定义命令的模板。

先是功能部分代码。这些函数定义需要放在~/mininet/mininet/net.py中的Mininet类里面。
<br /> def dhcp( self, hosts=None ):<br /> if not hosts:<br /> hosts = self.hosts<br /> output( 'Dhclient: Based on pingall testn' )<br /> for node in hosts:<br /> node.cmd( 'dhclient' )<br /> return<br /> def dhcpAll( self ):<br /> return self.dhcp()<br />

上面的代码实际上就是一个大循环,然后让Mininet中的每一个虚拟主机都想DHCP服务器发出申请。写完功能代码,</code>然后就是在控制台中注册注册这个函数。具体位置在~/mininet/mininet/cli.py

<br /> def do_dhcpall( self, line ):<br /> "Dhcp for all hosts."<br /> print "Dhcp for all hosts."<br /> print "mn:", self.mn<br /> self.mn.dhcpAll()<br />

这段代码中,”dhcpall”是控制台中可以执行的命令,而这个函数的具体作用,就是在控制台收到”dhcpall”指令的时候,执行self.mn.dhcpAll()这个函数。这样,控制端的命令绑定也就完成了。不过,现在还没有完成。最后的一步是在mininet核心代码中注册。位置是~/mininet/scripts-2.6/mn

<br /> # optional tests to run<br /> TESTS = [ 'cli', 'build', 'dhcpall', 'pingall', 'pingpair',<br /> 'iperf', 'all', 'iperfudp', 'none' ]</p> <p>ALTSPELLING = { 'dhcpall': 'dhcpAll', 'pingall': 'pingAll',<br /> 'pingpair': 'pingPair', 'iperfudp': 'iperfUdp',<br /> 'iperfUDP': 'iperfUdp', 'prefixlen': 'prefixLen' }<br />
这样,代码的修改就完成了。最后还要重新编译一边mininet【因为是和C混编,所以这一步必须要做… 将~/mininet/util/install.sh中从git获取mininet包的语句注释掉(更新需要的命令如下:
echo “Installing Mininet core”<br /> pushd ~/mininet<br /> sudo make install<br /> popd
),然后再运行一次,Mininet修改版就可以用了~