无法 ping 通在 mininet 中创建的自定义拓扑

问题描述 投票:0回答:5

所以我编写了一个 python 文件来创建单个拓扑(只是为了检查自定义拓扑是否有效),而不首先使用任何控制器。代码如下:

#!/usr/bin/python

from mininet.node import CPULimitedHost, Host, Node
from mininet.node import OVSSwitch
from mininet.topo import Topo

class Single1(Topo):

"Single Topology"

def __init__(self):
    "Create Fat tree Topology"

    Topo.__init__(self)

    #Add hosts

    h1 = self.addHost('h1', cls=Host, ip='10.0.0.1', defaultRoute=None)
    h2 = self.addHost('h2', cls=Host, ip='10.0.0.2', defaultRoute=None)
    h3 = self.addHost('h3', cls=Host, ip='10.0.0.3', defaultRoute=None)




    #Add switches
    s1 = self.addSwitch('s1', cls=OVSSwitch)



    #Add links


self.addLink(h1,s1)
self.addLink(h2,s1)
self.addLink(h3,s1)


topos = { 'mytopo': (lambda: Single1() ) }

我跑步时 Pingall 不起作用 :

sudo mn --custom single.py --topo mytopo

尽管它确实适用于预定义的“单一”拓扑。有人可以帮我解决这个问题吗?

mininet
5个回答
3
投票

这是一个较旧的问题,可能不再对原始海报感兴趣,但我是通过迷你网相关搜索来到这里的,所以我想我会提供一个工作示例,以防其他人将来在这里找到方法。

首先,发布的代码存在许多缩进问题,但这些问题很容易纠正。

接下来,该逻辑已在

Single1.__init__
中实现,但至少根据文档,这应该在
build
方法中实现。

纠正这两个问题并消除不必要的使用

host=Host
调用中的
defaultRoute=None
addHost
为我们提供:

#!/usr/bin/python

from mininet.node import OVSSwitch
from mininet.topo import Topo

class Single1(Topo):

    "Single Topology"

    def build(self):
        "Create Fat tree Topology"

        #Add hosts
        h1 = self.addHost('h1', ip='10.0.0.1')
        h2 = self.addHost('h2', ip='10.0.0.2')
        h3 = self.addHost('h3', ip='10.0.0.3')

        #Add switches
        s1 = self.addSwitch('s1', cls=OVSSwitch)

        #Add links
        self.addLink(h1,s1)
        self.addLink(h2,s1)
        self.addLink(h3,s1)


topos = { 'mytopo': Single1 }

上面的代码将正确运行并构建拓扑,但可能仍然会出现原来的问题:在创建交换机时使用

cls=OVSSwitch
意味着 Mininet 期望存在一个 OpenFlow 控制器来管理交换机,这通常不会'默认存在。

最简单的解决方案是更改:

s1 = self.addSwitch('s1', cls=OVSSwitch)

致:

s1 = self.addSwitch('s1', cls=OVSBridge)

通过此更改,Mininet 将配置一个不需要显式控制器的“独立”交换机,并且我们将拥有预期的连接。代码的最终版本如下所示:

#!/usr/bin/python

from mininet.topo import Topo
from mininet.node import OVSBridge

class Single1(Topo):

    "Single Topology"

    def build(self):
        "Create Fat tree Topology"

        #Add hosts
        h1 = self.addHost('h1', ip='10.0.0.1')
        h2 = self.addHost('h2', ip='10.0.0.2')
        h3 = self.addHost('h3', ip='10.0.0.3')

        #Add switches
        s1 = self.addSwitch('s1', cls=OVSBridge)

        #Add links
        self.addLink(h1,s1)
        self.addLink(h2,s1)
        self.addLink(h3,s1)


topos = { 'mytopo': Single1 }

运行它看起来像:

[root@servera ~]# mn --custom example.py --topo mytopo
*** Creating network
*** Adding controller
*** Adding hosts:
h1 h2 h3
*** Adding switches:
s1
*** Adding links:
(h1, s1) (h2, s1) (h3, s1)
*** Configuring hosts
h1 h2 h3
*** Starting controller
c0
*** Starting 1 switches
s1 ...
*** Starting CLI:
mininet> h1 ping -c2 h2
PING 10.0.0.2 (10.0.0.2) 56(84) bytes of data.
64 bytes from 10.0.0.2: icmp_seq=1 ttl=64 time=0.320 ms
64 bytes from 10.0.0.2: icmp_seq=2 ttl=64 time=0.051 ms

--- 10.0.0.2 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1009ms
rtt min/avg/max/mdev = 0.051/0.185/0.320/0.134 ms
mininet>

0
投票

默认情况下,Mininet 通过 Open VSwitch 模拟交换机。 如果未连接到控制器,OVS 将像普通的 L2 交换机一样使用其默认规则。 这就是你可以执行 pingall() 的原因。

但是,我也遇到了 Mininet 主机无法互相 ping 通的问题,即使它们实际上已连接。几天后,我发现 mininet 链接需要一些时间才能准备好。因此,如果您等待大约 30 秒然后调用 pingall(),我认为它应该正常运行。


0
投票

有谁知道是否可以在混合拓扑(环形和星形一起)中检查没有控制器的主机之间的连接性。我确实尝试使用 stp=True 并将开关更改为 OVSBridge,但没有成功。

#!/usr/bin/python

from mininet.net import Mininet
from mininet.topo import Topo
from mininet.link import TCLink
from mininet.node import CPULimitedHost, Host, Node
from mininet.node import OVSSwitch
from mininet.log import setLogLevel, info

