2017-08-24 52 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

相關問題