Ubuntu18.04 mininet+pox+poxdesk配置

前言

朋友最近在上SDN的课程,Software Defined Network,需要配置mininet与pox控制器。
应朋友的要求,研究了不少时间,似乎国内网站暂时没有很新的教程,所以想来写写,希望能给读者一些帮助。
这个教程希望的是短平快的实现所需的功能,所以一切安装以简单为主,尽量少的代码操作,其中如果有错误还希望各位读者点评指出

关于系统

Ubuntu20.04的坑

笔者的实操,Ubuntu20.04存在一个问题,即如果安装的语言选择了中文,后续mininet会无法ping通,显示could not parse…,当切换为English后,情况便成功了,如果有读者是Ubuntu20.04的系统,应当先切换为英文系统保证后续可以完成pingall的操作。

mininet的安装

安装部署

Github链接
读者可以选择源码安装,但一般而言,本着能简单就简单的思路,我们稳定地选择apt库

sudo apt-get install mininet

好了现在mininet就安装完了……
相比于Github库,直接apt-get安装的mininet没有pox和openflow,但我们可以在后面拼积木一样的把这些都拼起来。

测试

sudo mn --test pingall

当出现以下内容时,就说明mininet安装成功了。

*** Ping: testing ping reachability
h1 -> h2 
h2 -> h1 
*** Results: 0% dropped (2/2 received)

pox+poxdesk

Github链接-Getting Started

安装

这里安装就不像上面的sudo apt-get那么无脑了(hh)
运行以下的代码:

git clone https://github.com/noxrepo/pox
cd pox
git checkout betta
cd ext
git clone https://github.com/MurphyMc/poxdesk
cd poxdesk
wget http://downloads.sourceforge.net/qooxdoo/qooxdoo-2.0.2-sdk.zip
unzip qooxdoo-2.0.2-sdk.zip
mv qooxdoo-2.0.2-sdk qx
cd poxdesk
./generate.py
cd ../../..
./pox.py samples.pretty_log web messenger messenger.log_service messenger.ajax_transport openflow.of_service poxdesk

注意: 如果你之前有安装过pox,一定要保证你的pox是betta分支查询命令如下:

#记得进入你安装pox的目录
git branch -a
git checkout betta

部署

./pox.py samples.pretty_log web messenger messenger.log_service messenger.ajax_transport openflow.of_service poxdesk

在执行了以上的命令后,终端应该会显示以下命令:

POX 0.1.0 (betta) / Copyright 2011-2013 James McCauley, et al.
[core                   ] POX 0.1.0 (betta) is up.

此时另外开启一个终端,输入以下命令:

sudo mn --topo=tree,4,3 --controller=remote,ip=127.0.0.1,port=6633

打开浏览器输入http://127.0.0.1:8000,进入poxdesk
你就会发现以下的画面:
在这里插入图片描述
点击左下角的POX按键打开topoViewer,你会惊奇的发现,什么都没有。
是的,就是什么都没有……
这是因为我们没有加载好pox的组件。所以组件应该如何加载呢?

根据参考资料1,我们看到:

pox.py is the entry point of the program and requires the
openflow.of_01 library to explain the following parameters, and forwarding.l2_learning is a component provided by POX. POX opens port 6633 listening by default.

所以上面,其实我们漏掉了openflow.of_01和forwarding.l2_learning的组件。

pox.py是程序的入口,需要openflow.of_01库解释后面的参数,forwarding.l2_learning为POX提供的组件。POX默认开启6633端口监听。

poxdesk.tinytopo可以自动识别topo,poxdesk.terminal可以使用linux
terminal(在web上操作terminal)。上面命令的结尾添加py就可以出现熟悉的pox>命令模式,这时可以在web上看到下联的of-switch.

添加组件后让我们重新开启pox:

./pox.py samples.pretty_log web messenger messenger.log_service messenger.ajax_transport openflow.of_service poxdesk  poxdesk.terminal  poxdesk.tinytopo openflow.discovery forwarding.l2_learning py

再打开topoViewer就有如下的拓扑结构了:
在这里插入图片描述

自定义拓扑结构

许多读者可能发现,如果自己定义拓扑结构,似乎光凭借以上的命令生成的树并不稳定,节点之间的连接时常会断开。这还是因为没有加载好pox组件的原因,在这里我举一个经典的Fat Tree网络来说明。

tree.py(自定义拓扑网络)

以下是代码信息:

#!/usr/bin/env python

from mininet.net import Mininet
from mininet.node import Controller, RemoteController
from mininet.cli import CLI
from mininet.log import setLogLevel, info
from mininet.link import Link, Intf, TCLink
from mininet.topo import Topo
from mininet.util import dumpNodeConnections
import logging
import os 

logging.basicConfig(level=logging.DEBUG)
logger = logging.getLogger( __name__ )

