可以说onos是我遇到过最难编译运行的开源项目了,整个过程花了我好长时间,在此记录一下,希望对后来人有所帮助。
安装环境
我是在虚拟机中安装onos的。
虚拟机硬件:8G内存、4CPU(单核)、40G磁盘空间
虚拟机系统:ubuntu-16.04.6-desktop-amd64
安装依赖
ONOS-Wiki上列举的依赖有:git, zip, curl, unzip, python, python3, bzip2。
对于这些依赖,可直接使用sudo apt install *
来下载,必要时可直接将源更换为阿里云。
另外还需要安装jdk,我选择的是jdk8,通过手动下载并设置环境变量:
在/etc/profile中添加
export JAVA_HOME=/usr/lib/jvm/jdk1.8.0_231
export JRE_HOME=${JAVA_HOME}/jre
export CLASSPATH=${JAVA_HOME}/lib:${JRE_HOME}/lib:.
export PATH=${PATH}:${JAVA_HOME}/bin
记得source /etc/profile
还需要安装bazel,这里直接使用二进制压缩包进行安装。
根据https://github.com/bazelbuild/bazel/releases,选择合适的bazel版本(我的是bazel1.0.0)进行下载,然后命令行运行。
chmod +x bazel-1.0.0-installer-linux-x86_64.sh
./bazel-1.0.0-installer-linx-x86_64.sh --user
即在~/bin目录下就生成了bazel。
下载onos
ONOS-Wiki推荐的是git clone https://gerrit.onosproject.org/onos
但是其实也可以使用git clone https://github.com/opennetworkinglab/onos.git
我是使用onos2.3.0进行编译的
# 创建基于2.3.0的新分支,用于后续开发
git checkout -b dev 2.3.0
编译onos
首先需执行以下命令
vim ~/.bashrc
# 在最后添加
export ONOS_ROOT=~/onos
source ${ONOS_ROOT}/tools/dev/bash_profile
# 退出后执行文件
source ~/.bashrc
然后就可以使用bazel build onos
进行编译,但是此时就会出现很多问题。
bazel下载依赖包过慢
bazel下载一些github上的依赖包实在太慢了。总是会出现以下情况:
有些博客说网络不太好就多试几次,事实证明根本没用,还是要直面这个问题的。
使用代理
查阅了很多资料,说是bazel可以用HTTP_PROXY变量来使用代理,具体如下:
export HTTP_PROXY=http://127.0.0.1:1080
bazel build onos --action_env=HTTP_PROXY=$HTTP_PROXY
我在虚拟机上用v2ray搭建了一个客户端,但是直接使用是失败的。建议使用v2ray开1080端口的本地socks5代理,然后再通过工具将http代理转化为socks代理。这里推荐http-proxy-to-socks。
# 需要nodejs环境
npm install -g http-proxy-to-socks
# 开启http代理,将8080端口的http代理数据转化为socks代理数据,发送到1080端口
hpts -s localhost:1080 -p 8080
手动下载依赖
由于bazel编译失败会打印下载失败的url,可以直接通过该url下载依赖包。将下载的依赖包存入一个目录,比如~/deps,然后编译:
bazel build --distdir ~/deps onos
我选择的就是这种方法,之后可继续编译。
npm install特别慢
可以看到npm安装很慢,主要是因为访问不了外网。
网上资料说可以更换淘宝库来解决,即如下:
# onos/web/gui/BUILD
找到name = "_onos-gui-npm-build"的genrule
在cmd中倒数第5行$$NPM $$NPM_ARGS install后面加上
--registry https://registry.npm.taobao.org
找到name = "_onos-gui-npm-build"的genrule(其实我没找到)
在cmd中倒数第5行$$ROOT/$$NPM $$NPM_ARGS run build --no-cache后加上
--registry https://registry.npm.taobao.org
实际使用并没有效果,最后还是使用了上述的双重代理方法。
除了这些问题之外,还可能出现内存不足的情况,可通过增加交换分区来解决。
历经千辛万苦,编译成功…
运行onos
在onos目录下bazel run onos-local
,并打开另一终端执行onos localhost
,运行成功:
或者使用web-gui,在浏览器(使用chrome,火狐似乎不兼容)中输入http://localhost:8181/onos/ui,用户名onos,密码rocks,即可出现gui:
搭配mininet运行
控制器都是和交换机一起工作的,但是一般来讲不可能有实际的网络设备,所以本地使用都是搭配仿真网络工具mininet。
安装mininet
mininet的安装方式有很多种,我选择git源码安装:
git clone git://github.com/mininet/mininet.git
cd mininet
# 我使用的是mininet2.2.2
git tag 2.2.2
util/install.sh -fnv
运行
# 打开一个终端,进入~/onos
bazel run onos-local
# 打开另一终端,进入~/onos
onos localhost
# 启动应用程序,不然没有处理能力
onos>app activate org.onosproject.pipelines.basic
onos>app activate org.onosproject.fwd
# 再打开另一终端,启动mininet
sudo mn --topo linear,3 --switch=ovsk,protocols=OpenFlow13 --controller=remote,ip=127.0.0.1
mininet显示如下:
onos的web-gui显示如下: