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。平台适配工作,本质上就是让这两类接口在目标硬件上正确工作。

控制面与网络应用层 FRR (BGP/OSPF) Teamd (LAG) SNMP / LLDP DHCP Relay 其他容器应用 Redis 数据库(config_db / appl_db / state_db / counter_db) SWSS 层(Switch State Service) orchagent syncd portsyncd intfsyncd neighsyncd SAI(Switch Abstraction Interface)— 标准化 C API ASIC SDK 与平台驱动 libsai.so(厂商实现) ASIC SDK(如 OpenNSL) 平台驱动(风扇/电源/温度) ASIC 与平台硬件 交换芯片 CPU / 内存 风扇 / 电源 光模块 / 传感器 状态交换 适配边界

二、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为例,数据流如下:

  1. 用户执行config vlan add 100,写入config_db的VLAN|Vlan100表项。
  2. orchagent订阅到该表项变化,调用SAI创建VLAN对象。
  3. SAI返回成功后,orchagent把结果写入appl_db的VLAN_TABLE。
  4. 其他模块(如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.profilesyncd启动无报错,sai_query_attribute_capability返回支持
端口映射platform.json、port_config.inishow interface status端口数量与命名正确
平台驱动风扇、电源、温度驱动show platform fan、show platform temperature有数据
控制面联通Redis、FRR、TeamdBGP邻居建立、LAG成员UP
镜像启动ONIE安装、内核参数系统正常进入SONiC CLI,无内核panic