Vadnica simulatorja omrežja ns-3. 3. poglavje

Vadnica simulatorja omrežja ns-3. 3. poglavje
poglavje 1,2

3 Kako začeti
3.1 Pregled
3.2 Predpogoji
3.2.1 Prenos izdaje ns-3 kot izvornega arhiva
3.3 Prenos ns-3 z uporabo Git
3.3.1 Nalaganje ns-3 z uporabo Bake
3.4 Montaža ns-3
3.4.1 Gradnja z build.py
3.4.2 Gradnja z Bake
3.4.3 Zgradite z Waf
3.5 Testiranje ns-3
3.6 Zagon skripta
3.6.1 Argumenti ukazne vrstice
3.6.2 Odpravljanje napak
3.6.3 Delovni imenik

Poglavje 3

Kako začeti

Namen tega poglavja je pripraviti bralca na začetek z računalnikom, ki morda nikoli ni imel nameščenega ns-3. Zajema podprte platforme, predpogoje, kako pridobiti ns-3, kako zgraditi ns-3 in kako preizkusiti svojo gradnjo in izvajati preproste programe.

3.1 Pregled

Simulator ns-3 je zgrajen kot sistem sodelujočih programskih knjižnic. Med sestavljanjem se koda uporabniških programov poveže s temi knjižnicami. Za pisanje programov po meri se uporabljata programska jezika C++ ali Python.

Ns-3 se distribuira kot izvorna koda, kar pomeni, da mora imeti ciljni sistem okolje za razvoj programske opreme, da lahko najprej zgradi knjižnice in nato zgradi uporabniški program. Načeloma bi lahko ns-3 distribuirali kot že pripravljene knjižnice za določen sistem in v prihodnje bi jih lahko distribuirali na ta način. Toda dandanes veliko uporabnikov dejansko opravlja svoje delo z urejanjem samega ns-3, zato je koristno imeti izvorno kodo za gradnjo knjižnic. Če bi kdo želel prevzeti delo ustvarjanja že pripravljenih knjižnic in paketov za operacijske sisteme, se obrnite na poštni seznam ns-razvijalci.

Nato si bomo ogledali tri načine za prenos in izdelavo ns-3. Prvi je prenos in izdelava uradne izdaje z glavne strani. Drugi je izbor in sestavljanje kopij razvojnih različic osnovne namestitve ns-3. Tretji je uporaba dodatnih orodij za gradnjo za nalaganje več razširitev za ns-3. Pregledali bomo vsakega posebej, saj so orodja nekoliko drugačna.

Izkušeni uporabniki Linuxa se morda sprašujejo, zakaj ns-3 ni na voljo kot paket kot večina drugih knjižnic, ki uporabljajo upravitelja paketov? Čeprav obstajajo binarni paketi za različne distribucije Linuxa (npr. Debian), večina uporabnikov na koncu ureja knjižnice in mora sama znova zgraditi ns-3, zato je izvorna koda na voljo priročna. Zaradi tega se bomo osredotočili na namestitev iz vira.

Za večino aplikacij pravice ns-3 koren niso potrebni, je priporočljiva uporaba neprivilegiranega uporabniškega računa.

3.2 Predpogoji

Celoten nabor razpoložljivih knjižnic ns-3 ima številne odvisnosti od knjižnic tretjih oseb, vendar je večinoma ns-3 mogoče zgraditi in uporabljati s podporo za več običajnih (pogosto privzeto nameščenih) komponent: prevajalnik C++, Python, urejevalnik izvorne kode (npr. vim, emacs ali Eclipse) in, če se uporabljajo razvojna skladišča, sisteme za nadzor različic Git. Večini novih uporabnikov ne bo treba skrbeti, če njihova konfiguracija poroča, da nekatere napredne funkcije ns-3 manjkajo, toda za tiste, ki želijo popolno namestitev, projekt ponuja wiki, ki vključuje strani z veliko uporabnimi nasveti in triki. Ena taka stran je stran za namestitev z navodili za namestitev za različne sisteme, ki je na voljo na: https://www.nsnam.org/wiki/Installation.

Razdelek Predpogoji tega wikija pojasnjuje, kateri paketi so potrebni za podporo običajnih možnosti ns-3, in ponuja tudi ukaze, ki se uporabljajo za njihovo namestitev v običajnih različicah Linuxa ali macOS.

