Red Hat Training

A Red Hat training course is available for RHEL 8

第 10 章 管理虚拟设备

管理虚拟机功能、特性和性能的最有效的方法之一是调整其虚拟设备

以下小节介绍了虚拟设备的一般信息,以及如何从虚拟机中 附加修改删除它们的说明。

10.1. 虚拟设备的工作原理

基础知识

与物理机器一样,虚拟机(VM)需要特殊的设备来为系统提供功能,如处理电源、内存、存储、网络或者图形。物理系统通常将硬件设备用于这些目的。但是,因为虚拟机作为软件的实现,需要使用那些设备的软件抽象,而是称为 虚拟设备

附加到虚拟机的虚拟设备可在创建虚拟机时配置,也可以在现有虚拟机上管理。通常,只有在关闭虚拟机时才可以从虚拟机附加或者分离虚拟设备,但虚拟机运行时可以添加或删除一些设备。这个功能被称为设备热插(hot plug)热拔(hot unplug)

在创建新虚拟机时, libvirt 会自动创建并配置一组默认的基本虚拟设备,除非用户另有指定。它们基于主机系统架构和机器类型,通常包括:

  • CPU
  • 内存
  • 键盘
  • 网络接口控制器(NIC)
  • 各种设备控制器
  • 一个视频卡
  • 一个声卡

要在创建虚拟机后管理虚拟设备,请使用命令行界面(CLI)。但是,要管理 虚拟存储设备NIC, 您也可以使用 RHEL 8 web 控制台。

性能或灵活性

对于某些类型的设备,RHEL 8 支持多种实现,通常通过性能和灵活性来换取。

例如:用于虚拟磁盘的物理存储可由各种格式的文件(如 qcow2raw )表示,并使用各种控制器提供给虚拟机:

  • 模拟控制器
  • virtio-scsi
  • virtio-blk

模拟控制器比 virtio 控制器慢,因为 virtio 设备是为虚拟化目的特别设计的。另一方面,模拟控制器可以运行没有用于 virtio 设备的驱动程序的操作系统。同样, virtio-scsi 提供了对 SCSI 命令的完整支持,从而可以为虚拟机附加大量磁盘。最后,virtio-blk 提供了比 virtio-scsi 和模拟控制器都更好的性能,但用例的范围会比较有限。例如:在使用 virtio-blk 时无法将物理磁盘作为 LUN 设备附加到虚拟机。

有关虚拟设备类型的详情,请参考 第 10.5 节 “虚拟设备类型”

其它资源

10.2. 将设备附加到虚拟机

以下提供了有关使用命令行界面(CLI)创建和将虚拟设备附加到虚拟机(VM)的一般信息。还可使用 RHEL 8 web 控制台将一些设备附加到虚拟机。

先决条件

  • 获取您要附加到虚拟机的设备所需的选项。要查看特定设备的可用选项,请使用 virt-xml --device=? 命令。例如:

    # virt-xml --network=?
    --network options:
    [...]
    address.unit
    boot_order
    clearxml
    driver_name
    [...]

流程

  1. 要将设备附加到虚拟机。请使用 virt-xml --add-device 命令,包括设备的定义和所需选项:

    • 例如,以下命令在 /var/lib/libvirt/images/ 目录中创建一个 20GB newdisk qcow 2 磁盘镜像,并将其作为虚拟磁盘附加到在 虚拟机 下次启动时正在运行的 testguest 虚拟机:

      # virt-xml testguest --add-device --disk /var/lib/libvirt/images/newdisk.qcow2,format=qcow2,size=20
      Domain 'testguest' defined successfully.
      Changes will take effect after the domain is fully powered off.
    • 在虚拟机运行时,下面的命令会将一个 USB 盘(在主机的 002 总线中作为设备 004)附加到 testguest2 虚拟机:

      # virt-xml testguest2 --add-device --update --hostdev 002.004
      Device hotplug successful.
      Domain 'testguest2' defined successfully.

      用于定义 USB 的 bus-device 组合可以使用 lsusb 命令获得。

验证

要验证是否已添加该设备,请执行以下任一操作:

  • 使用 virsh dumpxml 命令,查看设备 XML 定义是否已添加到 VM XML 配置的 <devices> 部分。

    例如,以下输出显示 testguest 虚拟机的配置 , 并确认添加了 002.004 USB 闪存磁盘设备。

    # virsh dumpxml testguest
    [...]
    <hostdev mode='subsystem' type='usb' managed='yes'>
      <source>
        <vendor id='0x4146'/>
        <product id='0x902e'/>
        <address bus='2' device='4'/>
      </source>
      <alias name='hostdev0'/>
      <address type='usb' bus='0' port='3'/>
    </hostdev>
    [...]
  • 运行虚拟机并测试该设备是否存在并正常工作。

