您的位置:首页 > 其它

Mininet学习笔记

2016-03-09 20:13 239 查看
目录

前言

一、安装

1、直接下载Mininet镜像

2、源码安装

3、包安装

4、升级

二、使用

1、启动mininet(需要root权限)

2、cli命令

3、自定义功能

4、其他

三、源码分析

1、让SouceInsight支持Python。

2、目录结构

3、代码流程分析

Mininet学习笔记

前言

Mininet是什么?
Stanford大学NickMcKeown教授领导的研究小组基于LinuxContainer架构,开发出了这套进程虚拟化的平台。在Mininet的帮助下,你可以轻易的在自己的笔记本上测试一个软件定义网络(Software-DefinedNetworks),对基于Openflow、OpenvSwitch的各种协议等进行开发验证,或者验证自己的想法。
最令人振奋的是,所有的代码几乎可以无缝迁移到真实的硬件环境中。在实验室里,一行命令就可以创建一个支持SDN的任意拓扑的网络结构,并可以灵活的进行相关测试,验证了设计的正确后,又可以轻松部署到真实的硬件环境中。目前Mininet已经作为官方的演示平台对各个版本的Openflow协议进行演示和测试。

本文收集整理一些网上的资料,通过这些资料及动手实践全方位了解Mininet这个轻量级的软件定义网络系统平台。

一、安装

参考:http://mininet.org/download/

1、直接下载Mininet镜像

https://github.com/mininet/mininet/wiki/Mininet-VM-Images


2、源码安装

gitclonegit://github.com/mininet/mininet

#
选择你想要安装的版本,
master
为不稳定的

cdmininet

gittag#listavailableversions

gitcheckout-b2.2.12.2.1

cd..

#
可通过
-h
来查看各选项。

mininet/util/install.sh[options]

#
测试是否安装成功

sudomn--testpingall


3、包安装

#删除旧版本

sudorm-rf/usr/local/bin/mn/usr/local/bin/mnexec\

/usr/local/lib/python*/*/*mininet*\

/usr/local/bin/ovs-*/usr/local/sbin/ovs-*

#确认OS版本

lsb_release-a


#各版本对应的包

Mininet2.1.0onUbuntu14.10:sudoapt-getinstallmininet

Mininet2.1.0onUbuntu14.04:sudoapt-getinstallmininet

Mininet2.0.0onUbuntu12.04:sudoapt-getinstallmininet/precise-backports

#关闭[code]openvswitch-controller

sudoserviceopenvswitch-controllerstop

sudoupdate-rc.dopenvswitch-controllerdisable

#验证

sudomn--testpingall

#如果想完成接下来的实验还需要执行如下操作

gitclonegit://github.com/mininet/mininet

mininet/util/install.sh-fw


4、升级

cdmininet

gitfetch

gitcheckoutmaster#Oraspecificversionlike2.2.1

gitpull

sudomakeinstall


二、使用

参考:http://mininet.org/walkthrough/#part-1-everyday-mininet-usage

$
表示普通用户

#
表示
root
用户

mininet>
表示
mininet
命令行
(CLI)


1、启动mininet(需要root权限)

命令:sudomn[options]

Usage:mn[options]

(typemn-hfordetails)

ThemnutilitycreatesMininetnetworkfromthecommandline.Itcancreate

parametrizedtopologies,invoketheMininetCLI,andruntests.

Options:

-h,--helpshowthishelpmessageandexit

#
显示帮助信息


--switch=SWITCHdefault|ivs|lxbr|ovs|ovsbr|ovsk|user[,param=value...]

ovs=OVSSwitchdefault=OVSSwitchovsk=OVSSwitch

lxbr=LinuxBridgeuser=UserSwitchivs=IVSSwitch

ovsbr=OVSBridge

#
指定交换机类型,可以带的参数值:

OVSSwitch
mininet\mininet\node.py
脚本

name:nameforswitch

failMode:controllerlossbehavior(secure|standalone)

datapath:userspaceorkernelmode(kernel|user)

inband:usein-bandcontrol(False)

protocols:

usespecificOpenFlowversion(s)(e.g.OpenFlow13)

Unspecified(oroldOVSversion)usesOVSdefault

#OVSversion
可通过
ovs-ofctl--version
来查看

reconnectms:maxreconnecttimeoutinms(0/Nonefordefault)

stp:enableSTP(False,requiresfailMode=standalone)

batch:enablebatchstartup(False)

UserSwitch
node.py

