背景介绍
传统交换机上运行的都是厂商私有的系统,比如Cisco的IOS,华为的VRP等。这些系统首先是出厂固化的,用户(一般是运营商或者企业)只能基于已有的配置平面(命令行,网管SNMP,或者web)使用,不能够自己基于已有的系统开发新的功能;然后是封闭的,即你无法看到系统内部的运行机制,也就无从提高系统的安全性,只能依赖于设备商提供的版本更新,而这一般是以月来计的,或者是年;最后,不同厂商的配置平面不同(或者是专利限制,或者是实现限制),私有协议不能兼容,导致需要同时维护多套管理系统,甚至设备间互通不兼容。
对于运营商来说,可以通过集采规范来约束设备商之间实现兼容,通过第三方网管实现不同设备的统一配置;但是对于企业用户来说,没有资源和时间去搞集采,也没有资源实现兼容第三方网管。对于后一种用户来说,设备上的系统最好是开放的,可编程的,灵活定制的,而这就是开源交换机操作系统SONiC的诞生背景。
SONiC系统原理
SAI接口和容器化是SONiC的两个突出的亮点。前者使得SONiC可以兼容不同芯片的设备,且芯片驱动只需要提供接口,不需要开源,保证了芯片驱动的封闭性;后者使得SONiC可以充分利用现有的开源软件,比如redis, Quagga/FRR, GoBGP等,通过内核/redis-db来实现各个容器之间的通信,同时保证各个第三方组件的相对独立,便于对容器进行控制,也可以很快的兼容新的特性。当然,SONiC本身是完全开源的,最开始是Microsoft开源出来,但是放在Azure下维护,最近SONiC被移交给了Linux基金会管理,开源生态越来越成熟,独立性也越来越强,不再依赖于某一个厂商。
SAI接口
除了SONiC使用了SAI外,其他一些开源的白盒交换机项目也使用了SAI接口作为驱动层,用以兼容不同厂家的白盒交换机,比如FBOSS,
容器化
传统的设备操作系统是单一系统,各个协议通过多线程或者多进程交互,因此需要定义交互的协议类型,报文格式,比较常见是私有协议,或者基于Linux各种Socket的标准底层协议。这种实现要求各个协议之间数据格式是相一致的,因此也只有设备上自己开发的软件能够实现。而容器化是将各个协议使用容器的方式聚合(典型的是docker),容器之间通过操作系统的接口实现交互,因此各个容器之间是弱连接,这样便于容器之间的软重启或者动态编排,更符合软件及服务的概念。
SONiC系统应用
Microsoft
https://azure.microsoft.com/zh-cn/blog/microsoft-showcases-software-for-open-networking-in-the-cloud-sonic/
https://azure.microsoft.com/zh-cn/blog/sonic-the-networking-switch-software-that-powers-the-microsoft-global-cloud/
Alibaba https://www.sdnlab.com/25694.html
Tencent https://www.sdnlab.com/25761.html
中国电信 https://www.sdnlab.com/25765.html
中国联通 http://www.iitime.com.cn/html/10207/753337.htm
其他厂商
快手
京东 https://www.cnblogs.com/jdclouddeveloper/p/10907298.html
SONiC系统发展
一点想法