
1. 项目概述与核心价值最近在折腾软件定义网络SDN控制器ONOSOpen Network Operating System是绕不开的一个重量级选手。作为一个面向运营商级网络的开源SDN操作系统ONOS 2.5.0虽然已经不是最新版本但它是一个相当稳定且功能完备的里程碑式发布。很多企业内部的定制化开发、学术研究或者只是想深入理解SDN控制器架构的朋友可能都需要从源码开始构建一个属于自己的ONOS环境。网上的教程要么年代久远要么步骤缺失踩坑无数后我决定把从零开始编译安装ONOS 2.5.0的完整过程连同那些官方文档不会告诉你的“坑”和技巧系统地梳理出来。这篇教程的目标是让你能在一台干净的Linux机器上以Ubuntu 20.04 LTS为例成功完成ONOS 2.5.0源码的下载、依赖安装、编译、打包最终运行起一个可用的ONOS实例。它不仅是一份操作手册更会解释每个步骤背后的原因比如为什么需要特定版本的Java和Maven如何解决令人头疼的依赖下载失败问题以及编译完成后如何验证和初步使用。无论你是SDN的初学者还是有一定经验但被ONOS编译环境困扰的开发者这份基于实战的指南都应该能帮你节省大量时间。2. 环境准备构建稳固的基石编译ONOS这类大型Java项目环境配置是第一步也是最容易出错的一步。版本不匹配是绝大多数编译失败的根源。2.1 操作系统与基础工具ONOS官方推荐在Ubuntu或CentOS等Linux发行版上进行开发构建。这里我们选择Ubuntu 20.04 LTS作为标准环境因为它有长期的官方支持软件源丰富且稳定。首先确保系统是最新的sudo apt update sudo apt upgrade -y接下来安装一些必要的编译工具和库文件sudo apt install -y git curl wget tar zip unzip build-essential \ libssl-dev libffi-dev python3-dev python3-pip注意build-essential包包含了GCC、G、make等核心编译工具链是后续编译原生依赖如果存在的基础。即使ONOS主体是Java其底层或某些组件如协议库的本地绑定可能需要这些工具。2.2 Java开发环境配置ONOS 2.5.0对Java版本有严格要求它需要Java 8。更高版本的Java如Java 11可能会导致不兼容的编译或运行时错误。我们选择Oracle JDK 8或者OpenJDK 8。这里以安装OpenJDK 8为例因为它更容易获取且开源sudo apt install -y openjdk-8-jdk安装完成后验证版本至关重要java -version # 预期输出应包含 “openjdk version “1.8.0_xxx” javac -version # 预期输出应包含 “javac 1.8.0_xxx”接下来需要正确设置JAVA_HOME环境变量。这是Maven和许多构建工具定位Java编译器的关键。# 查找JDK的安装路径通常类似 /usr/lib/jvm/java-8-openjdk-amd64 sudo update-alternatives --config java # 记下路径然后编辑 ~/.bashrc 或 ~/.profile 文件 echo ‘export JAVA_HOME/usr/lib/jvm/java-8-openjdk-amd64‘ ~/.bashrc echo ‘export PATH$JAVA_HOME/bin:$PATH‘ ~/.bashrc source ~/.bashrc验证JAVA_HOMEecho $JAVA_HOME2.3 Apache Maven安装与配置ONOS使用Maven作为项目构建和依赖管理工具。ONOS 2.5.0需要Maven 3.3.x 或 3.5.x版本。不推荐使用过新或过旧的Maven版本。我们从Apache官网直接下载并安装Maven 3.5.4这是一个经过验证的稳定版本。# 下载Maven wget https://archive.apache.org/dist/maven/maven-3/3.5.4/binaries/apache-maven-3.5.4-bin.tar.gz # 解压到 /opt 目录通常用于存放第三方应用程序 sudo tar -xzf apache-maven-3.5.4-bin.tar.gz -C /opt # 创建软链接以便于管理版本 sudo ln -s /opt/apache-maven-3.5.4 /opt/maven接下来配置Maven环境变量echo ‘export MAVEN_HOME/opt/maven‘ ~/.bashrc echo ‘export PATH$MAVEN_HOME/bin:$PATH‘ ~/.bashrc source ~/.bashrc验证安装mvn -v # 输出应显示 Apache Maven 3.5.4以及我们刚才设置的 Java 1.8 信息。实操心得Maven仓库镜像配置默认的Maven中央仓库在国外下载依赖速度极慢且容易失败。为了加速构建过程必须配置国内镜像。编辑Maven的配置文件~/.m2/settings.xml如果不存在则创建settings mirrors mirror idaliyunmaven/id mirrorOf*/mirrorOf name阿里云公共仓库/name urlhttps://maven.aliyun.com/repository/public/url /mirror /mirrors /settings这个配置将所有的仓库请求重定向到阿里云的Maven镜像能极大提升依赖下载成功率与速度。2.4 获取ONOS 2.5.0源码ONOS的源代码托管在Gerrit上但我们可以通过其GitHub镜像仓库来克隆这样更方便。我们克隆特定版本tag的代码。# 创建一个工作目录并进入 mkdir -p ~/onos_workspace cd ~/onos_workspace # 克隆ONOS仓库这会下载整个仓库历史较大 git clone https://github.com/opennetworkinglab/onos.git cd onos # 切换到 2.5.0 版本标签 git checkout 2.5.0注意直接克隆主分支再切换标签可以确保获取到完整的项目历史和所有标签信息。如果你只想要2.5.0版本的代码以节省空间可以使用git clone --branch 2.5.0 --depth 1 https://github.com/opennetworkinglab/onos.git进行浅克隆。3. 编译过程详解与核心问题攻克环境就绪源码在手现在进入最核心的编译阶段。ONOS的编译不是简单的mvn compile它涉及到一个复杂的多模块构建和最终的打包。3.1 首次编译依赖解析与下载进入ONOS源码根目录我们首先进行清理并尝试编译整个项目。使用-DskipTests跳过测试可以显著加快首次编译速度。cd ~/onos_workspace/onos mvn clean compile -DskipTests这个命令会触发以下关键过程清理删除之前构建生成的target目录。依赖下载Maven根据pom.xml文件解析项目所有模块超过300个的依赖关系并从配置的仓库我们已设置为阿里云镜像下载所需的Jar包到本地仓库~/.m2/repository。这是最耗时的一步取决于网络状况可能需要30分钟到数小时。编译将项目的Java源代码编译成.class字节码文件。常见问题与排查技巧实录问题1依赖下载失败报Could not transfer artifact ...错误。原因网络连接超时或镜像仓库暂时缺少某个特定构件。解决检查settings.xml配置是否正确。尝试多次运行mvn compile命令Maven有重试机制。如果某个依赖始终失败可以尝试在浏览器中手动访问阿里云镜像的对应URL看是否能下载。有时需要等待镜像同步。终极方案暂时注释掉settings.xml中的镜像使用默认中央仓库速度慢但最全下载缺失的依赖下载成功后再启用镜像。问题2编译错误提示javac: invalid target release: 1.8或类似。原因JAVA_HOME设置错误或者系统中存在多个Java版本Maven使用了错误的Java编译器。解决再次确认java -version和mvn -v的输出是否一致指向Java 8。可以使用update-alternatives --config java和update-alternatives --config javac来切换系统默认的Java版本。3.2 构建ONOS安装包Karaf Distribution编译成功后我们需要将ONOS及其所有依赖、配置打包成一个可运行的发行版。ONOS使用Apache Karaf作为其OSGi运行时容器。打包命令如下mvn clean install -DskipTests -Dcheckstyle.skiptrue这个mvn install命令比compile更进一步重新清理和编译确保从干净状态开始。运行单元测试我们通过-DskipTests跳过了以加速构建。在生产或严格环境下建议移除此参数。跳过代码风格检查-Dcheckstyle.skiptrue跳过了Checkstyle检查这也是为了加快构建。ONOS有严格的代码规范但对于仅构建发行版来说可以跳过。打包这是关键步骤。它会创建一个完整的Karaf发行版包含ONOS的所有功能模块.kar文件、配置文件、启动脚本等。最终产物位于~/onos_workspace/onos/target/目录下文件名为onos-2.5.0.tar.gz。注意事项这个打包过程非常消耗内存和CPU。建议在性能较好的机器上操作并确保有至少8GB 的可用内存否则Maven进程可能会在编译过程中因内存不足OOM而被系统终止。你可以通过设置Maven内存选项来缓解export MAVEN_OPTS“-Xmx4g -XX:MaxPermSize512m”。但更根本的是增加物理内存或交换空间。整个过程可能需要1到3个小时取决于机器性能。耐心等待观察控制台输出只要没有红色的[ERROR]提示通常就是在正常进行中。3.3 验证构建产物打包完成后进入目标目录查看产物cd ~/onos_workspace/onos/target ls -lh onos-2.5.0.tar.gz你应该能看到一个大小约为200MB 到 300MB的tar.gz压缩包。这个文件就是完整的ONOS 2.5.0发行版。你可以将其复制到任何其他兼容的Linux服务器上解压运行。4. 安装、启动与基础配置编译打包出的tar.gz文件就是我们的“安装包”。接下来我们将其“安装”到本地并启动。4.1 解压与目录结构选择一个安装目录例如/optsudo tar -xzf ~/onos_workspace/onos/target/onos-2.5.0.tar.gz -C /opt cd /opt sudo ln -s onos-2.5.0 onos # 创建一个方便的软链接现在查看/opt/onos目录结构了解关键组成部分bin/: 包含启动脚本onos-service、onos命令行客户端脚本等。apache-karaf-version/: ONOS运行所基于的Karaf容器核心。config/: 配置文件目录如网络配置、组件属性等。system/,data/,deploy/: Karaf和ONOS运行时使用的系统目录、数据目录和热部署目录。logs/: 日志文件目录排查问题时首先查看这里。4.2 启动ONOS服务ONOS提供了服务脚本来管理其生命周期。我们以后台服务形式启动它cd /opt/onos sudo ./bin/onos-service start启动过程需要一些时间来初始化Karaf容器、加载所有OSGi bundle即ONOS的功能模块。你可以通过以下命令查看启动日志和状态# 跟踪日志输出类似 tail -f sudo ./bin/onos-service log # 或者直接查看日志文件 tail -f /opt/onos/logs/karaf.log在日志中你最终应该看到类似下面的关键信息表明ONOS已成功启动并进入就绪状态... INFO [Apache Karaf] Started ONOS successfully in XX seconds. ... INFO [TopologyManager] Network topology service started. ... INFO [ClusterManager] Node [127.0.0.1] ready for cluster operations.实操心得启动问题排查端口冲突ONOS默认使用8181Karaf控制台、8101Karaf SSH、9876ONOS集群通信等端口。确保这些端口没有被其他程序占用。可使用netstat -tlnp | grep 端口号检查。Java内存不足如果启动失败查看karaf.log开头部分是否有OutOfMemoryError。可以编辑/opt/onos/bin/onos-service脚本找到JAVA_OPTS设置行增加堆内存例如-Xmx4g。权限问题确保/opt/onos目录及其下的data/,logs/等目录对运行ONOS的用户可能是当前用户或root有读写权限。4.3 访问ONOS Web UI与命令行ONOS启动成功后可以通过两种主要方式与其交互Web图形界面GUI 默认情况下ONOS的Web UI运行在8181端口。在浏览器中访问http://你的服务器IP:8181/onos/ui。默认用户名和密码是onos/rocks。登录后你可以看到网络拓扑、设备、流表等可视化信息。命令行界面CLI ONOS提供了一个强大的命令行客户端它通过SSH连接到Karaf容器。首先确保ONOS的Karaf SSH服务已启动默认端口8101。然后使用自带的onos客户端脚本cd /opt/onos ./bin/onos 你的服务器IP # 首次连接会提示接受主机密钥输入密码 rocks连接成功后你会看到onos提示符。在这里可以执行各种管理命令例如apps -a -s列出所有已安装和激活的应用程序。devices列出已发现的网络设备。flows列出已安装的流表项。logout退出CLI。4.4 基础功能验证加载示例应用为了验证ONOS基本功能正常我们可以激活一个内置的示例应用比如fwd二层转发应用。在ONOS CLI中执行onos app activate org.onosproject.fwd激活后你可以通过Web UI或在CLI中使用flows命令查看当有主机比如连接了Mininet模拟的网络发送ARP请求或数据包时ONOS应该会自动安装相应的转发流表。5. 高级主题开发环境搭建与源码调试如果你不仅仅是想运行ONOS还希望对其进行二次开发或阅读调试源码那么需要搭建一个开发环境。5.1 使用IDE导入项目推荐使用IntelliJ IDEA社区版或旗舰版作为ONOS的Java开发IDE它对Maven和OSGi的支持非常好。打开项目在IntelliJ IDEA中选择 “Open”然后导航到~/onos_workspace/onos目录选择顶层的pom.xml文件以Maven项目形式打开。等待索引IDEA会自动开始下载依赖、建立索引。这个过程同样耗时请耐心等待。确保IDEA使用的Maven配置File - Settings - Build, Execution, Deployment - Build Tools - Maven指向我们之前配置好的Maven/opt/maven和使用了镜像的settings.xml。启用注解处理ONOS大量使用Google的AutoValue等注解处理器。需要在IDEA设置中启用注解处理Settings - Build, Execution, Deployment - Compiler - Annotation Processors勾选 “Enable annotation processing”。5.2 在IDE中运行与调试ONOS在开发模式下我们通常不打包整个发行版而是直接在IDE中运行Karaf并部署我们的模块。找到主类ONOS提供了一个用于开发的Main类。在IDEA的项目视图中导航到tools/dev/目录下找到org.onosproject.onos包里的Main类。创建运行配置右键点击Main类选择 “Run ‘Main.main()‘” 或 “Debug ‘Main.main()‘”。在运行配置中你可能需要设置工作目录为ONOS源码根目录~/onos_workspace/onos。还可以在 “VM options” 中添加调试参数例如-Xdebug -Xrunjdwp:transportdt_socket,servery,suspendn,address5005以便进行远程调试。运行启动这个配置你会在IDEA的Run/Debug控制台中看到类似终端启动ONOS的日志输出。此时一个开发版的ONOS实例就在运行了。部署模块如果你修改了某个模块例如apps/fwd的代码可以在该模块的目录下执行mvn clean install然后将生成的.kar文件在模块的target/目录下复制到运行中ONOS实例的deploy/目录对于开发模式路径可能在~/onos_workspace/onos/apache-karaf-version/deployKaraf会自动热部署该模块。5.3 连接ONOS CLI到开发实例开发实例的Karaf SSH端口可能不是默认的8101。查看启动日志找到类似SSH server listening on 127.0.0.1:port的行。然后使用客户端连接cd ~/onos_workspace/onos ./bin/onos localhost -p 日志中看到的端口号6. 生产环境部署考量与优化建议将编译好的ONOS用于实验和生产需要考虑更多因素。6.1 系统服务化与管理使用onos-service脚本是基础但在生产环境中我们通常将其注册为系统的守护进程如systemd服务以便实现开机自启、故障重启、日志轮转等。创建一个systemd服务文件/etc/systemd/system/onos.service[Unit] DescriptionONOS SDN Controller Afternetwork.target [Service] Typeforking Useronos # 建议创建一个专门的‘onos‘用户来运行 Grouponos Environment“JAVA_HOME/usr/lib/jvm/java-8-openjdk-amd64” Environment“KARAF_HOME/opt/onos/apache-karaf-version” ExecStart/opt/onos/bin/onos-service start ExecStop/opt/onos/bin/onos-service stop Restarton-failure RestartSec10 LimitNOFILE65536 [Install] WantedBymulti-user.target然后启用并启动服务sudo systemctl daemon-reload sudo systemctl enable onos sudo systemctl start onos sudo systemctl status onos6.2 性能调优与监控JVM参数根据服务器内存大小调整ONOS的JVM堆内存。编辑/opt/onos/bin/onos-service中的JAVA_OPTS例如-Xms4g -Xmx8g设置初始堆和最大堆。集群部署生产环境通常需要部署ONOS集群以实现高可用。这涉及修改/opt/onos/config/cluster.json文件配置节点IP、端口等过程较为复杂需要仔细阅读官方集群文档。日志管理默认日志可能增长很快。可以配置Karaf的日志框架etc/org.ops4j.pax.logging.cfg来按大小或时间滚动日志文件。监控ONOS提供了REST API和JMX接口可以集成到Prometheus、Grafana等监控系统中监控控制器性能、集群状态、设备连接数等关键指标。6.3 安全加固修改默认密码首要任务是修改Web UI和CLI的默认密码rocks。可以通过Karaf控制台命令完成ssh -p 8101 onoslocalhost # 使用默认密码登录 onos security:usermgt --changePassword onos # 根据提示输入新密码网络隔离将ONOS的控制平面南向接口如6633、6653端口与管理平面Web UI的8181CLI的8101部署在不同的网络分区或使用防火墙严格限制访问来源。定期更新关注ONOS社区的安全公告及时将自定义开发合并到最新的稳定分支以修复潜在的安全漏洞。编译和安装ONOS 2.5.0的过程就像搭建一个精密仪器的生产线。从准备符合规格的零件Java, Maven到按照图纸源码进行组装编译再到最终调试运行每一步的严谨性都决定了最终产品的稳定性。这份教程涵盖了从零开始到生产级部署的主要环节其中关于环境配置、依赖下载、内存设置和权限管理的那些“坑”都是我在多次实践中总结出来的。希望它能帮助你顺利搭建起自己的SDN控制平台并以此为起点深入探索软件定义网络的广阔世界。如果在实践中遇到新的问题多查看logs/karaf.log善用ONOS活跃的社区邮件列表和文档大部分难题都能找到解决方案。