To priložnost lahko izkoristite za raziskovanje wiki strani ns-3 ali glavne spletne strani: https://www.nsnam.org, ker je tam veliko informacij. Od najnovejše različice ns-3 (ns-3.29) so za zagon ns-3 potrebna naslednja orodja:

Paket orodij/različica

  • C++ prevajalnik
    clang++ ali g++ (g++ različica 4.9 ali novejša)
  • Python
    različica python2 >= 2.7.10 ali različica python3 >=3.4
  • git
    katera koli najnovejša različica (za dostop do ns-3 na GitLab.com)
  • katran
    katera koli najnovejša različica (za razpakiranje izdaje ns‑3)
  • bunzip2
    katera koli najnovejša različica (za razpakiranje izdaje ns‑3)

Če želite preveriti privzeto različico Pythona, vnesite python -V. Če želite preveriti različico g++, vnesite g++ -v. Če katera koli orodja manjkajo ali so prestara, si oglejte navodila za namestitev na wiki strani ns-3.

Od zdaj naprej predvidevamo, da bralnik uporablja Linux, MacOS ali emulator Linuxa in ima vsaj zgoraj navedena orodja.

3.2.1 Prenos izdaje ns-3 kot izvornega arhiva

To je potek dejanja za novega uporabnika, ki želi prenesti in eksperimentirati z najnovejšo izdajo in različicami paketa ns-3. Izdaje ns-3 so objavljene kot stisnjeni izvorni arhivi, včasih imenovani tarball. tarball je posebna programska arhivska oblika, v kateri je združenih več datotek. Arhiv je običajno stisnjen. ns-3 zagonski proces prek tarball je preprost, samo izbrati morate izdajo, jo prenesti in razpakirati.

Predpostavimo, da želite kot uporabnik zgraditi ns-3 v lokalnem imeniku, imenovanem delovni prostor. Delovno kopijo izdaje lahko dobite tako, da v konzolo Linux vnesete naslednje (seveda zamenjate ustrezne številke različice)

$ 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 

Bodite pozorni na zgoraj uporabljeni pripomoček wget, ki je orodje ukazne vrstice za prenos predmetov iz interneta. Če ga še niste namestili, lahko za to uporabite brskalnik.

Sledenje tem korakom vas bo pripeljalo do imenika ns-allinone-3.29, tam bi morali videti več datotek in imenikov

$ 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

Zdaj ste pripravljeni na izgradnjo osnovne distribucije ns-3 in lahko nadaljujete z razdelkom o izdelavi ns-3.

3.3 Prenos ns-3 z uporabo Git

Koda ns-3 je na voljo v repozitorijih Git na GitLab.com na https://gitlab.com/nsnam/. skupina nsnam združuje različne repozitorije, ki jih uporablja odprtokodni projekt.

Najlažji način, da začnete uporabljati repozitorije Git, je, da razcepite ali klonirate okolje ns-3-alinon. To je niz skriptov, ki upravljajo nalaganje in sestavljanje najpogosteje uporabljenih podsistemov ns-3. Če ste novi v Gitu, vam izraza "fork" in "clone" morda nista znana; če je tako, priporočamo, da preprosto klonirate (naredite svojo kopijo) repozitorij na GitLab.com takole:

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

Na tej stopnji je pogled na vaš imenik ns-3-alinon nekoliko drugačen od zgoraj opisanega arhivskega imenika izdaje. Videti bi moralo nekako takole:

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

Upoštevajte, da obstaja skript download.py, ki bo dodatno izvlekel ns-3 in spremljajočo izvorno kodo. Tukaj imate izbiro: ali prenesite najnovejši razvojni posnetek ns-3:

$ python download.py

ali raje izdajo ns-3 z uporabo zastavice -n za navedbo številke izdaje:

$ python download.py -n ns-3.29

Po tem koraku v imenik ns-3-alinon prenesena bodo dodatna skladišča ns-3, bake, pybindgen и netanim.

Obvestilo
Na stroju s čistim Ubuntu16.04 sem moral spremeniti ukaz v to: $ sudo python3 download.py -n ns-3.29 (v nadaljevanju opombe prevajalca).

3.3.1 Nalaganje ns-3 z uporabo Bake

Zgornji dve metodi (izvorni arhiv ali repozitorij ns-3-alinon prek Git) so uporabni za pridobitev najpreprostejše namestitve ns-3 z več dodatki (pybindgen za ustvarjanje povezav Python in netanim za mrežno animacijo). Pokliče se tretje skladišče, ki je privzeto na voljo v ns-3-allinone bake.