其它资源

  • 有关使用 virt-xml 命令的详情请参考 man virt-xml

10.3. 修改附加到虚拟机的设备

以下流程提供了使用命令行界面(CLI)修改虚拟设备的一般说明。也可以 使用 RHEL 8 web 控制台 修改附加到虚拟机的一些设备,如磁盘和 NIC。

先决条件

  • 获取您要附加到虚拟机的设备所需的选项。要查看特定设备的可用选项,请使用 virt-xml --device=? 命令。例如:
# virt-xml --network=?
--network options:
[...]
address.unit
boot_order
clearxml
driver_name
[...]
  • 可选: 使用 virsh dumpxml vm-name 将输出发送到文件来备份虚拟机的 XML 配置。例如,以下内容将 Motoko 虚拟机的配置备份为 motoko.xml 文件:
# virsh dumpxml Motoko > motoko.xml
# cat motoko.xml
<domain type='kvm' xmlns:qemu='http://libvirt.org/schemas/domain/qemu/1.0'>
  <name>Motoko</name>
  <uuid>ede29304-fe0c-4ca4-abcd-d246481acd18</uuid>
  [...]
</domain>

流程

  1. 使用 virt-xml --edit 命令,包括设备定义和所需选项:

    例如,以下可清除关闭的 testguest 虚拟机的 <cpu> 配置,并将其设置为 host-model

    # virt-xml testguest --edit --cpu host-model,clearxml=yes
    Domain 'testguest' defined successfully.

验证

要校验设备已被修改,请执行以下任一操作:

  • 运行虚拟机并测试该设备是否存在并反映了所做的修改。
  • 使用 virsh dumpxml 命令并查看是否在虚拟机 XML 配置中修改了设备的 XML 定义。

    例如,以下输出显示了 testguest 虚拟机的 配置,并确认 CPU 模式已被配置为 host-model

    # virsh dumpxml testguest
    [...]
    <cpu mode='host-model' check='partial'>
      <model fallback='allow'/>
    </cpu>
    [...]

故障排除

  • 如果修改设备会导致虚拟机变得不可引导,使用 virsh define 实用程序通过重新载入之前备份的 XML 配置文件来恢复 XML 配置。

    # virsh define testguest.xml
注意

要对虚拟机 XML 配置进行小更改,您可以使用 virsh edit 命令 - 例如 virsh edit testguest。但是,不要使用这个方法进行更广泛的更改,因为可能会以阻止虚拟机引导的方式破坏配置。

其它资源

  • 有关使用 virt-xml 命令的详情,请使用 man virt-xml

10.4. 从虚拟机中删除设备

以下提供了有关使用命令行界面(CLI)从虚拟机(VM)中删除虚拟设备的一般信息。还可 使用 RHEL 8 web 控制台从虚拟机中删除一些设备,如磁盘或 NIC。

先决条件

  • 可选: 使用 virsh dumpxml vm-name 将输出发送到文件来备份虚拟机的 XML 配置。例如,以下内容将 Motoko 虚拟机的配置备份为 motoko.xml 文件:
# virsh dumpxml Motoko > motoko.xml
# cat motoko.xml
<domain type='kvm' xmlns:qemu='http://libvirt.org/schemas/domain/qemu/1.0'>
  <name>Motoko</name>
  <uuid>ede29304-fe0c-4ca4-abcd-d246481acd18</uuid>
  [...]
</domain>

流程

  1. 使用 virt-xml --remove-device 命令,包括设备的定义。例如:

    • 以下会在运行的 testguest 虚拟机关闭后,从其中删除标记为 vdb 的存储设备:

      # virt-xml testguest --remove-device --disk target=vdb
      Domain 'testguest' defined successfully.
      Changes will take effect after the domain is fully powered off.
    • 以下命令会立即从运行的 testguest2 虚拟机中删除 USB 闪存驱动器设备:

      # virt-xml testguest2 --remove-device --update --hostdev type=usb
      Device hotunplug successful.
      Domain 'testguest2' defined successfully.

故障排除

  • 如果删除设备导致您的虚拟机无法引导,使用 virsh define 工具通过重新载入之前备份的 XML 配置文件来恢复 XML 配置。

    # virsh define testguest.xml

其它资源

  • 有关使用 virt-xml 命令的详情,请使用 man virt-xml

10.5. 虚拟设备类型

RHEL 8 中的虚拟化可显示可附加到虚拟机的几种不同类型的虚拟设备:

模拟设备

模拟设备是广泛使用的物理设备的软件实现。为物理设备设计的驱动程序还与模拟设备兼容。因此可非常灵活地使用模拟设备。

