ns-3 hálózati szimulátor oktatóanyag. 3. fejezet

ns-3 hálózati szimulátor oktatóanyag. 3. fejezet
1,2. fejezet

3 Kezdő lépések
3.1. Áttekintés
3.2 Előfeltételek
3.2.1 Az ns-3 kiadás letöltése forrásarchívumként
3.3 Az ns-3 letöltése Git használatával
3.3.1 Az ns-3 betöltése a Bake segítségével
3.4 Összeszerelés ns-3
3.4.1 Építés build.py segítségével
3.4.2 Épület sütéssel
3.4.3 Build with Waf
3.5 Az ns-3 tesztelése
3.6 A szkript futtatása
3.6.1 Parancssori argumentumok
3.6.2 Hibakeresés
3.6.3 Munkakönyvtár

Fejezet 3

Elkezdeni

Ennek a fejezetnek az a célja, hogy felkészítse az olvasót egy olyan számítógépre, amelyre esetleg még soha nem volt telepítve az ns-3. Tartalmazza a támogatott platformokat, az előfeltételeket, az ns-3 beszerzését, az ns-3 összeállítását, valamint az összeállítás tesztelését és az egyszerű programok futtatását.

3.1. Áttekintés

Az ns-3 szimulátor együttműködő szoftverkönyvtárak rendszereként épül fel. Az összeállítás során a felhasználói programok kódja ezekhez a könyvtárakhoz kapcsolódik. A C++ vagy a Python programozási nyelvek egyedi programok írására szolgálnak.

Az Ns-3 forráskódként van terjesztve, ami azt jelenti, hogy a célrendszernek szoftverfejlesztő környezettel kell rendelkeznie ahhoz, hogy először a könyvtárakat, majd a felhasználói programot építse fel. Elvileg az ns-3 egy adott rendszerhez kész könyvtárként terjeszthető, és a jövőben ilyen módon is terjeszthető. De manapság sok felhasználó valójában úgy végzi a munkáját, hogy magát az ns-3-at szerkeszti, ezért hasznos a forráskód birtokában a könyvtárak felépítéséhez. Ha valaki el szeretné vállalni a kész könyvtárak és operációs rendszerek csomagjainak elkészítését, kérjük, forduljon a levelezőlistához ns-fejlesztők.

Ezután az ns-3 letöltésének és elkészítésének három módját tekintjük meg. Az első a hivatalos kiadás letöltése és elkészítése a fő webhelyről. A második az alap ns-3 telepítés fejlesztői verzióinak másolatainak kiválasztása és összeállítása. A harmadik további összeállítási eszközök használata további bővítmények betöltésére az ns-3-hoz. Mindegyiket végignézzük, mivel az eszközök kissé eltérőek.

A tapasztalt Linux-felhasználók elgondolkodhatnak azon, hogy az ns-3 miért nincs csomagként biztosítva, mint a legtöbb más, csomagkezelőt használó könyvtár? Bár léteznek bináris csomagok a különféle Linux-disztribúciókhoz (pl. Debian), a legtöbb felhasználó végül szerkeszti a könyvtárakat, és magának kell újraépítenie az ns-3-at, így a forráskód kéznél van. Emiatt a forrásból történő telepítésre összpontosítunk.

A legtöbb alkalmazáshoz ns-3 jogok gyökér nincs szükség, akkor javasolt egy privilegizált felhasználói fiók használata.

3.2 Előfeltételek

Az elérhető ns-3 könyvtárak teljes készlete számos függőséggel rendelkezik harmadik féltől származó könyvtárakhoz, de az ns-3 többnyire több általános (gyakran alapértelmezés szerint telepített) összetevő támogatásával is összeállítható és használható: egy C++ fordító, Python, egy forráskód-szerkesztő (pl. életkedv, emacs vagy fogyatkozás) és ha fejlesztői adattárakat használnak, akkor a Git verzióvezérlő rendszereket. A legtöbb első felhasználónak nem kell aggódnia, ha konfigurációja bizonyos ns-3 speciális funkciók hiányát jelzi, de azok számára, akik teljes körű telepítést szeretnének, a projekt egy wikit tartalmaz, amely sok hasznos tippet és trükköt tartalmaz. Az egyik ilyen oldal a Telepítési oldal, ahol különféle rendszerek telepítési útmutatói találhatók, és a következő címen érhető el: https://www.nsnam.org/wiki/Installation.

Ennek a wikinek az Előfeltételek szakasza elmagyarázza, hogy mely csomagokra van szükség a gyakori ns-3 opciók támogatásához, és megadja azokat a parancsokat is, amelyekkel telepíthetők a Linux és a macOS általános változataira.

Kihasználhatja ezt a lehetőséget az ns-3 wiki oldal vagy a fő webhely felfedezésére: https://www.nsnam.org, mert rengeteg információ van ott. Az ns-3 legújabb verziójától (ns-3.29) kezdve az ns-3 futtatásához a következő eszközökre van szükség:

Eszközcsomag/Verzió

  • C++ fordító
    clang++ vagy g++ (g++ 4.9 vagy újabb verzió)
  • Piton
    python2 verzió >= 2.7.10 vagy python3 verzió >=3.4
  • megy
    bármely legújabb verzió (az ns-3 eléréséhez a GitLab.com webhelyen)
  • kátrány
    bármely legújabb verzió (ns-3 kiadás kicsomagolásához)
  • bunzip2
    bármely legújabb verzió (az ns-3 kiadás kicsomagolásához)

A Python alapértelmezett verziójának ellenőrzéséhez írja be python -V. A g++ verzió ellenőrzéséhez írja be a következőt: g++ -v. Ha valamelyik eszköz hiányzik vagy túl régi, kérjük, olvassa el a telepítési útmutatót az ns-3 wiki oldalán.

Ezentúl feltételezzük, hogy az olvasó Linux, MacOS vagy Linux emulátort futtat, és rendelkezik legalább a fenti eszközökkel.

3.2.1 Az ns-3 kiadás letöltése forrásarchívumként