class HugeTopo(Topo):
    logger.debug("Class HugeTopo")
    CoreSwitchList = []
    AggSwitchList = []
    EdgeSwitchList = []
    HostList = []
    iNUMBER = 0
    def __init__(self):
        logger.debug("Class HugeTopo init")
        iNUMBER = 4

        self.iNUMBER = iNUMBER
        self.iCoreLayerSwitch = iNUMBER
        self.iAggLayerSwitch = iNUMBER * 2
        self.iEdgeLayerSwitch = iNUMBER * 2
        self.iHost = self.iEdgeLayerSwitch * 2 


        #Init Topo
        Topo.__init__(self)

        logger.debug("Start create Core Layer Swich")
        self.createCoreLayerSwitch(self.iCoreLayerSwitch)
        logger.debug("Start create Agg Layer Swich ")
        self.createAggLayerSwitch(self.iAggLayerSwitch)
        logger.debug("Start create Edge Layer Swich ")
        self.createEdgeLayerSwitch(self.iEdgeLayerSwitch)
        logger.debug("Start create Host")
        self.createHost(self.iHost)

        self.createLink()
    """
    Create Switch and Host
    """

    def createCoreLayerSwitch(self, NUMBER):
        logger.debug("Create Core Layer")
        for x in range(1, NUMBER+1):
            PREFIX = "100"
            if x >= int(10):
                PREFIX = "10"
            self.CoreSwitchList.append(self.addSwitch(PREFIX + str(x)))

    def createAggLayerSwitch(self, NUMBER):
        logger.debug( "Create Agg Layer")
        for x in range(1, NUMBER+1):
            PREFIX = "200"
            if x >= int(10):
                PREFIX = "20"
            self.AggSwitchList.append(self.addSwitch(PREFIX + str(x)))

    def createEdgeLayerSwitch(self, NUMBER):
        logger.debug("Create Edge Layer")
        for x in range(1, NUMBER+1):
            PREFIX = "300"
            if x >= int(10):
                PREFIX = "30"
            self.EdgeSwitchList.append(self.addSwitch(PREFIX + str(x)))

    def createHost(self, NUMBER):
        logger.debug("Create Host")
        for x in range(1, NUMBER+1):
            PREFIX = "400"
            if x >= int(10):
                PREFIX = "40"
            self.HostList.append(self.addHost(PREFIX + str(x))) 

    """
    Create Link 
    """
    def createLink(self):
        logger.debug("Create Core to Agg")
        for x in range(0, self.iAggLayerSwitch, 2):
            self.addLink(self.CoreSwitchList[0], self.AggSwitchList[x])
            self.addLink(self.CoreSwitchList[1], self.AggSwitchList[x])
        for x in range(1, self.iAggLayerSwitch, 2):
            self.addLink(self.CoreSwitchList[2], self.AggSwitchList[x])
            self.addLink(self.CoreSwitchList[3], self.AggSwitchList[x])

        logger.debug("Create Agg to Edge")
        for x in range(0, self.iAggLayerSwitch, 2):
            self.addLink(self.AggSwitchList[x], self.EdgeSwitchList[x])
            self.addLink(self.AggSwitchList[x], self.EdgeSwitchList[x+1])
            self.addLink(self.AggSwitchList[x+1], self.EdgeSwitchList[x])
            self.addLink(self.AggSwitchList[x+1], self.EdgeSwitchList[x+1])

        logger.debug("Create Edge to Host")
        for x in range(0, self.iEdgeLayerSwitch):
            ## limit = 2 * x + 1 
            self.addLink(self.EdgeSwitchList[x], self.HostList[2 * x])
            self.addLink(self.EdgeSwitchList[x], self.HostList[2 * x + 1])


topos = { 'mytopo': ( lambda: HugeTopo() ) }

pox+poxdesk加载组件

./pox.py forwarding.l2_learning openflow.spanning_tree --no-flood --hold-down log.level --DEBUG samples.pretty_log openflow.discovery web messenger messenger.log_service messenger.ajax_transport openflow.of_service poxdesk  poxdesk.terminal  poxdesk.tinytopo host_tracker openflow.of_01 --address=127.0.0.1 --port=6633

mininet启动命令

# 进入到tree.py的路径下
sudo mn --custom tree.py --topo mytopo --mac --switch=ovsk --controller=remote,ip=127.0.0.1,port=6633

运行了以上三条指令,便可以得到Fat Tree的经典拓扑图:
在这里插入图片描述
可以看到主要是加入了openflow.spanning_tree --no-flood --hold-down这样的组件参数,最终使得Fat Tree网络稳定连接。

总结

Ubuntu20.04笔者没有跟着教程走过,但我想更换为English环境后,应该也是可以这么走通的。

综上即为简单的mininet+pox+poxdesk安装配置,笔者是一个自动化的学生,对计算机网络的理解不精,pox相关组件的学习还请读者参考资料2,其中讲述的还是很清晰的。希望阅读英语原文的读者也可以多多参考[1]POX of SDN Controller与[3]Poxdesk realizes topology display,多有裨益。

希望这篇文章能对读者有所帮助。

参考资料

[1]POX of SDN Controller
[2]SDN控制器之POX篇
[3]Poxdesk realizes topology display

  • 5
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值