然而,由于它们需要完全模拟某种特定类型的硬件,与对应的物理设备或者更优化的虚拟设备相比,模拟设备性能可能会显著降低。

支持以下模拟设备类型:

  • 虚拟 CPU(vCPU),具有大量选择的 CPU 型号。模拟的性能影响主要取决于主机 CPU 和模拟 vCPU 的不同。
  • 模拟系统组件,如 PCI 总线控制器
  • 模拟存储控制器,如 SATA、SCSI 甚至 IDE
  • 模拟声音设备,比如 ICH9、ICH6 或 AC97
  • 模拟图形卡,如 VGA 或 QXL 卡
  • 模拟网络设备,如 rtl8139
半虚拟设备

半虚拟(Paravirtualization)提供了向虚拟机公开虚拟设备的速度。半虚拟设备公开专用于虚拟机使用的接口,因此可显著提高设备的性能。RHEL 8 为虚拟机提供半虚拟设备,使用 virtio API 作为管理程序和虚拟机之间的层。这个方法的缺陷在于它需要在客户端操作系统中使用特定的设备驱动程序。

建议您尽可能为虚拟机使用半虚拟设备而不是模拟设备,特别是当它们运行大量 I/O 的应用程序时。半虚拟设备减少 I/O 延迟并增加 I/O 吞吐量,在某些情况下可使其非常接近裸机性能。其它半虚拟设备还会在不能使用的虚拟机中添加功能。

支持以下半虚拟设备类型:

  • 参数网络设备(virtio-net)。
  • 半虚拟化存储控制器:

    • virtio-blk - 提供块设备模拟。
    • virtio-scsi - 提供更加完整的 SCSI 模拟。
  • 半虚拟时钟。
  • 双虚拟化串行设备(virtio-serial)。
  • balloon 设备(virtio-balloon),用于与虚拟机监控程序共享有关客户机内存用量的信息。

    但请注意, balloon 设备还需要安装 balloon 服务。

  • 参数化随机数生成器(virtio-rng)。
  • 参数图形卡(QXL)。
物理共享设备

某些硬件平台可让虚拟机直接访问各种硬件设备和组件。这个过程被称为设备分配或者透传(passthrough)

以这种方式附加时,虚拟机可直接使用物理设备的一些方面,因为它们会提供给物理机器。这为虚拟机中使用的设备提供了出众的性能。但是,物理附加到虚拟机的设备在主机不可用,也无法迁移。

另外,有些设备可以在多个虚拟机间 共享。例如,一个物理设备在某些情况下可以提供多个介质设备,然后将其分配给不同的虚拟机。

支持以下 passthrough 设备类型:

  • 虚拟功能 I/O(VFIO)设备分配 - 使用硬件强制 DMA 和中断隔离安全地向应用程序或虚拟机公开设备。
  • USB、PCI 和 SCSI passthrough - 直接向虚拟机提供通用的行业标准总线,以便其特定功能可供客户机软件使用。
  • single-root I/O 虚拟化(SR-IOV)- 启用 PCI Express 资源的硬件强制隔离的规格。这样可安全有效地将单个物理 PCI 资源分区到虚拟 PCI 功能中。它通常用于网络接口卡(NIC)。
  • N_Port ID virtualization(NPIV)- 与多个虚拟端口共享单一物理主机总线适配器(HBA)的光纤通道技术。
  • GPU 和 vGPU - 针对特定图形或计算工作负载的加速器。有些 GPU 可以直接附加到虚拟机,而某些类型也可以创建共享基础物理硬件的虚拟 GPU(vGPU)。

10.6. 管理虚拟 USB 设备

使用虚拟机(VM)时,您可以访问和控制附加到主机系统的 USB 设备,如闪存驱动器或 Web 相机。在这种情况下,主机系统会将设备的控制权传递给虚拟机。这也被称为 USB-passthrough。

以下部分提供有关使用命令行的信息:

10.6.1. 将 USB 设备附加到虚拟机

要将 USB 设备附加到虚拟机,您可以在虚拟机 XML 配置文件中包含 USB 设备信息。

先决条件

  • 确定您要传递给虚拟机的设备已附加到主机。

流程

  1. 找到您要附加到虚拟机的 USB 总线和设备值。

    例如:以下命令显示附加到该主机的 USB 设备列表。在这个示例中,使用的设备作为设备 005 总线附加到总线 001 中。

    # lsusb
    [...]
    Bus 001 Device 003: ID 2567:0a2b Intel Corp.
    Bus 001 Device 005: ID 0407:6252 Kingston River 2.0
    [...]
  2. 使用 virt-xml 实用程序以及 --add-device 参数。

    例如,以下命令将 USB 闪存驱动器附加到 Library 虚拟机。

    # virt-xml Library --add-device --hostdev 001.005
    Domain 'Library' defined successfully.
