SONIC容器和主机的通信 d-bus

Posted hello-Will

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SONIC容器和主机的通信 d-bus相关的知识,希望对你有一定的参考价值。

一直有个疑问,sonic系统中容器怎么跟主机或者其他容器里的应用去通信交互。
在sonic官网上找到一点介绍,感觉这块还是很重要的,为啥介绍的篇幅那么少。

该文档描述了用于在容器内执行的应用程序以安全地请求主机OS执行操作(“动作”)的方式(框架)。该框架的组成部分是:

d-bus详细信息链接: https://dbus.freedesktop.org/doc/dbus-specification.html

主机服务组件(在主机操作系统上执行),
translib API组件(执行的是容器)
该框架旨在供SONiC管理和遥测容器使用,但也可以扩展为其他应用程序容器。

SONiC管理框架和遥测(应用程序)容器必须能够向主机发出请求,并从主机获得对那些请求的响应。
需要访问主机的各个应用程序必须能够创建主机模块并轻松发出请求并从主机获取响应。
主机通信API应在Translib中可用,并应提供同步和异步通信方法。
应该可以配置有权访问D-Bus套接字的Linux用户帐户的身份。
应当以仅某些容器(例如SONiC Mgmt。)可以访问D-Bus插座的方式配置容器。

此功能使管理应用程序可以向主机发出请求以执行“操作”。例如 :

映像安装/升级
使用现有脚本启动重启和热重启
使用现有的show-tech脚本创建show-tech tar文件
使用现有脚本进行配置保存/重新加载
与典型的数据库操作-CRUD(创建,读取,更新,删除)相反,“操作”是一种操作,它不直接修改数据库记录,而是触发主机OS系统请求(例如SW映像安装/更新) )。建议仅为此类应用程序定义“主机服务”。

该功能扩展了SONiC管理框架,以在主机上添加D-Bus服务。该服务将在已知的终结点计算机上注册,并将服务请求到终结点计算机。应用程序模块会将“ servlet”添加到主机服务,该服务将自动注册其端点(D-Bus对象和方法)。

容器中的客户端应用程序模块(例如管理或遥测)可以使用Translib中提供的API将请求发送到主机-本质上,进行(远程)D-Bus方法调用,或者等待响应(如果请求是同步的),或接收一个通道并等待该请求在通道上返回响应(异步请求)。

下图说明了SONiC环境中D-Bus主机服务的体系结构:

注意。 Linux D-Bus实现使用Unix域套接字进行客户端到D-Bus服务的通信。所有使用D-Bus服务的容器都将绑定安装(-v / var / run / dbus:/ var / run / dbus:rw)创建D-Bus服务套接字的主机目录。这样可以确保只有所需的容器才能访问D-Bus主机服务。

D-Bus在客户端(SONiC管理容器)和服务(本机主机OS)之间提供了可靠的通信通道-所有动作均得到确认,并可以提供返回值。应当指出,确认对于诸如“映像升级”或“配置保存”之类的操作很重要。此外,D-Bus方法可以返回许多类型的值,而不仅仅是ACK。例如,它们可以返回字符串,这对于返回命令的输出很有用。

以上是关于SONIC容器和主机的通信 d-bus的主要内容,如果未能解决你的问题,请参考以下文章

Qt高级——D-Bus快速入门

IPC进程间通信 D-Bus(Desktop Bus)快速入门(以libdbus-glib库为例)

投稿 | SONiC BGP源码分析

docker同宿主机容器和不同宿主机容器之间怎么通信?

Sonic测试平台搭建--设备接入

Docker容器跨主机通信之:直接路由方式