1. 环境准备与依赖安装
在开始ONOS和Mininet的集成部署之前,我们需要先准备好Ubuntu22.04的基础环境。我建议使用全新的Ubuntu系统,避免与其他软件产生冲突。记得先执行sudo apt update和sudo apt upgrade更新系统,这个习惯能帮你规避很多奇怪的依赖问题。
Java环境是ONOS运行的基础。Ubuntu22.04默认仓库中的OpenJDK11是个稳妥的选择,执行sudo apt install openjdk-11-jdk就能完成安装。这里有个小技巧:安装完成后,建议用sudo update-alternatives --config java检查默认Java版本,确保系统指向的是刚安装的JDK11。我遇到过因为多版本共存导致ONOS启动失败的情况,这个检查步骤能帮你省去不少排查时间。
环境变量配置也很关键。编辑~/.bashrc时,除了设置JAVA_HOME,最好把ONOS的bin目录也加入PATH:
export ONOS_ROOT=/opt/onos export PATH=$PATH:$ONOS_ROOT/bin这样后续操作会方便很多。配置完成后别忘记执行source ~/.bashrc让改动立即生效。
2. ONOS安装与配置实战
ONOS的安装过程其实很直接,但有些细节需要注意。我推荐使用/opt目录作为安装位置,这个目录本来就是为可选软件准备的。下载时可以直接用wget获取最新稳定版,比如:
sudo wget -c https://repo1.maven.org/maven2/org/onosproject/onos-releases/2.7.0/onos-2.7.0.tar.gz解压后记得给整个目录设置合适的权限,我一般会执行sudo chown -R $USER:$USER /opt/onos,这样普通用户也能操作这些文件。
启动ONOS服务时,新手常犯的错误是直接运行onos-service start而忘记加sudo。正确的命令应该是:
sudo /opt/onos/bin/onos-service start启动成功后,用onos-service status检查状态。如果遇到启动失败,可以查看/opt/onos/apache-karaf-4.2.8/data/log/karaf.log获取详细错误信息。
WEB界面访问需要特别注意防火墙设置。Ubuntu22.04默认的ufw防火墙会阻止8181端口,记得执行:
sudo ufw allow 8181/tcp登录界面默认凭证是onos/rocks,建议首次登录后就修改密码。在WEB界面中,这几个应用必须激活:
- OpenFlow Base Provider
- Forwarding
- Proxy ARP/NDP
3. Mininet安装与拓扑构建
Mininet的安装虽然简单,但有几个优化技巧。除了基本的sudo apt install mininet,我建议额外安装这些组件:
sudo apt install python3-pip mininet-docker mininet-openvswitch它们会在后续的拓扑测试中派上用场。
创建拓扑时,--controller=remote参数是关键。假设ONOS运行在本机,典型命令如下:
sudo mn --topo=tree,2,3 --controller=remote,ip=127.0.0.1 --mac --switch=ovsk,protocols=OpenFlow13这里的参数含义:
tree,2,3:创建2层树形拓扑,每层3个交换机ovsk:使用Open vSwitch交换机OpenFlow13:指定协议版本
如果遇到控制器连接问题,可以先用ovs-vsctl show检查Open vSwitch状态,再用nc -zv 127.0.0.1 6653测试端口连通性。我曾在测试中发现ONOS默认监听的是6633端口,这时需要在启动命令中显式指定端口号。
4. 集成测试与故障排查
完成基础部署后,真正的挑战在于让两个系统协同工作。首先在Mininet中执行pingall测试连通性,理想情况下应该看到100%成功率。如果出现失败,可以按照这个流程排查:
- 在ONOS CLI(通过
onos localhost进入)执行openflows:show,确认交换机连接状态 - 检查
apps -a -s确认必要应用已激活 - 使用
flows s1查看具体流表项
常见的坑包括:
- 防火墙阻止了6653端口
- ONOS未加载OpenFlow应用
- Mininet使用了不兼容的OpenFlow版本
对于复杂拓扑,我推荐使用Python API创建自定义网络:
from mininet.net import Mininet from mininet.topo import Topo from mininet.cli import CLI class MyTopo(Topo): def build(self): h1 = self.addHost('h1') h2 = self.addHost('h2') s1 = self.addSwitch('s1') self.addLink(h1, s1) self.addLink(h2, s1) net = Mininet(topo=MyTopo(), controller=RemoteController('c0', ip='127.0.0.1')) net.start() CLI(net) net.stop()这种方法灵活性更高,适合测试特定网络场景。
5. 性能优化与高级功能
当基础功能验证通过后,可以尝试一些进阶配置。在ONOS的WEB界面中,Network Configuration部分可以调整流表超时时间等参数。对于性能测试,Mininet的iperf命令非常有用:
mininet> h1 iperf -s & mininet> h2 iperf -c h1如果想模拟真实网络环境,可以使用--link tc参数添加带宽和延迟限制:
sudo mn --link tc,bw=10,delay='5ms'ONOS的CLI提供了丰富的诊断命令。比如hosts查看已发现主机,intents检查转发意图状态。遇到性能问题时,metrics命令能显示各种系统指标。
记得定期清理测试环境,特别是当频繁创建删除拓扑时。我习惯用这个组合命令重置网络状态:
sudo mn -c && sudo service openvswitch-switch restart6. 实际应用场景示例
最后分享一个真实案例:用这套环境测试SDN负载均衡。首先在ONOS中安装Load Balance应用,然后创建包含多个服务器的拓扑:
sudo mn --topo=linear,4 --controller=remote,ip=127.0.0.1 --mac在Mininet中启动多个iperf服务器:
mininet> h2 iperf -s -p 5001 & mininet> h3 iperf -s -p 5002 & mininet> h4 iperf -s -p 5003 &然后从h1发起多个连接:
mininet> h1 iperf -c h2 -p 5001 -t 30同时在ONOS界面观察流量分布情况。通过调整负载均衡算法参数,可以直观看到流量分配的变化。这种实践能帮你深入理解SDN控制器的调度能力。