Libvirt项目中的主机设备管理技术详解

Libvirt项目中的主机设备管理技术详解

概述

Libvirt作为一款强大的虚拟化管理工具,提供了对物理和虚拟主机设备的全面管理能力。本文将深入解析Libvirt如何管理USB、PCI、SCSI和网络设备等主机设备,以及如何利用这些设备提供的虚拟化功能,如SR-IOV、NPIV、MDEV和DRM等。

设备管理基础

Libvirt通过节点设备驱动(node device driver)提供了一系列管理功能:

  1. 设备列表与信息查看

    • virsh nodedev-list:列出所有主机设备
    • virsh nodedev-info:显示设备基本信息
    • virsh nodedev-dumpxml:以XML格式输出设备详细信息
  2. 虚拟设备管理

    • 持久化定义的虚拟设备(仅支持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管理操作
  1. 列出支持MDEV的设备:

    virsh nodedev-list --cap mdev_types
    
  2. 查看特定设备的MDEV类型:

    virsh nodedev-dumpxml <device>
    
  3. 创建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
    
  4. 创建临时MDEV设备:

    virsh nodedev-create mdev.xml
    
  5. 定义持久化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),仅供参考

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

窦恺墩

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值