Rpc

SPDK 从 v 20. x 的版本开始已经切换为 json 配置文件的格式,行可执行程序时可以通过 --json 参数来传递 json 配置文件。当启动 SPDK 的应用程序时指定了 json 文件,那在 SPDK 的初始化流程中就会以 rpc 的模式来执行其中 subsystems 的初始化并执行 json 文件中指定的操作

rpc 是一种为大家所熟知在程序启动后动态灵活地执行操作的方法。其主要使用了 unix socket 来在客户端和服务端之间传递消息数据

SPDK 也集成或者实现了 rpc 的交互通道,可以支持动态的操作

服务端

SPDK 中的 rpc 服务端在函数 spdk_rpc_initialize 中完成初始化。如果没有指定用于监听的地址,那就会使用默认的监听地址/var/tmp/spdk. sock。rpc 客户端访问时使用的默认监听地址就是这个。每个需要提供 rpc 调用的模块或者功能都可以通过 SPDK_RPC_REGISTER 来注册其提供服务的函数到 g_rpc_methods 链表中。函数 jsonrpc_handler 是处理所有从客户端过来的请求的入口,其中就会从 g_rpc_methods 链表中来根据请求匹配具体的处理函数

客户端

SPDK 的 rpc 客户端提供的功能大部分是以 ./spdk/scripts/rpc. py 脚本为入口来进行调用的。该脚本会包含./spdk/python/spdk/rpc 目录下的 python 脚本,各个 rpc 功能的客户端处理,以及公共的用于和服务端进行交互的函数就定义在这些被包含的脚本中。每个模块提供的 rpc 功能中客户端的相应处理逻辑都归集在以模块名字作为名字的 python 文件中

如果想查询有哪些已经支持的 rpc 调用功能,则可以直接执行./rpc. py -h 查询

如果想要添加新的 rpc 的功能,那就需要通过 SPDK_RPC_REGISTER 注册新的功能,并在 rpc 客户端添加相应的 python 脚本逻辑

利用 Vhost-user 来进行虚拟化的 I/O

Vhost-user 协议

该协议旨在补充用于控制 Linux 内核中 vhost 实现的 ioctl 接口。它实现了与同一主机上的用户空间进程建立 virtqueue 共享所需的控制平面。它通过 Unix 域套接字通信,共享信息辅助数据中的文件描述符。

该协议定义了通信的两端,即前端和后端。前端是共享虚拟队列的应用程序,在我们的例子中就是 QEMU。后端是虚拟队列的消费者。例如,在用户空间运行的软件以太网交换机(如 Snabbswitch),或处理虚拟磁盘读写的块设备后端。

SPDK vhost 是一个 Vhost-user 后端服务器。它公开 Unix 域套接字,允许外部应用程序连接。