Ez a teendő egy új felhasználó számára, aki szeretné letölteni és kísérletezni az ns-3 legújabb kiadásaival és csomagjaival. Az ns-3 kiadásokat tömörített forrásarchívumként teszik közzé, amelyet néha ún tarballt. tarballt egy speciális szoftverarchívum formátum, amelyben több fájl egyesítve van. Az archívum általában tömörített. ns-3 rendszerindítási folyamat ezen keresztül tarballt egyszerű, csak ki kell választania egy kiadást, letöltenie és ki kell csomagolnia.

Tételezzük fel, hogy felhasználóként az ns-3-at egy helyi könyvtárba szeretnéd építeni munkaterület. A kiadás munkapéldányát a Linux konzolba beírva szerezheti be (természetesen a megfelelő verziószámok helyettesítésével)

$ cd 
$ mkdir workspace 
$ cd workspace 
$ wget https://www.nsnam.org/release/ns-allinone-3.29.tar.bz2 
$ tar xjf ns-allinone-3.29.tar.bz2 

Ügyeljen a fent használt segédprogramra wget, amely egy parancssori eszköz objektumok internetről történő letöltésére. Ha még nem telepítette, használhatja a böngészőjét.

Ezeket a lépéseket követve az ns-allinone-3.29 könyvtárba kerül, ahol több fájlt és könyvtárat kell látnia

$ cd ns-allinone-3.29
$ ls
bake constants.py ns-3.29 README
build.py netanim-3.108 pybindgen-0.17.0.post58+ngcf00cc0 util.py

Most készen áll az ns-3 alap disztribúció felépítésére, és továbbléphet az ns-3 felépítéséről szóló részre.

3.3 Az ns-3 letöltése Git használatával

Az ns-3 kód elérhető a GitLab.com Git-tárolóiban a címen https://gitlab.com/nsnam/. Csoport nsnam egyesíti a nyílt forráskódú projektek által használt különféle tárolókat.

A Git-tárolók használatának legegyszerűbb módja a környezet elágazása vagy klónozása ns-3-allinon. Ez egy olyan szkriptkészlet, amely a leggyakrabban használt ns-3 alrendszerek betöltését és összeállítását kezeli. Ha még nem ismeri a Git-et, előfordulhat, hogy a "fork" és a "klón" kifejezések ismeretlenek számodra; ha igen, javasoljuk, hogy egyszerűen klónozza (készítse el saját másolatát) a GitLab.com-on található adattárat a következőképpen:

$ cd 
$ mkdir workspace 
$ cd workspace 
$ git clone https://gitlab.com/nsnam/ns-3-allinone.git 
$ cd ns-3-allinone 

Ebben a szakaszban a címtár nézete ns-3-allinon kissé eltér a fent leírt kiadási archívum könyvtárától. Valahogy így kell kinéznie:

$ ls
build.py constants.py download.py README util.py

Felhívjuk figyelmét, hogy van egy forgatókönyv download.py, amely emellett kivonja az ns-3-at és a hozzá tartozó forráskódot. Itt választhat: vagy töltse le a legújabb ns-3 fejlesztési pillanatképet:

$ python download.py

vagy előnyben részesítik az ns-3 kiadást a flag használatával -n a kiadási szám feltüntetéséhez:

$ python download.py -n ns-3.29

E lépés után a könyvtárba ns-3-allinon további adattárak letöltésre kerülnek ns-3, süt, pybindgen и netanim.

Megjegyzés
Egy tiszta Ubuntu16.04-es gépen a parancsot a következőre kellett módosítanom: $ sudo python3 download.py -n ns-3.29 (a továbbiakban fordítói megjegyzések).

3.3.1 Az ns-3 betöltése a Bake segítségével

A fenti két módszer (forrásarchívum vagy repository ns-3-allinon Git-en keresztül) hasznosak a legegyszerűbb ns-3 telepítéshez több kiegészítővel (pybindgen Python-kötések generálásához és netanim hálózati animációhoz). Az ns-3-allinone alapértelmezés szerint biztosított harmadik tárolója meghívásra kerül süt.

Süt az ns-3 projekthez kifejlesztett több tárolóból származó szoftver összehangolt felépítésének eszköze. Süt használható az ns-3 fejlesztői verzióinak beszerzésére, valamint az ns-3 disztribúció alapverziójának bővítményeinek letöltésére és elkészítésére, például a környezetre. Közvetlen kódvégrehajtás, CradleNetwork szimulációs bölcső, új Python-kötések és különféle ns-3 „alkalmazások” létrehozásának képessége.

Megjegyzés
CradleNetwork Simulation A Cradle egy olyan keretrendszer, amely lehetővé teszi valódi TCP/IP hálózati veremek használatát egy hálózati szimulátoron belül.

Ha arra számít, hogy az ns-3 telepítése fejlett vagy további funkciókkal rendelkezik, kövesse ezt a telepítési utat.

A legújabb ns-3 kiadásokban Süt hozzáadták a kátránykibocsátáshoz. A kiadás tartalmaz egy konfigurációs fájlt, amely lehetővé teszi az aktuális szoftververziók letöltését a kiadás időpontjában. Ez például a verzió Süt, amely az ns-3.29-es kiadással van terjesztve, felhasználható az adott ns-3 vagy korábbi kiadás összetevőinek lekérésére, de nem használható a későbbi kiadások összetevőinek lekérésére (ha a csomagleíró fájl bakeconf.xml nem frissített).

A legújabb példányt is beszerezheti süta következő parancs beírásával a Linux-konzolba (feltételezve, hogy telepítve van a Git):

$ cd 
$ mkdir workspace 
$ cd workspace 
$ git clone https://gitlab.com/nsnam/bake.git

A git parancs futtatásakor valami ilyesmit kell látnia:

Cloning into 'bake'...
remote: Enumerating objects: 2086, done. 
remote: Counting objects: 100% (2086/2086), done. 
remote: Compressing objects: 100% (649/649), done. 
remote: Total 2086 (delta 1404), reused 2078 (delta 1399) 
Receiving objects: 100% (2086/2086), 2.68 MiB | 3.82 MiB/s, done. 
Resolving deltas: 100% (1404/1404), done.

A parancs befejezése után klón nevű könyvtárnak kell lennie süt, amelynek tartalma valahogy így néz ki:

$ cd bake
$ ls
bake bakeconf.xml bake.py doc examples generate-binary.py test TODO

