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:
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:
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
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:
-
ns-3.29: a kiadásnak megfelelő modul; a tarballban lévő kiadáshoz hasonló összetevőket tölt le;
-
ns-3-dev: egy hasonló modul, de a fejlesztési fa kódját használja;
-
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.
-
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ó:
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:
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:
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.
Forrás: will.com