Mininet创建树形低级别API报错:Error creating interface pair修复
问题
手动通过Mininet低级别API构建树形拓扑时,运行代码抛出Exception: Error creating interface pair异常。执行sudo mn -c清理环境后,仍出现错误:
Exception: Error creating interface pair (s1-eth1,a1-eth3): RTNETLINK answers: File exists
怀疑存在接口重复创建但无法定位问题,目标是实现所有主机间互通ping。
原代码如下:
#!/usr/bin/python from mininet.node import Host, OVSSwitch, Controller from mininet.link import Link, TCLink, Intf from mininet.net import Mininet from mininet.cli import CLI net = Mininet(controller=OVSSwitch) #Creating Nodes: h1 = net.addHost( 'h1', mac = '00:00:00:00:00:01', ip='10.0.0.1/24' ) h2 = net.addHost( 'h2', mac = '00:00:00:00:00:02', ip='10.0.0.2/24' ) h3 = net.addHost( 'h3', mac = '00:00:00:00:00:03', ip='10.0.0.3/24' ) h4 = net.addHost( 'h4', mac = '00:00:00:00:00:04', ip='10.0.0.4/24' ) h5 = net.addHost( 'h5', mac = '00:00:00:00:00:05', ip='10.0.0.5/24' ) h6 = net.addHost( 'h6', mac = '00:00:00:00:00:06', ip='10.0.0.6/24' ) h7 = net.addHost( 'h7', mac = '00:00:00:00:00:07', ip='10.0.0.7/24' ) h8 = net.addHost( 'h8', mac = '00:00:00:00:00:08', ip='10.0.0.8/24' ) e1 = net.addSwitch( 's1', cls = OVSSwitch, protocols = 'OpenFlow13' ) e2 = net.addSwitch( 'e2', cls = OVSSwitch, protocols = 'OpenFlow13' ) e3 = net.addSwitch( 'e3', cls = OVSSwitch, protocols = 'OpenFlow13' ) e4 = net.addSwitch( 'e4', cls = OVSSwitch, protocols = 'OpenFlow13' ) a1 = net.addSwitch( 'a1', cls = OVSSwitch, protocols = 'OpenFlow13' ) a2 = net.addSwitch( 'a2', cls = OVSSwitch, protocols = 'OpenFlow13' ) c0 = net.addController( 'c0' ) c1 = net.addController( 'c0' ) #Linking Nodes net.addLink( h1, e1, cls=TCLink ) net.addLink( h2, e1, cls=TCLink ) net.addLink( h3, e2, cls=TCLink ) net.addLink( h4, e2, cls=TCLink ) net.addLink( h5, e3, cls=TCLink ) net.addLink( h6, e3, cls=TCLink ) net.addLink( h7, e4, cls=TCLink ) net.addLink( h8, e4, cls=TCLink ) net.addLink( e1, a1, port1=1, port2=3, cls=TCLink ) net.addLink( e2, a1, port1=1, port2=2, cls=TCLink ) net.addLink( e3, a2, port1=1, port2=3, cls=TCLink ) net.addLink( e4, a2, port1=1, port2=2, cls=TCLink ) net.addLink( a1, c1, port1=1, port2=2, cls=TCLink ) net.addLink( a2, c1, port1=1, port2=1, cls=TCLink ) #Set IP Address h1.setIP( '10.0.0.1/24' ) h2.setIP( '10.0.0.2/24' ) h3.setIP( '10.0.0.3/24' ) h4.setIP( '10.0.0.4/24' ) h5.setIP( '10.0.0.5/24' ) h6.setIP( '10.0.0.6/24' ) h7.setIP( '10.0.0.7/24' ) h8.setIP( '10.0.0.8/24' ) OVSSwitch.start(Controller) net.start() #printing IP addresses print (h1.IP) print (h2.IP) print (h3.IP) print (h4.IP) print (h5.IP) print (h6.IP) print (h7.IP) print (h8.IP) print ('Pinging ...') print (h1.cmd( 'ping -c1 ', h2.IP() )) print (h1.cmd( 'ping -c1 ', h3.IP() )) print (h1.cmd( 'ping -c1 ', h4.IP() )) print (h1.cmd( 'ping -c1 ', h5.IP() )) print (h1.cmd( 'ping -c1 ', h6.IP() )) print (h1.cmd( 'ping -c1 ', h7.IP() )) print (h1.cmd( 'ping -c1 ', h8.IP() )) CLI(net) net.stop()
问题分析与修复方案
核心问题点
控制器重复创建+非法链路:
c1 = net.addController( 'c0' )重复使用同一个控制器名称,导致资源冲突;- 手动添加交换机与控制器的链路完全多余,Mininet会自动完成控制器与交换机的OpenFlow连接,手动创建会生成冗余物理接口,引发"File exists"错误。
错误的交换机启动命令:
OVSSwitch.start(Controller)属于错误调用,正确的启动逻辑是通过net.start()统一初始化所有节点,手动调用会导致重复初始化接口。
端口指定冲突:
- 手动指定
port1=1给交换机e1、e2等,但这些交换机已经连接了主机,端口1大概率已被占用,强制指定会导致接口创建冲突。
- 手动指定
ping命令语法错误:
h1.cmd( 'ping -c1 ', h2.IP() )中逗号会将命令拆分为两个参数,导致ping命令执行失败,需合并为单个字符串。
冗余IP设置:
addHost时已指定IP,后续重复调用setIP无意义,可删除。
修复后的代码
#!/usr/bin/python from mininet.node import Host, OVSSwitch, Controller from mininet.link import TCLink from mininet.net import Mininet from mininet.cli import CLI # 初始化网络,指定默认控制器 net = Mininet(controller=Controller, switch=OVSSwitch) # 创建节点 h1 = net.addHost('h1', mac='00:00:00:00:00:01', ip='10.0.0.1/24') h2 = net.addHost('h2', mac='00:00:00:00:00:02', ip='10.0.0.2/24') h3 = net.addHost('h3', mac='00:00:00:00:00:03', ip='10.0.0.3/24') h4 = net.addHost('h4', mac='00:00:00:00:00:04', ip='10.0.0.4/24') h5 = net.addHost('h5', mac='00:00:00:00:00:05', ip='10.0.0.5/24') h6 = net.addHost('h6', mac='00:00:00:00:00:06', ip='10.0.0.6/24') h7 = net.addHost('h7', mac='00:00:00:00:00:07', ip='10.0.0.7/24') h8 = net.addHost('h8', mac='00:00:00:00:00:08', ip='10.0.0.8/24') e1 = net.addSwitch('s1', cls=OVSSwitch, protocols='OpenFlow13') e2 = net.addSwitch('e2', cls=OVSSwitch, protocols='OpenFlow13') e3 = net.addSwitch('e3', cls=OVSSwitch, protocols='OpenFlow13') e4 = net.addSwitch('e4', cls=OVSSwitch, protocols='OpenFlow13') a1 = net.addSwitch('a1', cls=OVSSwitch, protocols='OpenFlow13') a2 = net.addSwitch('a2', cls=OVSSwitch, protocols='OpenFlow13') # 创建控制器,避免重名 c0 = net.addController('c0') # 建立链路,不手动指定端口,让Mininet自动分配 net.addLink(h1, e1, cls=TCLink) net.addLink(h2, e1, cls=TCLink) net.addLink(h3, e2, cls=TCLink) net.addLink(h4, e2, cls=TCLink) net.addLink(h5, e3, cls=TCLink) net.addLink(h6, e3, cls=TCLink) net.addLink(h7, e4, cls=TCLink) net.addLink(h8, e4, cls=TCLink) net.addLink(e1, a1, cls=TCLink) net.addLink(e2, a1, cls=TCLink) net.addLink(e3, a2, cls=TCLink) net.addLink(e4, a2, cls=TCLink) # 启动网络 net.start() # 打印IP地址 for host in [h1, h2, h3, h4, h5, h6, h7, h8]: print(host.IP()) # 执行ping测试,修复命令语法 print('Pinging ...') targets = [h2, h3, h4, h5, h6, h7, h8] for target in targets: print(h1.cmd(f'ping -c1 {target.IP()}')) # 启动CLI交互 CLI(net) # 停止网络 net.stop()
额外清理步骤
如果仍有残留接口,执行以下命令彻底清理:
sudo mn -c sudo ovs-vsctl del-br s1 e2 e3 e4 a1 a2 sudo ip link delete s1-eth1 # 替换为报错的接口名称
验证方法
运行修复后的代码,进入CLI后执行pingall命令,确认所有主机互通;或者查看代码中的ping输出,验证连通性。
内容的提问来源于stack exchange,提问作者Emily Armstrong
相关产品推荐
相关产品推荐

