2017-08-24 9 views
0

Mininet設定の各ホストでQuaggaのインスタンスを実行したいとします。以下のコードで実装されているように、私は/tmp/<host>/etc/quaggaをホストごとに/etc/quaggaとしてマウントし、ホスト(プライベートディレクトリ)ごとにディレクトリ内の設定ファイルを隔離することができます。しかし、各ホストでQuaggaサービスを開始すると(下のファイルipconfの最後の行)、それらはすべて同じPID番号を共有します。それぞれに独自のQuagga構成ファイルがありますが、すべて同じプロセスを効果的に作成します。Mininetのプロセス用に別個のPID空間を持つホスト

それぞれ独自のPIDを持つ別々のQuaggaインスタンスが必要です。どうすればこれを達成できますか?

カスタム・トポロジーファイル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インスタンスをうまく実行できます。

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ディレクトリ、内側に配置する必要があります。ここでは

は、ケースには、誰もが同じような状況に直面し、Mininextライブラリを使用して適応し、トポロジコードです。 configsには、各ホストが/etc/quaggaディレクトリであるかのように、各ホスト用のディレクトリがあります。