Pečemo je orodje za usklajeno gradnjo programske opreme iz več repozitorijev, razvito za projekt ns-3. Pečemo se lahko uporablja za pridobivanje razvojnih različic ns-3, kot tudi za prenos in gradnjo razširitev osnovne različice distribucije ns-3, kot je okolje Neposredno izvajanje kode, Zibelka za simulacijo CradleNetwork, možnost ustvarjanja novih povezav Python in različnih "aplikacij" ns-3.

Obvestilo
CradleNetwork Simulation Cradle je ogrodje, ki vam omogoča uporabo pravih omrežnih skladov TCP/IP v omrežnem simulatorju.

Če pričakujete, da ima vaša namestitev ns-3 napredne ali dodatne funkcije, lahko sledite tej namestitveni poti.

V zadnjih izdajah ns-3 Pečemo je bil dodan izdaji tar. Izdaja vključuje konfiguracijsko datoteko, ki vam omogoča prenos trenutnih različic programske opreme v času izdaje. To je na primer različica Pečemo, ki se distribuira z izdajo ns-3.29, je mogoče uporabiti za pridobivanje komponent za to izdajo ns-3 ali starejše, vendar ga ni mogoče uporabiti za pridobivanje komponent za poznejše izdaje (če je datoteka z opisom paketa bakeconf.xml ni posodobljen).

Dobite lahko tudi najnovejšo kopijo baketako da v svojo konzolo Linux vnesete naslednji ukaz (ob predpostavki, da imate nameščen Git):

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

Ko zaženete ukaz git, bi morali videti nekaj takega:

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.

Ko je ukaz končan klon morali bi imeti imenik z imenom bake, katerega vsebina bi morala izgledati nekako takole:

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

Upoštevajte, da ste naložili več skriptov Python, modul Python z imenom bake in konfiguracijsko datoteko XML. Naslednji korak je uporaba teh skriptov za prenos in izdelavo distribucije ns-3 po vaši izbiri. Na voljo je več ciljev prilagajanja:

  1. ns-3.29: modul, ki ustreza izdaji; prenesel bo komponente, podobne izdaji v arhivu;

  2. ns-3-dev: podoben modul, vendar z uporabo kode iz razvojnega drevesa;

  3. ns-allinon-3.29: Modul, ki vključuje druge dodatne funkcije, kot sta usmerjanje klikov in omrežna simulacijska zibelka, Openflow za ns-3.

  4. ns-3-alinon: podobno izdajni različici modula vse v enem, ampak za razvojno kodo.

Obvestilo
klik — modularna programska arhitektura za izdelavo usmerjevalnikov.

Openflow je protokol za upravljanje procesa obdelave podatkov, ki jih po podatkovnem omrežju prenašajo usmerjevalniki in stikala, ki izvaja programsko definirano omrežno tehnologijo.

Trenutni razvojni posnetek (brez izdaje) ns-3 je na voljo na:https://gitlab.com/nsnam/ns-3-dev.git.

Razvijalci poskušajo ohraniti te repozitorije v doslednem delovnem stanju, vendar so v razvojnem območju in vsebujejo neobjavljeno kodo, tako da, če ne nameravate uporabljati novih funkcij, izberite uradno izdajo.

Najnovejšo različico kode najdete tako, da brskate po seznamu repozitorijev ali obiščete spletno stran ns-3 Releases:https://www.nsnam.org/releases/ in kliknite povezavo do najnovejše različice. V tem primeru bomo nadaljevali z ns-3.29.

Za pridobitev komponent ns-3, ki jih potrebujemo, bomo uporabili orodje Pečemo. Povejmo nekaj uvodnih besed o delu Pečemo.

Bake deluje tako, da naloži izvorne pakete v imenik vir in namestitev knjižnic v gradbeni imenik. Pečemo lahko zaženete s sklicevanjem na dvojiško datoteko, če pa želite zagnati Pečemo ne iz imenika, v katerem je bil prenesen, je priporočljivo dodati pot do bake na vašo pot (spremenljivka okolja PATH), na primer kot sledi (primer za lupino bash Linux). Pojdite v imenik "bake" in nato nastavite naslednje spremenljivke okolja:

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

