4个稳定版本

1.3.0 2024年1月9日
1.2.0 2022年8月5日
1.1.0 2021年9月10日
1.0.0 2021年7月9日

#74 in Unix API

LGPL-2.1

195KB
5K SLoC

mdevctl - Linux的介质设备管理工具

描述

mdevctl 是一个用于管理 Linux 内核介质设备框架中设备和持久化的工具。介质设备是父设备(例如,一个vGPU)的子设备,可以动态创建,并由vfio-mdev等驱动程序潜在地用于分配给虚拟机。

许可证

许可协议为GNU Lesser General Public License,即LGPL v2.1。有关详细信息,请参阅COPYING

源代码仓库

https://github.com/mdevctl/mdevctl

安装

mdevctl 使用rust的 cargo 工具构建。要构建可执行文件,请运行 cargo build。这将编译代码并生成一个Makefile,可用于将可执行文件和所有支持文件安装到您的系统中。在基于RPM的系统上,您可以使用 make rpm 然后安装生成的包。否则,运行 make install

架构

mdevctl 在 /etc/mdevctl.d/ 中存储定义的介质设备,目录与父设备名称匹配,配置文件以mdev设备的UUID命名。使用的格式是JSON;一个mdev设备的配置文件如下

  {
   "mdev_type": "$VENDOR_TYPE",
   "start": "auto|manual",
   "attrs": [
    ...optional list of device-specific attributes...
   ]
  }

当发生已知父设备的udev事件(或对于更新的内核,具有MDEV_STATE值的更改事件)时,mdevctl 由udev规则调用以创建具有 "start": "auto" 配置的已定义设备。

mdevctl 定义了三类命令,用于管理设备配置文件,管理设备本身以及列出命令以显示定义的、活动的或潜在的mdev设备。

从后者开始,mdevctl 可以管理通过 mdevctl 或外部方式(如直接与 sysfs 交互)创建的 mdev 设备。同样,通过 list 命令生成当前活动的 mdev 设备列表时,包括所有 mdev 设备。如果提供了 --defined 选项,列表命令将显示系统上定义的 mdev 设备配置,无论它们当前是否活动。types 命令提供了系统支持的 mdev 类型的详细信息,包括每个类型的实例数量,每个实例公开的 API,以及供应商提供的名称和描述(如果可用)。

可以使用 define 命令创建介质设备定义,该命令不仅接受通过选项完全指定的配置,还可以为当前运行的 mdev 创建配置。因此,通过 mdevctl 或 sysfs 创建的临时设备可以提升为定义设备。undefine 命令仅删除配置定义,而不修改正在运行的设备,而 modify 命令允许修改设备配置。对运行中的设备的配置修改将在设备停止并重新启动后才生效。

这导致了最后一类命令,它提供了 startstop 功能。start 命令可以操作之前定义的 mdev,或者可以通过选项完全指定 mdev 来创建一个临时设备,即一个没有持久性的运行设备。

用法

列出运行中的 mdev 设备

# mdevctl list
85006552-1b4b-45ef-ad62-de05be9171df 0000:00:02.0 i915-GVTg_V4_4
83c32df7-d52e-4ec1-9668-1f3c7e4df107 0000:00:02.0 i915-GVTg_V4_8 (defined)

列出定义的 mdev 设备

# mdevctl list -d
83c32df7-d52e-4ec1-9668-1f3c7e4df107 0000:00:02.0 i915-GVTg_V4_8 auto
b0a3989f-8138-4d49-b63a-59db28ec8b48 0000:00:02.0 i915-GVTg_V4_8 auto
5cf14a12-a437-4c82-a13f-70e945782d7b 0000:00:02.0 i915-GVTg_V4_4 manual

列出主机系统支持的 mdev 类型

# mdevctl types
0000:00:02.0
  i915-GVTg_V4_2
    Available instances: 1
    Device API: vfio-pci
    Description: low_gm_size: 256MB high_gm_size: 1024MB fence: 4 resolution: 1920x1200 weight: 8 
  i915-GVTg_V4_1
    Available instances: 0
    Device API: vfio-pci
    Description: low_gm_size: 512MB high_gm_size: 2048MB fence: 4 resolution: 1920x1200 weight: 16 
  i915-GVTg_V4_8
    Available instances: 4
    Device API: vfio-pci
    Description: low_gm_size: 64MB high_gm_size: 384MB fence: 4 resolution: 1024x768 weight: 2 
  i915-GVTg_V4_4
    Available instances: 3
    Device API: vfio-pci
    Description: low_gm_size: 128MB high_gm_size: 512MB fence: 4 resolution: 1920x1200 weight: 4 

将定义的设备从自动启动更改为手动

# mdevctl modify --uuid 83c32df7-d52e-4ec1-9668-1f3c7e4df107 --manual
# mdevctl list -d
83c32df7-d52e-4ec1-9668-1f3c7e4df107 0000:00:02.0 i915-GVTg_V4_8 manual
b0a3989f-8138-4d49-b63a-59db28ec8b48 0000:00:02.0 i915-GVTg_V4_8 auto
5cf14a12-a437-4c82-a13f-70e945782d7b 0000:00:02.0 i915-GVTg_V4_4 manual

停止运行中的 mdev 设备

# mdevctl stop -u 83c32df7-d52e-4ec1-9668-1f3c7e4df107

