1. SONiC架构与平台适配全景
SONiC(Software for Open Networking in the Cloud)是微软开源、现由Linux基金会托管的网络操作系统。它最核心的设计思想是“控制面与硬件解耦”:上层网络协议栈运行在标准Linux用户态,底层ASIC通过统一的SAI接口被抽象,中间由Redis数据库承载状态,各模块以“生产者—消费者”方式松耦合协作。理解这套分层结构,是后续做平台适配与镜像构建的前提。
一、SONiC的四层架构
从下往上,SONiC可以划分为四个层次:
- ASIC与平台硬件层:交换芯片(如Broadcom Trident/Tomahawk、Marvell、Mellanox Spectrum)、CPU、内存、风扇、电源、温度传感器、光模块EEPROM等物理器件。
- SAI层(Switch Abstraction Interface):一套C语言头文件定义的标准化API,把“创建VLAN”“下发路由”“配置ACL”等操作抽象成统一函数,屏蔽不同厂商ASIC的差异。SAI由厂商提供的
libsai.so实现,是平台适配的关键边界。 - SWSS层(Switch State Service):由一组容器组成,包括
syncd、orchagent、portsyncd、intfsyncd、neighsyncd等。它们通过Redis数据库交换数据,orchagent把上层意图翻译成SAI调用,syncd负责与ASIC SDK交互。 - 控制面与网络应用层:FRR提供BGP/OSPF路由协议,Teamd负责LAG,SNMP、LLDP、DHCP Relay等以容器形式运行,通过
config_db和appl_db与SWSS通信。
这四层之间通过两类接口衔接:SAI连接SWSS与ASIC,Redis数据库连接控制面与SWSS。平台适配工作,本质上就是让这两类接口在目标硬件上正确工作。
二、SAI:平台适配的核心边界
SAI定义了交换机能力的标准集合,包括端口、VLAN、路由表、下一跳、ACL、QoS队列、隧道等对象。每个对象都有create_xxx、remove_xxx、set_xxx_attribute、get_xxx_attribute四类操作。例如创建一个VLAN成员端口,SAI调用大致是:
sai_vlan_api->create_vlan_member(&member_id, switch_id,
vlan_id, port_id, SAI_VLAN_TAGGING_MODE_TAGGED);
平台适配时,厂商需要提供符合SAI版本要求的libsai.so,并保证sai_query_attribute_capability能正确报告每个属性的支持情况。SONiC的orchagent会根据这些能力查询结果决定是否下发某条配置。如果厂商SAI实现不完整,典型现象是orchagent日志中出现SAI_STATUS_NOT_SUPPORTED,对应功能静默失效。
三、SWSS与Redis的协作机制
SWSS层不直接调用SAI,而是通过Redis解耦。以配置一个VLAN为例,数据流如下:
- 用户执行
config vlan add 100,写入config_db的VLAN|Vlan100表项。 orchagent订阅到该表项变化,调用SAI创建VLAN对象。- SAI返回成功后,
orchagent把结果写入appl_db的VLAN_TABLE。 - 其他模块(如
intfsyncd)从appl_db读取,继续处理接口IP等后续配置。
这种“配置库→编排→SAI→状态库”的链路,使得每个模块只需关注自己的输入输出,平台适配时也更容易定位问题出在哪一层。
四、镜像构建流程与平台适配的关联
SONiC镜像构建基于sonic-buildimage仓库,使用Docker容器化编译。核心流程是:
- 选择平台配置:在
device/目录下确定目标平台,如device/accton/x86_64-accton_as7326_32x-r0/,其中包含platform.json、port_config.ini、sai.profile等文件。 - 准备SAI与SDK:把厂商提供的
libsai.so、ASIC SDK、平台驱动放入对应目录,并在sai.profile中指定SAI库路径和启动参数。 - 编译:执行
make init和make configure PLATFORM=<平台名>,然后make target/sonic-broadcom.bin生成最终镜像。 - 验证:镜像启动后检查
syncd是否正常加载SAI、show interface status是否显示所有端口、redis-cli -n 4 keys "VLAN*"是否能看到配置。
platform.json中端口编号与ASIC实际端口映射不一致,即使SAI正常加载,也会出现端口错位或部分端口不可用。建议在构建前用厂商提供的端口映射表逐项核对。
五、平台适配的检查清单
综合以上结构,平台适配可以按以下顺序推进:
| 阶段 | 关键对象 | 判断依据 |
|---|---|---|
| SAI可用性 | libsai.so、sai.profile | syncd启动无报错,sai_query_attribute_capability返回支持 |
| 端口映射 | platform.json、port_config.ini | show interface status端口数量与命名正确 |
| 平台驱动 | 风扇、电源、温度驱动 | show platform fan、show platform temperature有数据 |
| 控制面联通 | Redis、FRR、Teamd | BGP邻居建立、LAG成员UP |
| 镜像启动 | ONIE安装、内核参数 | 系统正常进入SONiC CLI,无内核panic |