To bo postavilo program bake.py na pot lupine in bo drugim programom omogočil najti izvedljive datoteke in knjižnice, ki jih je ustvaril bake. V nekaterih primerih uporabe bake, nastavitev PATH in PYTHONPATH, opisana zgoraj, ni potrebna, vendar jo običajno zahteva popolna zgradba ns-3-allinona (z dodatnimi paketi).

Pojdite v svoj delovni imenik in v konzolo vnesite naslednje:

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

Naprej bomo vprašali Pečemo preverimo, ali imamo dovolj orodij za nalaganje različnih komponent. Številčnica:

$ ./bake.py check

Videti bi morali nekaj takega:

> 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 ...

Zlasti orodja za nalaganje, kot so Mercurial, CVS, Git in Bazaar, so bistvena v tem koraku, saj nam omogočajo pridobitev kode. Na tej točki namestite manjkajoča orodja na običajen način za vaš sistem (če veste kako) ali se za pomoč obrnite na skrbnika sistema.

Nato poskusite prenesti programsko opremo:

$ ./bake.py download

rezultat bi moral biti nekaj takega:

>> 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

To bo pomenilo, da so bili preneseni trije viri. Zdaj pojdite v izvorni imenik in vnesite ls; Videti bi morali:

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

Zdaj ste pripravljeni na izgradnjo distribucije ns-3.

3.4 Montaža ns-3

Kot pri prenosu ns-3 obstaja več načinov za izdelavo ns-3. Glavna stvar, ki jo želimo poudariti, je, da je ns-3 zgrajen z orodjem za gradnjo, imenovanim Wafopisano spodaj. Večina uporabnikov bo delala z Waf, vendar obstaja nekaj priročnih skriptov, ki vam bodo pomagali začeti ali organizirati bolj zapletene gradnje. Zato prosim, preden preberete o Waf, Poglej build.py in montažo z bake.

3.4.1 Gradnja z build.py

Opozorilo! Ta korak gradnje je na voljo samo iz različice izvornega arhiva, pridobljene, kot je opisano zgoraj; in ni prenesen prek git ali bake.

Pri delu z arhivom izdaje tarballV ns-3-alinon Obstaja priročen skript, ki lahko olajša sestavljanje komponent. Imenuje se build.py. Ta program bo za vas postavil projekt na najbolj uporaben način. Vendar upoštevajte, da naprednejše nastavitve in delo z ns-3 običajno vključujejo uporabo lastnega gradbenega sistema ns-3, Waf, ki bo predstavljen kasneje v tej vadnici.

Če ste prenesli z uporabo tarball, nato v vašem imeniku ~/delovni prostor imenik z imenom, podobnim ns-allinon-3.29. Vnesite naslednje:

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

Ob klicu build.py Uporabili smo argumente ukazne vrstice za izdelavo primerov in testov, uporabljenih v tej vadnici, ki niso privzeto zgrajeni v ns-3. Program privzeto gradi tudi vse razpoložljive module. Nato lahko, če želite, sestavite ns-3 brez primerov in testov ali pa izključite module, ki za vaše delo niso potrebni.

Videli boste veliko izhodnih sporočil prevajalnika, ki jih prikaže skript, ko gradi različne dele, ki ste jih naložili. Najprej bo skript poskušal zgraditi animator netanim, nato vezni generator pybindgen in končno ns-3. Ko je postopek končan, bi morali videti naslednje:

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

V zadnjih treh vrsticah seznama vidimo sporočilo o modulih, ki niso bili zgrajeni:

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

To preprosto pomeni, da nekateri moduli ns-3, ki so odvisni od zunanjih knjižnic, morda niso bili izdelani ali da jih ni treba zgraditi za to konfiguracijo. To ne pomeni, da simulator ni sestavljen ali da sestavljeni moduli ne bodo delovali pravilno.

3.4.2 Gradnja z Bake

Če ste za pridobivanje izvorne kode iz projektnih repozitorijev uporabili bake zgoraj, ga lahko še naprej uporabljate za gradnjo ns-3. Številčnica:

$ ./bake.py build

in videli bi morali nekaj takega:

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

Tooltip: korake prenosa in gradnje lahko izvedete tudi hkrati, tako da pokličete »bake.py deploy«.

Sestavljanje vseh komponent morda ne bo uspelo, vendar se bo sestavljanje nadaljevalo, če komponenta ni potrebna. Na primer, nedavna težava s prenosljivostjo je bila ta castxml se lahko sestavi z orodjem bake ne na vseh platformah. V tem primeru se prikaže takšno sporočilo:

>> 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.

