IBM 虚拟管理通道内核驱动 (IBMVMC)¶
- 作者:
Dave Engebretsen <engebret@us.ibm.com>, Adam Reznechek <adreznec@linux.vnet.ibm.com>, Steven Royer <seroyer@linux.vnet.ibm.com>, Bryant G. Ly <bryantly@linux.vnet.ibm.com>,
简介¶
注意:理解本文档需要虚拟化技术知识。
一个很好的参考文档是
https://openpowerfoundation.org/wp-content/uploads/2016/05/LoPAPR_DRAFT_v11_24March2016_cmt1.pdf
虚拟管理通道 (VMC) 是一种逻辑设备,它在管理程序(hypervisor)和管理分区之间提供接口。此接口类似于消息传递接口。此管理分区旨在为使用基于硬件管理控制台 (HMC) 的系统管理系统提供替代方案。
IBM 开发的主要硬件管理解决方案依赖于名为硬件管理控制台 (HMC) 的设备服务器,该服务器以外部塔式或机架式个人计算机的形式打包。在 Power Systems 环境中,单个 HMC 可以管理多个基于 POWER 处理器 的系统。
管理应用程序¶
在管理分区中,存在一个管理应用程序,系统管理员可以通过命令行界面 (CLI) 或表征状态传输应用程序 (REST API) 配置系统的分区特性。
该管理应用程序在 PowerVM 虚拟化的基于 POWER8 或更新处理器的服务器上的 Linux 逻辑分区中运行。传统上需要 HMC 的系统配置、维护和控制功能可以通过管理应用程序,结合使用 HMC 到管理程序接口和现有操作系统方法来实现。此工具提供了 HMC 所实现功能的一个子集,并支持基本的分区配置。管理应用程序组件支持的 HMC 到管理程序消息集通过 VMC 接口(定义如下)传递给管理程序。
VMC 使管理分区能够提供基本的分区功能
逻辑分区配置
独立分区的启动和停止操作
分区状态显示
虚拟以太网管理
虚拟存储管理
基本系统管理
虚拟管理通道 (VMC)¶
定义了一种称为虚拟管理通道 (VMC) 的逻辑设备,用于管理应用程序和管理程序之间的通信。它基本上创建了启用虚拟化管理软件的管道。该设备作为虚拟设备呈现给指定管理分区。
该通信设备使用命令/响应队列 (CRQ) 和远程直接内存访问 (RDMA) 接口。定义了三向握手,必须在发送/接收任何协议消息之前进行,以确保通道的管理程序和管理分区两端都在运行。
该驱动程序还利用传输事件 CRQ。当管理程序检测到其中一个对等分区异常终止,或者某一方调用 H_FREE_CRQ 关闭其 CRQ 时,会发送 CRQ 消息。为 VMC 设备引入了两类新的 CRQ 消息。VMC 管理消息用于每个使用 VMC 的分区向其伙伴通信功能。HMC 接口消息用于管理分区和管理程序之间 HMC 消息的实际流动。由于大多数 HMC 消息远远超过 CRQ 缓冲区的大小,因此在每个 HMC 接口 CRQ 消息之前都会对 HMC 消息数据进行虚拟 DMA (RMDA)。只有管理分区驱动 RDMA 操作;管理程序从不直接导致消息数据的移动。
术语¶
- RDMA
远程直接内存访问 (RDMA) 是从服务器到其客户端或从服务器到其伙伴分区的 DMA 传输。DMA 指的是物理内存 I/O 操作以及内存到内存的移动操作。
- CRQ
命令/响应队列 (CRQ) 是一种用于伙伴分区之间通信的设施。从管理程序向分区发出的传输事件也会在此队列中报告。
管理分区 VMC 驱动程序接口示例¶
本节提供了一个管理应用程序实现的示例,其中设备驱动程序用于与 VMC 设备进行接口。该驱动程序包含一个新设备,例如 /dev/ibmvmc,它提供对 VMC 设备进行打开、关闭、读取、写入和执行 ioctl 操作的接口。
VMC 接口初始化¶
设备驱动程序负责在驱动程序加载时初始化 VMC。它首先创建并初始化 CRQ。接下来,执行 VMC 功能交换,以指示管理分区和管理程序中的代码版本和可用资源数量。最后,管理程序请求管理分区创建一个初始的 VMC 缓冲区池,每个可能的 HMC 连接一个缓冲区,这些缓冲区将用于管理应用程序会话初始化。在此初始化序列完成之前,设备对 open() 调用返回 EBUSY。所有 open() 失败都返回 EIO。
Management Partition Hypervisor
CRQ INIT
---------------------------------------->
CRQ INIT COMPLETE
<----------------------------------------
CAPABILITIES
---------------------------------------->
CAPABILITIES RESPONSE
<----------------------------------------
ADD BUFFER (HMC IDX=0,1,..) _
<---------------------------------------- |
ADD BUFFER RESPONSE | - Perform # HMCs Iterations
----------------------------------------> -
VMC 接口打开¶
在基本的 VMC 通道初始化后,可以建立 HMC 会话级连接。应用程序层对 VMC 设备执行 open() 操作,并对其执行 ioctl() 操作,指示此会话的 HMC ID(32 字节数据)。如果 VMC 设备处于无效状态,ioctl() 将返回 EIO。设备驱动程序为此 HMC ID 创建新的 HMC 会话值(范围从 1 到 255)和 HMC 索引值(从索引 0 开始,范围到 254)。然后驱动程序将 HMC ID 通过 RDMA 传输到管理程序,然后向管理程序发送一个接口打开消息,以通过 VMC 建立会话。管理程序收到此信息后,它会向管理分区发送添加缓冲区消息,为新的 HMC 连接播种一个初始缓冲区池。最后,管理程序发送一个接口打开响应消息,表明它已准备好进行正常的运行时消息传递。以下图示了此 VMC 流程
Management Partition Hypervisor
RDMA HMC ID
---------------------------------------->
Interface Open
---------------------------------------->
Add Buffer _
<---------------------------------------- |
Add Buffer Response | - Perform N Iterations
----------------------------------------> -
Interface Open Response
<----------------------------------------
VMC 接口运行时¶
在正常运行时,管理应用程序和管理程序通过信号 VMC 消息和 RDMA 操作交换 HMC 消息。当向管理程序发送数据时,管理应用程序对 VMC 设备执行 write() 操作,驱动程序将数据通过 RDMA 传输到管理程序,然后发送一个信号消息。如果在管理程序使 VMC 设备缓冲区可用之前尝试执行 write(),或者当前没有可用缓冲区,write() 将返回 EBUSY。对于所有其他错误,例如无效设备状态,write() 将返回 EIO。当管理程序向管理层发送消息时,数据被放入 VMC 缓冲区,并向管理分区中的 VMC 驱动程序发送一个信号消息。驱动程序将缓冲区通过 RDMA 传输到分区,并通过对 VMC 设备的 read() 操作将数据传递给相应的管理应用程序。如果没有可读取的缓冲区,read() 请求将阻塞。管理应用程序可以使用 select() 等待 VMC 设备准备好可读取的数据。
Management Partition Hypervisor
MSG RDMA
---------------------------------------->
SIGNAL MSG
---------------------------------------->
SIGNAL MSG
<----------------------------------------
MSG RDMA
<----------------------------------------
VMC 接口关闭¶
当应用程序层对设备执行 close() 操作时,管理分区会关闭 HMC 会话级连接。此操作会使接口关闭消息流向管理程序,从而终止会话。设备驱动程序必须释放为该 HMC 连接的缓冲区分配的所有存储。
Management Partition Hypervisor
INTERFACE CLOSE
---------------------------------------->
INTERFACE CLOSE RESPONSE
<----------------------------------------
附加信息¶
有关 CRQ 消息、VMC 消息、HMC 接口缓冲区和信号消息文档的更多信息,请参阅《Linux on Power Architecture Platform Reference》文档。F 节。