You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

故障排查与修复

核心问题

你的代码存在两个关键冲突:

  1. 初始化Mininet时指定了controller=Controller作为默认控制器,后续调用net.start()会自动让所有交换机尝试连接默认控制器,和你手动指定s1.start([c0])、s2.start([c1])的操作冲突。
  2. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 03:55:22