Vegye figyelembe, hogy több Python-szkriptet töltött be, egy Python-modult süt és egy XML konfigurációs fájl. A következő lépés ezeknek a szkripteknek az Ön által választott ns-3 disztribúció letöltése és összeállítása. Számos testreszabási cél érhető el:

  1. ns-3.29: a kiadásnak megfelelő modul; a tarballban lévő kiadáshoz hasonló összetevőket tölt le;

  2. ns-3-dev: egy hasonló modul, de a fejlesztési fa kódját használja;

  3. ns-allinon-3.29: Modul, amely további kiegészítő funkciókat is tartalmaz, mint például a Click Routing és a Network Simulation Cradle, Openflow for ns-3.

  4. ns-3-allinon: hasonló a modul kiadási verziójához minden egyben, hanem a fejlesztési kódhoz.

Megjegyzés
Kattints — moduláris szoftverarchitektúra útválasztók létrehozásához.

Az Openflow egy protokoll, amely az adathálózaton keresztül routerek és switchek által továbbított adatok feldolgozásának folyamatát kezeli, szoftveresen definiált hálózati technológiát valósítva meg.

A jelenlegi fejlesztési pillanatkép (nem kiadott) ns-3 itt található:https://gitlab.com/nsnam/ns-3-dev.git.

A fejlesztők igyekeznek ezeket a tárolókat konzisztens működési rendben tartani, de a fejlesztési területen vannak, és kiadatlan kódot tartalmaznak, ezért ha nem tervezi új funkciók használatát, válassza ki a hivatalos kiadást.

A kód legfrissebb verzióját a tárolók listájának böngészésével vagy az ns-3 Releases weboldalán találhatja meg:https://www.nsnam.org/releases/ és kattintson a legújabb verzió hivatkozására. Ebben a példában az ns-3.29-el folytatjuk.

Most, hogy megkapjuk a szükséges ns-3 összetevőket, használjuk az eszközt Süt. Egy pár bevezető szót a műről Süt.

A Bake úgy működik, hogy betölti a csomagforrásokat egy könyvtárba forrás és a könyvtárak telepítése a build könyvtárba. Süt futtatható a bináris hivatkozással, de ha futni akar Süt nem abból a könyvtárból, ahova letöltötte, célszerű az elérési utat hozzáadni süt elérési útjára (PATH környezeti változó), például az alábbiak szerint (példa Linux bash shellre). Lépjen a "bake" könyvtárba, és állítsa be a következő környezeti változókat:

$ export BAKE_HOME=`pwd` 
$ export PATH=$PATH:$BAKE_HOME:$BAKE_HOME/build/bin 
$ export PYTHONPATH=$PYTHONPATH:$BAKE_HOME:$BAKE_HOME/build/lib

Ez elhelyezi a programot bake.py a shell elérési útjára, és lehetővé teszi más programok számára, hogy megtalálják az általa létrehozott végrehajtható fájlokat és könyvtárakat süt. Egyes használati esetekben süt, a fent leírt PATH és PYTHONPATH beállítás nem szükséges, de az ns-3-allinone teljes buildjéhez (további csomagokkal) általában ez szükséges.

Lépjen a munkakönyvtárába, és írja be a következőket a konzolba:

$ ./bake.py configure -e ns-3.29

Legközelebb megkérdezzük Süt ellenőrizze, hogy van-e elegendő eszközünk a különböző összetevők betöltéséhez. Tárcsa:

$ ./bake.py check

Valami ilyesmit kell látnod:

> Python - OK 
> GNU C++ compiler - OK 
> Mercurial - OK 
> Git - OK 
> Tar tool - OK 
> Unzip tool - OK 
> Make - OK 
> cMake - OK 
> patch tool - OK 
> Path searched for tools: /usr/local/sbin /usr/local/bin /usr/sbin /usr/bin /sbin /bin ...

Ebben a lépésben különösen fontosak az olyan feltöltési eszközök, mint a Mercurial, CVS, Git és Bazaar, mivel ezek lehetővé teszik számunkra a kód beszerzését. Ezen a ponton telepítse a hiányzó eszközöket a rendszerén szokásos módon (ha tudja, hogyan), vagy kérjen segítséget a rendszergazdától.

Ezután próbálja meg letölteni a szoftvert:

$ ./bake.py download

az eredmény valami ilyesmi legyen:

>> Searching for system dependency setuptools - OK 
>> Searching for system dependency libgoocanvas2 - OK 
>> Searching for system dependency gi-cairo - OK 
>> Searching for system dependency pygobject - OK 
>> Searching for system dependency pygraphviz - OK 
>> Searching for system dependency python-dev - OK 
>> Searching for system dependency qt - OK 
>> Searching for system dependency g++ - OK 
>> Downloading pybindgen-0.19.0.post4+ng823d8b2 (target directory:pybindgen) - OK 
>> Downloading netanim-3.108 - OK 
>> Downloading ns-3.29 - OK

Ez azt jelenti, hogy három forrás lett letöltve. Most menjen a forráskönyvtárba, és írja be az ls-t; Látnod kéne:

$ cd source 
$ ls
netanim-3.108 ns-3.29 pybindgen

Most készen áll az ns-3 disztribúció felépítésére.

3.4 Összeszerelés ns-3

Az ns-3 letöltéséhez hasonlóan az ns-3 létrehozásának számos módja van. A legfontosabb dolog, amit szeretnénk hangsúlyozni, az az, hogy az ns-3 egy összeállítási eszköz segítségével épül fel Wafaz alábbiakban leírt. A legtöbb felhasználó együtt fog dolgozni Waf, de van néhány praktikus szkript, amelyek segítenek az indulásban vagy az összetettebb összeállítások megszervezésében. Szóval, kérlek, mielőtt olvasnál róla Waf, vessünk egy pillantást build.py és összeszerelés vele süt.

3.4.1 Építés build.py segítségével

Figyelem! Ez az összeállítási lépés csak a fent leírtak szerint kapott forrásarchívum-verzióból érhető el; és nem git vagy bake segítségével töltik le.

Kiadási archívum használatakor tarballt-Ban ns-3-allinon Van egy praktikus szkript, amely megkönnyíti az alkatrészek összeszerelését. Ezt build.py-nek hívják. Ez a program a leghasznosabb módon állítja be Önnek a projektet. Azonban vegye figyelembe, hogy a fejlettebb beállítás és az ns-3-mal való munka általában az ns-3 saját összeállítási rendszerének, a Waf-nak a használatát jelenti, amelyet ebben az oktatóanyagban később mutatunk be.

