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
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
命令允许修改设备配置。对运行中的设备的配置修改将在设备停止并重新启动后才生效。
这导致了最后一类命令,它提供了 start
和 stop
功能。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