<meta name="source" content="lake">
源码下载
<pre class="cm-s-default" style="color: rgb(89, 89, 89); margin: 0px; padding: 0px; background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0);">git clone https://github.com/Azure/sonic-buildimage.git</pre>
切换分支到releases 版本 master-20200712 :git checkout 13769f9
编译环境配置
<pre class="cm-s-default" style="color: rgb(89, 89, 89); margin: 0px; padding: 0px; background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0);">sudo modprobe overlay</pre>
拉取子模块源码
<pre class="cm-s-default" style="color: rgb(89, 89, 89); margin: 0px; padding: 0px; background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0);">make init</pre>
配置编译的目标平台
<pre class="cm-s-default" style="color: rgb(89, 89, 89); margin: 0px; padding: 0px; background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0);">make configure PLATFORM=barefoot</pre>
注:目标平台可以在sonic-buildimage-master-20200712/platform 目录下可以找到对应
<pre class="cm-s-default" style="color: rgb(89, 89, 89); margin: 0px; padding: 0px; background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0);">barefoot broadcom cavium centec generic innovium marvell marvell-arm64 marvell-armhf mellanox nephos p4 template vs</pre>
开始编译
<pre class="cm-s-default" style="color: rgb(89, 89, 89); margin: 0px; padding: 0px; background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0);">make all </pre>
技巧
由于国内网络环境恶心,make configure 和 make all经常导致失败,可以修改Makefile.work 和 makefile 脚本实现断点续编译和挂代理编译
修改内容如下:
修改buster的Dockerfile.j2 文件,添加如下代码,避免编译报错
原理解释
sonic编译是在docker 里面进行的,编译时会利用下面三个文件夹下的Dockerfile.j2构建基础编译环境镜像
我们可以看到这里有三种基础镜像buster, stretch,jessie这三种分别表示该镜像是基于那个Debian版本构建的,这里在make configure只选择其中一种就可以了。推荐使用Stretch
可以强制指定BLDENV=stretch
我们看到make configure后会产生两个镜像sonic-slave-buster-sysiphys 和 sonic-slave-buster ,这是因为我构建编译环境的时使用sysiphys这个用户名,而sonic-slave-buster-sysiphys这个镜像就是sonic-slave-buster的副本,sonic这样做的目的在于,如果此时还有另外一个用户在这个环境下编译sonic,就可以直接复用 sonic-slave-buster这个基础编译环境镜像,用来隔离不同用户对sonic 的修改。
在我们执行make all的时候其实就是将src 目录下的子模块文件映射到了由 sonic-slave-buster-sysiphys构建的容器里面在编译,最终的编译结果都会被放在目录 target/debs/buster/下。
编译时我们可以tail -f target/debs/buster/linux-headers-4.19.0-9-2-common_4.19.118-2+deb10u1_all.deb.log查看各个模块编译的详细日志
make NOJESSIE=1 KEEP_SLAVE_ON=yes,通过设置KEEP_SLAVE_ON=yes可以在编译发生错误时直接停留在dockers里面,进行debug
还有更多编译细节可参看Makefile.work和README.buildsystem.md
README.buildsystem.md文件介绍了sonic 编译时如何利用rule 和 platform 目录下的*.mk 文件进行打包,构建,依赖关联,以及运行时服务docekr的构建
编译大致流程总结为make -> Makefile -> Makefile.work -> slave.mk ->rule 和platform 这两个目录下的* .mk
rule 下的.mk用于构建通用的sonic服务, platform 下的.mk用于构建与硬件转发芯片相关的接口
rule.mk解释
在rules 下有很多*.mk文件, 就是用这些文件来构建makeflie 的target 和 依赖,查看slave.mk 可以看到如下内容
[图片上传中...(image-ef84c8-1625974872774-0)]
可以看到SONIC_DPKG_DEBS,SONIC_DOCKER_IMAGES,SONIC_PYTHON_WHEELS,SONIC_MAKE_DEBS等变量这些变量便是来自rule 和 platform 目录下的*.mk 文件
所以编译的时候也可以单独指定某一个目标来编译,例如:
<pre class="cm-s-default" style="color: rgb(89, 89, 89); margin: 0px; padding: 0px; background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0);">make target/docker-fpm-frr.gz</pre>
关于这些SONIC_DPKG_DEBS,SONIC_DOCKER_IMAGES,SONIC_PYTHON_WHEELS,SONIC_MAKE_DEBS变量的细节区别请大家参考README.buildsystem.md