name:namefortheswitch

dpopts:additionalargumentstoofdatapath(--no-slicing)

IVSSwitch
node.py

参考:
http://www.projectfloodlight.org/indigo-virtual-switch/[/code]
IndigoVirtualSwitch

OVSBridge:node.py

stp:enableSpanningTreeProtocol(False)

seeOVSSwitchforotheroptions

LinuxBridge
nodelib.py

stp:usespanningtreeprotocol?(defaultFalse)

prio:optionalexplicitbridgepriorityforSTP


#
交换机类型:

default\ovs\ovsk:OVSSwitch
OpenvSwitch.

ovsk
是为了跟
2.0
版本兼容而保留的

lxbr:LinuxBridge

user:UserSwitch

ivs:IVSSwitch

ovsbr:OVSBridge


--host=HOSTcfs|proc|rt[,param=value...]

rt=CPULimitedHost{'sched':'rt'}proc=Host

cfs=CPULimitedHost{'sched':'cfs'}

#
指定
Host
CPU
调度方式:
rt
或者
cfs


--controller=CONTROLLER

default|none|nox|ovsc|ref|remote|ryu[,param=value...]

ovsc=OVSControllernone=NullController

remote=RemoteControllerdefault=DefaultController

nox=NOXryu=Ryuref=Controller

#
指定控制器

node.py

default
情况是:

#(whichcontroller/ovs-controller/test-controller)

Controller/OVSController
第一个有效的

protocol
tcp

port
6633

ip
127.0.0.1

其实就是调用了不同的命令

ovsc=ovs-controller

none=None
没有指定控制器

nox=
nox_core

ref=controller

remote=controller


--link=LINKdefault|ovs|tc[,param=value...]default=Link

ovs=OVSLinktc=TCLink

#


--topo=TOPOlinear|minimal|reversed|single|torus|tree[,param=value

...]linear=LinearTopotorus=TorusTopotree=TreeTopo

single=SingleSwitchTopo

reversed=SingleSwitchReversedTopominimal=MinimalTopo

#
指定拓扑结构


-c,--cleancleanandexit

#
进行清理配置操作,适合故障后恢复


--custom=CUSTOMreadcustomclassesorparamsfrom.pyfile(s)

#
利用
MininetpythonAPI
接口编写的脚本

#API
参考:
http://mininet.org/api/annotated.html[/code]
#
可用
miniedit.py
这个脚本,图形化工具


--test=TESTcli|build|pingall|pingpair|iperf|all|iperfudp|none

#
测试


-x,--xtermsspawnxtermsforeachnode

#
为每个
node
生成一个
xterms


-iIPBASE,--ipbase=IPBASE

baseIPaddressforhosts

#
指定
hostip
地址段
。如:
1.1.1.XX


--macautomaticallysethostMACs

#
更友好的
mac
地址。如:
00:00:00:00:00:01


--arpsetall-pairsARPentries

#


-vVERBOSITY,--verbosity=VERBOSITY

info|warning|critical|error|debug|output

#
显示日志级别

#
默认是
info
级别,
debug
为全输出,
output
不输出


--innamespace
swandctrlinnamespace?

#


--listenport=LISTENPORT

baseportforpassiveswitchlistening

#
指定监听端口号


--nolistenportdon'tusepassivelisteningport

#
不使用任何端口来监听


--pre=PRECLIscripttorunbeforetests

#PRE
为一个文件,文件中写
CLI
命令,在测试前被执行


--post=POSTCLIscripttorunaftertests

#POST
为一个文件,文件中写
CLI
命令,在测试后被执行


--pin
pinhoststoCPUcores(requires--host
cfsor--host

rt)

#


--nataddsaNATtothetopologythatconnectsMininethosts

tothephysicalnetwork.Warning:Thismayrouteany

trafficonthemachinethatusesMininet'sIPsubnet

intotheMininetnetwork.Ifyouneedtochange

Mininet'sIPsubnet,seethe--ipbaseoption.

#


--versionprintstheversionandexits

#
显示
mininet
版本后退出


--cluster=server1,server2...

runonmultipleservers(experimental!)

#


--placement=block|random

nodeplacementfor--cluster(experimental!)

[code]#


2、cli命令

sudomn经过短暂的等待即可进入以mininet>引导的命令行界面。好了,从现在开始,我们就拥有了一个1台控制节点(controller)、一台交换机(switch)、两台主机(host)的网络,并且用wireshark进行观测。
通过table键我们可以看到所有命令,如下所示:
mininet>

