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:
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:
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
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:
-
ns-3.29: modul, ki ustreza izdaji; prenesel bo komponente, podobne izdaji v arhivu;
-
ns-3-dev: podoben modul, vendar z uporabo kode iz razvojnega drevesa;
-
ns-allinon-3.29: Modul, ki vključuje druge dodatne funkcije, kot sta usmerjanje klikov in omrežna simulacijska zibelka, Openflow za ns-3.
-
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:
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:
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:
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 - -run
in 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.
Vir: www.habr.com