• Mininet
    • 安装Mininet
    • mn命令行
      • 命令和选项
      • 自定义网络拓扑
      • 自定义网络参数
      • 自定义独立命名空间
  • Python API
  • 参考文档

    Mininet

    Mininet是一个由Stanford大学Nick研究小组开发的网络虚拟化平台,可以用来方便的测试、验证和研究OpenFlow和SDN网络。

    Mininet使用Linux Network Namespaces来创建虚拟节点,默认情况下,Mininet会为每一个host创建一个新的网络命名空间,同时在root Namespace(根进程命名空间)运行交换机和控制器的进程,因此这两个进程就共享host网络命名空间。由于每个主机都有各自独立的网络命名空间,我们就可以进行个性化的网络配置和网络程序部署。

    Mininet提供了命令行工具mn和Python API,用来构建网络拓扑。

    安装Mininet

    在Ubuntu系统上可以使用通过下面的命令来安装mininet:

    1. sudo apt-get install -y mininet openvswitch-testcontroller
    2. sudo /usr/bin/ovs-testcontroller /usr/bin/ovs-controller
    3. sudo service openvswitch-switch start

    然后运行下面的命令验证安装是否正常

    1. sudo mn --test pingall

    其他系统上,可以参考这里下载预置mininet的虚拟机镜像。

    mn命令行

    直接运行mn命令可以进入mininet控制台,默认创建一个minimal拓扑,即一个控制器、一台OpenFlow交换机并连着两台host。

    1. $ sudo mn
    2. mininet> nodes
    3. available nodes are:
    4. h1 h2 s1
    5. mininet> dump
    6. <Host h1: h1-eth0:10.0.0.1 pid=21291>
    7. <Host h2: h2-eth0:10.0.0.2 pid=21293>
    8. <OVSBridge s1: lo:127.0.0.1,s1-eth1:None,s1-eth2:None pid=21298>

    以节点名字开始的命令在节点内运行

    1. mininet> h1 ifconfig -a
    2. h1-eth0 Link encap:Ethernet HWaddr aa:7d:6a:7f:b5:52
    3. inet addr:10.0.0.1 Bcast:10.255.255.255 Mask:255.0.0.0
    4. inet6 addr: fe80::a87d:6aff:fe7f:b552/64 Scope:Link
    5. UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
    6. RX packets:15 errors:0 dropped:0 overruns:0 frame:0
    7. TX packets:8 errors:0 dropped:0 overruns:0 carrier:0
    8. collisions:0 txqueuelen:1000
    9. RX bytes:1206 (1.2 KB) TX bytes:648 (648.0 B)
    10. lo Link encap:Local Loopback
    11. inet addr:127.0.0.1 Mask:255.0.0.0
    12. inet6 addr: ::1/128 Scope:Host
    13. UP LOOPBACK RUNNING MTU:65536 Metric:1
    14. RX packets:0 errors:0 dropped:0 overruns:0 frame:0
    15. TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
    16. collisions:0 txqueuelen:1
    17. RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)
    18. mininet> h1 ping -c1 h2
    19. PING 10.0.0.2 (10.0.0.2) 56(84) bytes of data.
    20. 64 bytes from 10.0.0.2: icmp_seq=1 ttl=64 time=0.040 ms
    21. --- 10.0.0.2 ping statistics ---
    22. 1 packets transmitted, 1 received, 0% packet loss, time 0ms
    23. rtt min/avg/max/mdev = 0.040/0.040/0.040/0.000 ms

    命令和选项

    命令列表

    • py:执行python命令,如py h1.IP()
    • dump:查看各节点的信息
    • nodes:查看所有节点
    • net:查看链路信息
    • links:查看网络接口连接拓扑
    • link:开启或关闭网络接口,如link s1 h1 up
    • xterm:开启终端
    • dpctl:操作OpenFlow流表
    • pingall:自动ping测试

    选项列表

    • --topo:自定义拓扑,如linear|minimal|reversed|single|torus|tree
    • --link:自定义网络参数,如default|ovs|tc
    • --switch:自定义虚拟交换机,如default|ivs|lxbr|ovs|ovsbr|ovsk|user
    • --controller:自定义控制器,如default|none|nox|ovsc|ref|remote|ryu
    • --nat:自动设置NAT
    • --cluster:集群模式,将网络拓扑运行在多台机器上
    • --mac:自动设置主机mac
    • --arp:自动设置arp表项

    自定义网络拓扑

    默认的minimal拓扑比较简单,可以使用--topo选项设置网络拓扑。

    1. $ sudo mn --topo single,3
    2. mininet> dump
    3. <Host h1: h1-eth0:10.0.0.1 pid=22193>
    4. <Host h2: h2-eth0:10.0.0.2 pid=22195>
    5. <Host h3: h3-eth0:10.0.0.3 pid=22197>
    6. <OVSBridge s1: lo:127.0.0.1,s1-eth1:None,s1-eth2:None,s1-eth3:None pid=22202>

    自定义网络参数

    可以使用--link选项设置网络参数。

    1. $ sudo mn --link tc,bw=10,delay=10ms
    2. mininet> iperf
    3. *** Iperf: testing TCP bandwidth between h1 and h2
    4. *** Results: ['9.50 Mbits/sec', '12.0 Mbits/sec']

    自定义独立命名空间

    默认情况下,host在独立的netns中,而switch和controller都还是使用host netns,可以使用--innamespace选项将它们也放到独立的netns中。

    1. $ sudo mn --innamespace --switch user

    Python API

    对于复杂的网络,需要使用Python API来构建。

    比如,使用python API构造一个单switch接4台虚拟节点的示例

    1. #!/usr/bin/python
    2. from mininet.topo import Topo
    3. from mininet.net import Mininet
    4. from mininet.util import dumpNodeConnections
    5. from mininet.log import setLogLevel
    6. from mininet.node import OVSController
    7. class SingleSwitchTopo(Topo):
    8. "Single switch connected to n hosts."
    9. def build(self, n=2):
    10. switch = self.addSwitch('s1')
    11. # Python's range(N) generates 0..N-1
    12. for h in range(n):
    13. host = self.addHost('h%s' % (h + 1))
    14. self.addLink(host, switch)
    15. def simpleTest():
    16. "Create and test a simple network"
    17. topo = SingleSwitchTopo(n=4)
    18. net = Mininet(topo=topo, controller = OVSController)
    19. net.start()
    20. print "Dumping host connections"
    21. dumpNodeConnections(net.hosts)
    22. print "Testing network connectivity"
    23. net.pingAll()
    24. net.stop()
    25. topos = {"mytopo": SingleSwitchTopo}
    26. if __name__ == '__main__':
    27. # Tell mininet to print useful information
    28. setLogLevel('info')
    29. simpleTest()

    这个脚本可以直接运行,也可以使用mn命令启动

    1. $ sudo mn --custom a.py --topo mytopo,3 --test pingall

    Mininet v2.2.0+还提供了一个miniedit的可视化界面,更直观的编辑和查看网络拓扑。miniedit实际上是一个python脚本,存放在mininet安装目录的examples中,如/usr/lib/python2.7/dist-packages/mininet/examples/miniedit.py

    参考文档

    • Mininet官方网站
    • Mininet Github
    • REPRODUCING NETWORK RESEARCH