1. SONIC编译架构
target类型介绍:
- deb——deb安装包
- file——文件类
- python-deb——python deb安装包
- python-wheel——python wheel安装包
- docker——docker镜像压缩包
- bin——交换机安装包
- install——编译依赖的安装包
- load—— 制作docker镜像依赖的docker镜像
2. target⽣成原理
2.1 MK文件
SONiC编译相关的MK⽂件位于rules/*.mk和platform/*/*.mk。
deb包MK⽂件内容示例:
关键变量说明:
SWSS——deb包名称
(SWSS)_SRC_PATH——源代码路径,编译时根据该变量找到源代码进⾏编译
(SWSS)_DEPENDS——编译时依赖包
(SWSS)_UNINSTALLS——编译完成,需要卸载的包
(SWSS)_RDEPENDS——运⾏时依赖包
SONIC_DPKG_DEBS——所属的target组
docker MK⽂件内容示例:
关键变量说明:
DOCKER_ORCHAGENT_STEM——docker镜像的名字定义
DOCKER_ORCHAGENT——docker镜像的⽂件名
$(DOCKER_ORCHAGENT)_DEPENDS——docker镜像的依赖
$(DOCKER_ORCHAGENT)_PATH——docker的⽂件夹路径
$(DOCKER_ORCHAGENT)_LOAD_DOCKERS——制作docker镜像时需要加载的docker镜像
$(DOCKER_ORCHAGENT)_CONTAINER_NAME—— docker容器的名字
$(DOCKER_ORCHAGENT)_RUN_OPT——docker运⾏时选项
$(DOCKER_ORCHAGENT)_BASE_IMAGE_FILES—— 把基础镜像⽂件拷⻉到定义的⽬的路径
$(DOCKER_ORCHAGENT)_FILES——docker需要的⽂件
SONIC_DOCKER_IMAGES——加⼊target组
2.2 target组
在MK⽂件中,每个MK⽂件定义的taget必须属于的target组,否则不能⽣产相应的target。也就是说,target组规定了每种target的类型、⽣成的⽅式、安装的⽅式以及最后⽣产的target所在的位置。
SONIC_COPY_DEBS:
这种类型的target 就是表⽰ 通过拷⻉的,也就是需要的 ⽂件肯定是在拉取代码的时候就已经拉取到本地了,所以要⽤时只需要拷⻉
然后在slave.mk⽂件中定义了上述target组的编译规则,在规则中执⾏了命令⽣成相应的target。⽣成的target根据所属的target组的不同⽽不同,存放的位置也不同。
以SONIC_DPKG_DEBS为例:
make规则的target为$(addprefix $(DEBS_PATH)/, $(SONIC_DPKG_DEBS)),从⽽所有的加⼊SONIC_DPKG_DEBS的deb包target编译时都使⽤该规则。
make规则中调⽤命令:
${$*_BUILD_ENV} DEB_BUILD_OPTIONS="${DEB_BUILD_OPTIONS_GENERIC} ${$*_DEB_BUILD_OPTIONS}" dpkg-buildpackage -rfakeroot -b -us -uc -j$(SONIC_C
${$*_BUILD_ENV} DEB_BUILD_OPTIONS="${DEB_BUILD_OPTIONS_GENERIC} ${$*_DEB_BUILD_OPTIONS}" dpkg-buildpackage -rfakeroot -b -us -uc -j$(SONIC_C
通过dpkg-buildpackage命令可以⽣成deb包。接着调⽤命令:
mv -f $(addprefix $($*_SRC_PATH)/../, $* $($*_DERIVED_DEBS) $($*_EXTRA_DEBS)) $(DEBS_PATH) $(LOG)
从⽽deb包保存到了相应的target⽬录。
该target还添加到SONIC_TARGET_LIST,可以make list可以查看target。
2.3 target依赖
make target时如果相应的依赖不存在或者较旧时,先⽣成依赖的target。这⾥以make installer(mellanox.bin)为例说明关于依赖的设置。
slave.mk中定义的SONIC_INSTALLERS规则如下:
platform/mellanox/one-image.mk的内容如下:
sonic-mellanox.bin添加到SONIC_INSTALLERS,当make target/mellanox.bin时,使⽤了slave.mk中定义的$(addprefix$(TARGET_PATH)/, $(SONIC_INSTALLERS))的规则。规则的依赖有下⾯的语句:
$$(addprefix $(TARGET_PATH)/,$$($$*_DOCKERS)) \
对于sonic-mellanox.bin,依赖于$(SONIC_ONE_IMAGE)_DOCKERS,在编译sonic-mellanox.bin之前⾸先译$(SONIC_ONE_IMAGE)_DOCKERS包含的target。
$(SONIC_ONE_IMAGE)_DOCKERS定义如下:
$(SONIC_ONE_IMAGE)_DOCKERS = $(SONIC_INSTALL_DOCKER_IMAGES)
添加到installer内的docker镜像都需要添加到SONIC_INSTALL_DOCKER_IMAGES。例如docker-orchagent,rules/dockerorchagent.mk如下:
DOCKER_ORCHAGENT添加到SONIC_INSTALL_DOCKER_IMAGES,这样target/mellanox.bin依赖于docker-orchagent。
rules/docker-orchagent.mk有如下语句:
SONIC_DOCKER_IMAGES += $(DOCKER_ORCHAGENT)
slave.mk中定义的SONIC_DOCKER_IMAGES规则如下:
make target/docker-orchagent使⽤$(addprefix $(TARGET_PATH)/, $(DOCKER_IMAGES))的规则。其中的⼀个依赖为$$(addprefix$$($$*.gz_DEBS_PATH)/,$$($$*.gz_DEPENDS)),对于docker-orchangent,则为$(DOCKER_ORCHAGENT)_DEPENDS。在⽂件rules/docker-orchagent.mk中,$(DOCKER_ORCHAGENT)_DEPENDS定义为:
$(DOCKER_ORCHAGENT)_DEPENDS += $(SWSS)
说明docker-orchagent依赖于SWSS,⽣成docker-orchagent.gz之前需要⽣成SWSS。
rules/swss.mk的内容如下:
添加到SONIC_DPKG_DEBS,make target/debs/buster/swss_1.0.0_amd64.deb使⽤SONIC_DPKG_DEBS的规则。
slave.mk中定义的规则SONIC_DPKG_DEBS如下:
该规则的其中⼀个依赖为:
$$(addprefix $(DEBS_PATH)/,$$($$*_DEPENDS))
对于SWSS,$(SWSS)_DEPENDS定义为:
从中看出,SWSS的编译依赖于LIBSAIREDIS_DEV、LIBSAIMETADATA_DEV、LIBTEAM_DEV、LIBTEAMDCTL、LIBTEAM_UTILS、LIBSWSSCOMMON_DEV、LIBSAIVS、LIBSAIVS_DEV。
以上例⼦的依赖关系图如下:
3. 编译⽂件的修改
以功能组件的makefile⽣成是automake为例。
action/动作 | 文件修改 | 文件添加 | 举例 |
添加文件 | 所属进程的源码的⽂件夹下 Makefile.am增加添加的⽂件名字 |
无 | |
添加进程 | 所属deb包的源代码⽂件夹⽬录下的Makefile.am的SUBDIRS增加进程源码的⽬录; 所属deb包的⽂件夹下的configure.ac的的 AC_CONFIG_FILES增加进程源码 的Makefile; 在deb包所属的docker的supervi sovisord.conf⽂件,按照格式增加program,supervisor可以 管理该进程。 如果为关键进程,在deb包所属的docker的 critical_processes⽂件按照格式设置该进程为关键进程。 |
进程源码的⽂件下增加 Makefile.am⽂件,按照要求定 义makefile变量; |
(1)⽐如说在 src/sonic-swss⽬录项下想在 cfgmgr⽬录下增加新 的siwtchmgrd 进程。因为cfgmgr⽬录本⾝就存在了,也就是sonicswss/configure.ac 已经有cfgmgr的makefile了,所以就不需要修改configure.ac了。只需要修改cfgmgr⽬录下的makefile⽂件。然后因为swss对应的deb包是属于docker-orchagent的,所以就修改 dockers/docker-orchagent⽬录下的sovisord.conf。 注意docker下的critical_processes⾥⾯设置了关键进程。在这个列表中的进程如果挂起了且进程所在容器⼜是⽀持⾃动重启的,那么就会restart容器。(2)如果是要增加⼀个类似portsyncd这样单独⽂件夹的进程,那么就需要修改 sonic-swss/configure.ac ,然后还要写相应的makefile⽂件,后⾯步骤与(1)相同。 |
添加deb包 | 在所属的docker的docker mk⽂件中增加依赖; 在所属的docker的docker⽬录下的supervisord.conf,按照格式增加该deb包下的所有进程; 如果deb包包含的进程有关键进程,在在所属的docker的docker ⽬录下的critical_processes⽂件按照格式设置进程为关键进程。 |
在src⽬录下增加deb包源码的⽂ 件夹; 在源码的顶层⽬录下添 加automake需要的configure.ac 和Makefile.am⽂件; 在每个进 程的⽬录下增加Makefile.am⽂ 件; 在源码的顶层⽬录下增加 debian⽂件夹,增加⽣成deb包 相关的⽂件; 在rules⽬录下增 加MK⽂件; |
添加deb包的可以类似于在src/ ⽬录下增加类似sonic-swss的⽬录。然后注意要在 deb所在的容器docker.mk⽂件中增加deb的编译依赖。 |
添加docker | 无 | 在docker⽬录下增加docker的 ⽬录,在⽬录下增加docker需要 的⽂件,⽐如dockerfile模板、 supervisor配置⽂件,脚本等; 在files/build_templates增加 service模板⽂件,帮助docker ⽣成service⽂件,这样就可以 开机拉起docker 容器; 在rules ⽬录下增加mk⽂件和dep⽂件, 定义相关变量,添加该docker依 赖的deb包,添加到installer 等。 |