启动未定义的 mdev 设备

# uuidgen
6eba5b41-176e-40db-b93e-7f18e04e0b93
# mdevctl start -u 6eba5b41-176e-40db-b93e-7f18e04e0b93 -p 0000:00:02.0 --type i915-GVTg_V4_1
# mdevctl list
85006552-1b4b-45ef-ad62-de05be9171df 0000:00:02.0 i915-GVTg_V4_4
6eba5b41-176e-40db-b93e-7f18e04e0b93 0000:00:02.0 i915-GVTg_V4_1

将新创建的 mdev 提升为定义设备

# mdevctl define --uuid 6eba5b41-176e-40db-b93e-7f18e04e0b93
# mdevctl list -d
83c32df7-d52e-4ec1-9668-1f3c7e4df107 0000:00:02.0 i915-GVTg_V4_8 manual
6eba5b41-176e-40db-b93e-7f18e04e0b93 0000:00:02.0 i915-GVTg_V4_1 manual
b0a3989f-8138-4d49-b63a-59db28ec8b48 0000:00:02.0 i915-GVTg_V4_8 auto
5cf14a12-a437-4c82-a13f-70e945782d7b 0000:00:02.0 i915-GVTg_V4_4 manual

高级用法(属性和 JSON)

mdevctl 提供了通过设备特定属性指定额外配置的支持。它还提供了直接检查和修改配置的内部 JSON 表示的支持。

示例

# mdevctl list -d
783e6dbb-ea0e-411f-94e2-717eaad438bf matrix vfio_ap-passthrough manual

添加一些属性

# mdevctl modify -u 783e6dbb-ea0e-411f-94e2-717eaad438bf --addattr=assign_adapter --value=5
# mdevctl modify -u 783e6dbb-ea0e-411f-94e2-717eaad438bf --addattr=assign_adapter --value=6
# mdevctl modify -u 783e6dbb-ea0e-411f-94e2-717eaad438bf --addattr=assign_domain --value=0xab
# mdevctl modify -u 783e6dbb-ea0e-411f-94e2-717eaad438bf --addattr=assign_control_domain --value=0xab
# mdevctl modify -u 783e6dbb-ea0e-411f-94e2-717eaad438bf --addattr=assign_domain --value=4
# mdevctl modify -u 783e6dbb-ea0e-411f-94e2-717eaad438bf --addattr=assign_control_domain --value=4
# mdevctl list -dv
783e6dbb-ea0e-411f-94e2-717eaad438bf matrix vfio_ap-passthrough manual
  Attrs:
    @{0}: {"assign_adapter":"5"}
    @{1}: {"assign_adapter":"6"}
    @{2}: {"assign_domain":"0xab"}
    @{3}: {"assign_control_domain":"0xab"}
    @{4}: {"assign_domain":"4"}
    @{5}: {"assign_control_domain":"4"}

转储 JSON 配置

# mdevctl list -d -u 783e6dbb-ea0e-411f-94e2-717eaad438bf --dumpjson
{
  "mdev_type": "vfio_ap-passthrough",
  "start": "manual",
  "attrs": [
    {
      "assign_adapter": "5"
    },
    {
      "assign_adapter": "6"
    },
    {
      "assign_domain": "0xab"
    },
    {
      "assign_control_domain": "0xab"
    },
    {
      "assign_domain": "4"
    },
    {
      "assign_control_domain": "4"
    }
  ]
}

删除一些属性

# mdevctl modify -u 783e6dbb-ea0e-411f-94e2-717eaad438bf --delattr --index=5
# mdevctl modify -u 783e6dbb-ea0e-411f-94e2-717eaad438bf --delattr --index=4
# mdevctl list -dv
783e6dbb-ea0e-411f-94e2-717eaad438bf matrix vfio_ap-passthrough manual
  Attrs:
    @{0}: {"assign_adapter":"5"}
    @{1}: {"assign_adapter":"6"}
    @{2}: {"assign_domain":"0xab"}
    @{3}: {"assign_control_domain":"0xab"}

从文件定义 mdev 设备

# cat vfio_ap_device.json
{
  "mdev_type": "vfio_ap-passthrough",
  "start": "manual",
  "attrs": [
    {
      "assign_adapter": "5"
    },
    {
      "assign_domain": "0x47"
    },
    {
      "assign_domain": "0xff"
    }
  ]
}
# mdevctl define -p matrix --jsonfile vfio_ap_device.json
e2e73122-cc39-40ee-89eb-b0a47d334cae
# mdevctl list -dv
783e6dbb-ea0e-411f-94e2-717eaad438bf matrix vfio_ap-passthrough manual
  Attrs:
    @{0}: {"assign_adapter":"5"}
    @{1}: {"assign_adapter":"6"}
    @{2}: {"assign_domain":"0xab"}
    @{3}: {"assign_control_domain":"0xab"}
e2e73122-cc39-40ee-89eb-b0a47d334cae matrix vfio_ap-passthrough manual
  Attrs:
    @{0}: {"assign_adapter":"5"}
    @{1}: {"assign_domain":"0x47"}
    @{2}: {"assign_domain":"0xff"}

有关更多信息,请参阅 mdevctl --help 或 man 页面。

依赖关系

~7–18MB
~245K SLoC