【问题标题】:Hosts with distinct PID space for processes in MininetMininet 中进程具有不同 PID 空间的主机
【发布时间】:2018-02-27 13:52:34
【问题描述】:

我想在Mininet 设置中的每个主机上运行Quagga 的实例。正如在下面的代码中实现的那样,我可以为每个主机将/tmp/<host>/etc/quagga 挂载为/etc/quagga,在每个主机的目录(私有目录)中隔离配置文件。但是当我在每台主机上启动 Quagga 服务时(下面ipconf 文件中的最后一行),它们都共享相同的 PID 号,有效地为所有主机创建相同的进程,尽管每个主机都有自己的 Quagga 配置文件。

我想拥有单独的 Quagga 实例,每个实例都有自己的 PID。我怎样才能做到这一点?

自定义拓扑文件my_topo.py:

from mininet.topo import Topo

class my_topo(Topo):
    "My custom topology settings"

    def __init__(self, enable_all=True):
        "Create custom topo."

        Topo.__init__(self)

        private_dirs = [("/etc/quagga", "/tmp/%(name)s/etc/quagga")]

        h1 = self.addHost("h1",
                          ip="172.31.1.100/24",
                          privateDirs=private_dirs)

        h2 = self.addHost("h2",
                          ip="172.31.2.100/24",
                          privateDirs=private_dirs)

        h3 = self.addHost("h3",
                          ip="172.31.3.100/24",
                          privateDirs=private_dirs)

        h4 = self.addHost("h4",
                          ip="172.31.4.100/24",
                          privateDirs=private_dirs)

        h5 = self.addHost("h5",
                          ip="172.32.1.2/30",
                          privateDirs=private_dirs)

        sA = self.addSwitch("s5")
        sB = self.addSwitch("s6")
        sC = self.addSwitch("s7")
        sD = self.addSwitch("s8")

        self.addLink(h1, sA)
        self.addLink(h2, sB)
        self.addLink(h3, sC)
        self.addLink(h4, sD)
        self.addLink(sA, sB)
        self.addLink(sB, sD)
        self.addLink(sD, sC)
        self.addLink(sC, sA)
        self.addLink(sA, sD)

        self.addLink(h2, h5, 1, 0)
        self.addLink(h4, h5, 1, 1)


topos = { "my_topo": ( lambda: my_topo() ) }

命令文件ipconf:

h1 /etc/init.d/quagga restart
h2 /etc/init.d/quagga restart
h3 /etc/init.d/quagga restart
h4 /etc/init.d/quagga restart
h5 /etc/init.d/quagga restart

运行 Mininet 的命令:

sudo mn --custom mininet/custom/my_topo.py --topo=my_topo --controller=remote,ip=192.168.56.101,port=6633 --pre=ipconf

【问题讨论】:

    标签: python linux mininet


    【解决方案1】:

    我自己弄清楚了如何使用Mininext 将进程与每个主机隔离,这是 Mininet 的扩展,可在主机之间提供更大的隔离。由于 Mininext 与 Mininet 的最新版本不兼容,我不得不按照 Mininext 存储库中的说明将后者降级到 2.1.0 版本。现在我可以很好地在每个主机上运行不同的 Quagga 实例了。

    这里是使用 Mininext 库调整的拓扑代码,以防万一有人遇到同样的情况:

    import inspect
    import os
    from mininext.topo import Topo
    from mininext.services.quagga import QuaggaService
    from collections import namedtuple
    
    QuaggaHost = namedtuple('QuaggaHost', 'name ip lo gw')
    
    
    class my_topo(Topo):
        'My custom topology settings'
    
        def __init__(self):
            Topo.__init__(self)
    
            self_path = os.path.dirname(os.path.abspath(
                inspect.getfile(inspect.currentframe())
            ))
    
            quagga_svc = QuaggaService(autoStop=False)
    
            quagga_base_config_path = self_path + '/configs/'
    
            quagga_hosts = []
            quagga_hosts.append(QuaggaHost(name='h1',
                                           ip='172.31.1.100/24',
                                           lo='10.0.1.1/24',
                                           gw='gw 172.31.1.1'))
            quagga_hosts.append(QuaggaHost(name='h2',
                                           ip='172.31.2.100/24',
                                           lo='10.0.2.1/24',
                                           gw='gw 172.31.2.1'))
            quagga_hosts.append(QuaggaHost(name='h3',
                                           ip='172.31.3.100/24',
                                           lo='10.0.3.1/24',
                                           gw='gw 172.31.3.1'))
            quagga_hosts.append(QuaggaHost(name='h4',
                                           ip='172.31.4.100/24',
                                           lo='10.0.4.1/24',
                                           gw='gw 172.31.4.1'))
            quagga_hosts.append(QuaggaHost(name='h5',
                                           ip='172.32.1.2/30',
                                           lo='10.0.5.1/24',
                                           gw='gw 172.32.1.1'))
    
            hosts = {}
    
            for host in quagga_hosts:
                quagga_container = self.addHost(name=host.name,
                                                ip=host.ip,
                                                defaultRoute=host.gw,
                                                hostname=host.name,
                                                privateLogDir=True,
                                                privateRunDir=True,
                                                inMountNamespace=True,
                                                inPIDNamespace=True,
                                                inUTSNamespace=True)
                hosts[host.name] = quagga_container
    
                self.addNodeLoopbackIntf(node=host.name, ip=host.lo)
    
                quagga_svc_config = \
                    {'quaggaConfigPath': quagga_base_config_path + host.name}
                self.addNodeService(node=host.name, service=quagga_svc,
                                    nodeConfig=quagga_svc_config)
    
            sA = self.addSwitch('s5')
            sB = self.addSwitch('s6')
            sC = self.addSwitch('s7')
            sD = self.addSwitch('s8')
    
            self.addLink(hosts['h1'], sA)
            self.addLink(hosts['h2'], sB)
            self.addLink(hosts['h3'], sC)
            self.addLink(hosts['h4'], sD)
            self.addLink(sA, sB)
            self.addLink(sB, sD)
            self.addLink(sD, sC)
            self.addLink(sC, sA)
            self.addLink(sA, sD)
    
            self.addLink(hosts['h2'], hosts['h5'], 1, 0)
            self.addLink(hosts['h4'], hosts['h5'], 1, 1)
    
    
    topos = {'my_topo': (lambda: my_topo())}
    

    Quagga 配置文件必须放在configs 目录中,该目录与拓扑文件位于同一目录中。 configs 对每个主机都有目录,就好像每个主机都是一个/etc/quagga 目录一样。

    【讨论】:

      猜你喜欢
      • 2020-06-23
      • 2012-06-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多