首先感谢此稿的翻译工作人员,正是因为他们的劳动才让我们这些初学者有捷径可取。
3.1 下载ns-3
从现在起
,我们假定读者使用的工作环境为
Linux
或者仿
Linux
环境
(
Linux
,
Cygwin
等等
.) 并且已经安装了可用的
GNU
工具链
,而且还安装了
Mercurial
(分布式版本控制系统)和
Waf
软件。细节已经在
ns-3
网页中详述过,参见以下链接:
http://www.nsnam.org/getting_started.html.
ns-3
源码可以在网站
http://code.nsnam.org
上的
Mercurial
源码库下载到
.你也可以从链接
http://www.nsnam.org/releases/
处下载一个
tar格式
压缩包,或者直接使用
Mercurial
从
源码库下载。除非有特殊需要,我们推荐使用
Mercurial
从
源码库下载。
tar格式压缩包下载,请参见本节最后部分。最简单的方法就是使用
Mercurial
源码库下载一个
ns-3-allinone
压缩包,此压缩包内含一套脚本集来管理各种子系统下的
ns-3
下载和安装。我们推荐你使用这个压缩包来简化你的
ns-3
安装。
3.1.1 使用
Mercurial
下载
ns-3
作为练习,我们首先在
home
目录下建立一个目录并取名为
repos
,用来存放本地
Mercurial
源码库,注意:在本教程随后内容中,我们假定你已经这样做了。如果使用如下的方法,可以在
Linux
的
shell
中下载到一份
ns-3-allinone
软件包
(假定你已经安装了
Mercurial
):
cd
mkdir repos
cd repos
当
Mercurail
的
hg
命令执行后,可以看到如下结果
:
destination directory: ns-3-allinone
requesting all changes
adding changesets
adding manifests
adding file changes
added 31 changesets with 45 changes to 7 files
7 files updated, 0 files merged, 0 files removed, 0 files unresolved
当
clone命令运行结束以后,
在前述建立的
repos
目录下,会出现一个
ns-3-allinone
目录,而且含有如下文件:
build.py* constants.py dist.py* download.py* README util.py
注意:你实际上仅仅下载了一些
Python
脚本,下一步就是利用这些脚本根据需要下载并来安装
ns-3
软件包。如果你访问如下链接:
http://code.nsnam.org/
就会发现若干源码库,其中很多是
ns3开发团队专用的。其中在源码库
org/
你会发现名为
ns-3.1
的源码库,这是
ns-3
的第一个稳定版本。还有一些分散的源码库
名为
ns-3.1-reftraces,
它为
ns-3.1
保留了参考记录。保持这些文件的一致性是非常重要的,尤其是当你想对源码库做一个回归测试时。至少做一次测试来验证所有的程序都正确编译了。
由于发布版的版本号在变化中,我在指南中还是继续使用通常不变的
ns-3-dev
,但是你可以根据自己的需要选择其他的版本,并替换这里的
”
ns-3-dev
”,
(例如,
ns-3.6
或
ns-3.6-ref-traces
),在下文中,你可以通过访问源码库列表或者访问ns3开始网页找到最新的ns-3发布版软件。
当你从源码库下载完后,继续切换进入你自己建立的
ns-3-allinone
目录中。
我们现在使用
download.py
脚本来下载
ns-3
需要使用的各个部件。继续在你的
shell
中输入以下命令
(如果你想使用任意发行版你可以将
ns-3-dev
替换为你选择的发行版的名字,例如
"
ns-3.6
"
和
"
ns-3.6-reftraces
"
)。
./download.py -n ns-3-dev -r ns-3-dev-ref-traces
注意,
-n
选项的默认参数为
ns-3-dev
,
-r
选项的默认参数为
ns-3-dev-ref-traces
,
所以上述命令中这两个选项的参数实际上是多余的。我们使用这个例子来描述如何指定源码库。你
只需简单键入如下命令就
可以使用默认参数来下载
ns-3-dev
:
./download.py
当
hg (Mercurial)
命令执行时,你可以看到如下的信息:
#
# Get NS-3
#
Cloning ns-3 branch
=> hg clone http://code.nsnam.org/ns-3-dev ns-3-dev
requesting all changes
adding changesets
adding manifests
adding file changes
Chapter 3: Getting Started 8
added 4634 changesets with 16500 changes to 1762 files
870 files updated, 0 files merged, 0 files removed, 0 files unresolved
这些输出信息显示下载脚本已经从源码库中下载到了实际的
ns-3
源码,紧接着,你就会看到这样的信息:
#
# Get the regression traces
#
Synchronizing reference traces using Mercurial.
=> hg clone http://code.nsnam.org/ns-3-dev-ref-traces ns-3-dev-ref-traces
requesting all changes
adding changesets
adding manifests
adding file changes
added 86 changesets with 1178 changes to 259 files
208 files updated, 0 files merged, 0 files removed, 0 files unresolved
这表明下载脚本为你下载了参考记录文件。下载脚本被设计成自适应的,它能检测在一些系统平台上某些
ns-3
模块
不被支持,在你的系统平台上,你可能看不到这些系统不支持的源码被下载。然而,在大多数系统平台上这样的过程会显示如下:
#
# Get PyBindGen
#
Required pybindgen version: 0.10.0.640
Trying to fetch pybindgen; this will fail if no network connection is available. Hit Ctrl-=> bzr checkout -rrevno:640 https://launchpad.net/pybindgen pybindgen
Fetch was successful.
这些信息显示了下载脚本在为你下载
Python
绑定生成器的过程,下一步你就可能看到如下的信息
(不同的系统平台表现有所不同),
#
# Get NSC
#
Required NSC version: nsc-0.5.0
Retrieving nsc from https://secure.wand.net.nz/mercurial/nsc
=> hg clone https://secure.wand.net.nz/mercurial/nsc nsc
requesting all changes
adding changesets
adding manifests
adding file changes
added 273 changesets with 17565 changes to 15175 files
10622 files updated, 0 files merged, 0 files removed, 0 files unresolved
这些信息显示了下载脚本在为你下载网络仿真器支架程序
(NSC)的过程。
当复制命令结束,你在
~/repos/ns-3-allinone
目录下会有几个新目录
:
build.py* constants.pyc download.py* ns-3-dev-ref-traces/ pybindgen/ util.py
constants.py dist.py* ns-3-dev/ nsc/ README util.pyc
继续进入
ns-3-dev
目录,
你会见到如下的文件
:
AUTHORS examples/ regression/ scratch/ waf*
bindings/ LICENSE regression.py src/ waf.bat*
CHANGES.html ns3/ RELEASE_NOTES utils/ wscript
doc/ README samples/ VERSION wutils.py
现在可以准备编译
ns-3
软件了。
3.1.2 使用
Tarball
下载
ns-3
使用
tarball
下载
ns-3
比使用
Mercurail
下载
ns-3
要简单一些,因为需要下载的各个部分都已经预先被打包在一个压缩包中了,你只需要选择一个
发行版
版本,下载并且解压就可以。如上所述,在
Mercurial
下载方法中,是在
home
目录下创建一个
repos
目录,保存本地
Mercurial
源码库。你也可以建立一个
tarball
目录来下载。(注意
:本教程后面会假定你把它下载到了
repoa
目录,所以请留意这个选择)。如果你选择了
tarballs
方法下载,你可以键入如下命令来下载一份
ns-3
的
发行版
(当然,可以根据需要选择你想要的版本):
cd
mkdir tarballs
cd tarballs
wget http://www.nsnam.org/releases/ns-allinone-3.6.tar.bz2
tar xjf ns-allinone-3.6.tar.bz2
如果你切换到
ns-allinone-3.6
目录,你会看到下述文件
:
build.py* ns-3.6/ nsc-0.5.1/ README
constants.py ns-3.6-ref-traces/ pybindgen-0.12.0.700/ util.py
现在就可以编译
ns-3
软件包了。
3.2 编译
ns-3
3.2.1 使用
build.py
编译
如果你是第一次编译
ns-3
软件包,建议使用
allinone
环境
,它会为你以最常用的方式配置工程。
切换到你在上文下载一节中创建的目录下。如果你使用
Mercurial
下载,请进入
~/repos
目录下的
ns-3-allinone
目录
,如果你使用
tarball
下载,找到
~/tarballs
目录下类似
ns-allinone-3.6
的目录,键入如下的命令,并请耐心等待:
./build.py
编译脚本开始编译下载的
ns3时,你会看到大量常见的编译器输入信息。最后你会看到如下编译成功的好消息:
Waf: Leaving directory ‘/home/craigdo/repos/ns-3-allinone/ns-3-dev/build’
’
build’ finished successfully (2m30.586s)
一旦工程编译好,你就可以不再使用
ns-3-allinone
脚本包了。你已经从其中获取必要的东西,现在是你直接同
Waf
交互的时候了,它位于
ns-3-dev
目录中,并不在
ns-3-allinone
目录中
。切换到
ns-3-dev
目录下
(或者你下载的版本的相应目录下):
cd ns-3-dev
3.2.2使用
Waf
编译
我们使用
waf
来配置和编译
ns-3
工程软件包,这一点不是严格必须的,但是做一个简单的介绍是很有必要的,起码可以了解如何修改工程的配置。也许你能做出的最有用的配置修改就是编译工程的优化版本了,默认你会将你的工程编译为
调试
版本,让我们来使工程做出优化的编译。
为了通知
waf
进行
优化编译,你需要执行如下的命令:
./waf -d optimized configure
这会
Waf
可能会切换到其他目录收集信息
. 当编译系统检查各种依存关系时,你可以看到类似如下的输出结果:
Checking for program g++ : ok /usr/bin/g++
Checking for program cpp : ok /usr/bin/cpp
Checking for program ar : ok /usr/bin/ar
Checking for program ranlib : ok /usr/bin/ranlib
Checking for g++ : ok
(鉴于长度限制,省略)
Checking for program valgrind : ok /usr/bin/valgrind
---- Summary of optional NS-3 features:
Threading Primitives : enabled
Real Time Simulator : enabled
Emulated Net Device : enabled
GNU Scientific Library (GSL) : enabled
Tap Bridge : enabled
GtkConfigStore : enabled
XmlIo : enabled
SQlite stats data output : enabled
Network Simulation Cradle : enabled
Python Bindings : enabled
Python API Scanning Support : enabled
Use sudo to set suid bit : not enabled (option --enable-sudo not selected)
Build examples and samples : enabled
Static build : not enabled (option --enable-static not selected)
’
configure’ finished successfully (2.870s)
需要注意输入的最后一部分。部分
ns-3
选项并不是默认的,需要底层系统的支持才能够顺利运行。例如:为了运行
XmlTo
, 系统必须安装
libxml-2.0
库
,如果没有发现这个库,相应的
ns-3
特性就不会被激活,这会以消息显示出来。另一个需要注意的地方是:对于一些特定的程序,需要使用
sudo
命令来设置该程序的。这个是默认设置为关的,所以此性质会显示出未激活,现在我们可以进一步返回到调试编译上来:
./waf -d debug configure
此时编译系统被配置好,你可以编译
ns-3
程序的
debug
版本了,只需简单的命令如下:
./waf
一些
waf
命令在编译阶段是很重要的,另一些命令是在配置阶段有用的,例如,如果你想使用
ns-3
的仿真(
emaulation)特性,你一定要通过上述的
sudo
来设置用户标识位(
suid)
为有效位。这将是一个配置命令,你可以使用如下命令通知
Waf来重新设置:
./waf -d debug --enable-sudo configure
如果你这样做
,
waf
会运行
sudo
以
root
的权限来改变仿真代码的
socket
创建程序。在
waf
中还有许多其它的配置和编译选项可用。若要察看详细的选项
,键入以下命令:
./waf --help
我们将会在下一节中使用测试相关的命令。好的,你已经编译
ns-3
两遍了,现在你知道如何修改配置和编译优化代码了。