Ha a segítségével töltötted le tarballt, majd a könyvtárában ~/munkaterület valami hasonló nevű könyvtárat ns-allinon-3.29. Írd be a következőt:

$ ./build.py --enable-examples --enable-tests

Amikor hívják build.py Parancssori argumentumokat használtunk az oktatóanyagban használt példák és tesztek felépítéséhez, amelyek alapértelmezés szerint nem épülnek fel az ns-3-ban. Alapértelmezés szerint a program az összes elérhető modult is elkészíti. Ezután, ha akarja, elkészítheti az ns-3-at példák és tesztek nélkül, vagy kizárhatja azokat a modulokat, amelyekre nincs szükség a munkájához.

Sok fordítói kimeneti üzenetet fog látni a szkript által, amint az összeállítja a különböző betöltött részeket. Először a szkript megpróbálja felépíteni az animátort netanim, majd a kötésgenerátor pybindgen és végül ns-3. Amikor a folyamat befejeződött, a következőket kell látnia:

Waf: Leaving directory '/path/to/workspace/ns-allinone-3.29/ns-3.29/build'
'build' finished successfully (6m25.032s) 

Modules built:
antenna                aodv                     applications
bridge                 buildings                config-store
core                   csma                     csma-layout
dsdv                   dsr                      energy 
fd-net-device          flow-monitor             internet
internet-apps          lr-wpan                  lte
mesh                   mobility                 mpi
netanim (no Python)    network                  nix-vector-routing 
olsr                   point-to-point           point-to-point-layout 
propagation            sixlowpan                spectrum 
stats                  tap-bridge               test (no Python) 
topology-read          traffic-control          uan 
virtual-net-device     visualizer               wave 
wifi                   wimax 

Modules not built (see ns-3 tutorial for explanation):
brite                  click                    openflow 
Leaving directory ./ns-3.29

A lista utolsó három sorában egy üzenetet látunk olyan modulokról, amelyek nem készültek el:

Modules not built (see ns-3 tutorial for explanation):
brite                     click

Ez egyszerűen azt jelenti, hogy egyes ns-3 modulok, amelyek külső függvénytáraktól függenek, nem épültek fel, vagy nem szükséges beépíteni őket ehhez a konfigurációhoz. Ez nem jelenti azt, hogy a szimulátor nincs összeszerelve, vagy hogy az összeszerelt modulok nem működnek megfelelően.

3.4.2 Épület sütéssel

Ha a fenti bake-et használta a forráskód lekéréséhez a projekttárolókból, akkor továbbra is használhatja az ns-3 összeállításához. Tárcsa:

$ ./bake.py build

és valami ilyesmit kell látnod:

>> Building pybindgen-0.19.0.post4+ng823d8b2 - OK 
>> Building netanim-3.108 - OK 
>> Building ns-3.29 - OK

gyors: A „bake.py deploy” meghívásával egyszerre is elvégezheti a letöltési és az összeállítási lépéseket.

Előfordulhat, hogy az összes alkatrész összeszerelése meghiúsul, de az összeszerelés folytatódik, ha az alkatrészre nincs szükség. Például a közelmúltban egy hordozhatósági probléma az volt castxml szerszámmal összeállítható süt nem minden platformon. Ebben az esetben egy ehhez hasonló üzenet jelenik meg:

>> Building castxml - Problem 
> Problem: Optional dependency, module "castxml" failed
This may reduce the functionality of the final build.
However, bake will continue since "castxml" is not an essential dependency.
For more information call bake with -v or -vvv, for full verbose mode.

De castxml csak akkor szükséges, ha frissített Python-kötéseket szeretne létrehozni. A legtöbb felhasználó számára erre nincs szükség (legalábbis az ns-3 módosításáig), így az ilyen figyelmeztetéseket egyelőre nyugodtan figyelmen kívül hagyhatjuk.

Ha meghiúsul, a következő parancs tippet ad a hiányzó függőségekről:

$ ./bake.py show

Megjelenik a felépíteni kívánt csomagok különféle függőségei.

3.4.3 Build with Waf

Eddig a pontig az ns-3 felépítéséhez vagy a szkriptet használtuk build.py, vagy eszköz süt. Ezek az eszközök hasznosak az ns-3 építéséhez és a könyvtárak karbantartásához. Valójában az építéshez futtatják az építési eszközt Waf az ns-3 könyvtárból. Waf ns-3 forráskóddal telepítve. A legtöbb felhasználó gyorsan áttér a közvetlen használatra az ns‑3 konfigurálására és összeállítására Waf. Tehát a folytatáshoz lépjen az eredetileg létrehozott ns-3 könyvtárba.

Ez jelenleg nem feltétlenül szükséges, de hasznos lesz egy kicsit visszalépni, és megnézni, hogyan módosítható a projekt konfigurációja. Valószínűleg a leghasznosabb konfigurációs módosítás, amelyet megtehet, az, hogy létrehozza a kód optimalizált verzióját. Alapértelmezés szerint a projektet úgy állította be, hogy hibakeresési verziót készítsen. Vessünk egy pillantást egy projektre az optimalizált összeállítás létrehozásához. Ahhoz, hogy elmagyarázza a Wafnak, hogy példákat és teszteket tartalmazó optimalizált buildeket kell készítenie, a következő parancsokat kell futtatnia:

$ ./waf clean 
$ ./waf configure --build-profile=optimized --enable-examples --enable-tests

Ez elindul Waf a helyi címtáron kívül (az Ön kényelme érdekében). Az első parancs megtisztítja az előző buildet, ez általában nem feltétlenül szükséges, de jó gyakorlat (lásd alább az összeépítési profilokat is); ez törli a korábban létrehozott könyvtárakat és a könyvtárban található objektumfájlokat épít/. Amikor a projekt újra van konfigurálva, és a felépítési rendszer ellenőrzi a különböző függőségeket, a következőhöz hasonló kimenetet kell látnia:

