接上次发表的文章《适配TeleNOS的ko模块制作教程》中,提到需要预先准备好内核源码包,此步骤的目的是为了保证在虚拟机中制作ko模块时,依赖的内核源码是与设备运行的内核源码保持强一致,避免ko模块安装失败。
那么,这篇文章就简单介绍一下如何在编译过程中获取TeleNOS的内核源码。
首先,我们需要简单了解SONiC的编译过程,在sonic-buildimage目录下执行对应make动作,会触发对应的slave容器(bullseye、buster)依赖slave.mk文件来进行编译,而slave.mk则会根据上层的make动作走不同的流程,例如本次走内核编译的流程,会依赖sonic-buildimage/src/sonic-linux-kernel下的Makefile文件。若想要具体了解SONiC的编译过程,可以去看之前发布的一篇文章《开源NOS——SONIC编译过程介绍》。
有了以上背景知识,接下来就具体剖析具体执行流程:
首先,需要先删除旧的linux-headers-5.10.0-12-2-common_5.10.103-1_all.deb包,然后再sonic-buildimage下执行以下命令:
make KERNEL_PROCURE_METHOD=build target/debs/bullseye/linux-headers-5.10.0-12-2-common_5.10.103-1_all.deb KEEP_SLAVE_ON=yes SONIC_BUILD_JOBS=66
否则会提示该deb包已存在。
简单介绍一下其中的关键参数:
·KERNEL_PROCURE_METHOD=build,在编译时,走重新拉取内核源码,编译内核的流程
·KEEP_SLAVE_ON=yes,在编译时,停留在编译容器中
·SONIC_BUILD_JOBS=66,多线程编译,加快编译速度
一开始会先进入buster容器并停留,此时,需要执行exit就可以进入bullseye容器。或者还有另外一种方法是直接在make命令加上NOBUSTER=1 ,将会直接跳过buster容器,直接进入bullseye编译容器。
这里不就具体sonic-buildimage下的Makefile和slave.mk中的内容,直接来看sonic-buildimage/src/sonic-linux-kernel下的Makefile文件:
可以看到如果不设置KERNEL_PROCURE_METHOD=build,在编译时,直接拉取之前制作好相关deb包使用;
简单阅读60-117行,可以发现其流程:
·下载在制品库上的公用包,.dsc .debian.tar.xz .orig.tar.xz文件
·先是拉取一系列补丁修复任何可能影响后续配置生成的内容,再依赖kernel-wedge重新生成debian/rules.gen,接着为amd64_none_amd64 生成 linux 编译文件;最后,公共源码打补丁和更改公共config的配置。
综上所述,再执行make命令时,需要注释或删除以下代码:
然后等编译停留在bullseye容器下,在src/sonic-linux-kernel下能找到linux-5.10.103目录:
使用tar命令对整个目录进行压缩,就可以得到TeleNOS的内核源码压缩包了。
压缩命令如下:
tar -czvf linux-5.10.103-build_by_hou.tar.gz linux-5.10.103