注意

要将 USB 设备附加到正在运行的虚拟机中,请在上一个命令中添加 --update 参数。

验证步骤

  • 运行虚拟机并测试该设备是否存在并正常工作。
  • 使用 virsh dumpxml 命令查看设备的 XML 定义是否已添加到虚拟机 XML 配置文件的<devices> 项中。

    # virsh dumpxml Library
    [...]
    <hostdev mode='subsystem' type='usb' managed='yes'>
      <source>
        <vendor id='0x0407'/>
        <product id='0x6252'/>
        <address bus='1' device='5'/>
      </source>
      <alias name='hostdev0'/>
      <address type='usb' bus='0' port='3'/>
    </hostdev>
    [...]

其它资源

  • 有关其它参数,请查看 virt-xml(1)man page。

10.6.2. 从虚拟机中删除 USB 设备

要从虚拟机中删除 USB 设备,您可以从虚拟机 XML 配置中删除 USB 设备信息。

流程

  1. 找到您要从虚拟机中删除的 USB 的 bus 和 device 值。

    例如:以下命令显示附加到该主机的 USB 设备列表。在这个示例中,使用的设备作为设备 005 总线附加到总线 001 中。

    # lsusb
    [...]
    Bus 001 Device 003: ID 2567:0a2b Intel Corp.
    Bus 001 Device 005: ID 0407:6252 Kingston River 2.0
    [...]
  2. 使用 virt-xml 实用程序以及 --remove-device 参数。

    例如,以下命令从 Library 虚拟机中删除作为设备 005 附加到主机总线 001 的 USB 闪存驱动器。

    # virt-xml Library --remove-device --hostdev 001.005
    Domain 'Library' defined successfully.
注意

要从正在运行的虚拟机中删除 USB 设备,请在上一个命令中添加 --update 参数。

验证步骤

  • 运行虚拟机并检查该设备是否已从设备列表中删除。

其它资源

  • 有关其它参数,请查看 virt-xml(1)man page。

10.6.3. 其它资源

10.7. 管理虚拟光驱

当使用虚拟机时,您可以访问保存在主机中 ISO 镜像中的信息。要做到这一点,请将 ISO 镜像作为虚拟光驱附加到虚拟机,比如 CD 驱动器或者 DVD 驱动器。

以下部分提供有关使用命令行的信息:

10.7.1. 为虚拟机附加光驱

要将 ISO 镜像作为虚拟光驱附加,请编辑虚拟机的 XML 配置文件并添加新驱动器。

先决条件

  • 您必须将 ISO 镜像保存在本地主机中。
  • 您必须知道 ISO 镜像的路径。

流程

  • 使用 --add-device 参数的virt-xml 工具程序。

    例如,以下命令将存储在 /MC/tank/ 目录中的 Doc10 ISO 镜像附加到 DN1 虚拟机。

    # virt-xml DN1 --add-device --disk /MC/tank/Doc10.iso,device=cdrom
    Domain 'DN1' defined successfully.

验证步骤

  • 运行虚拟机并测试该设备是否存在并正常工作。

其它资源

  • 有关其它参数,请查看 virt-xml(1)man page。

10.7.2. 使用虚拟光驱替换 ISO 镜像

要替换作为虚拟光驱附加到虚拟机(VM)的 ISO 镜像,编辑虚拟机的 XML 配置文件并指定替换。

先决条件

  • 您必须将 ISO 镜像保存在本地主机中。
  • 您必须知道 ISO 镜像的路径。

流程

  1. 定位 CD-ROM 附加到虚拟机的目标设备。您可以在虚拟机 XML 配置文件中找到这些信息。

    例如:以下命令显示 DN1 虚拟机的 XML 配置文件,其中 CD-ROM 的目标设备为 sda

    # virsh dumpxml DN1
    ...
    <disk>
      ...
      <source file='/MC/tank/Doc10.iso'/>
      <target dev='sda' bus='sata'/>
      ...
    </disk>
    ...
  2. 使用带有 --edit 参数的 virt-xml 工具程序。

    例如,以下命令会替换 Doc10 ISO 镜像,在目标 sda 中附加到 DN1 虚拟机的,,使用存储在 /Dvrs/current/ 目录中的 DrDN ISO 镜像。

    # virt-xml DN1 --edit target=sda --disk /Dvrs/current/DrDN.iso
    Domain 'DN1' defined successfully.

验证步骤

  • 运行虚拟机并测试是否替换该设备并正常工作。

其它资源

  • 有关其它参数,请查看 virt-xml(1)man page。

10.7.3. 从虚拟光驱中删除 ISO 镜像