Setting top to      : /home/ns3user/workspace/bake/source/ns-3-dev
Setting out to      : /home/ns3user/workspace/bake/source/ns-3-dev/build
Checking for 'gcc' (C compiler)        : /usr/bin/gcc 
Checking for cc version                : 7.3.0 
Checking for 'g++' (C++ compiler)      : /usr/bin/g++ 
Checking for compilation flag -march=native support : ok 
Checking for compilation flag -Wl,--soname=foo support : ok 
Checking for compilation flag -std=c++11 support       : ok 
Checking boost includes   : headers not found, please ,!provide a --boost-includes argument (see help) 
Checking boost includes   : headers not found, please ,!provide a --boost-includes argument (see help) 
Checking for program 'python'            : /usr/bin/python 
Checking for python version >= 2.3       : 2.7.15 python-config                                                                     : /usr/bin/python-config
Asking python-config for pyembed '--cflags --libs --ldflags' flags : yes
Testing pyembed configuration                                      : yes
Asking python-config for pyext '--cflags --libs --ldflags' flags   : yes
Testing pyext configuration                                        : yes

Checking for compilation flag -fvisibility=hidden support          : ok 
Checking for compilation flag -Wno-array-bounds support            : ok 
Checking for pybindgen location          : ../pybindgen ,!(guessed) 
Checking for python module 'pybindgen'   : 0.19.0. ,!post4+g823d8b2 
Checking for pybindgen version           : 0.19.0. ,!post4+g823d8b2 
Checking for code snippet                : yes 
Checking for types uint64_t and unsigned long equivalence : no 
Checking for code snippet                                 : no 
Checking for types uint64_t and unsigned long long equivalence     : yes 
Checking for the apidefs that can be used for Python bindings                       : gcc-LP64 
Checking for internal GCC cxxabi         : complete 
Checking for python module 'pygccxml'    : not found 
Checking for click location              : not found 
Checking for program 'pkg-config'        : /usr/bin/pkg- ,!config 
Checking for 'gtk+-3.0'                  : not found 
Checking for 'libxml-2.0'                : yes 
checking for uint128_t                   : not found 
checking for __uint128_t                 : yes 
Checking high precision implementation   : 128-bit integer ,!(default) 
Checking for header stdint.h             : yes 
Checking for header inttypes.h           : yes 
Checking for header sys/inttypes.h       : not found 
Checking for header sys/types.h          : yes 
Checking for header sys/stat.h           : yes 
Checking for header dirent.h             : yes 
Checking for header stdlib.h             : yes 
Checking for header signal.h             : yes 
Checking for header pthread.h            : yes 
Checking for header stdint.h             : yes 
Checking for header inttypes.h           : yes 
Checking for header sys/inttypes.h       : not found
Checking for library rt                  : yes 
Checking for header sys/ioctl.h          : yes 
Checking for header net/if.h             : yes 
Checking for header net/ethernet.h       : yes 
Checking for header linux/if_tun.h       : yes 
Checking for header netpacket/packet.h   : yes 
Checking for NSC location                : not found 
Checking for 'sqlite3'                   : not found 
Checking for header linux/if_tun.h       : yes 
Checking for python module 'gi'          : 3.26.1 
Checking for python module 'gi.repository.GObject'      : ok 
Checking for python module 'cairo'                      : ok 
Checking for python module 'pygraphviz'                 : 1.4rc1 
Checking for python module 'gi.repository.Gtk'          : ok 
Checking for python module 'gi.repository.Gdk'          : ok 
Checking for python module 'gi.repository.Pango'        : ok 
Checking for python module 'gi.repository.GooCanvas'    : ok 
Checking for program 'sudo'                             : /usr/bin/sudo 
Checking for program 'valgrind'                         : not found 
Checking for 'gsl' : not found python-config            : not found 
Checking for compilation flag -fstrict-aliasing support : ok 
Checking for compilation flag -fstrict-aliasing support : ok 
Checking for compilation flag -Wstrict-aliasing support : ok 
Checking for compilation flag -Wstrict-aliasing support : ok 
Checking for program 'doxygen'                          : /usr/bin/doxygen
---- Summary of optional ns-3 features:
Build profile : optimized
Build directory : 
BRITE Integration : not enabled (BRITE not enabled (see option --with- ,!brite)) 
DES Metrics event collection : not enabled (defaults to disabled) 
Emulation FdNetDevice        : enabled 
Examples                     : enabled 
File descriptor NetDevice    : enabled 
GNU Scientific Library (GSL) : not enabled (GSL not found) 
Gcrypt library               : not enabled
(libgcrypt not found: you can use ,!libgcrypt-config to find its location.) GtkConfigStore               : not enabled (library 'gtk+-3.0 >= 3.0' not fou   nd)
MPI Support                  : not enabled (option --enable-mpi not selected)
ns-3 Click Integration       : not enabled (nsclick not enabled (see option --with- ,!nsclick))
ns-3 OpenFlow Integration   : not enabled (Required boost libraries not found) 
Network Simulation Cradle    : not enabled (NSC not found (see option --with-nsc))
PlanetLab FdNetDevice         : not enabled (PlanetLab operating system not detected ,!(see option --force-planetlab)) PyViz visualizer : enabled 
Python API Scanning Support   : not enabled (Missing 'pygccxml' Python module)
Python Bindings : enabled 
Real Time Simulator           : enabled 
SQlite stats data output      : not enabled (library 'sqlite3' not found)
Tap Bridge                    : enabled 
Tap FdNetDevice               : enabled
Tests                         : enabled 
Threading Primitives          : enabled 
Use sudo to set suid bit   : not enabled (option --enable-sudo not selected)
XmlIo                         : enabled
'configure' finished successfully (6.387s)

Kérjük, vegye figyelembe a fenti lista utolsó részét. Egyes ns-3 opciók alapértelmezés szerint nincsenek engedélyezve, vagy a megfelelő működéshez rendszertámogatás szükséges. Például az XmlTo engedélyezéséhez a könyvtárnak jelen kell lennie a rendszeren libxml-2.0. Ha ez a könyvtár nem található, és a megfelelő ns-3 funkció nincs engedélyezve, egy üzenet jelenik meg. Vegye figyelembe azt is, hogy lehetséges a parancs használata sudo a suid bit „set group ID at runtime” beállításához bizonyos programok esetében. Alapértelmezés szerint nincs engedélyezve, ezért ez a funkció „nincs engedélyezve”-ként jelenik meg. Végül az engedélyezett opciók listájának megtekintéséhez használja a Waf paraméterrel --check-config.

