SDN控制器-ONOS源码编译与mininet快速入门

Posted 水中加点糖

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SDN控制器-ONOS源码编译与mininet快速入门相关的知识,希望对你有一定的参考价值。

SDN控制器-ONOS源码编译与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的代码主要有两个来源:

其主要区别在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所模拟设备对应的拓扑图:


能看到交换机和主机,及对应的连接关系。

大功告成!

以上是关于SDN控制器-ONOS源码编译与mininet快速入门的主要内容,如果未能解决你的问题,请参考以下文章

基于容器快速搭建onos环境

openvswitch2.11.0修改源码后重新编译

配置sdn相关环境

SDN 网络系统之 Mininet 与 API 详解

实验1:SDN拓扑实验

实验1:SDN拓扑实践