Libvirt项目中的主机设备管理技术详解
概述
Libvirt作为一款强大的虚拟化管理工具,提供了对物理和虚拟主机设备的全面管理能力。本文将深入解析Libvirt如何管理USB、PCI、SCSI和网络设备等主机设备,以及如何利用这些设备提供的虚拟化功能,如SR-IOV、NPIV、MDEV和DRM等。
设备管理基础
Libvirt通过节点设备驱动(node device driver)提供了一系列管理功能:
-
设备列表与信息查看:
virsh nodedev-list
:列出所有主机设备virsh nodedev-info
:显示设备基本信息virsh nodedev-dumpxml
:以XML格式输出设备详细信息
-
虚拟设备管理:
- 持久化定义的虚拟设备(仅支持MDEV)
- 临时虚拟设备(支持MDEV和NPIV)
设备管理操作
持久化设备管理
# 定义持久化设备
virsh nodedev-define device.xml
# 取消定义
virsh nodedev-undefine device_name
# 设置自动启动
virsh nodedev-autostart device_name
# 激活设备
virsh nodedev-start device_name
# 更新设备配置
virsh nodedev-update device_name
临时设备管理
# 创建临时设备
virsh nodedev-create device.xml
# 销毁临时设备
virsh nodedev-destroy device_name
设备层次结构
主机上的设备以树状结构组织,根节点名为"computer"。当前Libvirt仅支持udev后端(HAL后端已在6.8.0版本中移除)。
设备XML格式详解
基本结构
<device>
<name>pci_0000_00_17_0</name>
<path>/sys/devices/pci0000:00/0000:00:17.0</path>
<parent>computer</parent>
<driver>
<name>ahci</name>
</driver>
<capability type='pci'>
<!-- 设备具体能力 -->
</capability>
</device>
PCI设备示例
<device>
<name>pci_0000_04_00_1</name>
<path>/sys/devices/pci0000:00/0000:00:06.0/0000:04:00.1</path>
<parent>pci_0000_00_06_0</parent>
<driver>
<name>igb</name>
</driver>
<capability type='pci'>
<domain>0</domain>
<bus>4</bus>
<slot>0</slot>
<function>1</function>
<product id='0x10c9'>82576 Gigabit Network Connection</product>
<vendor id='0x8086'>Intel Corporation</vendor>
<iommuGroup number='15'>
<address domain='0x0000' bus='0x04' slot='0x00' function='0x1'/>
</iommuGroup>
<numa node='0'/>
<pci-express>
<link validity='cap' port='1' speed='2.5' width='2'/>
<link validity='sta' speed='2.5' width='2'/>
</pci-express>
</capability>
</device>
高级功能解析
SR-IOV技术
SR-IOV(单根I/O虚拟化)允许将PCIe资源分配给多个虚拟环境使用。通过将物理功能(PF)划分为多个虚拟功能(VF)来实现资源共享。
SR-IOV设备XML示例
<capability type='pci'>
<!-- 基础PCI信息 -->
<capability type='virt_functions' maxCount='7'>
<address domain='0x0000' bus='0x04' slot='0x10' function='0x1'/>
<!-- 更多VF地址 -->
</capability>
</capability>
SR-IOV子设备示例
<capability type='phys_function'>
<address domain='0x0000' bus='0x04' slot='0x00' function='0x0'/>
</capability>
中介设备(MDEV)
MDEV(自3.2.0版本起支持)是定义在物理设备上的软件设备,允许将物理设备资源划分为多个中介设备。
MDEV设备XML示例
<device>
<name>mdev_4b20d080_1b54_4048_85b3_a6a62d165c01</name>
<path>/sys/devices/pci0000:00/0000:00:02.0/4b20d080-1b54-4048-85b3-a6a62d165c01</path>
<parent>pci_0000_06_00_0</parent>
<driver>
<name>vfio_mdev</name>
</driver>
<capability type='mdev'>
<type id='nvidia-11'/>
<uuid>4b20d080-1b54-4048-85b3-a6a62d165c01</uuid>
<iommuGroup number='12'/>
</capability>
</device>
MDEV管理操作
-
列出支持MDEV的设备:
virsh nodedev-list --cap mdev_types
-
查看特定设备的MDEV类型:
virsh nodedev-dumpxml <device>
-
创建MDEV设备前需执行的准备工作(以CCW设备为例):
device="0.0.1234" subchannel="0.0.0123" echo $device > /sys/bus/ccw/devices/$device/driver/unbind echo $subchannel > /sys/bus/css/devices/$subchannel/driver/unbind echo $subchannel > /sys/bus/css/drivers/vfio_ccw/bind
-
创建临时MDEV设备:
virsh nodedev-create mdev.xml
-
定义持久化MDEV设备:
virsh nodedev-define mdev.xml virsh nodedev-start mdev_name
VPD能力
VPD(重要产品数据)能力提供了设备名称和其他标准定义的只读字段(变更级别、制造商ID、部件号、序列号)以及供应商特定的只读字段。
VPD设备XML示例
<capability type='vpd'>
<name>BlueField-2 DPU 25GbE Dual-Port SFP56</name>
<fields access='readonly'>
<change_level>B1</change_level>
<manufacture_id>foobar</manufacture_id>
<part_number>MBF2H332A-AEEOT</part_number>
<serial_number>MT2113X00000</serial_number>
<vendor_field index='0'>PCIeGen4 x8</vendor_field>
</fields>
<fields access='readwrite'>
<asset_tag>fooasset</asset_tag>
<vendor_field index='0'>vendorfield0</vendor_field>
</fields>
</capability>
总结
Libvirt提供了强大的主机设备管理能力,从基本的设备信息查询到高级的虚拟化功能管理。通过本文的详细解析,管理员可以更好地理解如何利用Libvirt管理各种主机设备,包括PCI设备、SR-IOV功能和MDEV设备等。掌握这些知识将有助于优化虚拟化环境的性能和资源利用率。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考