软件定义网络实验 1:Mininet 源码安装和可视化拓扑工具
一、实验目的
掌握 Mininet 的源码安装方法和 MiniEdit 可视化拓扑生成工具。
二、实验任务
使用源码安装 Mininet 的 2.3.0d6 版本,并使用可视化拓扑工具生成一个最简拓扑(1 台交换机连接 2 台主机)。
三、实验步骤
1. 实验环境
Ubuntu 18.04.5 Desktop AMD64
Ubuntu 16.04.7 Desktop AMD64
VMware Workstation Pro 15.5.6
2. 实验过程
(0) 虚拟机环境建立
由于个人之前比较熟悉 VMware,而且课程提供的虚拟机文件下载实在是慢,因此我没有选择推荐的 VirtualBox,而是在 VMware 上自行安装了 Ubuntu 18.04 作为实验环境。
(1) 源码安装
1、建立工作目录
$ mkdir sdn-031802113 //新建 sdn 目录,所有的应用安装在该目录下
$ cd sdn-031802113 //进入 sdn 目录
2、用 git 下载 Mininet 源码
$ sudo apt install git //安装 git
$ git clone git://github.com/mininet/mininet //下载 Mininet 源码
$ cd mininet
GitHub 的下载速度好慢……
3、安装 Mininet
$ sudo util/install.sh -a //在 Mininet 目录下执行,-a 表示完整安装
$ sudo mn --version //查看版本
Enjoy Mininet!
4、测试基本功能
$ sudo mn --test pingall
报错:Cannot find required executable ifconfig.
原因是未安装 ifconfig,通过以下命令安装即可。
$ sudo apt install net-tools
(2) 使用可视化工具
用如下命令打开 MiniEdit 可视化编辑工具:
$ sudo ./mininet/examples/miniedit.py //在 Mininet 安装目录下执行
报错:ImportError: No module named mininet.log
百度搜索后,找到了林老师的博客,当时给的解决方法应该是修改软链接。总感觉有点危险就没有照做……不过大概理解了是 Python 2 和 Python 3 的问题,于是尝试:
$ sudo python3 ./mininet/examples/miniedit.py
成功打开。
将 2 台 Host、1 台 Switch,并用 NetLink 连接,形成下图所示的网络拓扑。
将 4 台 Host、2 台 Switch 和 1 台 Controller 拖出,并用 NetLink 连接,形成下图所示的网络拓扑。
鼠标右键点击 Host 和 Controller,选择设置属性(Properties): Host 部分主要是设置主机 IP,以及 VLAN 等扩展设置。每台主机逐台操作;Controller 部分主要是设置控制器类型,此处可按默认设置。
点击左上角的 Edit,进行全局设置,此时在默认设置的基础上,勾选“Start CLI”,将 OpenFlow 1.1、1.2、1.3 全部勾选。
Run!
此时可使用 pingall 命令测试主机的连通性,并做其他扩展操作。
拓扑生成并确认无误之后,可以点击 MiniEdit 左上角的 File 菜单,选择 Export Level 2 Script,将拓扑保存为 Python 脚本,方便之后执行脚本一键生成。
大功告成……了吗?并没有……
本以为成功了,结果发现最后一步保存的是空文件,仔细一看终端上输出了错误信息:TypeError: a bytes-like object is required, not 'str'
百度了一下,原因还是涉及 Python 2 与 Python 3 的语法差异,这回要么改 MiniEdit 的代码,要么还是得回 Python 2 下运行。前者我无能为力,后者由于是个 import 错误,我尝试用 pip 装包但并不知道要装什么……
结果我很无奈地在只剩最后一步的情况下,重新安装了 Ubuntu 16.04 的虚拟机。这回倒是一次成功了。
林老师给了新的解决方案:https://www.cnblogs.com/fjlinww/p/13388427.html,不过为了安全,之后的实验我还是继续在 Ubuntu 16.04 上做吧。
最后把保存的 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)
h3 = net.addHost('h3', cls=Host, ip='10.0.0.3', defaultRoute=None)
h1 = net.addHost('h1', cls=Host, ip='10.0.0.1', defaultRoute=None)
h4 = net.addHost('h4', cls=Host, ip='10.0.0.4', defaultRoute=None)
info( '*** Add links\n')
net.addLink(h1, s1)
net.addLink(h3, s1)
net.addLink(s1, s2)
net.addLink(s2, h4)
net.addLink(s2, h2)
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()
四、实验要求
(已在实验步骤中体现)
-
自行安装 Ubuntu 虚拟机,版本推荐 18.04 和 16.04,虚拟机软件推荐使用 VirtualBox。
-
在 Ubuntu 系统的 home 目录下创建一个目录,目录名为自己的标识,包括但不限于学号、姓名拼音等,目录不要包含中文。
-
在创建的目录下,完成 Mininet 的源码安装。
-
打开可视化工具,参照使用步骤生成一个最简拓扑。
-
在博客园发表一篇博客,记录结果,无需逐步截图。
五、实验总结
本次实验是我第一次接触 Mininet,说实话还不太理解它的功能和用途。虽然实验只涉及 Mininet 的安装和可视化拓扑的构建,不过坑还挺多,百度也没能解决所有问题。当然自主查询资料的能力应该始终是有用的。另外总感觉 Linux 虽然包管理很方便,不过兼容性要求似乎比较高?另外这次实验中感觉我对 Linux 命令行的操作还不太熟悉,需要多加练习。