美文网首页
2021-07-11

2021-07-11

作者: spyder_men | 来源:发表于2021-07-11 11:41 被阅读0次

    <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 脚本实现断点续编译和挂代理编译

    修改内容如下:

    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 文件

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

    <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

    相关文章

      网友评论

          本文标题:2021-07-11

          本文链接:https://www.haomeiwen.com/subject/etjkpltx.html