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

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()
问题分析与修复方案

核心问题点

  1. 控制器重复创建+非法链路:

    • c1 = net.addController( 'c0' ) 重复使用同一个控制器名称,导致资源冲突;
    • 手动添加交换机与控制器的链路完全多余,Mininet会自动完成控制器与交换机的OpenFlow连接,手动创建会生成冗余物理接口,引发"File exists"错误。
  2. 错误的交换机启动命令:

    • OVSSwitch.start(Controller) 属于错误调用,正确的启动逻辑是通过net.start()统一初始化所有节点,手动调用会导致重复初始化接口。
  3. 端口指定冲突:

    • 手动指定port1=1给交换机e1、e2等,但这些交换机已经连接了主机,端口1大概率已被占用,强制指定会导致接口创建冲突。
  4. ping命令语法错误:

    • h1.cmd( 'ping -c1 ', h2.IP() ) 中逗号会将命令拆分为两个参数,导致ping命令执行失败,需合并为单个字符串。
  5. 冗余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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 14:55:01