目录
前言
朋友最近在上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
安装
这里安装就不像上面的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