SDN控制器-ONOS源码编译与mininet
- 所需环境
- 系统要求
- onos编译软件环境安装
- 依赖软件安装
- Bazel/Bazelisk安装
- jdk11安装(可选)
- 克隆代码
- 进行编译
- 运行测试
- mininet模拟交换机和主机
ONOS作为开源SDN控制器中的一个重要项目,很有必要学习一下
在学习时,为了后续编码的需要,这里先体验下源码编译
其过程也比较简单,直接在官方wiki中找到对应的文档即可。
其官方链接为:
https://wiki.onosproject.org/display/ONOS/Developer+Quick+Start
如果在编译过程中一直卡住的话,需要检查下网络是否能联通。
所需环境
系统要求
- 系统:linux或者mac(本文中采用的是ubuntu18.04版本,在虚拟机的)
onos编译软件环境安装
onos编译的软件环境根据官方的来就行。
官方地址为:
https://wiki.onosproject.org/display/ONOS/Installing+required+tools
其中要注意的一点是:onos的开发和部署的操作系统仅支持linux和mac os的X86_64位操作系统。
ONOS development and deployment is only supported on Linux and Mac OS Operating systems for x86_64 architectures.
为了少走弯路,系统的选择上也建议根据官方的来。当然愿意折腾下其他的系统的话也可以尝试一下。
我这里选择的是稍微成熟一点的ubuntu18.04系统。之所以选择它也是因为之前在装open stack时,最新版本的ubuntu22.04中对很多包的更新支持度还没有赶上,报一些奇奇怪怪的错走了很多弯路,所以为了确保软件包的稳定性,选个老一点的稳定版系统稳定应该不大。
另外还有一点很重要,编译ONOS时不要以root用户进行操作,否则编译过程中可能会报错
所需要的软件安装根据官方的说明一步步安装就行了,也可参考下面的操作。
依赖软件安装
先安装python2和python3这些软件:
sudo apt install python
sudo apt install python3
sudo apt install python-pip python-dev python-setuptools
sudo apt install python3-pip python3-dev python3-setuptools
pip3 install --upgrade pip
pip3 install selenium
再安装git以克隆代码:
sudo apt-get install git
sudo apt-get install git-review
Bazel/Bazelisk安装
由于当前版本的ONOS是用Bazel进行打包的,还需要安装Bazel。
官方推荐的是不直接安装Bazel,安装它的管理软件Bazelisk即可,这样可以省去很多麻烦。
wget https://github.com/bazelbuild/bazelisk/releases/download/v1.4.0/bazelisk-linux-amd64
chmod +x bazelisk-linux-amd64
sudo mv bazelisk-linux-amd64 /usr/local/bin/bazel
cd ~/onos
bazel version
但如果在某些时候遇到Bazelisk找不到Bazel对应版本的情况下,就可能手动安装一下Bazel了。
具体需要安装哪个版本的bazel,可通过ONOS源码下的 .bazelversion 文件查看。
手动安装时,直接从官网中下载对应的安装文件即可。
bazel的所有版本,可在bazel的github中找到。其github地址为:
https://github.com/bazelbuild/bazel/releases
以安装bazel-6.0.0-pre.20220421.3这个版本的为例。
从官网下载好安装包后,执行对应的安装命令即可。
./bazel-6.0.0-pre.20220421.3-installer-linux-x86_64.sh --user
其他可选配置,可参照官网说明。
https://bazel.build/install/ubuntu
jdk11安装(可选)
需要注意的是,在编译时对于jdk的安装不是必须的。但如果在运行onos的话,就必须要将jdk装上了。以onos-2.7.0版本为例,所需要安装的jdk版本需要为jdk11
sudo apt-get install openjdk-11-jdk
再配置环境变量
sudo vim /etc/profile
在profile文件末尾添加下面的内容
export JAVA_HOME=/usr/lib/jvm/java-11-openjdk-amd64
export JRE_HOME=$JAVA_HOME/jre
export CLASSPATH=:$JAVA_HOME/lib:$JRE_HOME/lib:$CLASSPATH
export PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$PATH
之后验证一下java是否安装正确
java -version
克隆代码
当软件安装好了后,就可以克隆出onos的代码了。
onos的代码主要有两个来源:
- https://gerrit.onosproject.org/onos (官方版)
- https://github.com/opennetworkinglab/onos (github版)
其主要区别在ReadMe中有也说明:
github中的onos源码仅作为一个mirror,所以建议直接使用onos官方版本的源码进行clone,以确保代码最新。
git clone https://gerrit.onosproject.org/onos
克隆后再切换到想要编译的分支。
以本文为例,想要编译的分支为当前最新稳定版本的tag为2.7.0。
所以将代码checkout到2.7.0分支即可。
git checkout 2.7.0
进行编译
所需的编译软件和源码都有了之后,就可以进行编译了。
切换到onos的源码根目录,再执行bazel version命令将对应的bazel下载下来。
cd ~/onos
bazel version
再执行编译命令
bazel build onos
或者使用如下命令进行编译
bazel build onos --action_env=HTTP_PROXY=$HTTP_PROXY
但需要提前配置如下信息:
export https_proxy=http://ip:port;
export http_proxy=http://ip:port;
export all_proxy=socks5://ip:port
配置好后可以用如下命令进行验证:
curl cip.cc
如果在编译过程中报了一些错,可根据提示进行信息尝试一些搜索看看有没有解决方案。如果网上没有找到对应的解决方案,需要了解一下bazel的相关知识,并结合编译的代码一起排查。
如我之前编译时一直卡在web/gui处,通过查看了对应的BUILD脚本,才知道原来是我少加了代理信息导致的。
如果一切顺利,执行编译命令后等个一小会儿,就会提示编译成功了
如上图所示,编译成功后,会在onos的根目录下生成bazel-bin目录,所编译好的onos文件为onos.tar.gz文件
运行测试
当编译成功后,再来测试一下所编译出来的onos,看下能否运行成功。
将编译好的onos拷贝到某个目录,并进行解压。
这里以root用户运行onos为例,验证一下:
su换到root下去运行
su #切换到root用户
mv onos/bazel-bin/onos.tar.gz /root/
cd /root/
tar -zxvf onos.tar.gz
mkdir onos
cp -r onos-2.7.0/* onos/
cd onos
bin/onos-service start
显示启动成功,访问对应的web界面
http://ip:8181/onos/ui
输入默认的用户名和密码:onos/rocks
当看到上面的界面时,就证明ONOS的打包+启动成功了。
mininet模拟交换机和主机
启动成功后再用mininet模拟点设备数据上来,让onos动起来。
此部分也可直接参考官方的文档:
https://wiki.onosproject.org/display/ONOS/onos.py+Prerequisites
先安装mininet和网桥:
sudo apt-get install mininet bridge-utils
安装好后,运行mininet和onos下的测试脚本
cd到onos的源码目录
cd ~/onos/tools/dev/mininet
同时由于脚本原因,还需要将onos.tar.gz拷贝到指定的目录中去。我这里的是root用户运行的,所以拷贝到 /root/onos/bazel-out/k8-fastbuild/bin目录下去。
mkdir -p /root/onos/bazel-out/k8-fastbuild/bin/
cp /root/onos.tar.gz /root/onos/bazel-out/k8-fastbuild/bin/onos.tar.gz
执行mininet进行测试。
sudo mn --custom onos.py --controller onos,1 --topo tree,2,2
再在mininet中让主机ping一下:pingall
mininet-onos> pingall
*** Ping: testing ping reachability
h1 -> h2 h3 h4
h2 -> h1 h3 h4
h3 -> h1 h2 h4
h4 -> h1 h2 h3
*** Results: 0% dropped (12/12 received)
全部都收到了。
最后,再看下onos界面中对于上面mininet所模拟设备对应的拓扑图:
能看到交换机和主机,及对应的连接关系。
大功告成!