要从附加到虚拟机(VM)的虚拟光驱中删除 ISO 镜像,请编辑虚拟机的 XML 配置文件。

流程

  1. 定位 CD-ROM 附加到虚拟机的目标设备。您可以在虚拟机 XML 配置文件中找到这些信息。

    例如:以下命令显示 DN1 虚拟机的 XML 配置文件,其中 CD-ROM 的目标设备为 sda

    # virsh dumpxml DN1
    ...
    <disk>
      ...
      <source file='/Dvrs/current/DrDN'/>
      <target dev='sda' bus='sata'/>
      ...
    </disk>
    ...
  2. 使用带有 --edit 参数的 virt-xml 工具程序。

    例如,以下命令可从附加到 DN1 虚拟机的 CD 驱动器中删除 DrDN ISO 镜像。

    # virt-xml DN1 --edit target=sda --disk path=
    Domain 'DN1' defined successfully.

验证步骤

  • 运行虚拟机,检查镜像已不再可用。

其它资源

  • 有关其它参数,请查看 virt-xml(1)man page。

10.7.4. 从虚拟机中删除光驱

要删除附加到虚拟机的光驱,编辑虚拟机的 XML 配置文件。

流程

  1. 定位 CD-ROM 附加到虚拟机的目标设备。您可以在虚拟机 XML 配置文件中找到这些信息。

    例如:以下命令显示 DN1 虚拟机的 XML 配置文件,其中 CD-ROM 的目标设备为 sda

    # virsh dumpxml DN1
    ...
    <disk type='file' device='cdrom'>
      <driver name='qemu' type='raw'/>
      <target dev='sda' bus='sata'/>
      ...
    </disk>
    ...
  2. 使用带有 --remove-device 参数的 virt-xml 工具程序。

    例如,以下命令从 DN1 虚拟机中删除作为目标 sda 的光驱。

    # virt-xml DN1 --remove-device --disk target=sda
    Domain 'DN1' defined successfully.

验证步骤

  • 确认该设备不再列在虚拟机 XML 配置文件中。

其它资源

  • 有关其它参数,请查看 virt-xml(1)man page。

10.7.5. 其它资源

10.8. 管理 SR-IOV 设备

模拟虚拟设备通常使用比硬件网络设备更多的 CPU 和内存。这可能会限制虚拟机的性能。但是,如果虚拟化主机中的任何设备支持单根 I/O 虚拟化(SR-IOV),您可以使用此功能提高设备性能,并可能提高虚拟机的整体性能。

10.8.1. 什么是 SR-IOV?

single-root I/O 虚拟化(SR-IOV)是一个规格,它允许一个 PCI Express(PCIe)设备在主机系统上提供多个独立的 PCI 设备,称为 虚拟功能 (VF)。这样的每个设备:

  • 提供与原始 PCI 设备相同的或类似的服务。
  • 出现在主机 PCI 总线的不同地址上。
  • 可使用 VFIO 分配功能分配到不同的虚拟机。

例如,单个具有 SR-IOV 的网络设备可以向多个虚拟机显示 VF。虽然所有 VF 都使用相同的物理卡、相同的网络连接和相同的网络电缆,但每个虚拟机直接控制自己的硬件网络设备,且不使用主机的额外资源。

SR-IOV 的工作原理

SR-IOV 功能可能会因为引进了以下 PCI 功能:

  • 物理功能(PF) - 为主机提供设备功能(如联网)的 PCIe 功能,但也可以创建和管理一组 VF。每个具有 SR-IOV 功能的设备都有一个或多个 PF。
  • 虚拟功能(VF) - 作为独立设备的 Lightweight PCIe 功能。每个 VF 都是从 PF 中派生的。一个设备可依赖于设备硬件的最大 VF 数。每个 VF 每次只能分配给一个虚拟机,但虚拟机可以分配多个 VF。

VM 将 VF 识别为虚拟设备。例如,由 SR-IOV 网络设备创建的 VF 将以分配给它的虚拟机的网卡的形式出现,方式与在主机系统中出现物理网卡相同。

图 10.1. SR-IOV 架构

Virt SR IOV

优点

使用 SR-IOV VF 而不是模拟设备的主要优点是:

  • 提高的性能
  • 减少主机 CPU 和内存资源使用量

例如,以 vNIC 附加到虚拟机的 VF 与物理 NIC 几乎相同,并且比半虚拟化或模拟 NIC 要好。特别是,当同时在单一主机上使用多个 VF 时,性能优势会很大。