Vendar castxml potreben samo, če želite ustvariti posodobljene Python vezi. Za večino uporabnikov to ni potrebno (vsaj dokler ne zamenjajo ns-3), zato lahko takšna opozorila za zdaj mirno ignoriramo.

Če ne uspe, vam bo naslednji ukaz dal namig o manjkajočih odvisnostih:

$ ./bake.py show

Navedene bodo različne odvisnosti paketov, ki jih poskušate zgraditi.

3.4.3 Zgradite z Waf

Do te točke smo za začetek gradnje ns-3 uporabljali bodisi skript build.py, ali orodje bake. Ta orodja so uporabna za gradnjo ns-3 in vzdrževanje knjižnic. Pravzaprav za gradnjo zaženejo orodje za gradnjo Waf iz imenika ns-3. Waf nameščen z izvorno kodo ns-3. Večina uporabnikov hitro preide na neposredno uporabo za konfiguriranje in sestavljanje ns‑3 Waf. Če želite nadaljevati, pojdite v imenik ns-3, ki ste ga prvotno ustvarili.

To trenutno ni nujno potrebno, vendar bo koristno, če se malo vrnemo nazaj in vidimo, kako spremeniti konfiguracijo projekta. Verjetno najbolj uporabna sprememba konfiguracije, ki jo lahko naredite, je ustvariti optimizirano različico kode. Privzeto ste svoj projekt konfigurirali za izdelavo različice za odpravljanje napak. Oglejmo si projekt za ustvarjanje optimizirane gradnje. Če želite Wafu razložiti, da mora narediti optimizirane gradnje, ki vključujejo primere in teste, boste morali zagnati naslednje ukaze:

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

To se bo začelo Waf zunaj lokalnega imenika (za vaše udobje). Prvi ukaz počisti iz prejšnje gradnje, to običajno ni nujno potrebno, vendar je dobra praksa (glejte tudi profile gradnje spodaj); to bo izbrisalo predhodno ustvarjene knjižnice in objektne datoteke, ki se nahajajo v imeniku graditi /. Ko je projekt ponovno konfiguriran in sistem gradnje preveri različne odvisnosti, bi morali videti izhod, podoben naslednjemu:

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)

Upoštevajte zadnji del zgornjega seznama. Nekatere možnosti ns-3 niso privzeto omogočene ali zahtevajo sistemsko podporo za pravilno delovanje. Če želite na primer omogočiti XmlTo, mora biti knjižnica prisotna v sistemu libxml-2.0. Če te knjižnice ni bilo mogoče najti in ustrezna funkcija ns-3 ni bila omogočena, bo prikazano sporočilo. Upoštevajte tudi, da je mogoče uporabiti ukaz sudo za nastavitev bita suid »nastavi ID skupine med izvajanjem« za določene programe. Privzeto ni omogočena, zato je ta funkcija prikazana kot »ni omogočena«. Končno, če želite dobiti seznam omogočenih možnosti, uporabite Waf s parametrom --check-config.

Zdaj pa se vrnimo nazaj na gradnjo za odpravljanje napak, ki vsebuje primere in teste.

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

Sistem gradnje je zdaj nastavljen in lahko sestavite različice za odpravljanje napak programov ns-3 tako, da preprosto vnesete:

$ ./waf

Zgornji koraki so vas morda prisilili, da ste dvakrat zgradili del sistema ns-3, zdaj pa veste, kako spremeniti konfiguracijo in zgraditi optimizirano kodo.

Če želite preveriti, kateri profil je aktiven za dano konfiguracijo projekta, obstaja ukaz:

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

Zgornji scenarij build.py podpira tudi argumente --enable-examples и --enable-tests, ampak druge možnosti Waf ne podpira neposredno. Na primer, to ne bo delovalo:

$ ./build.py --disable-python

reakcija bo taka:

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

Vendar pa lahko poseben operater -- uporabite za posredovanje dodatnih parametrov WAFtako da bo namesto zgornjega deloval naslednji ukaz:

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

ker generira glavni ukaz ./waf configure --disable-python. Tu je še nekaj uvodnih nasvetov o Waf.

Obravnava napak pri gradnji

Izdaje ns-3 so testirane na najnovejših prevajalnikih C++, ki so na voljo v času izdaje v običajnih distribucijah Linuxa in MacOS. Vendar pa se sčasoma izdajo nove distribucije z novimi prevajalniki in ti novejši prevajalniki so bolj pedantni glede opozoril. ns-3 konfigurira svojo gradnjo tako, da vsa opozorila obravnava kot napake, tako da lahko včasih, če uporabljate starejšo različico v novejšem sistemu, opozorilo prevajalnika ustavi gradnjo.

