onos之安装编译

可以说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显示如下:

参考

ONOS-Wiki
搭建onos和mininet环境
编译onos的各种问题