缺点

  • 要修改 PF 的配置,您必须首先将 PF 公开的 VF 数量改为零。因此,您还需要从为其分配的虚拟机中删除这些 VF 提供的设备。
  • 附加了 VFIO 分配设备的虚拟机(包括 SR-IOV VF)无法迁移到另一台主机。在某些情况下,您可以通过将分配的设备与模拟设备配对来临时工作。例如,您可以将分配的网络 VF 绑定 到模拟的 vNIC,并在迁移前删除 VF。
  • 另外,VFIO 分配的设备需要固定 VM 内存,这会增加虚拟机的内存消耗,并防止在虚拟机上使用内存块。

其它资源

10.8.2. 将 SR-IOV 网络设备附加到虚拟机

要将 SR-IOV 网络设备附加到 Intel 或 AMD 主机上的虚拟机(VM),您必须从主机上的 SR-IOV 功能网络接口创建一个虚拟功能(VF),并将 VF 分配为指定的虚拟机。详情请查看以下步骤。

先决条件

  • CPU 和您的主机固件支持 I/O 内存管理单元(IOMMU)。

    • 如果使用 Intel CPU,它必须支持 Intel Virtualization Technology for Directed I/O(VT-d)。
    • 如果使用 AMD CPU,则必须支持 AMD-Vi 功能。
  • 主机系统使用 Access Control Service(ACS)来为 PCIe 拓扑提供直接内存访问(DMA)隔离。使用系统厂商验证它。

    如需更多信息,请参阅实施 SR-IOV 的硬件注意事项

  • 物理网络设备支持 SR-IOV。要验证系统中是否有网络设备支持 SR-IOV,请使用 lspci -v 命令并在输出中查找 Single Root I/O Virtualization (SR-IOV)

    # lspci -v
    [...]
    02:00.0 Ethernet controller: Intel Corporation 82576 Gigabit Network Connection (rev 01)
    	Subsystem: Intel Corporation Gigabit ET Dual Port Server Adapter
    	Flags: bus master, fast devsel, latency 0, IRQ 16, NUMA node 0
    	Memory at fcba0000 (32-bit, non-prefetchable) [size=128K]
    [...]
    	Capabilities: [150] Alternative Routing-ID Interpretation (ARI)
    	Capabilities: [160] Single Root I/O Virtualization (SR-IOV)
    	Kernel driver in use: igb
    	Kernel modules: igb
    [...]
  • 用于创建 VF 的主机网络接口正在运行。例如:要激活 eth1 接口并验证它正在运行:

    # ip link set eth1 up
    # ip link show eth1
    8: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP mode DEFAULT qlen 1000
       link/ether a0:36:9f:8f:3f:b8 brd ff:ff:ff:ff:ff:ff
       vf 0 MAC 00:00:00:00:00:00, spoof checking on, link-state auto
       vf 1 MAC 00:00:00:00:00:00, spoof checking on, link-state auto
       vf 2 MAC 00:00:00:00:00:00, spoof checking on, link-state auto
       vf 3 MAC 00:00:00:00:00:00, spoof checking on, link-state auto
  • 要使 SR-IOV 设备分配正常工作,必须在主机 BIOS 和内核中启用 IOMMU 功能。要做到这一点:

    • 在 Intel 主机上启用 VT-d:

      • 如果您的 Intel 主机使用多个引导条目:

        1. 编辑 /etc/default/grub 文件并在 GRUB_CMDLINE_LINUX 行末尾添加 intel_iommu=oniommu=pt 参数:

          GRUB_CMDLINE_LINUX="crashkernel=auto resume=/dev/mapper/rhel_dell-per730-27-swap rd.lvm.lv=rhel_dell-per730-27/root rd.lvm.lv=rhel_dell-per730-27/swap console=ttyS0,115200n81 intel_iommu=on iommu=pt"
        2. 重新生成 GRUB 配置:

          # grub2-mkconfig -o /boot/grub2/grub.cfg
        3. 重启主机。
      • 如果您的 Intel 主机使用单个引导条目:

        1. 使用 intel_iommu=on 参数重新生成 GRUB 配置:

          # grubby --args="intel_iommu=on" --update-kernel DEFAULT
        2. 重启主机。
    • 在 AMD 主机上启用 AMD-Vi:

      • 如果您的 AMD 主机使用多个引导条目:

        1. 编辑 /etc/default/grub 文件并在 GRUB_CMDLINE_LINUX 行末尾添加 iommu=ptamd_iommu=on 参数:

          GRUB_CMDLINE_LINUX="crashkernel=auto resume=/dev/mapper/rhel_dell-per730-27-swap rd.lvm.lv=rhel_dell-per730-27/root rd.lvm.lv=rhel_dell-per730-27/swap console=ttyS0,115200n81 iommu=pt amd_iommu=on"
        2. 重新生成 GRUB 配置:

          # grub2-mkconfig -o /boot/grub2/grub.cfg
        3. 重启主机。
      • 如果您的 AMD 主机使用单个引导条目:

        1. 使用 iommu=pt 参数重新生成 GRUB 配置:

          # grubby --args="iommu=pt" --update-kernel DEFAULT
        2. 重启主机。

