mininet是由斯坦福大学基于Linux Container架构开发的一个进程虚拟化网络仿真工具 可以创建一个包含主机 交换机 控制器和链路的虚拟网络 其交换机支持OpenFlow 具备高度灵活的自定义软件定义网络。
在ubuntu系统中安装mininet比较简单 直接通过命令行安装即可
apt install mininet
安装完成之后 即可在终端使用mn命令进行相关操作。不过这种方式相对比较抽象 不是特别直观。mininet 2.2.0版本之后包含了miniedit程序 可以进行可视化的配置。
直接在系统中搜索 miniedit.py 然后切换到该路径下 直接使用python miniedit.py即可启动。需要注意的是 该程序支持python2.7版本 如果使用python3的版本会出现诸如print函数报错之类的常见错误。另外需要tk的支持 apt install python-tk进行安装。
启动之后界面如下图所示
可以直接在主窗口中画出host switch 以及controller等各个组件 随后使用run菜单下单run即可运行。首次运行的时候出现如下错误
Cannot find required executable controller. Please make sure that it is installed and available in your $PATH: (/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin)
可以通过如下命令解决此问题
sudo ln /usr/bin/ovs-controller /usr/bin/controller
重新执行 则显示结果如下
通过File菜单中的 Export Level 2 script 命令 可以将相关设计保存为python源代码 之后可以随时复现该结构。例如上述结构的python代码如下
#!/usr/bin/python from mininet.net import Mininet from mininet.node import Controller, RemoteController, OVSController from mininet.node import CPULimitedHost, Host, Node from mininet.node import OVSKernelSwitch, UserSwitch from mininet.node import IVSSwitch from mininet.cli import CLI from mininet.log import setLogLevel, info from mininet.link import TClink, Intf from subprocess import call def myNetwork(): net Mininet( topo None, build False, ipbase 10.0.0.0/8 ) info( *** Adding controllern ) c0 net.addController(name c0 , controller Controller, protocol tcp , port 6633) info( *** Add switchesn ) s1 net.addSwitch( s1 , cls OVSKernelSwitch) s2 net.addSwitch( s2 , cls OVSKernelSwitch) info( *** Add hostsn ) h2 net.addHost( h2 , cls Host, ip 10.0.0.2 , defaultRoute None) h4 net.addHost( h4 , cls Host, ip 10.0.0.4 , defaultRoute None) h3 net.addHost( h3 , cls Host, ip 10.0.0.3 , defaultRoute None) h5 net.addHost( h5 , cls Host, ip 10.0.0.5 , defaultRoute None) h1 net.addHost( h1 , cls Host, ip 10.0.0.1 , defaultRoute None) info( *** Add linksn ) net.addlink(s1, h1) net.addlink(s1, h3) net.addlink(s2, h4) net.addlink(s2, h2) net.addlink(s2, h5) info( *** Starting networkn ) net.build() info( *** Starting controllersn ) for controller in net.controllers: controller.start() info( *** Starting switchesn ) net.get( s1 ).start([c0]) net.get( s2 ).start([c0]) info( *** Post configure switches and hostsn ) CLI(net) net.stop() if __name__ __main__ : setLogLevel( info ) myNetwork()



