Хосты с отдельным пространством PID для процессов в Mininet

Я хочу запустить экземпляры Quagga на каждом из моих хостов в настройка Mininet. Как реализовано в приведенном ниже коде, я могу монтировать /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

person rodsoars    schedule 24.08.2017    source источник


Ответы (1)


Я сам придумал, как изолировать процессы от каждого хоста, используя Mininext, расширение для Mininet, обеспечивающее большую изоляцию между хозяева. Поскольку Mininext не совместим с последними версиями Mininet, мне пришлось понизить последнюю версию до версии 2.1.0, как указано в репозитории Miniext. Теперь я могу хорошо запускать отдельные экземпляры 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.

person rodsoars    schedule 26.08.2017