Most térjünk vissza, és térjünk vissza a példákat és teszteket tartalmazó hibakereső buildre.

$ ./waf clean 
$ ./waf configure --build-profile=debug --enable-examples --enable-tests

Az összeállítási rendszer most be van állítva, és az ns-3 programok hibakereső verzióit egyszerűen beírhatja:

$ ./waf

Lehet, hogy a fenti lépések arra kényszerítették, hogy az ns-3 rendszer egy részét kétszer is összeállítsa, de most már tudja, hogyan módosíthatja a konfigurációt és hogyan készíthet optimalizált kódot.

Egy parancs segítségével ellenőrizheti, hogy egy adott projektkonfigurációhoz melyik profil aktív:

$ ./waf --check-profile 
Waf: Entering directory `/path/to/ns-3-allinone/ns-3.29/build' 
Build profile: debug

A fenti forgatókönyv build.py érveket is alátámasztja --enable-examples и --enable-tests, hanem más lehetőségek is Waf közvetlenül nem támogatja. Például ez nem fog működni:

$ ./build.py --disable-python

a reakció a következő lesz:

build.py: error: no such option: --disable-python

A speciális operátor - - azonban további paraméterek átadására használható WAFtehát a fentiek helyett a következő parancs fog működni:

$ ./build.py -- --disable-python

mert ez generálja a főparancsot ./waf configure --disable-python. Íme néhány további bevezető tipp ezzel kapcsolatban Waf.

Összeállítási hibák kezelése

Az ns-3 kiadásokat a kiadás idején elérhető legújabb C++ fordítókon tesztelik a szokásos Linux és MacOS disztribúciókon. Idővel azonban új disztribúciók jelennek meg új fordítókkal, és ezek az újabb fordítók általában pedánsabbak a figyelmeztetésekkel kapcsolatban. Az ns-3 úgy állítja be a buildjét, hogy az összes figyelmeztetést hibaként kezelje, így néha, ha régebbi verziót futtat egy újabb rendszeren, a fordítói figyelmeztetés leállíthatja a buildet.

Például korábban megjelent az ns-3.28 a Fedora 28-hoz, amely egy új főverziót is tartalmazott gcc (gcc-8). Az ns-3.28-as vagy korábbi verziók Fedora 28 alatti, Gtk2+ telepítése mellett a következő hiba lép fel:

/usr/include/gtk-2.0/gtk/gtkfilechooserbutton.h:59:8: error: unnecessary parentheses ,!in declaration of ‘__gtk_reserved1’ [-Werror=parentheses] void (*__gtk_reserved1);

Az ns-3.28.1-től kezdődő kiadásokban in Waf lehetőség van ezen problémák megoldására. Letiltja a "-Werror" jelző beállítását a g++ és a clang++ alkalmazásban. Ez a "--disable-werror" opció, amelyet a konfiguráció során kell alkalmazni:

$ ./waf configure --disable-werror --enable-examples --enable-tests

Konfigurálja vagy szerelje össze

Néhány parancs Waf csak a konfigurációs fázisban van jelentésük, néhány pedig csak a felépítési fázisban érvényes. Például, ha használni szeretné az ns-3 emulációs szolgáltatásokat, engedélyezheti a bitbeállítást suid felhasználásával sudo, a fent leírtak szerint. Ez felülírja a konfigurációs lépés parancsait, és így módosíthatja a konfigurációt a következő paranccsal, amely példákat és teszteket is tartalmaz.

$ ./waf configure --enable-sudo --enable-examples --enable-tests

Ha ezt teszed Waf elindul sudoaz emulációs kódfoglalat-létrehozó programok engedélyekkel való futtatásához módosítani gyökér. -Ban Waf A konfigurációs és összeállítási lépésekhez számos más lehetőség is rendelkezésre áll. A lehetőségek felfedezéséhez írja be:

$ ./waf --help

A következő részben néhány teszteléssel kapcsolatos lehetőséget fogunk használni.

Összeszerelési profilok

Már láttuk, hogyan lehet konfigurálni Waf szerelvényekhez hibakeresés и optimalizált:

$ ./waf --build-profile=debug

Van egy közbenső összeszerelési profil is, engedje. választási lehetőség -d szinonimája a --build-profile. Az összeállítási profil vezérli a naplózási, állítási és fordítói optimalizálási kapcsolók használatát:

ns-3 hálózati szimulátor oktatóanyag. 3. fejezet

Amint látja, a naplózás és az állítások csak hibakereső buildekben érhetők el. Az ajánlott gyakorlat az, hogy a szkriptet hibakeresési módban fejlessze, majd hajtson végre ismételt futtatásokat (statisztika vagy paramétermódosítás céljából) egy optimalizált összeállítási profilban.

Ha olyan kóddal rendelkezik, amelynek csak bizonyos felépítési profilokban kell futnia, használja a Code Wrapper makrót:

NS_BUILD_DEBUG (std::cout << "Part of an output line..." << std::flush; timer.Start ,!()); DoLongInvolvedComputation ();
NS_BUILD_DEBUG (timer.Stop (); std::cout << "Done: " << timer << std::endl;)

Alapértelmezett, Waf build melléktermékeket helyez el a build könyvtárban. Az opció segítségével más kimeneti könyvtárat is megadhat - -out, például:

$ ./waf configure --out=my-build-dir

Ha ezt összeállítási profilokkal kombinálja, könnyedén válthat a különböző fordítási lehetőségek között:

$ ./waf configure --build-profile=debug --out=build/debug
$ ./waf build
... 
$ ./waf configure --build-profile=optimized --out=build/optimized 
$ ./waf build
...

Ez lehetővé teszi, hogy több összeállítással dolgozzon anélkül, hogy minden alkalommal át kellene írnia a legújabb összeállítást. Amikor másik profilra vált, Waf csak azt fogja lefordítani, anélkül, hogy mindent teljesen újrafordítana.

Amikor ilyen módon vált az összeépítési profilok között, ügyeljen arra, hogy minden alkalommal ugyanazokat a konfigurációs beállításokat adja meg. Több környezeti változó meghatározása segít elkerülni a hibákat:

$ export NS3CONFIG="--enable-examples --enable-tests" 
$ export NS3DEBUG="--build-profile=debug --out=build/debug"
$ export NS3OPT=="--build-profile=optimized --out=build/optimized" 

$ ./waf configure $NS3CONFIG $NS3DEBUG
$ ./waf build 
... 
$ ./waf configure $NS3CONFIG $NS3OPT
$ ./waf build

Fordítók és zászlók

A fenti példákban Waf az ns-3 felépítéséhez a GCC C++ fordítóját használja ( g ++). A használtat azonban megváltoztathatja Waf C++ fordító, a CXX környezeti változó definiálásával. Például a C++ fordító Clang, clang++,

$ CXX="clang++" ./waf configure 
$ ./waf build 

Ugyanígy lehet konfigurálni Waf segítségével elosztott fordítást használni distcc:

$ CXX="distcc g++" ./waf configure 
$ ./waf build

További információ a distcc-ről és az elosztott fordításról a projekt oldalán, a Dokumentáció részben található. Ha az ns-3 beállításakor fordítójelzőket szeretne hozzáadni, használja a CXXFLAGS_EXTRA környezeti változót.

Telepítés

Waf használható könyvtárak telepítésére a rendszer különböző helyeire. Alapértelmezés szerint a lefordított könyvtárak és végrehajtható fájlok a könyvtárban találhatók épít, és mivel a Waf ismeri e könyvtárak és végrehajtható fájlok helyét, nincs szükség a könyvtárak máshová telepítésére.

Ha a felhasználók a build könyvtáron kívül szeretnek telepíteni, akkor lefuttathatják a parancsot ./waf telepítés. A telepítés alapértelmezett előtagja / usr / local, így ./waf telepítés telepíti a programokat / Usr / local / bin, könyvtárak / Usr / local / lib és a fejlécfájlokat /usr/local/include. A szuperfelhasználói jogokat általában alapértelmezett előtaggal kell beállítani, ezért egy tipikus parancs lenne sudo ./waf install. Indításkor a Waf először a megosztott könyvtárak használatát választja a build könyvtárban, majd megkeresi a könyvtárakat a helyi környezetben konfigurált könyvtárak elérési útja mentén. Tehát, amikor könyvtárakat telepít egy rendszerre, célszerű ellenőrizni, hogy a megfelelő könyvtárakat használja-e. A felhasználók választhatnak egy másik előtaggal történő telepítést, ha a beállítás során átadják a lehetőséget --prefix, például:

./waf configure --prefix=/opt/local

Ha később, a build után a felhasználó beírja a telepítési parancsot ./waf, az előtag kerül felhasználásra /opt/local.

Csapat ./waf clean A projekt újrakonfigurálása előtt kell használni, ha a telepítés használni fogja Waf más előtag alatt.

Így az ns-3 használatához nincs szükség hívásra ./waf install. A legtöbb felhasználónak nincs szüksége erre a parancsra, mert Waf felveszi az aktuális könyvtárakat a build könyvtárból, de egyes felhasználók hasznosnak találhatják ezt, ha tevékenységük során az ns-3 könyvtáron kívüli programokkal dolgoznak.

Waf szingli

Az ns-3 forrásfa legfelső szintjén csak egy Waf szkript található. Ha elkezd dolgozni, sok időt fog tölteni a címtárban scratch/ vagy mélyebbresrc/... és ugyanakkor futnia kell Waf. Csak emlékezhet, hol van, és futhat Waf az alábbiak szerint:

$ ../../../waf ...

de ez fárasztó és hibára hajlamos lesz, ezért vannak jobb megoldások. Az egyik gyakori módja egy szövegszerkesztő használata, mint pl emacs vagy életkedv, amelyben két terminál munkamenet nyílik meg, az egyik az ns-3 felépítésére szolgál, a másik pedig a forráskód szerkesztésére szolgál. Ha csak van tarballt, akkor egy környezeti változó segíthet:

$ export NS3DIR="$PWD" 
$ function waff { cd $NS3DIR && ./waf $* ; } 

$ cd scratch 
$ waff build

A modulkönyvtárban csábító lehet egy triviális waf szkript hozzáadása, mint pl exec ../../waf. Kérlek, ne tedd ezt. Ez zavaró az újoncok számára, és ha rosszul végzik el, nehezen észlelhető összeállítási hibákhoz vezet. A fent bemutatott megoldásokat kell használni.

3.5 Az ns-3 tesztelése

Az ns-3 disztribúció egységtesztjeit a parancsfájl futtatásával futtathatja ./test.py:

$ ./test.py

Ezeket a teszteket párhuzamosan futtatják Waf. Végül látnia kell egy üzenetet, amely a következő:

92 of 92 tests passed (92 passed, 0 failed, 0 crashed, 0 valgrind errors)

Ez egy fontos üzenet a valgrind összeomlások, összeomlások vagy hibák azonosításához, jelezve a kóddal kapcsolatos problémákat vagy az eszközök és a kód közötti inkompatibilitást.

Látni fogja a végső kimenetet is Waf és minden tesztet futtató tesztelő, amely így fog kinézni:

Waf: Entering directory `/path/to/workspace/ns-3-allinone/ns-3-dev/build' 
Waf: Leaving directory `/path/to/workspace/ns-3-allinone/ns-3-dev/build' 
'build' finished successfully (1.799s) 

Modules built:
aodv           applications          bridge
click          config-store          core
csma           csma-layout           dsdv
emu            energy                flow-monitor
internet       lte                   mesh
mobility       mpi                   netanim
network        nix-vector-routing    ns3tcp
ns3wifi        olsr                  openflow
point-to-point point-to-point-layout propagation
spectrum       stats                 tap-bridge
template       test                  tools
topology-read  uan                   virtual-net-device
visualizer     wifi                  wimax

PASS: TestSuite ns3-wifi-interference
PASS: TestSuite histogram 

...

PASS: TestSuite object
PASS: TestSuite random-number-generators
92 of 92 tests passed (92 passed, 0 failed, 0 crashed, 0 valgrind errors)

Ezt a parancsot általában a felhasználók futtatják az ns-3 disztribúció megfelelő felépítésének gyors ellenőrzésére. (Ne feledje, hogy a "PASS: ..." sorok sorrendje eltérő lehet, ez normális. Ami fontos, hogy a jelentés végén lévő összefoglaló sor azt mutatja, hogy minden teszt sikeres volt; egyetlen teszt sem volt sikertelen vagy összeomlott.) És WafÉs test.py párhuzamosítja a munkát a gép elérhető processzormagjai között.

3.6 A szkript futtatása

Általában kontroll alatt futtatjuk a szkripteket Waf. Ez lehetővé teszi a felépítési rendszer számára, hogy biztosítsa a megosztott könyvtári útvonalak helyes beállítását, és azt, hogy a könyvtárak futás közben elérhetőek legyenek. A program futtatásához egyszerűen használja Waf paraméterrel - -run. Futtassuk a mindenütt jelenlévő program ns-3 megfelelőjét hello, világa következő beírásával:

$ ./waf --run hello-simulator

A Waf először ellenőrzi, hogy a program megfelelően van-e felépítve, és szükség esetén elkészíti. Akkor Waf olyan programot fog végrehajtani, amely a következő kimenetet állítja elő.

Hello Simulator

Gratulálunk! Ön most ns-3 felhasználó!

Mit tegyek, ha nem látok eredményt?

Ha üzeneteket lát Wafjelezve, hogy a build sikeresen befejeződött, de nem látja a kimenetet "Hello Simulator", akkor előfordulhat, hogy a [Build-with-Waf] részben átállította az építési módot optimalizált, de nem váltott vissza az üzemmódba hibakeresés. Az oktatóanyagban használt összes konzolkimenet egy speciális ns-3 összetevőt használ, amely naplózást végez, és egyéni üzenetek konzolra történő nyomtatására szolgál. Ennek a komponensnek a kimenete automatikusan letiltásra kerül, amikor az optimalizált kódot lefordítják – ez „optimalizált”. Ha nem látja a „Hello Simulator” kimenetet, írja be a következőket:

$ ./waf configure --build-profile=debug --enable-examples --enable-tests

testreszabni Waf ns-3 programok hibakereső verzióinak elkészítéséhez, amelyek példákat és teszteket tartalmaznak. Ezután gépeléssel állítsa újra a kód jelenlegi hibakeresési verzióját

$ ./waf

Most, ha futtatja a programot hello-szimulátor, látnia kell a várt eredményt.

3.6.1 Parancssori argumentumok

Ha parancssori argumentumokat szeretne átadni az ns-3 programnak, használja a következő mintát:

$ ./waf --run <ns3-program> --command-template="%s <args>"

Cserélje ki a program nevéhez és az érvekhez. Érv - -command-template a Waf lényegében egy recept a tényleges parancssor felépítéséhez Waf a program végrehajtására használják. A Waf ellenőrzi, hogy a felépítés kész-e, beállítja a megosztott könyvtár elérési útjait, majd a megadott parancssori sablont használja, és a programnévvel helyettesíti a %s helyőrzőt a végrehajtható fájl meghívásához. Ha bonyolultnak találja ezt a szintaxist, van egy egyszerűbb verzió, amely magában foglalja az ns-3 programot és annak argumentumait idézőjelbe zárva:

$ ./waf --run '<ns3-program> --arg1=value1 --arg2=value2 ...'

Egy másik különösen hasznos példa a tesztcsomagok szelektív futtatása. Tegyük fel, hogy létezik egy mytest nevű tesztcsomag (valójában nincs). A fentiekben a ./test.py szkriptet használtuk számos teszt párhuzamos futtatására, amely ismételten meghívja a tesztprogramot tesztfutó. Hívás tesztfutó közvetlenül egy teszt futtatásához:

$ ./waf --run test-runner --command-template="%s --suite=mytest --verbose"

Az érveket átadják a programnak tesztfutó. Mivel a mytest nem létezik, hibaüzenet jelenik meg. A rendelkezésre álló tesztfutó opciók kinyomtatásához írja be:

$ ./waf --run test-runner --command-template="%s --help"

3.6.2 Hibakeresés

ns-3 programok futtatásához más segédprogram, például hibakereső alatt (például gdb) vagy memóriatesztelő eszközzel (pl. valgrind), használjon hasonló űrlapot - -command-template = "…". Például a hibakeresőben való futtatáshoz gdb a hello-simulator ns-3 program argumentumokkal:

$ ./waf --run=hello-simulator --command-template="gdb %s --args <args>"

Vegye figyelembe, hogy az ns-3 programnév az argumentummal együtt érkezik - -run, és a kezelő segédprogram (itt gdb) az első jelző az argumentumban - -command-template. választási lehetőség - -args jelentések gdbhogy a parancssor többi része az "alsó" programhoz tartozik. (Néhány verzió gdb nem értem a lehetőséget - -args. Ebben az esetben távolítsa el a program argumentumait - -command-template és használja a parancskészletet gdb érvel.) Kombinálhatjuk ezt a receptet és az előzőt a teszt futtatásához a hibakereső alatt:

$ ./waf --run test-runner --command-template="gdb %s --args --suite=mytest --verbose"

3.6.3 Munkakönyvtár

A Waf-ot az ns-3 fa tetején lévő helyéről kell elindítani. Ez a mappa lesz a munkakönyvtár, ahová a kimeneti fájlok íródnak. De mi van, ha ezeket a fájlokat az ns-3 forrásfán kívül szeretné tartani? Használjon argumentumot - -cwd:

$ ./waf --cwd=...

Kényelmesebbnek találhatja, ha a kimeneti fájlokat a munkakönyvtárába tölti be. Ebben az esetben a következő közvetett cselekvés segíthet:

$ function waff {
CWD="$PWD" 
cd $NS3DIR >/dev/null 
./waf --cwd="$CWD" $*
cd - >/dev/null 
}

A parancs előző verziójának ez a díszítése elmenti az aktuális munkakönyvtárat, és a könyvtárba kerül Wafmajd utasítja Waf a munkakönyvtár visszaállításához a program indítása előtt mentett aktuális munkakönyvtárra. Említjük a csapatot - -cwd A teljesség kedvéért a legtöbb felhasználó egyszerűen futtatja a Waf-ot a legfelső szintű könyvtárból, és ott generál kimeneti fájlokat.

Folytatás: 4. fejezet

Forrás: will.com

Hozzászólás