Prej je na primer obstajala izdaja ns‑3.28 za Fedoro 28, ki je vključevala novo glavno različico GCC (gcc-8). Pri gradnji izdaje ns-3.28 ali starejših različic pod Fedoro 28 z nameščenim Gtk2+ se bo pojavila naslednja napaka:

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

V izdajah, ki se začnejo od ns‑3.28.1, in Waf na voljo je možnost za rešitev teh težav. Onemogoči nastavitev zastavice "-Werror" v g++ in clang++. To je možnost "--disable-werror" in jo je treba uporabiti med konfiguracijo:

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

Konfigurirajte ali sestavite

Nekaj ​​ukazov Waf imajo pomen samo v fazi konfiguracije, nekateri pa so veljavni samo v fazi gradnje. Na primer, če želite uporabiti funkcije emulacije ns-3, lahko omogočite nastavitev bitov suid uporabo sudo, kot je opisano zgoraj. To bo preglasilo ukaze koraka konfiguracije in tako lahko spremenite konfiguracijo z naslednjim ukazom, ki vključuje tudi primere in teste.

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

Če to storite Waf se bo začel sudoda spremenite programe za ustvarjanje vtičnic emulacijske kode, da se izvajajo z dovoljenji koren. V Waf Na voljo je veliko drugih možnosti za konfiguracijo in korake gradnje. Če želite raziskati svoje možnosti, vnesite:

$ ./waf --help

V naslednjem razdelku bomo uporabili nekaj možnosti, povezanih s testiranjem.

Montažni profili

Videli smo že, kako lahko konfigurirate Waf za sklope debug и optimizirana:

$ ./waf --build-profile=debug

Obstaja tudi vmesni montažni profil, sprostitev. Možnost -d je sinonim za --build-profile. Profil gradnje nadzira uporabo stikal za beleženje, trditve in optimizacijo prevajalnika:

Vadnica simulatorja omrežja ns-3. 3. poglavje

Kot lahko vidite, so beleženje in trditve na voljo samo v zgradbah za odpravljanje napak. Priporočena praksa je, da svoj skript razvijete v načinu za odpravljanje napak, nato izvedete ponavljajoče se zagone (za statistiko ali spremembe parametrov) v optimiziranem profilu gradnje.

Če imate kodo, ki bi se morala izvajati samo v določenih profilih gradnje, uporabite makro Ovoj kode:

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;)

privzeto, Waf postavi artefakte gradnje v imenik gradnje. Z možnostjo lahko določite drug izhodni imenik - -out, na primer:

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

Če to združite s profili gradnje, lahko preprosto preklapljate med različnimi možnostmi prevajanja:

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

Kar vam omogoča delo z več sklopi, ne da bi morali vsakič prepisati najnovejši sklop. Ko preklopite na drug profil, Waf bo prevedel samo to, ne da bi popolnoma znova prevedel vse.

Ko preklapljate med profili gradnje na ta način, morate paziti, da vsakič podate enake konfiguracijske možnosti. Če definirate več spremenljivk okolja, se boste izognili napakam:

$ 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

Prevajalniki in zastavice

V zgornjih primerih Waf za izdelavo ns-3 uporablja prevajalnik C++ iz GCC ( g ++). Vendar pa lahko spremenite tistega, ki ga uporabljate Waf Prevajalnik C++ z definiranjem okoljske spremenljivke CXX. Če želite na primer uporabiti prevajalnik C++ Clang, clang++,

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

Na enak način lahko konfigurirate Waf za uporabo porazdeljene kompilacije z uporabo distcc:

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

Več informacij o distcc in porazdeljenem prevajanju najdete na strani projekta v razdelku Dokumentacija. Za dodajanje zastavic prevajalnika pri konfiguriranju ns-3 uporabite spremenljivko okolja CXXFLAGS_EXTRA.

Namestitev

Waf lahko uporabite za namestitev knjižnic na različna mesta v sistemu. Privzeto se prevedene knjižnice in izvedljive datoteke nahajajo v imeniku izgradnjo, in ker Waf pozna lokacijo teh knjižnic in izvedljivih datotek, knjižnic ni treba nameščati nikamor drugam.