流程

  1. 可选: 确认您的网络设备可使用的最大 VF 数。要做到这一点,请使用以下命令,将 eth1 替换为您的 SR-IOV 兼容网络设备。

    # cat /sys/class/net/eth1/device/sriov_totalvfs
    7
  2. 使用以下命令来创建虚拟功能(VF):

    # echo VF-number > /sys/class/net/network-interface/device/sriov_numvfs

    在命令中,替换:

    • 使用您要在其上创建 PF 的 VF 数替换 VF-number
    • 使用 VF 要创建的网络接口的名称替换 network-interface

    以下示例从 eth1 网络接口创建 2 个 VF:

    # echo 2 > /sys/class/net/eth1/device/sriov_numvfs
  3. 确定已添加了 VF:

    # lspci | grep Ethernet
    01:00.0 Ethernet controller: Intel Corporation Ethernet Controller 10-Gigabit X540-AT2 (rev 01)
    01:00.1 Ethernet controller: Intel Corporation Ethernet Controller 10-Gigabit X540-AT2 (rev 01)
    07:00.0 Ethernet controller: Intel Corporation I350 Gigabit Network Connection (rev 01)
    07:00.1 Ethernet controller: Intel Corporation I350 Gigabit Network Connection (rev 01)
  4. 通过为您用来创建 VF 的网络接口创建一个 udev 规则来使创建的 VF 持久。例如,对于 eth1 接口,创建 /etc/udev/rules.d/eth1.rules 文件并添加以下行:

    ACTION=="add", SUBSYSTEM=="net", ENV{ID_NET_DRIVER}=="ixgbe", ATTR{device/sriov_numvfs}="2"

    这样可确保在主机启动时,两个使用 ixgbe 驱动程序的 VF 自动可用于 eth1 接口。

    警告

    目前,当尝试使 VF 在 Broadcom NetXtremeII BCM57810 适配器中保留时,这个命令无法正常工作。另外,基于这些适配器将 VF 附加到 Windows 虚拟机当前还不可靠。

  5. 使用 virsh nodedev-list 命令验证 libvirt 是否可以识别添加的 VF 设备。例如,以下显示,上例中的 01:00.0 和 07:00.0 PF 已被成功转换为 VF:

    # virsh nodedev-list | grep pci_
    pci_0000_01_00_0
    pci_0000_01_00_1
    pci_0000_07_10_0
    pci_0000_07_10_1
    [...]
  6. 获取 PF 及其对应的 VF 的 busslotfunction 值。例如,对于 pci_0000_01_00_0pci_0000_01_00_1:

    # virsh nodedev-dumpxml pci_0000_01_00_0
    <device>
      <name>pci_0000_01_00_0</name>
      <path>/sys/devices/pci0000:00/0000:00:01.0/0000:01:00.0</path>
      <parent>pci_0000_00_01_0</parent>
      <driver>
        <name>ixgbe</name>
      </driver>
      <capability type='pci'>
        <domain>0</domain>
        <bus>1</bus>
        <slot>0</slot>
        <function>0</function>
    [...]
    # virsh nodedev-dumpxml pci_0000_01_00_1
    <device>
      <name>pci_0000_01_00_1</name>
      <path>/sys/devices/pci0000:00/0000:00:01.0/0000:01:00.1</path>
      <parent>pci_0000_00_01_0</parent>
      <driver>
        <name>vfio-pci</name>
      </driver>
      <capability type='pci'>
        <domain>0</domain>
        <bus>1</bus>
        <slot>0</slot>
        <function>1</function>
    [...]
  7. 创建临时 XML 文件并使用您在上一步中获得的 busslotfunction 值添加一个配置。例如:

    <interface type='hostdev' managed='yes'>
      <source>
        <address type='pci' domain='0x0000' bus='0x03' slot='0x10' function='0x2'/>
      </source>
    </interface>
  8. 使用临时 XML 文件将 VF 添加到虚拟机。例如,将 /tmp/holdmyfunction.xml 中保存的 VF 附加到正在运行的 testguest1 虚拟机,并确保在虚拟机重启后可用:

    # virsh attach-device testguest1 /tmp/holdmyfunction.xml --live --config
    Device attached successfully.

    如果成功,客户端操作系统会检测到一个新的网卡。

10.8.3. SR-IOV 分配支持的设备

并非所有设备都可用于 SR-IOV。在 RHEL 8 中,以下设备已被测试并验证为与 SR-IOV 兼容。

