2021-07-11

源码下载

git clone https://github.com/Azure/sonic-buildimage.git

切换分支到releases 版本 master-20200712 :git checkout 13769f9

编译环境配置

sudo modprobe overlay

拉取子模块源码

make init

配置编译的目标平台

make configure PLATFORM=barefoot

注:目标平台可以在sonic-buildimage-master-20200712/platform 目录下可以找到对应

barefoot broadcom cavium centec generic innovium marvell marvell-arm64 marvell-armhf mellanox nephos p4 template vs

开始编译

make all 

技巧

由于国内网络环境恶心,make configure 和 make all经常导致失败,可以修改Makefile.work 和 makefile 脚本实现断点续编译和挂代理编译

修改内容如下:

image.png

修改buster的Dockerfile.j2 文件,添加如下代码,避免编译报错

image.png

原理解释

sonic编译是在docker 里面进行的,编译时会利用下面三个文件夹下的Dockerfile.j2构建基础编译环境镜像

image.png
image.png

我们可以看到这里有三种基础镜像buster, stretch,jessie这三种分别表示该镜像是基于那个Debian版本构建的,这里在make configure只选择其中一种就可以了。推荐使用Stretch

可以强制指定BLDENV=stretch

image.png

我们看到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/下。

image.png

编译时我们可以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

image.png
image.png

README.buildsystem.md文件介绍了sonic 编译时如何利用rule 和 platform 目录下的*.mk 文件进行打包,构建,依赖关联,以及运行时服务docekr的构建

image.png

编译大致流程总结为make -> Makefile -> Makefile.work -> slave.mk ->rule 和platform 这两个目录下的* .mk

rule 下的.mk用于构建通用的sonic服务, platform 下的.mk用于构建与硬件转发芯片相关的接口

rule.mk解释

image.png

在rules 下有很多*.mk文件, 就是用这些文件来构建makeflie 的target 和 依赖,查看slave.mk 可以看到如下内容

image.png

[图片上传中...(image-ef84c8-1625974872774-0)]

可以看到SONIC_DPKG_DEBS,SONIC_DOCKER_IMAGES,SONIC_PYTHON_WHEELS,SONIC_MAKE_DEBS等变量这些变量便是来自rule 和 platform 目录下的*.mk 文件

所以编译的时候也可以单独指定某一个目标来编译,例如:

make target/docker-fpm-frr.gz

关于这些SONIC_DPKG_DEBS,SONIC_DOCKER_IMAGES,SONIC_PYTHON_WHEELS,SONIC_MAKE_DEBS变量的细节区别请大家参考README.buildsystem.md

你可能感兴趣的:(2021-07-11)