class NewTopo( Topo ):

    def __init__( self ):

        Topo.__init__( self )

        H1 = self.addHost( 'MS1', cls=Host, ip="10.0.0.1", defaultRoute=None, mac='00:00:00:00:00:aa')
        H2 = self.addHost( 'MS2', cls=Host, ip="10.0.0.2", defaultRoute=None, mac='00:00:00:00:00:bb')
        H3 = self.addHost( 'MS3', cls=Host, ip="10.0.0.3", defaultRoute=None, mac='00:00:00:00:00:cc')
        H4 = self.addHost( 'MS4', cls=Host, ip="10.0.0.4", defaultRoute=None, mac='00:00:00:00:00:dd')
        H5 = self.addHost( 'MS5', cls=Host, ip="10.0.0.5", defaultRoute=None, mac='00:00:00:00:00:ee')
        H6 = self.addHost( 'MS6', cls=Host, ip="10.0.0.6", defaultRoute=None, mac='00:00:00:00:00:ff')
        H7 = self.addHost( 'MS7', cls=Host, ip="10.0.0.7", defaultRoute=None, mac='00:00:00:00:00:gg')
        H8 = self.addHost( 'MS8', cls=Host, ip="10.0.0.8", defaultRoute=None, mac='00:00:00:00:00:hh')
        H9 = self.addHost( 'MS9', cls=Host, ip="10.0.0.9", defaultRoute=None, mac='00:00:00:00:00:ii')
        H10 = self.addHost('MS10', cls=Host, ip="10.0.0.10", defaultRoute=None, mac='00:00:00:00:00:jj')

        server = self.addHost('server', ip="10.0.0.100", mac='00:00:00:00:00:kk')

        b1 = self.addSwitch( 'bts1', cls=OVSSwitch, mac='00:00:00:00:00:01')
        b2 = self.addSwitch( 'bts2', cls=OVSSwitch, mac='00:00:00:00:00:02')
        b3 = self.addSwitch( 'bts3', cls=OVSSwitch, mac='00:00:00:00:00:03')
        b4 = self.addSwitch( 'bts4', cls=OVSSwitch, mac='00:00:00:00:00:04')
        b5 = self.addSwitch( 'bts5', cls=OVSSwitch, mac='00:00:00:00:00:05')


        s1 = self.addSwitch('s1', dpid='6001', cls=OVSSwitch, mac='00:00:00:00:00:06')
        s2 = self.addSwitch('s2', dpid='7001', cls=OVSSwitch, mac='00:00:00:00:00:07')
        s3 = self.addSwitch('s3', dpid='8001', cls=OVSSwitch, mac='00:00:00:00:00:08')
        s4 = self.addSwitch('s4', dpid='9001', cls=OVSSwitch, mac='00:00:00:00:00:09')
        s5 = self.addSwitch('s5', dpid='1010', cls=OVSSwitch, mac='00:00:00:00:00:10')

        s0 = self.addSwitch('s0', dpid='1111', cls=OVSSwitch, mac='00:00:00:00:00:11')
        s6 = self.addSwitch('s6', dpid='1212', cls=OVSSwitch, mac='00:00:00:00:00:12')

    
        self.addLink( H1, b1, stp=True, cls=TCLink)
        self.addLink( H2, b1, stp=True, cls=TCLink)
        self.addLink( H3, b2, stp=True, cls=TCLink)
        self.addLink( H4, b2, stp=True, cls=TCLink)
        self.addLink( H5, b3, stp=True, cls=TCLink)
        self.addLink( H6, b3, stp=True, cls=TCLink)
        self.addLink( H7, b4, stp=True, cls=TCLink)
        self.addLink( H8, b4, stp=True, cls=TCLink)
        self.addLink( H9, b5, stp=True, cls=TCLink)
        self.addLink( H10, b5, stp=True, cls=TCLink)
      

        self.addLink( b1, b2, stp=True, cls=TCLink)
        self.addLink( b2, b3, stp=True, cls=TCLink)
        self.addLink( b3, b4, stp=True, cls=TCLink)
        self.addLink( b4, b5, stp=True, cls=TCLink)
        self.addLink( b5, b1, stp=True, cls=TCLink)

        self.addLink(b1, s1, stp=True, cls=TCLink)
        self.addLink(b2, s2, stp=True, cls=TCLink)
        self.addLink(b3, s3, stp=True, cls=TCLink)
        self.addLink(b4, s4, stp=True, cls=TCLink)
        self.addLink(b5, s5, stp=True, cls=TCLink)

        self.addLink(s1, s0, stp=True, cls=TCLink)
        self.addLink(s2, s0, stp=True, cls=TCLink)
        self.addLink(s3, s0, stp=True, cls=TCLink)
        self.addLink(s4, s0, stp=True, cls=TCLink)
        self.addLink(s5, s0, stp=True, cls=TCLink)

        self.addLink(s0, s6, stp=True, cls=TCLink)
        self.addLink(s6, server, stp=True, cls=TCLink)


topos  = { 'mytopo': ( lambda: NewTopo() ) }

if __name__ == '__main__':
    setLogLevel('info')

如果有人可以提供帮助,那将是一个很大的帮助。


-1
投票

主机必须位于同一子网中,以避免路由协议。否则你需要静态路由


-1
投票

很奇怪,但现在我突然可以 ping 通..我不知道为什么或如何..我没有改变任何东西。

© www.soinside.com 2019 - 2024. All rights reserved.