2017-08-24 50 views
0

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

我想拥有单独的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 

回答

0

我想出了如何使用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())} 

斑驴的配置文件必须放在里面configs目录,该目录位于同一目录中的拓扑文件。 configs有每个主机的目录,好像每个目录都是/etc/quagga

相关问题