Če uporabniki raje namestijo zunaj imenika gradnje, lahko zaženejo ukaz ./waf namestitev. Privzeta predpona za namestitev je / usr / localTako ./waf namestitev bo namestil programe v / usr / local / bin, knjižnice v / usr / local / lib in datoteke glave v /usr/local/include. Pravice superuporabnika je običajno treba nastaviti s privzeto predpono, tako da bi bil tipičen ukaz namestitev sudo ./waf. Ko se zažene, se bo Waf najprej odločil za uporabo knjižnic v skupni rabi v imeniku gradnje, nato pa poiskal knjižnice na poti do knjižnic, konfiguriranih v lokalnem okolju. Ko nameščate knjižnice v sistem, je dobro preveriti, ali se uporabljajo prave knjižnice. Uporabniki se lahko odločijo za namestitev z drugo predpono, tako da podajo možnost med konfiguracijo --prefix, na primer:

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

Če pozneje, po gradnji, uporabnik vnese ukaz za namestitev ./waf, bo uporabljena predpona /opt/lokalno.

Ekipa ./waf clean je treba uporabiti pred ponovno konfiguracijo projekta, če bo namestitev uporabljala Waf pod drugo predpono.

Tako za uporabo ns-3 ni potrebe po klicu ./waf install. Večina uporabnikov tega ukaza ne bo potrebovala, ker Waf bo pobral trenutne knjižnice iz imenika gradnje, vendar bo nekaterim uporabnikom to morda koristno, če njihove dejavnosti vključujejo delo s programi zunaj imenika ns-3.

Waf samski

Na najvišji ravni izvornega drevesa ns-3 je samo en skript Waf. Ko začnete delati, boste veliko časa preživeli v imeniku scratch/ ali globlje vsrc/... in hkrati morajo teči Waf. Lahko se samo spomniš, kje si, in tečeš Waf kot sledi:

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

vendar bo to dolgočasno in nagnjeno k napakam, zato obstajajo boljše rešitve. Eden pogostih načinov je uporaba urejevalnika besedil, kot je npr emacs ali vim, v katerem sta odprti dve terminalski seji, ena se uporablja za izdelavo ns-3, druga pa za urejanje izvorne kode. Če le imate tarball, potem lahko spremenljivka okolja pomaga:

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

$ cd scratch 
$ waff build

V imenik modulov je morda skušnjava dodati trivialni skript waf, kot je exec ../../waf. Prosim, ne počni tega. To je za novince zmedeno in, če je narejeno slabo, vodi do napak pri gradnji, ki jih je težko zaznati. Zgoraj prikazane rešitve so pot, ki jo je treba uporabiti.

3.5 Testiranje ns-3

Preizkuse enote distribucije ns-3 lahko izvajate tako, da zaženete skript ./test.py:

$ ./test.py

Ti testi potekajo vzporedno z Waf. Na koncu bi morali videti sporočilo, ki pravi:

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

To je pomembno sporočilo za prepoznavanje zrušitev, zrušitev ali napak valgrind, ki kaže na težave s kodo ali nezdružljivost med orodji in kodo.

Videli boste tudi končni rezultat iz Waf in tester, ki izvaja vsak test, ki bo videti nekako takole:

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)

Ta ukaz običajno zaženejo uporabniki, da hitro preverijo, ali je distribucija ns-3 pravilno zgrajena. (Upoštevajte, da je vrstni red vrstic »PASS: ...« lahko drugačen, to je normalno. Pomembno je, da vrstica s povzetkom na koncu poročila kaže, da so bili vsi testi uspešni; noben test ni bil neuspešen ali se je zrušil.) in WafIn test.py bo paraleliziral delo v razpoložljivih procesorskih jedrih stroja.

3.6 Zagon skripta

Običajno izvajamo skripte pod nadzorom Waf. To omogoča sistemu gradnje, da zagotovi, da so poti knjižnic v skupni rabi pravilno nastavljene in da so knjižnice na voljo med izvajanjem. Za zagon programa preprosto uporabite Waf s parametrom - -run. Zaženimo ns-3 ekvivalent vseprisotnega programa zdravo svettako da vnesete naslednje:

$ ./waf --run hello-simulator

Waf bo najprej preveril, ali je program pravilno zgrajen in po potrebi zgradil. Potem Waf bo izvedel program, ki ustvari naslednji izhod.

Hello Simulator

čestitke! Zdaj ste uporabnik ns-3!