EOFintfs
nodesports
switch
dpctliperfnoechopx
time
dumpiperfudp
pingallpy
x
exitlinkpingallfullquitxterm
gtermlinks
pingpairsh

helpnetpingpairfullsource
help:
显示帮助
如:
helpdpctl


EOF
退出


exit:
退出


quit:
退出




#

0
、服务端允许
ssh
x11
转发。
/etc/sshd/sshd_config

1
、客户端是
Windows
主机,需要先在

Windows
机器上安装
Xserver
Xming
)。

下载地址:
http://sourceforge.net/projects/xming/files/Xming/6.9.0.31/Xming-6-9-0-31-setup.exe

2
SCRT
配置:





gterm
:
gnome
终端。注:可能导致
Mininet
崩溃




xterm:
x
终端




x:
无效果


dump:
查看输出各节点信息




intfs
列出所有的网络接口




net:
显示网络链接情况




switch
:停止
/
启动某个交换机


switch<switchname>{start,stop}




ports:
显示交换机的所有接口




links:
查看链路状态




link:
禁用或启用两个节点之间的链路




nodes:
列出所有的节点信息


time:
测量
mininet
命令所花的时间




pingall:
所有
host
节点之间互
ping




pingallfull:
所有
host
节点之间互
ping,
并返回详细结果




pingpair:
在前两个主机之间互
ping
测试




pingpairfull
:在前两个主机之间互
ping
测试,并返回详细结果






iperf:
两个
host
之间进行简单的
iperfTCP
测试




iperfudp:
两个节点之间用指定带宽
udp
进行测试




sh:
运行外部
shell
命令




source
:从外部文件中读入命令,并执行


px:
执行一条
python
语句




py:
执行
python
表达式。




noecho:
运行交互式窗口,关闭回应(
echoing)




dpctl:
操控交换机,控制交换机行为
(
具体执行是
ovs-dpctl.


该命令将会结合OVS与openflow协议一起讲解。

3、自定义功能

参考:http://www.muzixing.com/pages/2015/02/22/fattree-topo-and-iperfmulti-function-in-mininet.html
在mininet中增加新功能其实不难。

主要分为3步:

修改net.py增加函数实体;

修改cli.py,

增加对应do_function函数,用于命令解析;修改mn函数,用于声明命令。

net.py和cli.py均在mininet/mininet目录,mn文件在在mininet/bin目录中。

4、其他

通过各大实验学习掌握Mininet:http://csie.nqu.edu.tw/smallko/sdn/sdn.htm

三、源码分析

1、让SouceInsight支持Python。

参考:http://www.sourceinsight.com/public/

2、目录结构

├──bin#mn命令,Python脚本
├──build
│├──bdist.linux-x86_64
│├──lib.linux-x86_64-2.7
││└──mininet
││└──examples
│└──scripts-2.7
├──custom#自定义的Python文件
├──debian#生成deb安装包时的配置文件
│└──source
├──dist
├──doc#执行doxygen生成文档时的配置文件
├──examples#一些例子,帮助用户学习使用PythonAPI
│└──test
├──mininet#核心部分
│├──examples->../examples
│└──test
├──mininet.egg-info
└──util#目录下是一些辅助文件,包括安装脚本、文档辅助生成,m命令等
├──kbuild
├──nox-patches
├──openflow-patches
├──sch_htb-ofbuf
└──vm

3、代码流程分析

参考:https://www.gitbook.io/book/yeasy/mininet_book
http://www.sdnlab.com/11495.html
主要过程是创建一个MininetRunner()实例,依次解析传入参数,进行初始化后开启网络。整体过程如下图所示。

其中Mininet类的start()方法是核心的启动过程,主要包括调用build方法来根据拓扑创建网络、控制器、交换机、主机和连接等。之后依次启动控制器和交换机进程。在执行完start()之后,通过test参数来判断mininet运行的模式。

mn.start()

iftest=='none':
pass
eliftest=='all':
mn.waitConnected()
mn.start()
mn.ping()
mn.iperf()
eliftest=='cli':
cli(mn)
eliftest!='build':
mn.waitConnected()
getattr(mn,test)()

ifself.options.post:
cli(mn,script=self.options.post)
mn.stop()默认情况下,参数为cli,即进入到控制台模式,允许用户自己输入对Mininet的操作命令。最终执行mininet.stop()进行删除资源的工作。

接下来就是调用系统中的OVS,controller等来build整个网络结构。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: