0%

SONiC添加新的device

写在前面

SONiC项目中,有时候厂商需要添加自己新的device上去。

  1. 需要添加那些东西?
  2. 怎么编译进文件系统?
  3. SONiC启动时是如何选择对应设备的文件?

搞清楚这三个问题后,我们就可以对device进行裁剪(SONiC默认会将device目录下所有文件拷贝进文件系统)。

目录结构及添加内容

与设备硬件耦合的文件夹有两个,分别是platformdeviceplatform描述ASIC,厂商设备驱动代码以及new platform API的适配;device描述厂商设备代码,其中包括端口配置,led配置,sai配置等信息,plugins文件夹是一些外设命令适配的python代码。

1
2
3
4
5
sonic-buildimage/
platform/ # asic相关,重点关注sai以及sonic-platform.bin
broadcom/
device # 设备相关,对设备硬件特性的控制描述,如端口,led,console;以及和硬件相关的命令的底层适配接口,如填入eeprom的地址,之后使用SONiC的解析器进行解析。对于SONiC的命令体系,可以再写一篇文档
celestica/

platform中有个sonic-platform的文件夹,这里面包含了eeprom、fan、psu等外设相关的文件,与device里面的文件实际上是有重复的,这可能是SONiC的历史遗留问题,在字节项目中有讨论过后续会将外设相关的处理全部放到platform中去。

对于端口适配这些内容不熟悉,在此只做简单介绍。

编译相关

device的编译

device中的数据会打包到sonic-device-data_1.0-1_all.deb, 具体是在src/sonic-device-data/Makefile实现文件拷贝然后打包成deb

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
$(addprefix $(DEST)/, $(MAIN_TARGET)): $(DEST)/% :                                       
pushd ./src

# Remove any stale data
rm -rf ./device

