Mininet脚本中Switch无法连接对应Controller的问题求助
问题:Mininet交换机无法连接指定控制器,卡在连接等待环节
我用Python脚本搭建Mininet网络,期望让每个交换机连接不同的控制器,但执行sudo python3 test.py后,进程一直卡在“*** Waiting for switches to connect”环节,无法完成连接。已参考官方示例代码仍无法定位原因,请求协助排查故障。
脚本代码
#!/usr/bin/python from mininet.cli import CLI from mininet.topo import Topo from mininet.net import Mininet from mininet.util import dumpNodeConnections from mininet.node import Controller, OVSSwitch, RemoteController, OVSBridge from mininet.log import setLogLevel class test_Topo(Topo): def build(self): s1 = self.addSwitch( 's1') s2 = self.addSwitch( 's2') h1 = self.addHost( 'h1' ) h2 = self.addHost( 'h2' ) n1 = self.addHost( 'n1' ) self.addLink( s1, s2 ) self.addLink( s1, h1 ) self.addLink( s1, h2 ) self.addLink( s2, n1 ) def test(): topo = test_Topo() net = Mininet(topo, build=False, waitConnected=True, switch=OVSSwitch, controller=Controller) c0 = net.addController( 'c0', port=6633 ) c1 = net.addController('c1', port=6634) net.build() s1 = net.get('s1') s2 = net.get('s2') c0.start() c1.start() s1.start([c0]) s2.start([c1]) net.start() net.pingAll() CLI( net ) net.stop() if __name__ == '__main__': setLogLevel('info') test()
执行结果
*** Creating network *** Adding hosts: h1 h2 n1 *** Adding switches: s1 s2 *** Adding links: (s1, h1) (s1, h2) (s1, s2) (s2, n1) *** Configuring hosts h1 h2 n1 *** Starting controller c0 c1 *** Starting 2 switches s1 s2 ... *** Waiting for switches to connect
故障排查与修复
核心问题
你的代码存在两个关键冲突:
- 初始化
Mininet时指定了controller=Controller作为默认控制器,后续调用net.start()会自动让所有交换机尝试连接默认控制器,和你手动指定s1.start([c0])、s2.start([c1])的操作冲突。 net.start()会重复启动控制器和交换机,导致交换机的控制器绑定逻辑混乱,最终卡在连接等待环节。
修复后的代码
#!/usr/bin/python from mininet.cli import CLI from mininet.topo import Topo from mininet.net import Mininet from mininet.util import dumpNodeConnections from mininet.node import Controller, OVSSwitch, RemoteController, OVSBridge from mininet.log import setLogLevel class test_Topo(Topo): def build(self): s1 = self.addSwitch('s1') s2 = self.addSwitch('s2') h1 = self.addHost('h1') h2 = self.addHost('h2') n1 = self.addHost('n1') self.addLink(s1, s2) self.addLink(s1, h1) self.addLink(s1, h2) self.addLink(s2, n1) def test(): topo = test_Topo() # 初始化时禁用默认控制器,避免自动绑定冲突 net = Mininet(topo, build=False, waitConnected=True, switch=OVSSwitch, controller=None) c0 = net.addController('c0', port=6633) c1 = net.addController('c1', port=6634) net.build() s1 = net.get('s1') s2 = net.get('s2') # 先启动所有控制器 c0.start() c1.start() # 手动指定每个交换机连接的控制器 s1.start([c0]) s2.start([c1]) # 无需调用net.start(),手动启动流程已完成 net.pingAll() CLI(net) net.stop() if __name__ == '__main__': setLogLevel('info') test()
额外排查建议
- 检查端口占用:执行
sudo lsof -i :6633和sudo lsof -i :6634,确认这两个端口未被其他进程占用 - 验证OVS服务状态:执行
sudo systemctl status openvswitch-switch,确保Open vSwitch服务正常运行 - 开启 debug 日志:将
setLogLevel('info')改为setLogLevel('debug'),查看连接过程中的具体错误输出,进一步定位问题
内容的提问来源于stack exchange,提问作者eggboy
相关产品推荐
相关产品推荐

