最近需要用NS3进行一些网络仿真,便在win10系统上安装了VMware,并建立了一个ubuntu的64位虚拟机,版本为18.04.3。
由于NS3是初次接触,虚拟机使用也很不熟练,因此将使用过程中遇到的一些问题及应对方式记录在这里,便于之后再遇到相似问题时能很好的应对。
下面大多数都是遇到的问题与解决办法,有些地方还惨杂着一些我没来得及验证的推测,希望对这些推测有想法的人可以在评论区和我交流,接受你的指导,或者大家共同提高,不胜感激!
NS3的安装参考了如下链接
https://www.jianshu.com/p/7aa7f3955233
NS3有一些依赖库的安装需要大量的时间,若是此时需要中断安装状态,只需要 “Ctrl+C” 即可强行中断安装。
如果强行中断安装之后需要恢复安装,或者安装中途遇到种种原因导致安装中断,需要继续安装,直接输入安装命令会报错:
$ sudo apt-get install [packagename]
E: 无法获得锁 /var/lib/dpkg/lock-frontend - open (11: 资源暂时不可用)
E: Unable to acquire the dpkg frontend lock (/var/lib/dpkg/lock-frontend), is another process using it?
此时参考如下链接,使用方法三确实有效:
sudo rm /var/lib/dpkg/lock-frontend
https://blog.csdn.net/qq_45089570/article/details/104137501
然后再次输入安装命令即可。
安装参考链接:
https://www.cnblogs.com/Xylona/p/10658767.html
PyViz的使用:
在xxxx.cc文件中加入:
CommandLine cmd;
cmd.Parse (argc, argv);
将xxxx.cc文件放在ns-3.28/scratch目录下
运行程序时在终端ns-3.28目录下输入:
sudo ./waf --run scratch/xxxx --vis
NetAnim的使用:
打开xxxx.cc文件,在头文件中加入#include "ns3/netanim-module.h"
,在Simulation::Run();
前面加入代码:AnimationInterface anim ("xxxx.xml");
,双引号中是生成的xml文件的名字,可以任意取。
将xxxx.cc文件放在ns-3.28/scratch目录下,在终端ns-3.28目录下运行xxxx.cc:
./waf --run scratch/xxxx
进入netanim-3.107目录,运行NetAnim:
./NetAnim
在NetAnim界面中Open->xxxx.xml->Play,其中xxxx.xml文件在目录ns-3.28下。
出于种种原因,有些时候不得不重装NS3,此时只需要简单粗暴的将NS3所在的文件夹整个删除,之后再按照正常的安装方式,从“解压安装包”这一步开始即可。
还有一种避免重装NS3的思路,在进行操作之前如果无法确定后果,建议先使用VMware的快照功能,将此时虚拟机的状态拍摄快照,之后随意操作,一旦出现问题直接恢复到快照时刻的系统状态即可。这种做法也有一些弊端,拍摄快照后虚拟机在正常开关机、挂起时会花更多的时间,所以只要在需要的时候拍摄快照,不需要快照后及时删除。
因为之前在网上找到的一个模块在ns-3.28下编译不通过,但是有人说在ns-3.24.1下可以,故尝试再安装一个ns-3.24.1,之后直接使用ns-3.24.1进行模拟,发现ns-3.24.1在18.04.3的ubuntu下无法成功编译,网上找了一下发现可能是之前安装的依赖库版本过新,或者ubuntu版本过新,导致与ns-3.24.1不兼容。
解决办法是重新安装一个虚拟机,降低ubuntu的版本或是添加低版本的NS3依赖库,我重新安装了一个ubuntu16.04的虚拟机,紧接着成功安装ns-3.24.1。
模块的添加思路参考了如下链接
https://blog.csdn.net/barcodegun/article/details/6898193
如果是直接使用别人编写好的模块,即wscript文件都已经不再需要自己修改,那么只要将模块复制到src目录下,直接开始编译即可。
cd tarballs/ns-allinone-3.28/ns-3.26
./waf configure --enable-examples --enable-tests
./waf build
编译结果中出现了这个模块,即成功添加。
下面这个链接是另外一个博主对上面方法在ns-3.26下的改进
https://blog.csdn.net/meditation19/article/details/73608896
在编译那一步多了一句
./waf clean
个人使用下来感觉不太需要这一句,加上这一句后会多花大量时间全部重新编译,而我们只需要编译新加入的模块就可以,不加这一句也能成功编译。
在使用过程中可能会出现种种原因导致模块编译失败,比如自己写的模块依赖关系不对、旧版本下写好的模块在新版本下不兼容等等,此时就会出现模块编译不通过。
亲身试验发现,单独编译模块A可以通过,单独编译模块B不可以通过,模块A和B同名。当编译了模块B不通过后,先直接删除模块B的文件,再重新编译,会编译失败,推测是直接删除文件并没有删除wscript文件中的一些依赖。此时再将模块A复制到src目录下面,模块A的编译也会失败,因为两个模块同名,所以不确定失败原因具体在哪里。也尝试过在编译新模块之前./waf clean,但是模块A仍然无法编译成功。
因为在自己编写模块时哪怕出现问题也不会频繁改动模块的名字,所以上面这种情况不太好避免,一种做法是重装NS3,这样非常的浪费时间;另一种做法是提前拍摄快照,遇到问题恢复到快照时的系统状态即可,这样也有一些弊端。
后来找到了一种删除模块的方法:
./waf distclean //这里需要加上dist,不然还是清除不掉
./waf configure //重新配置,后面可以跟上具体的参数
./waf
这种方法我还没有进行验证,但是不加dist直接./waf clean确实不管用。
因此如果看到这篇博客的人知道更好的应对方式,或者我这里说的有什么问题,希望可以留言告诉我,不胜感激!
因为我的代码编写实在win10中完成的,在将文件拷贝到虚拟机时偶尔会出现拷贝到一半进度条不动了,此时点取消没有反应,虚拟机也无法正常关机,只能在任务管理器强制关闭。
这时再次打开虚拟机就会报错:VMware Workstation 无法连接到虚拟机。请确保您有权限运行该程序、访问改程序使用的所有目录以及访问所有临时文件目录。
这种情况下的处理方式在我的另一篇博客里面有写到,使用里面的方法五即可。
【六种解决思路尝试】VMware Workstation 无法连接到虚拟机。
另外,好的习惯是虚拟机不用时直接挂起就可以,这样能有效避免在关闭虚拟机时出现的各种导致VMware不正常关闭的情况。