# Create a new dir and copy all ONIE-platform-string-named dirs into it
mkdir ./device
cp -r -L ../../../device/*/* ./device/

# Create hwsku for virtual switch
for d in `find -L ../../../device -maxdepth 3 -mindepth 3 -type d | grep -vE "(plugins|led-code)"`; do \
cp -Lr $$d device/x86_64-kvm_x86_64-r0/ ; \
cp ./sai.vs_profile device/x86_64-kvm_x86_64-r0/$$(basename $$d)/sai.profile; \
grep -v ^# device/x86_64-kvm_x86_64-r0/$$(basename $$d)/port_config.ini | awk '{i=i+1;print "eth"i":"$$2}' > device/x86_64-kvm_x86_64-r0/$$(basename $$d)/lanemap.ini
done;

# Build the package
dpkg-buildpackage -rfakeroot -b -us -uc

src/sonic-device-data/src/Makefile中有config和media的测试

1
2
3
4
5
6
7
8
9
10
test:
# Execute Broadcom config file test
pushd ../tests/
for f in $$(find ../../../device -name "*.config.bcm"); do
./config_checker $$f
done
for f in $$(find ../../../device -name media_settings.json); do
./media_checker $$f
done
popd

使用dpkg -X target/debs/stretch/sonic-device-data_1.0-1_all.deb或者在fsroot/usr/share/sonic/device/目录下可以发现device相关的文件。这些文件与设备目录上/usr/share/sonic/device/的文件相对应。
sonic_debian_extension.sh脚本中会将其释放到根文件系统中去。

注意,在slave.mk中操作一下才能看到脚本,否则它做为中间文件,编译完成后会被自动删除。

1
2
3
4
5
6
7
8
9
-       $(if $($*_DOCKERS),
- rm sonic_debian_extension.sh,
- )
+# $(if $($*_DOCKERS),
+# rm sonic_debian_extension.sh,
+# )

chmod a+x $@
$(FOOTER)

对于porting而言,可以修改Makefile中cmd的规则,只拷贝需要的device和只进行与之对应的test。

platform的编译

slave.mk是SONiC项目真正的Makefile,所有的编译规则在里面可以找到,platform的入口在:

1
2
3
ifneq ($(CONFIGURED_PLATFORM), undefined)
include $(PLATFORM_PATH)/rules.mk
endif

我们在执行make configure PLATFORM=platform时会指定platform,从而找到对应的rules.mk。

这里面关注三个文件

1
2
3
sai.mk                          # 指定SAI版本以及下载路径
platform-modules-device.mk # 指定设备platform源文件路径,编译打包成debian
one-image.mk # 指定SONiC系统安装镜像名称

sai由ASIC厂商维护,作为设备厂商,我们直接使用即可。Makefile中通过指定url在编译时下载指定版本sai,对于此类重要的模块文件,可以将之缓存到本地,指定本地url进行使用。

对于设备厂商的platform,通过在rules.mk中增删 platform-modules-device.mk 可以实现在文件系统中添加或删除设备厂商platform的device模块

1
2
3
4
5
6
7
8
9
10
11
12
diff --git a/platform/broadcom/rules.mk b/platform/broadcom/rules.mk
index 8dd7b2c8..91e3afd3 100644
--- a/platform/broadcom/rules.mk
+++ b/platform/broadcom/rules.mk
@@ -1,7 +1,7 @@
include $(PLATFORM_PATH)/sai-modules.mk
include $(PLATFORM_PATH)/sai.mk
-include $(PLATFORM_PATH)/platform-modules-dell.mk
-include $(PLATFORM_PATH)/platform-modules-arista.mk
+#include $(PLATFORM_PATH)/platform-modules-dell.mk
+#include $(PLATFORM_PATH)/platform-modules-arista.mk
include $(PLATFORM_PATH)/platform-modules-ingrasys.mk

通过在one-image.mk中增删**_PLATFORM_MODULE可以选择将在platform-modules-device.mk中编译好的对应机型的deb包拷贝到文件系统中。

1
2
3
4
5
6
7
8
9
10
11
12
diff --git a/platform/broadcom/one-image.mk b/platform/broadcom/one-image.mk
index 8cbf7269..edc51460 100644
--- a/platform/broadcom/one-image.mk
+++ b/platform/broadcom/one-image.mk
@@ -54,8 +54,8 @@ $(SONIC_ONE_IMAGE)_LAZY_INSTALLS += $(DELL_S6000_PLATFORM_MODULE) \
$(ALPHANETWORKS_SNH60B0_640F_PLATFORM_MODULE) \
$(BRCM_XLR_GTS_PLATFORM_MODULE) \
$(DELTA_AG9032V2A_PLATFORM_MODULE) \
- $(JUNIPER_QFX5210_PLATFORM_MODULE) \
- $(CEL_SILVERSTONE_PLATFORM_MODULE)
+ #$(JUNIPER_QFX5210_PLATFORM_MODULE) \
+ #$(CEL_SILVERSTONE_PLATFORM_MODULE)

对于打包好的platform文件,会在sonic_debian_extension.sh中拷贝到文件系统中去

上面这张图片上就是裁剪过后只会拷贝cel-b3010这一款机型的platform。有兴趣的同学可以研究下是如何实现的。

在SONiC的安装镜像第一次启动时,会在rc.local中将其释放到文件系统中去.

对于platform-modules-*_amd64.deb,里面包含了device的驱动,会在systemd中添加服务完成驱动的加载。这个deb的生成规则参见platform/broadcom/sonic-platform-modules-cel/debian/,主要修改如下几个文件:

1
2
rules
control

以及添加

1
2
3
platform-modules-ivystone.init
platform-modules-ivystone.install
platform-modules-ivystone.postinst

注意编译platform-modules-*_amd64.deb的规则:

1
2
3
4
5
6
7
8
9
CEL_DX010_PLATFORM_MODULE = platform-modules-dx010_$(CEL_DX010_PLATFORM_MODULE_VERSION)_amd64.deb
$(CEL_DX010_PLATFORM_MODULE)_SRC_PATH = $(PLATFORM_PATH)/sonic-platform-modules-cel
$(CEL_DX010_PLATFORM_MODULE)_DEPENDS += $(LINUX_HEADERS) $(LINUX_HEADERS_COMMON)
$(CEL_DX010_PLATFORM_MODULE)_PLATFORM = x86_64-cel_seastone-r0
SONIC_DPKG_DEBS += $(CEL_DX010_PLATFORM_MODULE)

CEL_HALIBURTON_PLATFORM_MODULE = platform-modules-haliburton_$(CEL_HALIBURTON_PLATFORM_MODULE_VERSION)_amd64.deb
$(CEL_HALIBURTON_PLATFORM_MODULE)_PLATFORM = x86_64-cel_e1031-r0
$(eval $(call add_extra_package,$(CEL_DX010_PLATFORM_MODULE),$(CEL_HALIBURTON_PLATFORM_MODULE)))

在slave.mk中会有编译SONIC_DPKG_DEBS的命令,只有CEL_DX010_PLATFORM_MODULE是显示的添加到SONIC_DPKG_DEBS

SONiC启动简述

对于从onie下面安装SONiC,在onie下面会维护一个machine.conf文件,这里面有设备的详细信息,之后SONiC会根据这里的信息完成初始化的文件加载流程。

对于从SONiC下面直接安装SONiC,修改grub,暂不做深入研究。

对于systemd的初始化,SDK的初始化,platform/chassis的初始化,后续有需要在继续研究。