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 controller\n' )
c0=net.addController(name='c0',
controller=Controller,
protocol='tcp',
port=6633)
info( '*** Add switches\n')
s1 = net.addSwitch('s1', cls=OVSKernelSwitch)
s2 = net.addSwitch('s2', cls=OVSKernelSwitch)
info( '*** Add hosts\n')
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 links\n')
net.addLink(s1, h1)
net.addLink(s1, h3)
net.addLink(s2, h4)
net.addLink(s2, h2)
net.addLink(s2, h5)
info( '*** Starting network\n')
net.build()
info( '*** Starting controllers\n')
for controller in net.controllers:
controller.start()
info( '*** Starting switches\n')
net.get('s1').start([c0])
net.get('s2').start([c0])
info( '*** Post configure switches and hosts\n')
CLI(net)
net.stop()
if __name__ == '__main__':
setLogLevel( 'info' )
myNetwork()