Kaj naj storim, če ne vidim rezultatov?

Če vidite sporočila Wafoznačuje, da je bila gradnja uspešno zaključena, vendar ne vidite rezultata "Pozdravljeni simulator", potem obstaja možnost, da ste v razdelku [Build-with-Waf] preklopili na način gradnje optimizirana, vendar je zamudil preklop nazaj na način debug. Vsi izhodi konzole, uporabljeni v tej vadnici, uporabljajo posebno komponento ns-3, ki izvaja beleženje in se uporablja za tiskanje sporočil po meri na konzolo. Izhod iz te komponente je samodejno onemogočen, ko je optimizirana koda prevedena - je "optimizirana". Če ne vidite izpisa »Hello Simulator«, vnesite naslednje:

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

za konfiguracijo Waf za izgradnjo različic za odpravljanje napak programov ns-3, ki vključujejo primere in teste. Nato morate znova zgraditi trenutno različico kode za odpravljanje napak s tipkanjem

$ ./waf

Zdaj, če zaženete program pozdravljeni simulator, bi morali videti pričakovani rezultat.

3.6.1 Argumenti ukazne vrstice

Za posredovanje argumentov ukazne vrstice programu ns-3 uporabite naslednji vzorec:

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

Zamenjajte z imenom vašega programa in argumenti. Prepir - -command-template za Waf je v bistvu recept za izdelavo dejanske ukazne vrstice Waf ki se uporablja za izvajanje programa. Waf preveri, ali je izdelava končana, nastavi poti do knjižnice v skupni rabi, nato uporabi predloženo predlogo ukazne vrstice in zamenja ime programa za ogrado %s, da pokliče izvršljivo datoteko. Če se vam zdi ta sintaksa zapletena, obstaja enostavnejša različica, ki vključuje program ns-3 in njegove argumente v enojnih narekovajih:

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

Drug posebej uporaben primer je selektivno izvajanje testnih paketov. Predpostavimo, da obstaja testna zbirka z imenom mytest (pravzaprav je ni). Zgoraj smo uporabili skript ./test.py za vzporedno izvajanje številnih testov, ki večkrat kliče testni program testni tekač. Pokliči testni tekač neposredno za izvedbo enega testa:

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

Argumenti bodo posredovani programu testni tekač. Ker mytest ne obstaja, bo ustvarjeno sporočilo o napaki. Če želite natisniti razpoložljive možnosti preizkusnega programa, vnesite:

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

3.6.2 Odpravljanje napak

Za zagon programov ns-3 z drugim pripomočkom, kot je razhroščevalnik (npr. gdb) ali orodje za testiranje pomnilnika (npr. valgrind), uporabite podoben obrazec - -command-template = "…". Na primer za zagon v razhroščevalniku gdb vaš hello-simulator ns-3 program z argumenti:

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

Upoštevajte, da ime programa ns-3 prihaja z argumentom - -runin pripomoček za upravljanje (tukaj gdb) je prvi žeton v argumentu - -command-template. Možnost - -args poročila gdbda preostali del ukazne vrstice pripada "nižjemu" programu. (Nekatere različice gdb ne razumem možnosti - -args. V tem primeru odstranite argumente programa iz - -command-template in uporabite nabor ukazov gdb rogove.) Ta recept in prejšnjega lahko združimo, da izvedemo test pod razhroščevalnikom:

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

3.6.3 Delovni imenik

Waf je treba zagnati z njegove lokacije na vrhu drevesa ns-3. Ta mapa postane delovni imenik, kamor bodo zapisane izhodne datoteke. Kaj pa, če želite te datoteke obdržati zunaj izvornega drevesa ns-3? Uporabi argument - -cwd:

$ ./waf --cwd=...

Morda se vam bo zdelo bolj priročno, če dobite izhodne datoteke v svojem delovnem imeniku. V tem primeru lahko pomaga naslednje posredno dejanje:

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

Ta dekoracija prejšnje različice ukaza ohranja trenutni delovni imenik, gre v imenik Wafin nato daje navodila Waf da spremenite delovni imenik nazaj v trenutni delovni imenik, shranjen pred zagonom programa. Omenjamo ekipo - -cwd Za popolnost večina uporabnikov preprosto zažene Waf iz imenika najvišje ravni in tam ustvari izhodne datoteke.

Nadaljevanje: 4. poglavje

Vir: www.habr.com

Dodaj komentar