网络设备

  • Intel 82599ES 10 Gigabit Ethernet Controller - 使用 ixgbe 驱动程序
  • Intel Ethernet Controller XL710 Series - 使用 i40e 驱动程序
  • Mellanox ConnectX-5 以太网适配器卡 - 使用 mlx5_core 驱动程序
  • Intel 以太网网络适配器 XXV710 - 使用 i40e 驱动程序
  • Intel 82576 Gigabit Ethernet Controller - 使用 igb 驱动程序
  • Broadcom NetXtreme II BCM57810 - 使用 bnx2x 驱动程序

10.9. 将 DASD 设备附加到 IBM Z 中的虚拟机

直接访问的存储设备(DASD)提供很多特定的存储功能。使用 vfio-ccw 功能,您可以将 DASD 分配给 IBM Z 主机上的虚拟机(VM)作为 mediated devices。例如,这可让虚拟机访问 z/OS 数据集,或者将分配的 DASD 与 z/OS 机器共享。

先决条件

  • 您的主机系统使用 IBM Z 硬件构架并支持 FICON 协议。
  • 目标虚拟机使用 Linux 客户机操作系统。
  • 在主机中载入了必要的内核模块。要验证,请使用:

    # lsmod | grep vfio

    输出应包含以下模块:

    • vfio_ccw
    • vfio_mdev
    • vfio_iommu_type1
  • 您有一个备用 DASD 设备供虚拟机独占使用。

流程

  1. 获取 DASD 设备的设备识别符。lsdasd 工具显示它为 Bus-ID

    # lsdasd
    Bus-ID    Status    Name      Device  Type         BlkSz  Size      Blocks
    ================================================================================
    0.0.002c  active    dasdh     94:0    ECKD         4096   21129MB   5409180

    在以下命令中,将 0.0.002c 替换为您的设备识别程序。

  2. 获取 DASD 设备的子通道路径。

    # lscss | grep 0.0.002c
    0.0.002c 0.0.24ac  3390/0c 3990/e9 yes  f0  f0  ff   01021112 00000000

    在这个示例中,子通道路径被检测到为 0.0.24ac。在以下命令中,将 0.0.24ac 替换为您的设备的子通道路径。

  3. 从主机上的子频道中取消绑定 DASD 设备。

    # echo 0.0.002c > /sys/bus/ccw/devices/0.0.002c/driver/unbind
  4. 从 I/O 子通道驱动程序中取消绑定子通道。

    # echo 0.0.24ac > /sys/bus/css/devices/0.0.24ac/driver/unbind
  5. 将子通道绑定到 vfio_ccw passthrough 驱动程序。

    # echo 0.0.24ac > /sys/bus/css/drivers/vfio_ccw/bind
  6. 生成 UUID。

    # uuidgen
    30820a6f-b1a5-4503-91ca-0c10ba12345a
  7. 使用生成的 UUID 创建 DASD 介质设备

    # echo "30820a6f-b1a5-4503-91ca-0c10ba12345a" > /sys/bus/css/devices/0.0.24ac/mdev_supported_types/vfio_ccw-io/create
  8. 将介质设备附加到虚拟机。要做到这一点,使用 virsh edit 实用程序编辑虚拟机 XML 配置,将以下部分添加到 XML 中,并将 uuid 值替换为您在上一步中生成的 UUID。

    <hostdev mode='subsystem' type='mdev' model='vfio-ccw'>
      <source>
        <address uuid="30820a6f-b1a5-4503-91ca-0c10ba12345a"/>
      </source>
    </hostdev>

验证

  1. 获取 libvirt 分配给介质 DASD 设备的标识符。要做到这一点,显示虚拟机的 XML 配置并查找 vfio-ccw 设备。

    # virsh dumpxml vm-name
    
    <domain>
    [...]
        <hostdev mode='subsystem' type='mdev' managed='no' model='vfio-ccw'>
          <source>
            <address uuid='10620d2f-ed4d-437b-8aff-beda461541f9'/>
          </source>
          <alias name='hostdev0'/>
          <address type='ccw' cssid='0xfe' ssid='0x0' devno='0x0009'/>
        </hostdev>
    [...]
    </domain>

    在这个示例中,该设备分配的标识符为 0.0.0009

  2. 登录到虚拟机的客户端操作系统,并确认列出了该设备。例如:

    # lscss | grep 0.0.0009
    0.0.0009 0.0.0007  3390/0c 3990/e9      f0  f0  ff   12212231 00000000
  3. 设置设备在线。例如:

    # chccwdev -e 0.0009
    Setting device 0.0.0009 online
    Done

为了尽快向用户提供最新的信息,本文档可能会包括由机器自动从英文原文翻译的内容。如需更多信息,请参阅此说明。