Red Hat Training

A Red Hat training course is available for RHEL 8

配置和管理虚拟化

Red Hat Enterprise Linux 8

设置您的主机、创建和管理虚拟机并了解 Red Hat Enterprise Linux 8 中的虚拟化功能

Red Hat Customer Content Services

摘要

本文档论述了如何在 Red Hat Enterprise Linux 8(RHEL 8)中管理虚拟化。除了有关虚拟化的一般信息外,它还论述了如何使用命令行工具管理虚拟化,并使用 web 控制台。

使开源包含更多

红帽承诺替换我们的代码、文档和网页属性中存在问题的语言。我们从这四个术语开始: master、slave、blacklist 和 whitelist。这些更改将在即将发行的几个发行本中逐渐实施。如需了解更多详细信息,请参阅 CTO Chris Wright 信息

对红帽文档提供反馈

我们感谢您对文档提供反馈信息。请让我们了解如何改进文档。要做到这一点:

  • 关于特定内容的简单评论:

    1. 请确定您使用 Multi-page HTML 格式查看文档。另外,确定 Feedback 按钮出现在文档页的右上方。
    2. 用鼠标指针高亮显示您想评论的文本部分。
    3. 点在高亮文本上弹出的 Add Feedback
    4. 按照显示的步骤操作。
  • 要提交更复杂的反馈,请创建一个 Bugzilla ticket:

    1. 进入 Bugzilla 网站。
    2. 在 Component 中选择 Documentation
    3. Description 中输入您要提供的信息。包括文档相关部分的链接。
    4. Submit Bug

第 1 章 RHEL 8 中的虚拟化 - 概述

如果您对虚拟化概念或其在 Linux 中的实施不熟悉,以下小节提供了 RHEL 8 虚拟化的一般概述:红帽提供的基本知识、优势、组件和其他可能的虚拟化解决方案。

1.1. 什么是虚拟化?

RHEL 8 提供虚拟化功能,它让运行 RHEL 8 的机器能够托管(host) 多个虚拟机(VM),也称为客户机(guest)。VM 使用主机的物理硬件和计算资源,在主机操作系统中作为用户空间进程运行一个独立的虚拟操作系统(客户机操作系统)。

换句话说,虚拟化功能使在一个操作系统中执行其他操作系统成为可能。

VM 可让您安全地测试软件配置和功能,运行旧的软件或优化硬件的工作负载效率。有关优点的详情请参考 第 1.2 节 “虚拟化的优点”

有关虚拟化的更多信息,请参阅红帽客户门户网站

要在 RHEL 8 中尝试虚拟化,请参考 第 2 章 虚拟化入门

注意

除了 RHEL 8 虚拟化外,红帽还提供很多特殊的虚拟化解决方案,每个解决方案都有不同的用户重点和功能。更多信息请参阅 第 1.5 节 “红帽虚拟化解决方案”

1.2. 虚拟化的优点

与使用物理机器相比,使用虚拟机(VM)有以下优点:

  • 灵活精细的资源分配

    一个虚拟机在主机机器(通常是物理机器)上运行,主机的硬件也可以分配给客户机操作系统使用。但是,物理资源分配是在软件级别上完成的,因此非常灵活。虚拟机使用的主机内存、CPU 或存储空间的比例是可以配置的,可以指定非常精细的资源请求。

    例如:客户机操作系统的磁盘可以在主机的文件系统中以一个文件代表,且该磁盘的大小限制比物理磁盘的限制要小。

  • 软件控制的配置

    虚拟机的整个配置都作为数据保存在主机上,并由软件控制。因此,虚拟机可轻松创建、删除、克隆、迁移、远程操作或连接到远程存储。

  • 与主机分离

    在虚拟内核中运行的客户机操作系统与主机操作系统分开。这意味着可在虚拟机中安装任何操作系统,即使虚拟机操作系统不稳定或受损,主机也不会受到任何影响。

  • 空间及成本效率

    单个物理机器可以托管大量虚拟机。因此,无需多个物理机器执行同样的任务,因此降低了与物理硬件关联的空间、电源和维护的要求。

  • 软件兼容性

    因为虚拟机可以使用不同于其主机的操作系统,所以通过虚拟化,可以运行最初没有为主机操作系统发布的应用程序。例如,通过 RHEL 6 客户机操作系统,您可以在 RHEL 8 主机系统中运行为 RHEL 6 发布的应用程序。

    注意

    不是所有操作系统都可以作为 RHEL 8 主机中的客户机操作系统被支持。详情请查看 第 20.2 节 “RHEL 8 虚拟化中推荐的功能”

1.3. 虚拟机组件及其交互

RHEL 8 中的虚拟化由以下主要软件组件组成:

虚拟机监控程序(Hypervisor)

在 RHEL 8 中创建虚拟机(VM)的基础是(hypervisor(虚拟机监控程序) ),它是一个软件层用来控制硬件并在主机中运行多个操作系统。

虚拟机监控程序包括 Kernel-based Virtual Machine(KVM) 模块和虚拟化内核驱动,如 virtiovfio。这些组件可确保主机中的 Linux 内核为用户空间软件提供虚拟化资源。

在用户空间级别,QEMU 模拟器会模拟一个客户机操作系统可以在上面运行的完整虚拟硬件平台,并管理如何在主机中分配资源并提供给客户机。

另外,libvirt 软件套件充当一个管理和沟通层,让 QEMU 更容易地进行互动、强制执行安全规则,并提供一些配置和运行虚拟机的额外工具。

XML 配置

基于主机的 XML 配置文件(也称域 XML 文件)决定了特定虚拟机中的所有设置和设备。配置包括:

  • 元数据,如虚拟机名称、时区和其他有关虚拟机的信息。
  • 对虚拟机中的设备的描述,包括虚拟 CPU(vCPUS)、存储设备、输入/输出设备、网络接口卡及其他真实和虚拟硬件。
  • 虚拟机设置,如它可以使用的最大内存量、重启设置和其他有关虚拟机行为的设置。

有关 XML 配置内容的更多信息,请参阅 VM XML 配置示例

组件交互

当虚拟机启动时,虚拟机监控程序使用 XML 配置在主机上以用户空间进程的形式创建虚拟机实例。虚拟机监控程序还可让基于主机的界面访问虚拟机进程,如 virshvirt-installguestfish 工具,或 web 控制台 GUI。

当使用这些虚拟化工具时,libvirt 会将它们的输入转换成 QEMU 的指令。QEMU 将指令信息发送到 KVM,这样可确保内核正确分配执行该指令所需的资源。因此,QEMU 可以执行相应的用户空间更改,如创建或修改虚拟机或在虚拟机的客户机操作系统中执行操作。

注意

尽管 QEMU 是构架中的基本组件,但出于安全考虑,它并没有被设计为直接在 RHEL 8 系统中使用。因此,红帽不支持使用 qemu-* 命令,强烈建议您使用 libvirt 与 QEMU 交互。

有关基于主机接口的详情,请参考 第 1.4 节 “用于虚拟化管理的工具和界面”

图 1.1. RHEL 8 虚拟化架构

virt 构架

1.4. 用于虚拟化管理的工具和界面

您可以使用命令行界面(CLI)或几个图形用户界面(GUI)管理 RHEL 8 中的虚拟化。

命令行界面

CLI 是在 RHEL 8 中管理虚拟化的最强大的方法。虚拟机(VM)管理的 CLI 命令包括:

  • virsh - 一个多用途的虚拟化命令行工具程序和 shell,根据提供的参数,可以实现不同功能。例如:

    • 启动和关闭虚拟机 - virsh startvirsh shutdown
    • 列出可用的虚拟机 - virsh list
    • 从配置文件创建虚拟机 - virsh create
    • 进入虚拟化 shell - virsh

    如需更多信息,请参阅 virsh(1) man page。

  • virt-install - 用于创建新虚拟机的 CLI 工具。如需更多信息,请参阅 virt-install(1) man page。
  • virt-xml - 编辑虚拟机配置的工具。
  • guestfish - 检查和修改虚拟机磁盘镜像的工具。如需更多信息,请参阅 guestfish(1) man page。

图形界面

您可以使用以下 GUI 在 RHEL 8 中管理虚拟化:

  • RHEL 8 web 控制台 (也称为 Cockpit )提供了一个远程的、易于使用的图形用户界面管理虚拟机和虚拟化主机。

    有关使用 web 控制台进行基本虚拟化管理的步骤请参考 第 5 章 在 web 控制台中管理虚拟机

  • 虚拟机管理器(virt-manager)应用程序提供管理虚拟机和虚拟化主机的专用 GUI。

    重要

    虽然 RHEL 8 仍支持 virt-manager,但其已被弃用。在以后的版本中计划使用 Web 控制台替换它。因此,建议您熟悉通过 web 控制台使用 GUI 管理虚拟化。

    但是在 RHEL 8 中,某些功能只能通过 virt-manager 或命令行访问。详情请查看 第 5.4 节 “虚拟机管理器和 web 控制台中虚拟化功能的不同”

  • Gnome Boxes 应用程序是一个轻量级图形界面,可用来查看和访问虚拟机和远程系统。GNOME Boxes 主要用于桌面系统。

    重要

    GNOME Boxes 作为 GNOME 桌面环境的一部分提供,在 RHEL 8 中被支持,但红帽建议您通过 web 控制台使用 GUI 管理虚拟化。

其它资源

1.5. 红帽虚拟化解决方案

以下红帽产品基于 RHEL 8 虚拟化功能构建,它们扩展了 RHEL 8 中的 KVM 虚拟化功能。另外,RHEL 8 虚拟化的很多限制并不会限制这些产品:

Red Hat Virtualization(RHV)

RHV 是针对企业级的可伸缩性和性能进行设计的,能够通过集中图形界面管理整个虚拟基础架构,包括主机、虚拟机、网络、存储和用户。

Red Hat Virtualization 可用于运行大型部署或关键任务应用程序的企业。适用于 Red Hat Virtualization 的大型部署示例包括数据库、平台和消息系统,这些系统需要持续运行且不能出现停机状况。

有关 Red Hat Virtualization 的更多信息,请参阅红帽客户门户网站Red Hat Virtualization 文档套件

要下载完全支持的 Red Hat Virtualization 60 天试用版本,请访问红帽客户门户网站

Red Hat OpenStack Platform(RHOSP)

Red Hat OpenStack Platform 为创建、部署并扩展一个安全可靠的公共或私有 OpenStack 云环境提供了一个集成的基础。

如需有关 Red Hat OpenStack Platform 的更多信息,请参阅红帽客户门户网站Red Hat OpenStack Platform 文档套件

注意

如果需要使用 RHEL 不支持,但 RHV 或 RHOSP 可以支持的虚拟化功能,请参阅 第 20.3 节 “RHEL 8 虚拟化不支持的功能”

另外,特定的红帽产品还提供操作系统级别的虚拟化,也称为容器化

  • 容器是主机操作系统的隔离实例,并在现有操作系统内核之上操作。如需有关容器的更多信息,请参阅红帽客户门户网站
  • 容器并不具有 KVM 虚拟化的灵活性,但其处理更加轻便且灵活。有关更详细的比较,请参阅 Linux 容器简介

第 2 章 虚拟化入门

要在 RHEL 8 中使用虚拟化,请按照以下步骤操作。默认方法是使用命令行界面(CLI),但为方便用户,可在 web 控制台 GUI 中完成一些步骤。

注意

Web 控制台目前只提供所有虚拟机管理功能的一部分,因此对于一下高级功能,建议在 RHEL 8 使用命令行实现。

2.1. 启用虚拟化

要在 RHEL 8 中使用虚拟化,您必须启用虚拟化模块,安装虚拟化软件包,并确保将您的系统配置为运行虚拟机(VM)的主机。

先决条件

  • 主机已安装 Red Hat Enterprise Linux 8 并进行了注册
  • 您的系统满足以下硬件要求以作为虚拟主机工作:

    • 主机的构架支持 KVM 虚拟化
    • 有以下最小系统资源可用:

      • 主机有 6 GB 可用磁盘空间,以及每个预期的虚拟机需要额外 6 GB 空间。
      • 主机需要 2 GB RAM,以及每个预期的虚拟机需要额外 2 GB。

流程

  1. 在 RHEL 8 虚拟化模块中安装软件包:

    # yum module install virt
  2. 安装 virt-installvirt-viewer 软件包:

    # yum install virt-install virt-viewer
  3. 启动 libvirtd 服务。

    # systemctl start libvirtd
  4. 确认您的系统已准备好成为虚拟化主机:

    # virt-host-validate
    [...]
    QEMU: Checking for device assignment IOMMU support         : PASS
    QEMU: Checking if IOMMU is enabled by kernel               : WARN (IOMMU appears to be disabled in kernel. Add intel_iommu=on to kernel cmdline arguments)
    LXC: Checking for Linux >= 2.6.26                          : PASS
    [...]
    LXC: Checking for cgroup 'blkio' controller mount-point    : PASS
    LXC: Checking if device /sys/fs/fuse/connections exists    : FAIL (Load the 'fuse' module to enable /proc/ overrides)
  5. 如果所有 virt-host-validate 检查都返回 PASS 值,则代表您的系统已经准备好用于创建虚拟机

    如果有任何检查返回 FAIL 值,请按照显示的步骤解决相关问题。

    如果任何检查返回 WARN 值,请考虑根据显示内容改进虚拟化功能。

附加信息

  • 请注意:如果您的主机 CPU 不支持虚拟化,virt-host-validate 会生成以下输出:

    QEMU: Checking for hardware virtualization: FAIL (Only emulated CPUs are available, performance will be significantly limited)

    但是,在这样的主机系统中尝试创建虚拟机会失败,而不是存在性能问题。

2.2. 创建虚拟机

要在 RHEL 8 中创建虚拟机(VM),请使用 命令行界面RHEL 8 web 控制台

先决条件

  • 已在您的系统中安装并启用虚拟化。
  • 您有足够的系统资源来分配给您的虚拟机,如磁盘空间、RAM 或 CPU。根据虚拟机的预期任务和工作负载,推荐的值可能会有很大不同。

    警告

    RHEL 8 无法从主机 CD-ROM 或者 DVD-ROM 设备安装。如果您在使用 RHEL 8 中的任何 VM 安装方法时选择了 CD-ROM 或 DVD-ROM 作为安装源,则安装会失败。如需更多信息,请参阅红帽知识库

2.2.1. 使用命令行界面创建虚拟机

要使用 virt-install 工具在 RHEL 8 主机上创建虚拟机(VM),请按照以下步骤操作。

先决条件

  • 虚拟化已在您的主机系统中启用
  • 操作系统(OS)安装源可存在于本地或者网络中。可以是以下之一:

    • 安装介质的 ISO 镜像
    • 现有虚拟机安装的磁盘镜像
  • 可选:对于快速、简单的配置安装,可以使用 Kickstart 文件。

流程

要创建虚拟机并启动操作系统安装,使用 virt-install 命令以及以下强制参数:

  • 新机器的名称
  • 分配的内存量
  • 分配的虚拟 CPU(vCPU)数量
  • 分配的存储的类型和大小
  • 操作系统安装源的类型和位置

根据所选安装方法,所需选项和值可能会有所不同。请参阅以下的示例:

  • 下面创建一个名为 demo-guest1 的虚拟机,它从本地存储在 /home/username/Downloads/Win10install.iso 文件中的 ISO 镜像安装 Windows 10 OS。此虚拟机还可分配 2048 MiB RAM 和 2 个 vCPU,为虚拟机自动配置 80 GiB qcow2 虚拟磁盘。

    # virt-install --name demo-guest1 --memory 2048 --vcpus 2 --disk size=80 --os-variant win10 --cdrom /home/username/Downloads/Win10install.iso
  • 下面创建一个名为 demo-guest2 的虚拟机,它使用 /home/username/Downloads/rhel8.iso 镜像从 live CD 运行 RHEL 8 OS。没有为这个虚拟机分配磁盘空间,因此在此会话中所做的更改不会被保留。另外,虚拟机被分配 4096 MiB RAM 和 4 个 vCPU。

    # virt-install --name demo-guest2 --memory 4096 --vcpus 4 --disk none --livecd --os-variant rhel8.0 --cdrom /home/username/Downloads/rhel8.iso
  • 下面创建一个名为 demo-guest3 的 RHEL 8 虚拟机,它连接到现有磁盘镜像 /home/username/backup/disk.qcow2。这和在不同的机器间物理地移动硬盘驱动器类似,因此 demo-guest3 可用的操作系统和数据由之前处理镜像的方式决定。另外,这个虚拟机还会分配 2048 MiB RAM 和 2 个 vCPU。

    # virt-install --name demo-guest3 --memory 2048 --vcpus 2 --os-variant rhel8.0 --import --disk /home/username/backup/disk.qcow2

    请注意,在导入磁盘镜像时强烈建议您使用 --os-variant 选项。如果没有提供,创建虚拟机的性能将会受到负面影响。

  • 以下创建一个名为 demo-guest4 的虚拟机,它从 http://example.com/OS-install URL 安装。要使安装成功启动,URL 必须包含可正常工作的操作系统安装树。另外,操作系统是使用 /home/username/ks.cfg kickstart 文件自动配置的。此虚拟机还可分配 2048 MiB RAM、2 个 vCPU 和 160 GiB qcow2 虚拟磁盘。

    # virt-install --name demo-guest4 --memory 2048 --vcpus 2 --disk size=160 --os-variant rhel8.0 --location http://example.com/OS-install --initrd-inject /home/username/ks.cfg --extra-args="ks=file:/ks.cfg console=tty0 console=ttyS0,115200n8"
  • 下面创建一个名为 demo-guest5 的虚拟机,它使用文本模式安装 RHEL8.iso 镜像文件,无需图形。它将客户端控制台连接到串行控制台。虚拟机有 16384 MiB 内存、16 个 vCPU 和 280 GiB 磁盘。当通过慢速网络连接连接到主机时这种安装很有用。

    # virt-install --name demo-guest5 --memory 16384 --vcpus 16 --disk size=280 --os-variant rhel8.0 --location RHEL8.iso --graphics none --extra-args='console=ttyS0'
  • 下面创建一个名为 demo-guest6 的虚拟机,其配置与 demo-guest5 相同,但会位于 10.0.0.1 远程主机上。

    # virt-install --connect qemu+ssh://root@10.0.0.1/system --name demo-guest6 --memory 16384 --vcpus 16 --disk size=280 --os-variant rhel8.0 --location RHEL8.iso --graphics none --extra-args='console=ttyS0'

如果成功创建虚拟机,则使用虚拟机的图形控制台打开 virt-viewer 窗口并启动客户端操作系统安装。

故障排除

  • 如果 virt-install 失败并显示 cannot find default network 错误:

    1. 确定安装了 libvirt-daemon-config-network 软件包:

      # yum info libvirt-daemon-config-network
      Installed Packages
      Name         : libvirt-daemon-config-network
      [...]
    2. 验证 libvirt 默认网络是否活跃,并配置为自动启动:

      # virsh net-list --all
       Name      State    Autostart   Persistent
      --------------------------------------------
       default   active   yes         yes
    3. 如果没有,激活默认网络并将其设置为 auto-start:

      # virsh net-autostart default
      Network default marked as autostarted
      
      # virsh net-start default
      Network default started
      1. 如果激活默认网络失败并显示以下错误,则代表还没有正确安装 libvirt-daemon-config-network 软件包。

        error: failed to get network 'default'
        error: Network not found: no network with matching name 'default'

        要解决这个问题,请重新安装 libvirt-daemon-config-network

        # yum reinstall libvirt-daemon-config-network
      2. 如果激活默认网络失败并显示类似如下的错误,则默认网络子网和主机上现有接口之间出现了冲突。

        error: Failed to start network default
        error: internal error: Network is already in use by interface ens2

        要修复这个问题,请使用 virsh net-edit default 命令,并将配置中的 192.168.122.* 值改为一个主机上还没有使用的子网。

其它资源

  • virt-install 可以指定很多其它选项来进一步配置 VM 及其操作系统安装。详情请查看 virt-install man page。
  • 如果您已经有一个正常工作的虚拟机,则可以迅速克隆它,以使用相同的配置和数据创建新虚拟机。详情请查看 第 8 章 克隆虚拟机

2.2.2. 使用 web 控制台创建虚拟机并安装客户端操作系统

要在 RHEL 8 主机上的 GUI 中管理虚拟机(VM),请使用 web 控制台。以下小节介绍了如何使用 RHEL 8 web 控制台创建虚拟机并安装客户机操作系统。

2.2.2.1. 使用 web 控制台创建虚拟机

要在连接 web 控制台的主机机器中创建虚拟机(VM),请遵循以下步骤。

先决条件

  • 要使用 Web 控制台来管理虚拟机,请安装 Web 控制台虚拟机插件
  • 您有足够的系统资源来分配给您的虚拟机,如磁盘空间、RAM 或 CPU。根据虚拟机的预期任务和工作负载,推荐的值可能会有很大不同。

流程

  1. 在 web 控制台的 Virtual Machines 界面中,点 Create VM

    此时会出现「创建新虚拟机」对话框。

    Cockpit 创建新虚拟机
  2. 输入您要创建的虚拟机的基本配置。

    • Name - 虚拟机的名称。
    • 安装类型 - 安装可以使用本地安装介质、URL、PXE 网络引导或者从有限的操作系统中下载操作系统。
    • 操作系统 - 虚拟机的操作系统。请注意,红帽只支持有限的客户端操作系统
    • 存储 - 要配置虚拟机的存储类型。
    • 大小 - 配置虚拟机的存储空间大小。
    • 内存 - 配置虚拟机的内存量。
    • 执行无人值守安装 - 是否无人值守安装。
    • 立即启动 VM - 虚拟机是否在创建后立即启动。
  3. Create

    虚拟机已创建。如果选择了立即启动虚拟机复选框,则虚拟机将立即启动并开始安装客户端操作系统。

其它资源

2.2.2.2. 使用 web 控制台导入磁盘镜像来创建虚拟机

要通过导入现有虚拟机安装的磁盘镜像来创建虚拟机(VM),请遵循以下步骤。

先决条件

  • 要使用 Web 控制台来管理虚拟机,请安装 Web 控制台虚拟机插件
  • 您有足够的系统资源来分配给您的虚拟机,如磁盘空间、RAM 或 CPU。根据虚拟机的预期任务和工作负载,推荐的值可能会有很大不同。
  • 确保已有虚拟机安装的磁盘镜像

流程

  1. 在 web 控制台的 Virtual Machines 界面中,点 Import VM

    此时会出现「导入虚拟机」对话框。

    Cockpit 导入虚拟机
  2. 输入您要创建的虚拟机的基本配置。

    • Name - 虚拟机的名称。
    • 连接 - libvirt 连接、系统或者会话的类型。
    • 安装源 - 主机系统中虚拟机的现有磁盘镜像。
    • 操作系统 - 虚拟机的操作系统。请注意,红帽只支持有限的客户端操作系统
    • 内存 - 配置虚拟机的内存量。
    • 立即启动 VM - 虚拟机是否在创建后立即启动。
  3. Import

2.2.2.3. 使用 Web 控制台安装客户端操作系统

第一次载入虚拟机(VM)时,您必须在虚拟机上安装操作系统。

注意

如果选中 Create New Virtual Machine 对话框中的 Immediately Start VM 复选框,则在创建虚拟机时自动启动操作系统的安装过程。

先决条件

流程

  1. Virtual Machines 界面中,点您要在其中安装客户机操作系统的虚拟机行。

    行会展开,以显示 Overview 窗格中有关所选虚拟机的基本信息,以及用于安装和删除虚拟机的控制信息。

    Cockpit UEFI 概述
  2. 可选:修改固件。

    注意

    只有在 Create New Virtual Machine 对话框中没有选择 Immediately Start VM 复选框且虚拟机上还没有安装操作系统时,才能更改固件。

    1. 点高亮的固件。

      Cockpit vm 概述
    2. 在 Change Firmware 窗口中,选择所需固件。

      Cockpit vm 固件
    3. Save
  3. Install

    在 VM 控制台中运行的操作系统的安装过程。

故障排除

  • 如果安装过程失败,则必须删除虚拟机并重新创建。

2.3. 启动虚拟机

要在 RHEL 8 中启动虚拟机(VM),您可以使用 命令行界面web 控制台 GUI

先决条件

2.3.1. 使用命令行界面启动虚拟机

您可以使用命令行界面启动关闭虚拟机(VM)或恢复保存的虚拟机。按照以下步骤操作。

先决条件

  • 已定义的一个不活跃地虚拟机。
  • 虚拟机的名称。
  • 对于远程虚拟机:

    • 虚拟机所在主机的 IP 地址。
    • 对主机的 root 访问权限。

流程

  • 对于本地虚拟机,使用 virsh start 工具。

    例如,以下命令启动 demo-guest1 虚拟机。

    # virsh start demo-guest1
    Domain demo-guest1 started
  • 对于位于远程主机上的虚拟机,使用 virsh start 工具以及到主机的 QEMU+SSH 连接。

    例如,以下命令在 192.168.123.123 主机上启动 demo-guest1 虚拟机。

    # virsh -c qemu+ssh://root@192.168.123.123/system start demo-guest1
    
    root@192.168.123.123's password:
    Last login: Mon Feb 18 07:28:55 2019
    
    Domain demo-guest1 started

其它资源

  • 对于更多 virsh start 参数,请使用 virsh start --help
  • 有关简化远程主机上的虚拟机管理,请参阅修改 libvirt 和 SSH 配置
  • 您可以使用 virsh autostart 工具配置虚拟机,以便在主机引导时自动启动。有关 autostart 的详情请参考 virsh autostart 帮助页。

2.3.2. 使用 web 控制台启动虚拟机

如果虚拟机(VM)处于关闭状态,您可以使用 RHEL 8 web 控制台启动它。

先决条件

流程

  1. Virtual Machines 接口中,点您要启动的虚拟机行。

    行会展开,以显示有关所选虚拟机以及用于关闭和删除虚拟机的基本信息 Overview 窗格。

  2. Run

    虚拟机启动,您可以连接到其控制台或图形输出

  3. 可选:要将虚拟机设置为在主机启动时自动启动,点 Autostart 复选框。

其它资源

2.4. 连接至虚拟机

要在 RHEL 8 中与虚拟机(VM)交互,您需要通过以下方法之一连接它:

如果您要连接的虚拟机位于远程主机而不是本地主机,您可以选择配置您的系统以更方便地访问远程主机

先决条件

2.4.1. 使用 web 控制台与虚拟机交互

要在 RHEL 8 web 控制台中与虚拟机(VM)交互,您需要连接到虚拟机的控制台。这包括图形和串行控制台。

2.4.1.1. 在 web 控制台中查看虚拟机图形控制台

使用虚拟机(VM)控制台界面,您可以在 RHEL 8 web 控制台中查看所选虚拟机的图形输出。

先决条件

流程

  1. Virtual Machines 界面中,点您要查看图形控制台的虚拟机行。

    行会展开,以显示有关所选虚拟机以及用于关闭和删除虚拟机的基本信息 Overview 窗格。

  2. Consoles

    图形控制台会出现在 web 界面中。

Cockpit 图形控制台

您可以使用鼠标和键盘与虚拟机控制台以与实际机器交互的方式与 VM 控制台进行交互。VM 控制台中的显示反映了虚拟机上正在执行的操作。

注意

运行 web 控制台的主机可能会截获特定的组合键,如 Ctrl+Alt+Del,阻止它们发送到虚拟机。

要发送这样的组合键,点 Send key 菜单并选择要使用地键序列。

例如:要将 Ctrl+Alt+Del 组合发送到 VM,点 Send key 菜单并选择 Ctrl+Alt+Del 菜单。

其它资源

2.4.1.2. 使用 Web 控制台在远程 viewer 中查看图形控制台

您可以在 remote viewer 中查看所选虚拟机(VM)的图形控制台,比如 virt-viewer。具体步骤请查看以下操作。

注意

您可以在 web 控制台中启动 Virt Viewer。可以手动启动其他 VNC 和 SPICE remote viewer。

先决条件

  • 要使用 Web 控制台来管理虚拟机,请安装 Web 控制台虚拟机插件
  • 确保主机和虚拟机支持图形界面。
  • 在您在 Virt Viewer 中查看图形控制台前,必须在连接 web 控制台的机器中安装 Virt Viewer。

    要查看有关安装 Virt Viewer 的信息,选择 Graphics Console in Desktop Viewer控制台类型,在 Consoles 窗口中点 More Information

    cockpit 安装 vv 信息
注意

有些浏览器扩展和插件不允许 web 控制台打开 Virt Viewer。

流程

  1. Virtual Machines 界面中,点您要查看图形控制台的虚拟机行。

    行会展开,以显示有关所选虚拟机以及用于关闭和删除虚拟机的基本信息 Overview 窗格。

  2. Consoles

    图形控制台会出现在 web 界面中。

  3. 选择 Graphics Console in Desktop Viewer 控制台类型。

    Cockpit 在 vv 中启动图形控制台
  4. Launch Remote Viewer

    图形控制台会出现在 Virt Viewer 中。

    virt viewer GUI

您可以使用鼠标和键盘与虚拟机控制台以与实际机器交互的方式与 VM 控制台进行交互。VM 控制台中的显示反映了虚拟机上正在执行的操作。

注意

运行 web 控制台的服务器可以截获特定的组合键,如 Ctrl+Alt+Del,阻止它们发送到虚拟机。

要发送这样的组合键,点 Send key 菜单并选择要使用地键序列。

例如:要将 Ctrl+Alt+Del 组合发送到 VM,点 Send key 菜单并选择 Ctrl+Alt+Del 菜单。

故障排除

  • 如果在 web 控制台中启动远程查看器图形控制台无法正常工作或者无法优化,您可以使用 Manual Connection 信息,显示在 Graphics Console 窗格的右侧。

    Cockpit manual viewer info

    输入 SPICE 或者 VNC viewer 应用程序中的信息,比如 Virt Viewer。

其它资源

2.4.1.3. 在 web 控制台中查看虚拟机串口控制台

您可以在 RHEL 8 web 控制台中查看所选虚拟机(VM)的串行控制台。这在主机机器或者虚拟机没有使用图形界面配置时很有用。

先决条件

流程

  1. Virtual Machines 窗格中,点您要查看的串口控制台的虚拟机行。

    行会展开,以显示有关所选虚拟机以及用于关闭和删除虚拟机的基本信息 Overview 窗格。

  2. Consoles

    图形控制台会出现在 web 界面中。

  3. 选择 Serial Console 控制台类型。

    串行控制台会出现在 web 界面中。

    Cockpit 串口控制台

您可以断开串行控制台与虚拟机的连接和重新连接。

  • 要断开串行控制台与虚拟机的连接,请点 Disconnect
  • 要将串行控制台重新连接到虚拟机,请点 Reconnect

其它资源

2.4.2. 使用 Virt Viewer 打开虚拟机图形控制台

要连接到 KVM 虚拟机(VM)的图形控制台并在 Virt Viewer 桌面应用程序中打开它,请按照以下步骤操作。

先决条件

  • 您的系统以及您要连接的虚拟机必须支持图形显示。
  • 如果目标虚拟机位于远程主机上,则需要对主机有连接和 root 访问权限。
  • 可选: 如果目标虚拟机位于远程主机上,请设置 libvirt 和 SSH 以更方便地访问远程主机

流程

  • 要连接到本地虚拟机,请使用以下命令,并将 guest-name 替换为您要连接的虚拟机的名称:

    # virt-viewer guest-name
  • 要连接到远程虚拟机,使用带 SSH 协议的 virt-viewer 命令。例如,以下命令以 root 身份连接到位于远程系统 10.0.0.1 的名为 guest-name 的虚拟机。此连接还需要为 10.0.0.1 进行 root 身份验证。

    # virt-viewer --direct --connect qemu+ssh://root@10.0.0.1/system guest-name
    root@10.0.0.1's password:

如果连接正常工作,则虚拟机显示在 Virt Viewer 窗口中。

virt Viewer 显示 RHEL 7 虚拟机操作系统

您可以使用鼠标和键盘与虚拟机控制台以与实际机器交互的方式与 VM 控制台进行交互。VM 控制台中的显示反映了虚拟机上正在执行的操作。

其它资源

2.4.3. 使用 SSH 连接到虚拟机

要使用 SSH 连接协议与虚拟机(VM)终端交互,请遵循以下步骤:

先决条件

  • 有对目标虚拟机的网络连接和 root 访问权限。
  • 如果目标虚拟机位于远程主机上,您也可以拥有对该主机的连接和 root 访问权限。
  • libvirt-nss 组件在虚拟机的主机上安装并启用。如果没有,请执行以下操作:

    1. 安装 libvirt-nss 软件包:

      # yum install libvirt-nss
    2. 编辑 /etc/nsswitch.conf 文件并将 libvirt_guest 添加到 hosts 行中:

      [...]
      passwd:      compat
      shadow:      compat
      group:       compat
      hosts:       files libvirt_guest dns
      [...]

流程

  1. 可选:当连接到远程虚拟机时,请首先 SSH 到其物理主机。以下示例演示了使用其 root 凭证连接到主机 10.0.0.1:

    # ssh root@10.0.0.1
    root@10.0.0.1's password:
    Last login: Mon Sep 24 12:05:36 2018
    root~#
  2. 使用虚拟机的名称和用户访问凭证来连接它。例如,以下命令使用根凭证连接到 "testguest1" 虚拟机:

    # ssh root@testguest1
    root@testguest1's password:
    Last login: Wed Sep 12 12:05:36 2018
    root~]#

故障排除

  • 如果您不知道虚拟机的名称,可以使用 virsh list --all 命令列出主机上所有可用虚拟机:

    # virsh list --all
    Id    Name                           State
    ----------------------------------------------------
    2     testguest1                    running
    -     testguest2                    shut off

2.4.4. 打开虚拟机串口控制台

使用 virsh console 命令,可以连接到虚拟机(VM)的串行控制台。

但虚拟机有以下情况时很有用:

  • 没有提供 VNC 或 SPICE 协议,因此没有为 GUI 工具提供视频显示。
  • 没有网络连接,因此无法使用 SSH 进行交互。

先决条件

  • 虚拟机必须在内核命令行中配置串口控制台。要验证这一点,虚拟机的 cat /proc/cmdline 命令输出应该包含 console=ttyS0。例如:

    # cat /proc/cmdline
    BOOT_IMAGE=/vmlinuz-3.10.0-948.el7.x86_64 root=/dev/mapper/rhel-root ro console=tty0 console=ttyS0,9600n8 rd.lvm.lv=rhel/root rd.lvm.lv=rhel/swap rhgb

    如果没有在虚拟机中正确设置串口控制台,请使用 virsh 控制台连接到虚拟机,请将您连接到无响应的客户端控制台。然而,您仍然可以使用 Ctrl+] 快捷键退出无响应控制台。

  • 要在虚拟机上设置串行控制台,请执行以下操作:

    1. 在虚拟机上,编辑 /etc/default/grub 文件并将 console=ttyS0 添加到以 GRUB_CMDLINE_LINUX 开头的行中。
    2. 清除可能会阻止您更改生效的内核选项。

      # grub2-editenv - unset kernelopts
    3. 重新载入 Grub 配置:

      # grub2-mkconfig -o /boot/grub2/grub.cfg
      Generating grub configuration file ...
      Found linux image: /boot/vmlinuz-3.10.0-948.el7.x86_64
      Found initrd image: /boot/initramfs-3.10.0-948.el7.x86_64.img
      [...]
      done
    4. 重启虚拟机。

流程

  1. 在您的主机系统中,使用 virsh console 命令。如果 libvirt 驱动程序支持安全控制台处理,以下示例连接到 guest1 虚拟机:

    # virsh console guest1 --safe
    Connected to domain guest1
    Escape character is ^]
    
    Subscription-name
    Kernel 3.10.0-948.el7.x86_64 on an x86_64
    
    localhost login:
  2. 您还可以使用与标准命令行界面相同的方法与 virsh 控制台互动。

其它资源

  • 有关 VM 串口控制台的详情请参考 virsh man page。

2.4.5. 设置对远程虚拟化主机的简单访问

当使用 libvirt 工具在远程主机系统中管理虚拟机时,建议使用 -c qemu+ssh://root@hostname/system 语法。例如,要在 10.0.0.1 主机上以 root 用户身份使用 virsh list 命令:

# virsh -c qemu+ssh://root@10.0.0.1/system list

root@10.0.0.1's password:
Last login: Mon Feb 18 07:28:55 2019

Id   Name              State
---------------------------------
1    remote-guest      running

然而,为方便起见,您可以通过修改 SSH 和 libvirt 配置来完全删除需要指定连接详情。例如,您可以:

# virsh -c remote-host list

root@10.0.0.1's password:
Last login: Mon Feb 18 07:28:55 2019

Id   Name              State
---------------------------------
1    remote-guest      running

要进行改进,请按照以下步骤操作。

流程

  1. 编辑或创建 ~/.ssh/config 文件并添加以下内容,其中 host-alias 是与特定远程主机关联的短名称,hosturl 是主机的 URL 地址。

    Host host-alias
            User                    root
            Hostname                hosturl

    例如,下面的命令为 root@10.0.0.1 设置 tyrannosaurus 别名:

    Host tyrannosaurus
            User                    root
            Hostname                10.0.0.1
  2. 编辑或创建 /etc/libvirt/libvirt.conf 文件,添加以下内容,其中 qemu-host-alias 是 QEMU 和 libvirt 工具与预期主机关联的主机别名:

    uri_aliases = [
      "qemu-host-alias=qemu+ssh://host-alias/system",
    ]

    例如,以下命令使用上一步中配置的 tyrannosaurus 别名来设置 t-rex 别名,它代表 qemu+ssh://10.0.0.1/system

    uri_aliases = [
      "t-rex=qemu+ssh://tyrannosaurus/system",
    ]
  3. 因此,您可以使用本地系统中基于 libvirt 的实用程序以及添加的 -c qemu-host-alias 参数来管理远程虚拟机。这会在远程主机中使用 SSH 自动执行命令。

    例如,以下列出了 10.0.0.1 远程主机上的虚拟机,其连接在前面的步骤中被设置为 t-rex

    $ virsh -c t-rex list
    
    root@10.0.0.1's password:
    Last login: Mon Feb 18 07:28:55 2019
    
    Id   Name              State
    ---------------------------------
    1    velociraptor      running
  4. 可选:如果您要在单一远程主机中只使用 libvirt 工具,您也可以为基于 libvirt 的实用程序设置一个特定的连接作为默认目标。要做到这一点,编辑 /etc/libvirt/libvirt.conf 文件并将 uri_default 参数的值设置为 qemu-host-alias。例如:以下命令使用在前面的步骤中设置的 t-rex 主机别名作为默认的 libvirt 目标。

    # These can be used in cases when no URI is supplied by the application
    # (@uri_default also prevents probing of the hypervisor driver).
    #
    uri_default = "t-rex"

    因此,所有基于 libvirt 的命令都会在指定的远程主机中自动执行。

    $ virsh list
    root@10.0.0.1's password:
    Last login: Mon Feb 18 07:28:55 2019
    
    Id   Name              State
    ---------------------------------
    1    velociraptor      running

    但是,如果您也要管理本地主机或不同远程主机上的虚拟机,则不建议这样做。

其它资源

2.5. 关闭虚拟机

要在 Red Hat Enterprise Linux 8 中关闭正在运行的虚拟机,请使用 命令行界面web 控制台 GUI

2.5.1. 使用命令行界面关闭虚拟机

要关闭响应的虚拟机(VM),请执行以下操作之一:

  • 连接到客户端时,使用适合客户端操作系统的 shutdown 命令。
  • 在主机上使用 virsh shutdown 命令:

    • 如果虚拟机位于本地主机上:

      # virsh shutdown demo-guest1
      Domain demo-guest1 is being shutdown
    • 如果虚拟机位于远程主机上,在本例中为 10.0.0.1:

      # virsh -c qemu+ssh://root@10.0.0.1/system shutdown demo-guest1
      
      root@10.0.0.1's password:
      Last login: Mon Feb 18 07:28:55 2019
      Domain demo-guest1 is being shutdown

要强制客户端关闭(例如,如果它已经变得不响应),请在主机中使用 virsh destroy 命令:

# virsh destroy demo-guest1
Domain demo-guest1 destroyed
注意

virsh destroy 命令并不实际删虚拟机配置或磁盘镜像。它只会销毁正在运行的虚拟机实例。然而,在个别情况下,这个命令可能会导致虚拟机文件系统崩溃,因此只有在其它所有关闭方法都失败时才建议使用 virsh destroy

2.5.2. 使用 web 控制台关闭和重启虚拟机

使用 RHEL 8 web 控制台,您可以关闭重启运行虚拟机。您还可以向无响应的虚拟机发送不可屏蔽中断。

2.5.2.1. 在 web 控制台中关闭虚拟机

如果虚拟机(VM)处于 running 状态,您可以使用 RHEL 8 web 控制台关闭它。

先决条件

流程

  1. Virtual Machines 界面中,点您要关闭的虚拟机行。

    行会展开,以显示有关所选虚拟机以及用于关闭和删除虚拟机的基本信息 Overview 窗格。

  2. Shut Down

    虚拟机关机。

故障排除

其它资源

2.5.2.2. 使用 web 控制台重启虚拟机

如果虚拟机(VM)处于 running 状态,您可以使用 RHEL 8 web 控制台重启它。

先决条件

流程

  1. Virtual Machines 接口中,点您要重新启动的虚拟机行。

    行会展开,以显示有关所选虚拟机以及用于关闭和删除虚拟机的基本信息 Overview 窗格。

  2. 重启

    虚拟机将关机并重启。

故障排除

其它资源

2.5.2.3. 使用 web 控制台向虚拟机发送不可屏蔽中断

发送不可屏蔽中断(NMI)可能会导致无响应运行的虚拟机(VM)响应或关闭。例如,您可以将 Ctrl+Alt+Del NMI 发送到不响应标准输入的虚拟机。

先决条件

流程

  1. Virtual Machines 接口中,点您要将 NMI 发送到的虚拟机行。

    行会展开,以显示有关所选虚拟机以及用于关闭和删除虚拟机的基本信息 Overview 窗格。

  2. Shut Down 按钮旁边的 Menu 按钮,然后选择 Send Non-skable Interrupt

    一个 NMI 发送到虚拟机。

其它资源

2.6. 删除虚拟机

要删除 Red Hat Enterprise Linux 8 中的虚拟机,使用 命令行界面web 控制台 GUI

2.6.1. 使用命令行界面删除虚拟机

要删除虚拟机(VM),您可以使用命令行从主机中删除它的 XML 配置和相关存储文件。按照以下步骤操作:

先决条件

  • 备份虚拟机中的重要数据。
  • 关闭虚拟机。
  • 确保没有其他虚拟机使用相同的关联的存储。

流程

  • 使用 virsh undefine 工具。

    例如:以下命令删除 guest1 虚拟机、与其关联的存储卷以及非电压 RAM(若有)。

    # virsh undefine guest1 --remove-all-storage --nvram
    Domain guest1 has been undefined
    Volume 'vda'(/home/images/guest1.qcow2) removed.

其它资源

  • 有关其他 virsh undefine 参数,请使用 virsh undefine --help 或查看 virsh man page。

2.6.2. 使用 web 控制台删除虚拟机

要从 RHEL 8 web 控制台连接的主机中删除虚拟机(VM)及其关联的存储文件,请按照以下步骤操作:

先决条件

  • 要使用 Web 控制台来管理虚拟机,请安装 Web 控制台虚拟机插件
  • 备份虚拟机中的重要数据。
  • 关闭虚拟机。
  • 确保没有其他虚拟机使用相同的关联的存储。

流程

  1. 虚拟机界面中,点击您要删除 的虚拟机的 Menu 按钮

    此时会出现一个下拉菜单,控制各种虚拟机操作。

    Cockpit VM 操作
  2. 删除

    此时会出现确认对话框。

    Cockpit vm delete 确认
  3. 可选: 要删除与虚拟机关联的所有或部分存储文件,请选择您要删除的存储文件旁的复选框。
  4. 删除

    虚拟机和任何选择的存储文件都将被删除。

第 3 章 在 IBM POWER 中使用虚拟化

您可以在 IBM POWER8 或 POWER9 硬件中使用 RHEL 8 虚拟化。但是,与 AMD64 和 Intel64 构架中的虚拟化相比,在您的系统中启用 KVM 虚拟机管理程序需要额外的步骤。某些 RHEL 8 虚拟化功能在 IBM POWER 中也具有 不同或受限的功能

除以下部分中的信息外,在 IBM POWER 中使用虚拟化与 AMD64 和 Intel64 相同。因此,您可以在 IBM POWER 中使用虚拟化时查看其他 RHEL 8 虚拟化文档。

3.1. 在 IBM POWER 中启用虚拟化

要在运行 RHEL 8 的 IBM POWER8 或 IBM POWER9 系统上设置 KVM 管理程序并创建虚拟机(VM),请按照以下步骤操作。

先决条件

  • RHEL 8 已安装并在主机中注册。
  • 有以下最小系统资源可用:

    • 主机有 6 GB 可用磁盘空间,以及每个预期的虚拟机需要额外 6 GB 空间。
    • 主机需要 2 GB RAM,以及每个预期的虚拟机需要额外 2 GB。
  • 您的 CPU 机器类型必须支持 IBM POWER 虚拟化。

    要验证这一点,请在您的 /proc/cpuinfo 文件中查询平台信息。

    # grep ^platform /proc/cpuinfo/
    platform        : PowerNV

    如果这个命令的输出中包含 PowerNV 条目,您将运行 PowerNV 机器类型,并可在 IBM POWER 中使用虚拟化。

流程

  1. 载入 KVM-HV 内核模块

    # modprobe kvm_hv
  2. 验证是否载入了 KVM 内核模块

    # lsmod | grep kvm

    如果成功载入 KVM,该命令的输出会包括 kvm_hv

  3. 在虚拟化模块中安装软件包:

    # yum module install virt
  4. 安装 virt-install 软件包:

    # yum install virt-install
  5. 启动 libvirtd 服务。

    # systemctl start libvirtd
  6. 确认您的系统已准备好成为虚拟化主机:

    # virt-host-validate
    [...]
    QEMU: Checking if device /dev/vhost-net exists                          : PASS
    QEMU: Checking if device /dev/net/tun exists                            : PASS
    QEMU: Checking for cgroup 'memory' controller support                   : PASS
    QEMU: Checking for cgroup 'memory' controller mount-point               : PASS
    [...]
    QEMU: Checking for cgroup 'blkio' controller support                    : PASS
    QEMU: Checking for cgroup 'blkio' controller mount-point                : PASS
    QEMU: Checking if IOMMU is enabled by kernel                            : PASS
  7. 如果所有 virt-host-validate 检查都返回 PASS 值,则代表您的系统已经准备好用于创建虚拟机

    如果有任何检查返回 FAIL 值,请按照显示的步骤解决相关问题。

    如果任何检查返回 WARN 值,请考虑根据显示内容改进虚拟化功能。

附加信息

  • 请注意:如果您的主机 CPU 不支持虚拟化,virt-host-validate 会生成以下输出:

    QEMU: Checking for hardware virtualization: FAIL (Only emulated CPUs are available, performance will be significantly limited)

    但是,在这样的主机系统中尝试创建虚拟机会失败,而不是存在性能问题。

3.2. IBM POWER 中的虚拟化与 AMD64 和 Intel 64 的不同

IBM POWER 系统中的 RHEL 8 虚拟化与 AMD64 和 Intel 64 系统中的 KVM 虚拟化在很多方面有所不同,特别是:

内存要求
IBM POWER 上的虚拟机消耗更多内存。因此,推荐在 IBM POWER 主机上为虚拟机(VM)分配最小内存为 2GB RAM。
显示协议

IBM POWER 系统不支持 SPICE 协议。要显示虚拟机的图形输出,请使用 VNC 协议。另外,只支持以下虚拟图形卡设备:

  • vga - 仅在 -vga std 模式中支持,不支持 -vga cirrus 模式。
  • virtio-vga
  • virtio-gpu
SMBIOOS
SMBIOS 配置不可用。
内存分配错误

POWER8 虚拟机(包括兼容模式虚拟机)可能会因为类似如下的错误而失败:

qemu-kvm: Failed to allocate KVM HPT of order 33 (try smaller maxmem?): Cannot allocate memory

这在使用 RHEL 7.3 及之前作为虚拟机操作系统的虚拟机上发生的可能性更大。

要解决这个问题,在主机内核命令行中添加 kvm_cma_resv_ratio=memory,为客户端散列页表(HPT)增加 CMA 内存池。其中 memory 是应该为 CMA 池保留的主机内存的百分比(默认为 5)。

巨页

透明巨页(THP)在 IBM POWER8 虚拟机上不提供任何显著的性能优势。但是 IBM POWER9 虚拟机可以如预期从 THP 中受益。

另外,IBM POWER8 系统中静态巨页的大小为 16 MiB 和 16 GiB,而 AMD64、Intel 64 和 IBM POWER9 上的 2 MiB 和 1 GiB 不同。因此,要将配置有静态巨页的虚拟机从 IBM POWER8 主机迁移到 IBM POWER9 主机,您必须首先在虚拟机上设置 1GiB 巨页。

kvm-clock
kvm-clock 服务不必为 IBM POWER9 的虚拟机中的时间管理配置。
pvpanic

IBM POWER9 系统不支持 pvpanic 设备。但是在这个构架中默认使用并激活等同的功能。要在虚拟机中启用它,使用带有 preserve 值的 <on_crash> XML 配置元素。

另外,请确定从 <devices> 部分中删除 <panic> 元素,因为它存在可能会导致虚拟机无法在 IBM POWER 系统中引导。

单线程主机
在 IBM POWER8 系统中,主机机器必须以 单线程模式 运行,才能支持虚拟机。如果安装了 qemu-kvm 软件包,则会自动进行配置。但是,在单线程主机上运行的虚拟机仍然可以使用多个线程。
外设设备

IBM POWER 系统中不支持在 AMD64 和 Intel 64 系统上支持很多外设设备,或者支持不同的设备替换。

  • 不支持用于 PCI-E 层次结构的设备,包括 ioh3420xio3130-downstream。这个功能由 spapr-pci-host-bridge 设备提供的多个独立 PCI 根桥接替代。
  • 不支持 UHCI 和 EHCI PCI 控制器。使用 OHCI 和 XHCI 控制器。
  • 不支持 IDE 设备,包括虚拟 IDE 光盘(ide-cd)和虚拟 IDE 磁盘(ide-hd)。使用 virtio-scsivirtio-blk 设备替代。
  • 不支持模拟 PCI NIC(rtl8139)。使用 virtio-net 设备替代。
  • 不支持包括 intel-hdahda-outputAC97 在内的声音设备。
  • 不支持 USB 重定向设备,包括 usb-redirusb-tablet
v2v 和 p2v
virt-v2vvirt-p2v 工具只在 AMD64 和 Intel 64 构架中被支持,且不在 IBM POWER 中提供。

其他资源

第 4 章 在 IBM Z 中使用虚拟化

您可以在 IBM Z 硬件中使用 RHEL 8 时使用 KVM 虚拟化。但是,与 AMD64 和 Intel 64 构架中的虚拟化相比,在您的系统中启用 KVM 虚拟机管理程序需要额外的步骤。某些 RHEL 8 虚拟化功能在 IBM Z 中也具有不同或受限的功能

除以下部分中的信息外,在 IBM Z 中使用虚拟化与 AMD64 和 Intel64 相同。因此,您可以在 IBM Z 中使用虚拟化时查看其他 RHEL 8 虚拟化文档。

4.1. 在 IBM Z 中启用虚拟化

要在运行 RHEL 8 的 IBM Z 系统上设置 KVM 管理程序并创建虚拟机(VM)请遵循以下步骤。

先决条件

  • RHEL 8 已安装并在主机中注册。
  • 有以下最小系统资源可用:

    • 主机有 6 GB 可用磁盘空间,以及每个预期的虚拟机需要额外 6 GB 空间。
    • 主机需要 2 GB RAM,以及每个预期的虚拟机需要额外 2 GB。
  • 您的 IBM Z 主机系统使用 z13 CPU 或更高版本。
  • RHEL 8 安装在逻辑分区(LPAR)上。另外,LPAR 支持 启动阶段执行(SIE)虚拟化功能。

    要验证这一点,请在 /proc/cpuinfo 文件中搜索 sie

    # grep sie /proc/cpuinfo/
    features        : esan3 zarch stfle msa ldisp eimm dfp edat etf3eh highgprs te sie

流程

  1. 载入 KVM 内核模块:

    # modprobe kvm
  2. 验证是否载入了 KVM 内核模块:

    # lsmod | grep kvm

    如果 KVM 成功加载,这个命令的输出会包括 kvm

  3. 删除系统已包含的任何已存在的虚拟化软件包和模块:

    # yum remove -y libvirt* qemu* @virt
    # yum module reset virt
  4. virt:av/common 模块中安装软件包:

    # yum module install virt:av/common
  5. 启动 libvirtd 服务。

    # systemctl start libvirtd
  6. 确认您的系统已准备好成为虚拟化主机:

    # virt-host-validate
    [...]
    QEMU: Checking if device /dev/kvm is accessible                : PASS
    QEMU: Checking if device /dev/vhost-net exists                 : PASS
    QEMU: Checking if device /dev/net/tun exists                   : PASS
    QEMU: Checking for cgroup 'memory' controller support          : PASS
    QEMU: Checking for cgroup 'memory' controller mount-point      : PASS
    [...]
  7. 如果所有 virt-host-validate 检查都返回 PASS 值,则代表您的系统已经准备好用于创建虚拟机

    如果有任何检查返回 FAIL 值,请按照显示的步骤解决相关问题。

    如果任何检查返回 WARN 值,请考虑根据显示内容改进虚拟化功能。

附加信息

  • 请注意:如果您的主机 CPU 不支持虚拟化,virt-host-validate 会生成以下输出:

    QEMU: Checking for hardware virtualization: FAIL (Only emulated CPUs are available, performance will be significantly limited)

    但是,在这样的主机系统中尝试创建虚拟机会失败,而不是存在性能问题。

4.2. IBM Z 上的虚拟化与 AMD64 和 Intel 64 有什么不同

IBM Z 系统中的 RHEL 8 虚拟化与 AMD64 和 Intel 64 系统的 KVM 不同,如下:

PCI 和 USB 设备

IBM Z 不支持虚拟 PCI 和 USB 设备。这也意味着 virtio-*-pci 设备不受支持,应当使用 virtio-*-ccw 设备。例如,使用 virtio-net-ccw 而不是 virtio-net-pci

请注意,支持直接附加 PCI 设备(也称 PCI 透传)。

支持的客户端操作系统
如果它们使用 RHEL 7 或 RHEL 8 作为客户机操作系统,红帽只支持在 IBM Z 上托管的虚拟机。
设备引导顺序

IBM Z 不支持 <boot dev='device'> XML 配置元素。要定义设备引导顺序,使用 XML 的 <devices> 部分中的 <boot order='number'> 元素。例如:

<disk type='file' device='disk'>
  <driver name='qemu' type='qcow2'/>
  <source file='/path/to/qcow2'/>
  <target dev='vda' bus='virtio'/>
  <address type='ccw' cssid='0xfe' ssid='0x0' devno='0x0000'/>
  <boot order='2'>
</disk>
注意

使用 <boot order='number'> 进行引导顺序管理,这在 AMD64 和 Intel 64 主机中是首选的。

内存热插拔
在 IBM Z 上无法将内存添加到正在运行的虚拟机。请注意,在 IBM Z 上,以及 AMD64 和 Intel64 上,从正在运行的虚拟机(内存热插拔)中不可能删除内存。
NUMA 拓扑
IBM Z 上的 libvirt 不支持 CPU 的非统一内存访问(NUMA)拓扑。因此,在这些系统中无法使用 NUMA 调整 vCPU 性能。
vfio-ap
IBM Z 主机上的虚拟机可以使用 vfio-ap 加密设备透传,其它架构都不支持它。
SMBIOOS
IBM Z 不提供 SMBIOS 配置。
watchdog 设备

如果在 IBM Z 主机上使用 VM 中的 watchdog 设备,请使用 diag288 模型。例如:

<devices>
  <watchdog model='diag288' action='poweroff'/>
</devices>
kvm-clock
kvm-clock 服务专用于 AMD64 和 Intel 64 系统,且不必为 IBM Z 中的虚拟机时间管理配置。
v2v 和 p2v
virt-v2vvirt-p2v 工具只在 AMD64 和 Intel 64 构架中被支持,且不在 IBM Z 中提供。
嵌套虚拟化
创建嵌套虚拟机需要在 IBM Z 上进行与 AMD64 和 Intel64 的不同设置。详情请查看 第 18 章 创建嵌套虚拟机
之前的版本中没有图形输出
当在主机上使用 RHEL 8.3 或更早的次版本时,当使用 VNC 协议连接到虚拟机时,无法显示 VM 图形输出。这是因为 IBM Z 上的早期 RHEL 版本不支持 gnome-desktop 工具程序。另外,SPICE 显示协议无法在 IBM Z 上工作。

其它资源

第 5 章 在 web 控制台中管理虚拟机

在 RHEL 8 web 控制台中管理您的虚拟机,并了解虚拟化管理功能。

要在 RHEL 8 主机上的图形界面管理虚拟机,您可以在 RHEL 8 web 控制台 中使用 Virtual Machines 窗格。

Web 控制台概述

5.1. 使用 web 控制台管理虚拟机概述

RHEL 8 web 控制台是一个用于系统管理的基于 web 的界面。作为其功能之一,Web 控制台提供主机系统中虚拟机(VM)的图形视图,并可创建、访问和配置这些虚拟机。

请注意,要使用 Web 控制台在 RHEL 8 上管理虚拟机,您必须首先为虚拟化安装 web 控制台插件

后续步骤

5.2. 设置 web 控制台以管理虚拟机

在使用 RHEL 8 web 控制台管理虚拟机(VM)之前,您必须在主机上安装 web 控制台虚拟机插件。

先决条件

  • 确保机器上安装并启用了 Web 控制台。

    # systemctl status cockpit.socket
    cockpit.socket - Cockpit Web Service Socket
    Loaded: loaded (/usr/lib/systemd/system/cockpit.socket
    [...]

    如果这个命令返回 Unit cockpit.socket could not be found,请按照安装 Web 控制台文档启用 Web 控制台。

流程

  • 安装 cockpit-machines 插件。

    # yum install cockpit-machines

验证

  • 如果安装成功,Virtual Machines 会出现在 web 控制台侧菜单中。

    cockpit 虚拟机信息

其它资源

5.3. web 控制台中提供的虚拟机管理功能

使用 RHEL 8 web 控制台,您可以执行以下操作来管理系统中的虚拟机(VM)。

表 5.1. RHEL 8 web 控制台中执行的虚拟机管理任务

5.4. 虚拟机管理器和 web 控制台中虚拟化功能的不同

RHEL 8 支持虚拟机管理器(virt-manager)应用程序,但已弃用。Web 控制台旨在在以后的主发行版本中替换。因此,建议您熟悉通过 web 控制台使用 GUI 管理虚拟化。

但是在 RHEL 8 中,一些虚拟机管理任务只能在 virt-manager 或命令行中执行。下表主要介绍 virt-manager 中可用但没有在 RHEL 8.0 web 控制台中提供的功能。

如果一个功能在以后的 RHEL 8 次版本中可用,Web 控制台引入栏中会显示最小 RHEL 8 版本。

表 5.2. 在 RHEL 8.0 中,无法通过 Web 控制台执行的虚拟机管理任务

任务引入的 Web 控制台支持使用 CLI 的替代方法

将虚拟机设置为在主机引导时启动

RHEL 8.1

virsh autostart

挂起虚拟机

RHEL 8.1

virsh suspend

恢复挂起的虚拟机

RHEL 8.1

virsh resume

创建文件系统目录存储池

RHEL 8.1

virsh pool-define-as

创建 NFS 存储池

RHEL 8.1

virsh pool-define-as

创建物理磁盘设备存储池

RHEL 8.1

virsh pool-define-as

创建 LVM 卷组存储池

RHEL 8.1

virsh pool-define-as

创建基于分区的存储池

当前不可用

virsh pool-define-as

创建基于 GlusterFS 的存储池

当前不可用

virsh pool-define-as

使用 SCSI 设备创建基于 vHBA 的存储池

当前不可用

virsh pool-define-as

创建基于多路径的存储池

当前不可用

virsh pool-define-as

创建基于 RBD 的存储池

当前不可用

virsh pool-define-as

创建新存储卷

RHEL 8.1

virsh vol-create

添加一个新的虚拟网络

RHEL 8.1

virsh net-createvirsh net-define

删除虚拟网络

RHEL 8.1

virsh net-undefine

从主机机器接口创建到虚拟机的桥接

当前不可用

virsh iface-bridge

创建快照

当前不可用

virsh snapshot-create-as

恢复到快照

当前不可用

virsh snapshot-revert

删除快照

当前不可用

virsh snapshot-delete

克隆虚拟机

当前不可用

virt-clone

将虚拟机迁移到另一台主机机器中

当前不可用

virsh migrate

其它资源

第 6 章 查看有关虚拟机的信息

当需要在 RHEL 8 中调整或排除虚拟化部署的任何方面时,您需要执行的第一个步骤通常是查看有关虚拟机当前状态和配置的信息。要做到这一点,您可以使用 命令行界面Web 控制台。您还可以查看虚拟机 XML 配置中的信息。

6.1. 使用命令行界面查看虚拟机信息

要检索主机上虚拟机(VM)的信息,请使用以下一个或多个命令。

流程

  • 获取主机上的虚拟机列表:

    # virsh list --all
    Id   Name              State
    ----------------------------------
    1    testguest1             running
    -    testguest2             shut off
    -    testguest3             shut off
    -    testguest4             shut off
  • 要获取有关特定虚拟机的基本信息:

    # virsh dominfo testguest1
    Id:             1
    Name:           testguest1
    UUID:           a973666f-2f6e-415a-8949-75a7a98569e1
    OS Type:        hvm
    State:          running
    CPU(s):         2
    CPU time:       188.3s
    Max memory:     4194304 KiB
    Used memory:    4194304 KiB
    Persistent:     yes
    Autostart:      disable
    Managed save:   no
    Security model: selinux
    Security DOI:   0
    Security label: system_u:system_r:svirt_t:s0:c486,c538 (enforcing)
  • 要获得特定虚拟机的完整 XML 配置:

    # virsh dumpxml testguest2
    
    <domain type='kvm' id='1'>
      <name>testguest2</name>
      <uuid>a973434f-2f6e-4ěša-8949-76a7a98569e1</uuid>
      <metadata>
    [...]
  • 有关虚拟机磁盘和其它块设备的详情:

    # virsh domblklist testguest3
     Target   Source
    ---------------------------------------------------------------
     vda      /var/lib/libvirt/images/testguest3.qcow2
     sda      -
     sdb      /home/username/Downloads/virt-p2v-1.36.10-1.el7.iso

    有关管理虚拟机存储的步骤,请参阅 第 11 章 为虚拟机管理存储

  • 要获取有关虚拟机文件系统及其挂载点的信息:

    # virsh domfsinfo testguest3
    Mountpoint   Name   Type   Target
    ------------------------------------
     /            dm-0   xfs
     /boot        vda1   xfs
  • 要获取有关特定虚拟机 vCPU 的详细信息:

    # virsh vcpuinfo testguest4
    VCPU:           0
    CPU:            3
    State:          running
    CPU time:       103.1s
    CPU Affinity:   yyyy
    
    VCPU:           1
    CPU:            0
    State:          running
    CPU time:       88.6s
    CPU Affinity:   yyyy

    要在虚拟机中配置和优化 vCPU,请参阅 第 16.5 节 “优化虚拟机 CPU 性能”

  • 列出主机上的所有虚拟网络接口:

    # virsh net-list --all
     Name       State    Autostart   Persistent
    ---------------------------------------------
     default    active   yes         yes
     labnet     active   yes         yes

    有关特定接口的详情:

    # virsh net-info default
    Name:           default
    UUID:           c699f9f6-9202-4ca8-91d0-6b8cb9024116
    Active:         yes
    Persistent:     yes
    Autostart:      yes
    Bridge:         virbr0

    有关网络接口、虚拟机网络和配置它们的说明,请参阅 第 13 章 配置虚拟机网络连接

  • 有关查看主机上存储池和存储卷的详情,请参考 第 11.2.1 节 “使用 CLI 查看虚拟机存储信息”

6.2. 使用 web 控制台查看虚拟机信息

使用 RHEL 8 web 控制台,您可以查看与 web 控制台连接的虚拟存储和虚拟机的信息。

6.2.1. 在 web 控制台中查看虚拟化概述

以下流程描述了如何查看虚拟机(VM)以及 web 控制台会话连接的可用虚拟存储概述。

先决条件

流程

  • 在 web 控制台侧菜单中点击 Virtual Machines

    此时会出现一个对话框,其中包含有关可用存储以及 Web 控制台连接的虚拟机的信息。

cockpit 虚拟机信息

该信息包括:

  • 存储池 - 可通过 web 控制台访问的存储池数及其状态。
  • 网络 - Web 控制台及其状态可访问的网络数量。
  • Name - 虚拟机的名称。
  • 连接 - libvirt 连接、系统或者会话的类型。
  • State - 虚拟机的状态。

其它资源

6.2.2. 使用 Web 控制台查看存储池信息

以下流程描述了如何查看 web 控制台会话可访问的虚拟机(VM)存储池的详细存储池信息。

先决条件

流程

  1. Virtual Machines 接口顶部的 Storage Pools。此时会出现存储池窗口,显示配置的存储池列表。

    Web 控制台存储池窗口

    该信息包括:

    • 名称 - 存储池的名称。
    • 大小 - 存储池的大小。
    • connection - 用于访问存储池的连接。
    • State - 存储池的状态。
  2. 点击您要查看的存储行。

    行会展开,并包含以下有关所选存储池的信息的 Overview 窗格:

    • Path - 存储池的路径。
    • persistent - 存储池是否持久。
    • autostart - 是否自动启动存储池。
    • 类型 - 存储池的类型。
    Web 控制台存储池概述
  3. 要查看从存储池中创建的存储卷列表,请点存储卷

    此时会出现 Storage Volumes 窗格,显示配置的存储卷的大小以及使用的空间量。

    Web 控制台存储池存储卷

其它资源

6.2.3. 在 web 控制台中查看基本虚拟机信息

下面描述了如何查看 web 控制台会话连接到的所选虚拟机(VM)的基本信息。

先决条件

流程

  1. 在 web 控制台侧菜单中点击 Virtual Machines
  2. 点击您要查看信息的虚拟机行。

    行会展开,以显示有关所选虚拟机以及用于关闭和删除虚拟机的基本信息 Overview 窗格。

  3. 如果选择了另一个标签页,点 Overview

    cockpit 基本虚拟机信息

该信息包括以下常规虚拟机详情:

  • 内存 - 分配给虚拟机的内存量。
  • vCPU - 为虚拟机配置的虚拟 CPU 数量。
  • CPU 类型 - 为虚拟机配置的虚拟 CPU 的构架。
  • 启动顺序 - 为虚拟机配置的引导顺序。
  • autostart - 是否为虚拟机启用自动启动。

该信息还包括以下管理程序详情:

  • 模拟的机器 - 虚拟机模拟的机器类型。
  • 固件 - 虚拟机的固件。

其它资源

6.2.4. 在 web 控制台中查看虚拟机资源使用情况

以下流程描述了如何查看 web 控制台会话连接的所选虚拟机(VM)的内存和虚拟 CPU 用量信息。

先决条件

流程

  1. Virtual Machines 界面中,点您要查看信息的虚拟机行。

    行会展开,以显示有关所选虚拟机以及用于关闭和删除虚拟机的基本信息 Overview 窗格。

  2. Usage

    此时会出现 Usage 窗格,其中包含有关虚拟机内存和虚拟 CPU 用量的信息。

Cockpit 资源使用量

其它资源

6.2.5. 在 web 控制台中查看虚拟机磁盘信息

以下流程描述了如何查看 web 控制台会话连接到的虚拟机(VM)的磁盘信息。

先决条件

要使用 Web 控制台来管理虚拟机,请安装 Web 控制台虚拟机插件

流程

  1. 点击您要查看信息的虚拟机行。

    行会展开,以显示有关所选虚拟机以及用于关闭和删除虚拟机的基本信息 Overview 窗格。

  2. Disks

    Disks 窗格会出现有关分配给虚拟机的磁盘的信息。

Cockpit 磁盘信息

该信息包括:

  • 设备 - 该磁盘的设备类型。
  • 使用的 - 使用的磁盘大小。
  • Capacity - 磁盘的大小。
  • 总线 - 磁盘的总线类型。
  • access - 磁盘是可写入还是只读。
  • Source - 磁盘设备或者文件。

其它资源

6.2.6. 在 web 控制台中查看和编辑虚拟网络接口信息

使用 RHEL 8 web 控制台,您可以在所选虚拟机(VM)上查看和修改虚拟网络接口:

先决条件

流程

  1. Virtual Machines 界面中,点您要查看信息的虚拟机行。

    行会展开,以显示有关所选虚拟机以及用于关闭和删除虚拟机的基本信息 Overview 窗格。

  2. Network Interfaces

    Networks Interfaces 窗格会出现,其中包含为虚拟机配置的虚拟网络接口的信息。

    cockpit vNIC 信息

    该信息包括:

    • 类型 - 虚拟机的网络接口类型。类型包括虚拟网络、网桥到 LAN 以及直接附加。

      注意

      RHEL 8.2 不支持通用以太网连接。

    • 型号类型 - 虚拟网络接口的型号。
    • MAC 地址 - 虚拟网络接口的 MAC 地址。
    • IP 地址 - 虚拟网络接口的 IP 地址。
    • Source - 网络接口源。这取决于网络类型。
    • State - 虚拟网络接口的状态。
  3. 要编辑虚拟网络接口设置,请点 Edit。此时会打开「虚拟网络接口设置」对话框。

    Web 控制台虚拟网络,如果设置
  4. 更改接口类型、源或型号。
  5. Save。已修改网络接口。

    注意

    对虚拟网络接口设置的更改仅在重启虚拟机后生效。

其它资源

6.3. 虚拟机 XML 配置示例

虚拟机的 XML 配置(也称为 域 XML )决定虚拟机的设置和组件。下表显示了虚拟机(VM)的 XML 配置示例并解释了其内容。

要获得虚拟机的 XML 配置,您可以使用 virsh dumpxml 命令以及虚拟机的名称。

# virsh dumpxml testguest1

表 6.1. XML 配置示例

域 XML 部分描述
<domain type='kvm'>
 <name>Testguest1</name>
 <uuid>ec6fbaa1-3eb4-49da-bf61-bb02fbec4967</uuid>
 <memory unit='KiB'>1048576</memory>
 <currentMemory unit='KiB'>1048576</currentMemory>

这是一个名为 Testguest1 的 KVM 虚拟机,内存为 1024 MiB。

 <vcpu placement='static'>1</vcpu>

虚拟机被分配为单个虚拟 CPU(vCPU)。

有关配置 vCPU 的详情,请参考 第 16.5 节 “优化虚拟机 CPU 性能”

 <os>
  <type arch='x86_64' machine='pc-q35-4.1'>hvm</type>
  <boot dev='hd'/>
 </os>

机器构架被设置为 AMD64 和 Intel 64 架构,并使用 Intel Q35 机器类型来决定功能兼容性。将该操作系统设定为从硬盘引导。

有关使用安装的操作系统创建虚拟机的详情,请参考 第 2.2.2 节 “使用 web 控制台创建虚拟机并安装客户端操作系统”

 <features>
  <acpi/>
  <apic/>
  <vmport state='off'/>
 </features>

acpiapic 监控程序功能被禁用,并关闭 VMWare IO 端口。

 <cpu mode='host-model' check='partial'>

功能 XML(可以使用 virsh capabilities 获得)中的主机 CPU 定义会自动复制到虚拟机 XML 配置中。因此,当虚拟机引导时,libvirt 会选择类似主机 CPU 的 CPU 模型,然后尽可能向大约主机模型添加额外的功能。

 <clock offset='utc'>
  <timer name='rtc' tickpolicy='catchup'/>
  <timer name='pit' tickpolicy='delay'/>
  <timer name='hpet' present='no'/>
 </clock>

VM 的虚拟硬件时钟使用 UTC 时区。另外,设置了三个不同的计时器以便与 QEMU 管理程序同步。

 <on_poweroff>destroy</on_poweroff>
 <on_reboot>restart</on_reboot>
 <on_crash>destroy</on_crash>

当虚拟机关闭或者其操作系统意外终止时,libvirt 会终止虚拟机并释放其分配的所有资源。当虚拟机被重启时,libvirt 会使用相同的配置重启它。

 <pm>
  <suspend-to-mem enabled='no'/>
  <suspend-to-disk enabled='no'/>
 </pm>

这个虚拟机禁用 S3 和 S4 ACPI 睡眠状态。

 <devices>
  <emulator>/usr/bin/qemu-kvm</emulator>
  <disk type='file' device='disk'>
   <driver name='qemu' type='qcow2'/>
   <source file='/var/lib/libvirt/images/Testguest.qcow2'/>
   <target dev='hda' bus='ide'/>
   <address type='drive' controller='0' bus='0' target='0' unit='0'/>
  </disk>
  <disk type='file' device='cdrom'>
   <driver name='qemu' type='raw'/>
   <target dev='hdb' bus='ide'/>
   <readonly/>
   <address type='drive' controller='0' bus='0' target='0' unit='1'/>
  </disk>

虚拟机使用 /usr/bin/qemu-kvm 二进制文件模拟。另外,它连接了两个磁盘。第一个磁盘是基于主机上存储的 /var/lib/libvirt/images/Testguest.qcow2 的虚拟硬盘,其逻辑设备名称被设置为 hda

  <controller type='usb' index='0' model='qemu-xhci' ports='15'>
   <address type='pci' domain='0x0000' bus='0x02' slot='0x00' function='0x0'/>
  </controller>
  <controller type='sata' index='0'>
   <address type='pci' domain='0x0000' bus='0x00' slot='0x1f' function='0x2'/>
  </controller>
  <controller type='pci' index='0' model='pcie-root'/>
  <controller type='pci' index='1' model='pcie-root-port'>
   <model name='pcie-root-port'/>
   <target chassis='1' port='0x10'/>
    <address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x0' multifunction='on'/>
  </controller>
  <controller type='pci' index='2' model='pcie-root-port'>
   <model name='pcie-root-port'/>
   <target chassis='2' port='0x11'/>
    <address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x1'/>
  </controller>
  <controller type='pci' index='3' model='pcie-root-port'>
   <model name='pcie-root-port'/>
   <target chassis='3' port='0x12'/>
    <address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x2'/>
  </controller>
  <controller type='pci' index='4' model='pcie-root-port'>
   <model name='pcie-root-port'/>
   <target chassis='4' port='0x13'/>
    <address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x3'/>
  </controller>
  <controller type='pci' index='5' model='pcie-root-port'>
   <model name='pcie-root-port'/>
   <target chassis='5' port='0x14'/>
     <address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x4'/>
  </controller>
  <controller type='pci' index='6' model='pcie-root-port'>
   <model name='pcie-root-port'/>
   <target chassis='6' port='0x15'/>
    <address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x5'/>
  </controller>
  <controller type='pci' index='7' model='pcie-root-port'>
   <model name='pcie-root-port'/>
   <target chassis='7' port='0x16'/>
   <address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x6'/>
  </controller>
  <controller type='virtio-serial' index='0'>
   <address type='pci' domain='0x0000' bus='0x03' slot='0x00' function='0x0'/>
  </controller>

VM 使用单个控制器来附加 USB 设备,而用于 PCI-Express(PCIe)设备的根控制器。另外,virtio-serial 控制器可用,它可让虚拟机以各种方式与主机交互,如串行控制台。

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

 <interface type='network'>
  <mac address='52:54:00:65:29:21'/>
  <source network='default'/>
  <model type='rtl8139'/>
  <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/>
 </interface>

在虚拟机中设置了网络接口,它使用 default 虚拟网络和 rtl8139 网络设备模型。

有关配置网络接口的详情,请参考 第 16.6 节 “优化虚拟机网络性能”

  <serial type='pty'>
   <target type='isa-serial' port='0'>
    <model name='isa-serial'/>
   </target>
  </serial>
  <console type='pty'>
   <target type='serial' port='0'/>
  </console>
  <channel type='unix'>
   <target type='virtio' name='org.qemu.guest_agent.0'/>
   <address type='virtio-serial' controller='0' bus='0' port='1'/>
  </channel>
  <channel type='spicevmc'>
   <target type='virtio' name='com.redhat.spice.0'/>
    <address type='virtio-serial' controller='0' bus='0' port='2'/>
  </channel>

在虚拟机上设置了一个 pty 串行控制台,它可启用与主机的不便虚拟机通信。控制台在端口 1 中使用 UNIX 频道,在端口 2 中使用半虚拟 SPICE。这个设置是自动设置的,我们不推荐修改这些设置。

有关与虚拟机交互的更多信息,请参阅 第 2.4.1 节 “使用 web 控制台与虚拟机交互”

  <input type='tablet' bus='usb'>
   <address type='usb' bus='0' port='1'/>
  </input>
  <input type='mouse' bus='ps2'/>
  <input type='keyboard' bus='ps2'/>

虚拟机使用虚拟 usb 端口,该端口设定为接收表格输入,并设置了一个虚拟 ps2 端口以接收鼠标和键盘输入。这个设置是自动设置的,我们不推荐修改这些设置。

  <graphics type='spice' autoport='yes' listen='127.0.0.1'>
   <listen type='address' address='127.0.0.1'/>
   <image compression='off'/>
  </graphics>
  <graphics type='vnc' port='-1' autoport='yes' listen='127.0.0.1'>
   <listen type='address' address='127.0.0.1'/>
  </graphics>

虚拟机使用 vncSPICE 协议渲染其图形输出,并且关闭镜像压缩。

  <sound model='ich6'>
   <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x0'/>
  </sound>
  <video>
   <model type='qxl' ram='65536' vram='65536' vgamem='16384' heads='1' primary='yes'/>
   <address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x0'/>
  </video>

为虚拟机设置了一个 ICH6 HDA 声音设备,,QEMU QXL 半虚拟帧缓冲设备被设置为视频加速器。这个设置是自动设置的,我们不推荐修改这些设置。

  <redirdev bus='usb' type='spicevmc'>
   <address type='usb' bus='0' port='1'/>
  </redirdev>
  <redirdev bus='usb' type='spicevmc'>
   <address type='usb' bus='0' port='2'/>
  </redirdev>
  <memballoon model='virtio'>
   <address type='pci' domain='0x0000' bus='0x00' slot='0x07' function='0x0'/>
  </memballoon>
 </devices>
</domain>

虚拟机有两个重新目录来远程附加 USB 设备,打开内存 ballooning。这个设置是自动设置的,我们不推荐修改这些设置。

第 7 章 保存和恢复虚拟机

要释放系统资源,您可以关闭该系统中运行的虚拟机(VM)。然而,当您再次需要虚拟机时,您必须引导客户端操作系统(OS)并重启应用程序,这可能需要大量时间。要减少这个停机时间并让虚拟机工作负载更早开始运行,您可以使用保存和恢复功能来完全避免操作系统关闭和引导序列。

本节提供有关保存虚拟机的信息,以及在没有完全引导虚拟机的情况下将虚拟机恢复到同一状态的信息。

7.1. 保存和恢复虚拟机的工作方式

保存虚拟机(VM)会将其内存和设备状态保存到主机的磁盘中,并立即停止虚拟机进程。您可以保存处于运行状态或暂停状态的虚拟机,在恢复后,虚拟机将返回到那个状态。

这个过程释放了主机系统中的 RAM 和 CPU 资源以交换磁盘空间,这样可提高主机系统的性能。当虚拟机被恢复时,因为不需要引导客户机操作系统,也避免使用较长的启动周期。

要保存虚拟机,您可以使用命令行界面(CLI)。具体步骤请参阅使用命令行界面保存虚拟机

要恢复虚拟机,您可以使用 CLIWeb 控制台 GUI

7.2. 使用命令行界面保存虚拟机

要使用命令行保存虚拟机,请按照以下步骤执行。

先决条件

  • 确保有足够的磁盘空间来保存虚拟机及其配置。请注意,虚拟机消耗的空间取决于分配给该虚拟机的 RAM 量。
  • 确保虚拟机具有持久性。
  • 可选: 根据需要备份虚拟机中的重要数据。

流程

  • 使用 virsh managedsave 工具。

    例如,以下命令可停止 demo-guest1 虚拟机并保存其配置。

    # virsh managedsave demo-guest1
    Domain demo-guest1 saved by libvirt

    保存的虚拟机文件默认位于 /var/lib/libvirt/qemu/save 目录中,即 demo-guest1.save

    下次启动虚拟机时,它将自动从上述文件中恢复保存的状态。

验证

  • 您可以确保虚拟机处于保存的状态,或使用 virsh list 实用程序关闭。

    要列出已启用了保存的受管虚拟机,请使用以下命令。列为 saved 的虚拟机启用了受管保存。

    # virsh list --managed-save --all
    Id    Name                           State
    ----------------------------------------------------
    -     demo-guest1                    saved
    -     demo-guest2                    shut off

    列出具有受管保存镜像的虚拟机:

    # virsh list --with-managed-save --all
    Id    Name                           State
    ----------------------------------------------------
    -     demo-guest1                    shut off

    请注意,要列出处于关闭状态的保存的虚拟机,则必须使用 --all--inactive 选项。

故障排除

  • 如果保存的虚拟机文件变得损坏或不可读,恢复虚拟机将启动标准虚拟机引导。

其它资源

7.3. 使用命令行界面启动虚拟机

您可以使用命令行界面启动关闭虚拟机(VM)或恢复保存的虚拟机。按照以下步骤操作。

先决条件

  • 已定义的一个不活跃地虚拟机。
  • 虚拟机的名称。
  • 对于远程虚拟机:

    • 虚拟机所在主机的 IP 地址。
    • 对主机的 root 访问权限。

流程

  • 对于本地虚拟机,使用 virsh start 工具。

    例如,以下命令启动 demo-guest1 虚拟机。

    # virsh start demo-guest1
    Domain demo-guest1 started
  • 对于位于远程主机上的虚拟机,使用 virsh start 工具以及到主机的 QEMU+SSH 连接。

    例如,以下命令在 192.168.123.123 主机上启动 demo-guest1 虚拟机。

    # virsh -c qemu+ssh://root@192.168.123.123/system start demo-guest1
    
    root@192.168.123.123's password:
    Last login: Mon Feb 18 07:28:55 2019
    
    Domain demo-guest1 started

其它资源

  • 对于更多 virsh start 参数,请使用 virsh start --help
  • 有关简化远程主机上的虚拟机管理,请参阅修改 libvirt 和 SSH 配置
  • 您可以使用 virsh autostart 工具配置虚拟机,以便在主机引导时自动启动。有关 autostart 的详情请参考 virsh autostart 帮助页。

7.4. 使用 web 控制台启动虚拟机

如果虚拟机(VM)处于关闭状态,您可以使用 RHEL 8 web 控制台启动它。

先决条件

流程

  1. Virtual Machines 接口中,点您要启动的虚拟机行。

    行会展开,以显示有关所选虚拟机以及用于关闭和删除虚拟机的基本信息 Overview 窗格。

  2. Run

    虚拟机启动,您可以连接到其控制台或图形输出

  3. 可选:要将虚拟机设置为在主机启动时自动启动,点 Autostart 复选框。

其它资源

第 8 章 克隆虚拟机

要使用特定属性集合快速创建新虚拟机,您可以克隆现有虚拟机。

克隆会创建一个使用其自身磁盘镜像保存存储的新虚拟机,但大多数克隆的配置和源虚拟机的数据都是一样的。这样就可以准备很多虚拟机来满足特定的任务,而无需单独优化每个虚拟机。

8.1. 克隆虚拟机的方式

克隆虚拟机会复制源虚拟机及其磁盘镜像的 XML 配置,并对配置进行修改以确保新虚拟机的唯一性。这包括更改虚拟机的名称,并确保它使用磁盘镜像克隆。存储在克隆的虚拟磁盘上的数据与源虚拟机是一致的。

这个过程比创建新虚拟机要快,并使用客户端操作系统安装它,并可用于快速生成带有特定配置和内容的虚拟机。

如果您计划为虚拟机创建多个克隆,首先请创建一个不包含以下内容的虚拟机模板

  • 唯一设置,如持久性网络 MAC 配置,这可阻止克隆正常工作。
  • 敏感数据,如 SSH 密钥和密码文件。

具体步骤请查看 第 8.2 节 “创建虚拟机模板”

要克隆虚拟机,您可以使用 RHEL 8 CLI。详情请查看 第 8.3 节 “使用命令行界面克隆虚拟机”

8.2. 创建虚拟机模板

为确保虚拟机克隆正确运行,请在克隆源虚拟机前删除源虚拟机独有的信息和配置,如 SSH 密钥或持久性网络 MAC 配置。

这会创建一个虚拟机模板,可用于轻松和安全地创建虚拟机克隆。

先决条件

  • virt-sysprep 工具安装在您的主机上:

    # yum install /usr/bin/virt-sysprep
  • 用作模板的虚拟机将被关闭。
  • 您必须知道源虚拟机的磁盘镜像位于哪里,并且需要是虚拟机磁盘镜像文件的拥有者。

    请注意,在 libvirt 系统会话中创建的虚拟机磁盘镜像默认位于 /var/lib/libvirt/images 目录中,并由 root 用户拥有:

    # ls -la /var/lib/libvirt/images
    -rw-------.  1 root root  9665380352 Jul 23 14:50 a-really-important-vm.qcow2
    -rw-------.  1 root root  8591507456 Jul 26  2017 an-actual-vm-that-i-use.qcow2
    -rw-------.  1 root root  8591507456 Jul 26  2017 totally-not-a-fake-vm.qcow2
    -rw-------.  1 root root 10739318784 Sep 20 17:57 another-vm-example.qcow2
  • 可选: 虚拟机磁盘上的所有重要数据都已备份。如果要保留源虚拟机,请首先克隆它,并编辑克隆以创建模板。

流程

  1. 确保您已作为虚拟机磁盘镜像的所有者登录:

    # whoami
    root
  2. 可选: 复制虚拟机的磁盘镜像。

    # cp /var/lib/libvirt/images/a-really-important-vm.qcow2 /var/lib/libvirt/images/a-really-important-vm-original.qcow2

    这用于验证虚拟机被成功转换为模板。

  3. 使用以下命令,将 /var/lib/libvirt/images/a-really-important-vm.qcow2 替换为源虚拟机磁盘镜像的路径。

    # virt-sysprep -a /var/lib/libvirt/images/a-really-important-vm.qcow2
    [   0.0] Examining the guest ...
    [   7.3] Performing "abrt-data" ...
    [   7.3] Performing "backup-files" ...
    [   9.6] Performing "bash-history" ...
    [   9.6] Performing "blkid-tab" ...
    [...]

验证

  • 要确认进程成功,请将修改的磁盘镜像与原始镜像进行比较。以下示例显示了成功创建模板:

    # virt-diff -a /var/lib/libvirt/images/a-really-important-vm-orig.qcow2 -A /var/lib/libvirt/images/a-really-important-vm.qcow2
    - - 0644       1001 /etc/group-
    - - 0000        797 /etc/gshadow-
    = - 0444         33 /etc/machine-id
    [...]
    - - 0600        409 /home/username/.bash_history
    - d 0700          6 /home/username/.ssh
    - - 0600        868 /root/.bash_history
    [...]

其它资源

  • 使用如上所示的 virt-sysprep 命令来执行标准虚拟机模板准备。如需更多信息,请参阅 OPERATIONS man page 中的 virt-sysprep 部分。

    要自定义您要 virt-sysprep 执行的特定操作,使用 --operations 选项,并将计划操作指定为用逗号分开的列表。

  • 有关克隆虚拟机模板的步骤,请参阅 第 8.3 节 “使用命令行界面克隆虚拟机”

8.3. 使用命令行界面克隆虚拟机

要使用特定属性集(如为测试目的)快速创建新虚拟机,您可以克隆现有的虚拟机。要使用 CLI 完成此操作,请遵循以下步骤。

先决条件

  • 源虚拟机被关闭。
  • 确保有足够的磁盘空间来存储克隆的磁盘镜像。
  • 可选: 在创建多个虚拟机克隆时,从源虚拟机中删除唯一数据和设置,以确保克隆的虚拟机正常工作。具体步骤请查看 第 8.2 节 “创建虚拟机模板”

流程

  1. 使用 virt-clone 工具以及适合您的环境和用例的选项。

    使用案例示例

    • 以下命令克隆一个名为 doppelganger 的本地虚拟机 ,并创建 doppelganger-clone 虚拟机。它还在与原始虚拟机磁盘镜像相同的位置,使用相同的数据创建 doppelganger-clone.qcow2 磁盘镜像:

      # virt-clone --original doppelganger --auto-clone
      Allocating 'doppelganger-clone.qcow2'                            | 50.0 GB  00:05:37
      
      Clone 'doppelganger-clone' created successfully.
    • 以下命令克隆一个名为 geminus1 的虚拟机,并创建一个名为 geminus2 的本地虚拟机,它只使用 geminus1的多个磁盘中的两个。

      # virt-clone --original geminus1 --name geminus2 --file /var/lib/libvirt/images/disk1.qcow2 --file /var/lib/libvirt/images/disk2.qcow2
      Allocating 'disk1-clone.qcow2'                                      | 78.0 GB  00:05:37
      Allocating 'disk2-clone.qcow2'                                      | 80.0 GB  00:05:37
      
      Clone 'geminus2' created successfully.
    • 要将虚拟机克隆到其他主机,请迁移虚拟机而无需在本地主机上取消它。例如,以下命令将之前创建的 geminus2 虚拟机克隆到 10.0.0.1 远程系统,包括本地磁盘。请注意,使用这些命令还需要 100.0.1 的 root 权限。

      # virsh migrate --offline --persistent geminus2 qemu+ssh://root@10.0.0.1/system
      root@10.0.0.1's password:
      
      # scp /var/lib/libvirt/images/disk1-clone.qcow2 root@10.0.0.1/user@remote_host.com://var/lib/libvirt/images/
      
      # scp /var/lib/libvirt/images/disk2-clone.qcow2 root@10.0.0.1/user@remote_host.com://var/lib/libvirt/images/

验证

验证虚拟机是否已成功克隆,且正在正常工作:

  1. 确认克隆已添加到主机上的虚拟机列表中。

    # virsh list --all
    Id   Name                  State
    ---------------------------------------
    -    doppelganger          shut off
    -    doppelganger-clone    shut off
  2. 启动克隆并观察它是否引导。

    # virsh start doppelganger-clone
    Domain doppelganger-clone started

其它资源

  • 有关克隆虚拟机的额外选项,请参阅 virt-clone man page。
  • 有关将虚拟机克隆移动到不同主机的详情,包括故障排除信息,请参阅 第 9 章 迁移虚拟机

第 9 章 迁移虚拟机

如果虚拟机所在的当前主机变得不适合或者无法再使用,或者要重新分发托管工作负载,您可以将该虚拟机迁移到另一个 KVM 主机中。

9.1. 迁移虚拟机的工作方式

虚拟机迁移的基本部分是将虚拟机的 XML 配置复制到不同的主机机器中。如果没有关闭迁移的虚拟机,迁移还会将虚拟机内存和任何虚拟设备的状态传送到目标主机机器中。要使虚拟机在目标主机上正常工作,虚拟机的磁盘镜像必须仍可用。

默认情况下,迁移的虚拟机在目标主机上是临时的,虚拟机在源主机上仍然被定义。

您可以使用 实时非实时迁移对运行的虚拟机进行迁移。要迁移关闭虚拟机,必须使用离线迁移。详情请查看下表。

表 9.1. VM 迁移类型

迁移类型描述使用案例存储要求

实时迁移

VM 将继续在源主机中运行,而 KVM 会将虚拟机的内存页面传送到目标主机。当迁移接近完成后,KVM 会非常简单地挂起虚拟机,并在目标主机上恢复它。

对于需要一直保持运行的虚拟机,这个方法非常有用。但是,如果虚拟机修改内存页面的速度比 KVM 可以传输它们的速度更快,比如 I/O 负载较重的虚拟机,则不能进行实时迁移,这需要使用非实时迁移

VM 的磁盘镜像必须位于 共享网络中,同时可访问源主机和目标主机。

非实时迁移

挂起虚拟机,将其配置及其内存复制到目标主机,并恢复虚拟机。

这个迁移方式需要虚拟机停机,但通常比实时迁移更可靠。建议有高 I/O 负载的虚拟机使用这个方法。

VM 的磁盘镜像必须位于 共享网络中,同时可访问源主机和目标主机。

离线迁移

将虚拟机的配置移到目标主机

建议关闭虚拟机。

VM 的磁盘镜像不必在共享网络中可用,并可手动复制或移动到目标主机。

其它资源

9.2. 迁移虚拟机的好处

迁移虚拟机对以下情况非常有用:

负载均衡
如果主机超载或者另一台主机使用不足,则可将虚拟机移动到使用率较低的主机中。
硬件独立
当您需要升级、添加或删除主机中的硬件设备时,您可以安全地将虚拟机重新定位到其他主机。这意味着,在改进硬件时虚拟机不需要停机。
节能
虚拟机可重新分发到其他主机,因此可关闭未载入的主机系统以便在低用量时节约能源并降低成本。
地理迁移
可将虚拟机移动到另一个物理位置,以减少延迟,或者因为其他原因需要。

9.3. 迁移虚拟机的限制

在 RHEL 8 中迁移虚拟机前,请确定您了解迁移的限制。

  • 无法在 RHEL 8 中执行实时存储迁移,但您可以在虚拟机关闭时迁移存储。请注意,在 Red Hat Virtualization 上提供了实时存储迁移功能。
  • 将虚拟机迁移(或从) libvirt 的用户会话是不可靠的,因此不推荐。
  • 使用以下功能和配置的虚拟机在迁移时将无法正常工作,或者迁移失败。这些特性包括:

    • 设备透传
    • SR-IOV 设备分配
    • 介质设备,如 vGPU
    • 使用 NUMA 固定功能

9.4. 将虚拟机磁盘镜像与其他主机共享

要在 支持的 KVM 主机 间执行虚拟机实时迁移,需要共享虚拟机存储。本节提供将本地存储的虚拟机镜像与源主机以及使用 NFS 协议的目标主机共享的信息。

先决条件

  • 旨在迁移的虚拟机被关闭。
  • 可选: 一个主机系统可用于托管不是源或目标主机的存储,但源和目标主机都可以通过网络访问它。这是共享存储的最佳解决方案,红帽推荐使用它。
  • 请确定 NFS 文件锁定没有被使用,因为在 KVM 中不支持它。
  • 在源主机和目标主机上安装并启用 NFS。如果没有:

    1. 安装 NFS 软件包:

      # yum install nfs-utils
    2. 请确保在防火墙中打开了 iptables 中的 NFS 端口(比如 2049)。

      # firewall-cmd --permanent --add-service=nfs
      # firewall-cmd --permanent --add-service=mountd
      # firewall-cmd --permanent --add-service=rpc-bind
      # firewall-cmd --permanent --add-port=2049/tcp
      # firewall-cmd --permanent --add-port=2049/udp
      # firewall-cmd --reload
    3. 启动 NFS 服务。

      # systemctl start nfs-server

流程

  1. 连接到提供共享存储的主机。在本例中,它是 cargo-bay 主机:

    # ssh root@cargo-bay
    root@cargo-bay's password:
    Last login: Mon Sep 24 12:05:36 2019
    root~#
  2. 创建存放磁盘镜像的目录,并将与迁移主机共享。

    # mkdir /var/lib/libvirt/shared-images
  3. 将虚拟机的磁盘镜像从源主机复制到新创建的目录。例如,以下命令将 wanderer1 虚拟机的磁盘镜像复制到 'cargo-bay' 主机上的 /var/lib/libvirt/shared-images/ 目录中:

    # scp /var/lib/libvirt/images/wanderer1.qcow2 root@cargo-bay:/var/lib/libvirt/shared-images/wanderer1.qcow2
  4. 在您要用于共享存储的主机上,将共享目录添加到 /etc/exports 文件中。以下示例中,source-exampledest-example 主机共享 /var/lib/libvirt/shared-images 目录:

    /var/lib/libvirt/shared-images source-example(rw,no_root_squash) dest-example(rw,no_root_squash)
  5. 在源和目标主机上,将共享目录挂载到 /var/lib/libvirt/images 目录中:

    # mount cargo-bay:/var/lib/libvirt/shared-images /var/lib/libvirt/images

验证

  • 要验证进程是否成功,在源主机上启动虚拟机并观察它是否正确引导。

其它资源

  • 有关配置 NFS、打开 IP 表和配置防火墙的详情,请参考 导出 NFS 共享

9.5. 使用命令行界面迁移虚拟机

如果虚拟机所在的当前主机变得不适合或者无法再使用,或者要重新分发托管工作负载,您可以将该虚拟机迁移到另一个 KVM 主机中。本节介绍了各种迁移情境的信息和示例。

先决条件

  • 源主机和目标主机都使用 KVM 管理程序。
  • 源主机和目标主机可以通过网络相互访问。使用 ping 实用程序验证这一点。
  • 要让红帽支持迁移,源主机和目标主机必须使用特定的操作系统和机器类型。要确定这种情况,请查看 VM 迁移兼容性表
  • 红帽建议将虚拟机的磁盘镜像迁移到源主机和目标主机都可以访问的独立联网位置中。这在离线迁移中是可选的,但在迁移运行的虚拟机时是必需的。

    有关设置这样的共享虚拟机存储的步骤,请参阅 第 9.4 节 “将虚拟机磁盘镜像与其他主机共享”

  • 当迁移公共网桥中现有虚拟机时,源和目标主机必须位于同一网络中。否则,迁移后 VM 网络将不会操作。

流程

  1. 确保启用并运行 libvirtd 服务。

    # systemctl enable libvirtd.service
    # systemctl restart libvirtd.service
  2. 使用带有适合您的迁移要求的 virsh migrate 命令。

    • 下面将 wanderer1 虚拟机从本地主机迁移到 dest-example 主机的系统会话。虚拟机将在迁移过程中继续运行。

      # virsh migrate --persistent --live wanderer1 qemu+ssh://dest-example/system
    • 以下操作可让您手动调整本地主机上运行的 wanderer2 虚拟机的配置,然后将该虚拟机迁移到 dest-example 主机。迁移的虚拟机将自动使用更新的配置。

      # virsh dumpxml --migratable wanderer2 >wanderer2.xml
      # vi wanderer2.xml
      # virsh migrate --live --persistent --xml wanderer2.xml wanderer2 qemu+ssh://dest-example/system

      当目标主机需要使用不同路径访问共享虚拟机存储或配置特定于目标主机的功能时,这个过程很有用。

    • 以下命令会从 source-example 主机挂起 wanderer3 虚拟机,将其迁移到 dest-example 主机,并指示它使用 wanderer3-alt.xml 文件提供的经过调整的 XML 配置。迁移完成后,libvirt 会在目标主机上恢复虚拟机。

      # virsh migrate wanderer3 qemu+ssh://source-example/system qemu+ssh://dest-example/system --xml wanderer3-alt.xml

      迁移后,虚拟机在源主机上保持挂起状态,并在关闭后删除迁移的副本。

    • 下面从 wanderer4 主机中删除已关闭的 source-example 虚拟机,并将其配置移到 dest-example 主机。

      # virsh migrate --offline --persistent --undefinesource wanderer4 qemu+ssh://source-example/system qemu+ssh://dest-example/system

      请注意,这种类型的迁移不需要将虚拟机的磁盘镜像移到共享存储中。但是,要使虚拟机在目标主机上可用,您需要迁移虚拟机的磁盘镜像。例如:

      # scp root@source-example:/var/lib/libvirt/images/wanderer4.qcow2 root@dest-example:/var/lib/libvirt/images/wanderer4.qcow2
  3. 等待迁移完成。这个过程可能需要一些时间,具体要看网络带宽、系统负载和虚拟机的大小。如果 virsh migrate 没有使用 --verbose 选项,CLI 不会显示任何进度指示符,除了错误外。

    当迁移进行时,您可以使用 virsh domjobinfo 工具显示迁移统计。

验证

  • 在目标主机上,列出可用虚拟机以验证虚拟机是否已迁移:

    # virsh list
    Id Name                 State
    ----------------------------------
    10 wanderer1              running

    请注意,如果迁移仍然在运行,这个命令会列出虚拟机状态为 paused

故障排除

  • 在某些情况下,目标主机与迁移虚拟机 XML 配置的某些值不兼容,比如网络名称或 CPU 类型。因此,虚拟机将无法在目标主机上引导。要修复这些问题,您可以使用 virsh edit 命令更新有问题的值。
  • 如果实时迁移需要很长时间才能完成,这可能是因为虚拟机负载很重,且有太多的内存页面改变使得实时迁移不可能实现。要解决这个问题,请挂起虚拟机,将迁移改为非实时迁移。

    # virsh suspend wanderer1

其它资源

  • 有关虚拟机迁移的进一步选项和示例,请使用 virsh migrate --help 或者 virsh man page。

9.6. 虚拟机迁移支持的主机

要使虚拟机迁移正常工作并获得红帽支持,源和目标主机必须是特定的 RHEL 版本和机器类型。下表显示了支持的虚拟机迁移路径。

表 9.2. 实时迁移兼容性

迁移方法发行类型示例支持状态

向前

主发行版本

7.6+ → 8.1

在支持的 RHEL 7 系统上: 机器类型 i440fxq35

向后

主发行版本

8.1 → 7.6+

在支持的 RHEL 8 系统上: 机器类型 i440fxq35

向前

次发行版本

8.0.1+ → 8.1+

在支持的 RHEL 7 系统上: RHEL 7.6.0 及之后的版本中的机器类型 i440q35

在支持的 RHEL 8 系统上: 机器类型 q35

向后

次发行版本

8.1 → 8.0.1

在支持的 RHEL 7 系统中。完全支持机器类型 i440fxq35

在支持的 RHEL 8 系统上: 机器类型 q35

其它资源

  • 有关当前支持的 RHEL 7 和 RHEL 8 版本的详情,请查看红帽知识库

9.7. 其它资源

  • 您还可以将虚拟机从非 KVM 管理程序迁移到 RHEL 7 或 RHEL 8 主机上。这也被称为 V2V conversion,您可以在红帽知识库中找到附加信息和说明。

第 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

第 11 章 为虚拟机管理存储

您可以使用 CLIweb 控制台管理虚拟机存储。

本文档提供了有关如何使用 virsh 命令管理虚拟机存储的信息。

11.1. 了解虚拟机存储

以下小节提供有关虚拟机(VM)存储的信息,包括存储池、存储卷以及如何用于为虚拟机提供存储的信息。

11.1.1. 虚拟机存储

以下提供了有关如何使用存储池和存储卷为虚拟机创建存储的信息。

存储池是主机管理并留置供虚拟机使用的存储数量。可使用存储池中的空间创建存储卷。每个存储卷都可作为块设备(如磁盘)在客户机总线中分配到虚拟机。

存储池和卷使用 libvirt 管理。使用 libvirt 远程协议,您可以管理虚拟机存储的所有方面。这些操作可以在远程主机上执行。因此,使用 libvirt 的管理应用程序(如 RHEL web 控制台)可以用来执行所有必要的任务来为虚拟机配置存储。

libvirt API 可以用来查询存储池中的卷列表,或者获取存储池中容量、分配和可用存储的信息。可能会查询存储池中的存储卷以获取分配和容量等信息,稀疏卷可能会有所不同。

对于支持它的存储池,可以使用 libvirt API 来创建、克隆、调整和删除存储卷。API 还可用于将数据上传到存储卷,从存储卷下载数据或从存储卷中下载数据。

启动存储池后,可以使用存储池名称和存储卷名称将存储卷分配给虚拟机,而不是虚拟机 XML 配置文件中的主机路径。

11.1.2. 存储池

存储池是一个文件、目录或存储设备,由 libvirt 管理,用来为虚拟机(VM)提供存储。存储池被分成存储虚拟机镜像或作为额外存储附加到虚拟机的存储卷。多个虚拟机可以共享同一存储池,从而更好地分配存储资源。

存储池可以是持久的或临时的:

  • 主机系统重启后,持久性存储池会保留下来。
  • 临时存储池仅在主机重启前存在。

virsh pool-define 命令用于创建持久性存储池,virsh pool-create 命令用于创建临时存储池。

存储池存储类型

存储池可以是本地的也可以基于网络的(共享):

  • 本地存储池

    本地存储池直接附加到主机服务器。它们包括本地设备中的本地目录、直接附加磁盘、物理分区以及逻辑卷管理(LVM)卷组。

    本地存储池对不需要迁移或大量虚拟机的部署非常有用。

  • 联网的(共享)存储池

    联网的存储池包括使用标准协议通过网络共享的存储设备。

存储池使用示例

要演示管理存储池的可用选项,下面描述了使用 mount -t nfs nfs.example.com:/path/to/share /path/to/data 的 NFS 服务器示例。

存储管理员可以在虚拟化主机上定义 NFS 存储池,以描述导出的服务器路径和客户端目标路径。这可允许 libvirtlibvirt 启动时或根据需要在 libvirt 运行时自动执行挂载。NFS 服务器导出目录的文件在 NFS 存储池中被列为存储卷。

当存储卷添加到虚拟机时,管理员不需要为卷添加目标路径。它们只需要根据名称添加存储池和存储卷。因此,如果目标客户端路径改变,它不会影响虚拟机。

启动存储池时,libvirt 将共享挂载到指定目录中,就像系统管理员登录并执行 mount nfs.example.com:/path/to/share /vmdata 一样。如果存储池被配置为自动启动(autostart),libvirt 可确保将 NFS 共享磁盘挂载到 libvirt 启动时指定的目录中。

启动存储池后, NFS 共享磁盘中的文件会作为存储卷报告,并且可能使用 libvirt API 对存储卷的路径进行查询。然后可将存储卷的路径复制到虚拟机 XML 定义的部分,该部分描述了虚拟机块设备的源存储。对于 NFS,使用 libvirt API 的应用程序可以在存储池中创建和删除存储卷(NFS 共享中的文件)到池大小的限制(共享的存储容量)。

停止(销毁)存储池会删除数据的提取,但保持数据不受影响。

并非所有存储池类型都支持创建和删除卷。停止存储池(pool-destroy)会取消启动操作,在本例中卸载 NFS 共享。销毁操作不会修改共享中的数据,即使该命令的名称看似象要删除。如需了解更多详细信息,请参阅 man virsh

支持和不支持的存储池类型

以下是 RHEL 支持的存储池类型列表:

  • 基于目录的存储池
  • 基于磁盘的存储池
  • 基于分区的存储池
  • glusterfs 存储池
  • 基于 iSCSI 的存储池
  • 基于 LVM 的存储池
  • 基于 NFS 的存储池
  • 使用 vHBA 设备基于 SCSI 的存储池
  • 基于多路径的存储池
  • 基于 RBD 的存储池

以下是 RHEL 不支持的 libvirt 存储池类型的列表:

  • 基于 Sheepdog 的存储池
  • 基于 Vstorage 的存储池
  • 基于 ZFS 的存储池

11.1.3. 存储卷

存储池被分成不同的 storage volumes。存储卷是物理分区、LVM 逻辑卷、基于文件的磁盘镜像,以及 libvirt 处理的其他存储类型抽象。无论底层硬件是什么,存储卷都以本地存储设备(如磁盘)的形式出现在虚拟机中。

在主机机器上,存储卷由它的名称和生成该存储池的存储池标识符来引用。在 virsh 命令行中,格式为 --pool storage_pool volume_name

例如:要在 guest_images 池中显示名为 firstimage 的卷信息。

# virsh vol-info --pool guest_images firstimage
  Name:             firstimage
  Type:             block
  Capacity:         20.00 GB
  Allocation:       20.00 GB

11.2. 使用 CLI 管理虚拟机存储

以下文档提供了有关如何使用 virsh 命令行实用程序管理虚拟机(VM)存储的信息。

使用 virsh,您可以添加、删除和修改虚拟机存储,以及查看有关虚拟机存储的信息。

注意

在很多情况下,虚拟机的存储会在创建虚拟机时同时创建。因此,以下信息主要与虚拟机存储的高级管理相关。

11.2.1. 使用 CLI 查看虚拟机存储信息

以下提供了有关使用 CLI 查看存储池和存储卷的信息。

11.2.1.1. 使用 CLI 查看存储池信息

通过 CLI,您可以查看所有存储池的列表,其中包含有关存储池的有限或完整详情。您还可以过滤列出的存储池。

流程

  • 使用 virsh pool-list 命令查看存储池信息。

    # virsh pool-list --all --details
     Name                State    Autostart  Persistent    Capacity  Allocation   Available
     default             running  yes        yes          48.97 GiB   23.93 GiB   25.03 GiB
     Downloads           running  yes        yes         175.62 GiB   62.02 GiB  113.60 GiB
     RHEL8-Storage-Pool  running  yes        yes         214.62 GiB   93.02 GiB  168.60 GiB

其它资源

  • 如需可用 virsh pool-list 选项的信息,请使用 virsh pool-list --help 命令。

11.2.1.2. 使用 CLI 查看存储卷信息

以下提供了有关查看存储池的信息。您可以查看指定存储池中的所有存储池列表,以及指定存储池的详情。

流程

  1. 使用 virsh vol-list 命令列出指定存储池中的存储卷。

    # virsh vol-list --pool RHEL8-Storage-Pool --details
     Name                Path                                               Type   Capacity  Allocation
    ---------------------------------------------------------------------------------------------
     .bash_history       /home/VirtualMachines/.bash_history       file  18.70 KiB   20.00 KiB
     .bash_logout        /home/VirtualMachines/.bash_logout        file    18.00 B    4.00 KiB
     .bash_profile       /home/VirtualMachines/.bash_profile       file   193.00 B    4.00 KiB
     .bashrc             /home/VirtualMachines/.bashrc             file   1.29 KiB    4.00 KiB
     .git-prompt.sh      /home/VirtualMachines/.git-prompt.sh      file  15.84 KiB   16.00 KiB
     .gitconfig          /home/VirtualMachines/.gitconfig          file   167.00 B    4.00 KiB
     RHEL8_Volume.qcow2  /home/VirtualMachines/RHEL8_Volume.qcow2  file  60.00 GiB   13.93 GiB
  2. 使用 virsh vol-info 命令列出指定存储池中的存储卷。

    # vol-info --pool RHEL8-Storage-Pool --vol RHEL8_Volume.qcow2
    Name:           RHEL8_Volume.qcow2
    Type:           file
    Capacity:       60.00 GiB
    Allocation:     13.93 GiB

11.2.2. 使用 CLI 为虚拟机创建并分配存储

以下是为虚拟机(VM)创建和分配存储的高级别流程:

  1. 创建存储池

    从可用存储介质创建一个或多个存储池。如需支持的存储池类型列表,请参阅存储池类型

    • 要创建持久性存储池,使用 virsh pool-define-asvirsh pool-define 命令。

      virsh pool-define-as 命令将选项放在命令行中。virsh pool-define 命令在池选项中使用 XML 文件。

    • 要创建临时存储池,使用 virsh pool-createvirsh pool-create-as 命令。

      virsh pool-create-as 命令将选项放在命令行中。virsh pool-create 命令在池选项中使用 XML 文件。

  1. 创建存储卷

    从可用存储池创建一个或多个存储卷

  2. 为虚拟机分配存储设备

    将从存储卷中提取的一个或多个存储设备分配给虚拟机。

以下小节提供有关使用 CLI 创建和分配存储的信息:

11.2.2.1. 使用 CLI 为虚拟机创建并分配基于目录的存储

以下提供了有关创建基于目录的存储池和存储卷以及将卷分配给虚拟机的信息。

11.2.2.1.1. 使用 CLI 创建基于目录的存储池

以下提供了创建基于目录的存储池的说明。

先决条件

  • 确定您的管理程序支持目录存储池:

    # virsh pool-capabilities | grep "'dir' supported='yes'"

    如果命令显示任何输出结果,则代表支持目录池。

流程

  1. 创建存储池

    使用 virsh pool-define-as 命令定义并创建目录类型存储池。例如,要创建一个名为 guest_images_dir 的、使用 /guest_images 目录的存储池:

    # virsh pool-define-as guest_images_dir dir --target "/guest_images"
    Pool guest_images_dir defined

    如果您已经有要创建的存储池的 XML 配置,,也可以根据 XML 定义池。详情请查看 第 11.2.2.1.2 节 “基于目录的存储池参数”

  2. 创建存储池目标路径

    使用 virsh pool-build 命令为预格式的文件系统存储池创建存储池目标路径,初始化存储源设备并定义数据格式。

    # virsh pool-build guest_images_dir
      Pool guest_images_dir built
    
    # ls -la /guest_images
      total 8
      drwx------.  2 root root 4096 May 31 19:38 .
      dr-xr-xr-x. 25 root root 4096 May 31 19:38 ..
  3. 验证是否已创建池

    使用 virsh pool-list 命令验证池是否已创建。

    # virsh pool-list --all
    
      Name                 State      Autostart
      -----------------------------------------
      default              active     yes
      guest_images_dir     inactive   no
  4. 启动存储池

    使用 virsh pool-start 命令挂载存储池。

    # virsh pool-start guest_images_dir
      Pool guest_images_dir started
    注意

    virsh pool-start 命令只适用于持久性存储池。临时存储池创建时会自动启动。

  5. [可选]自动启动过程

    默认情况下,使用 virsh 命令定义的存储池不会被设置为在每次 libvirtd 启动时自动启动。使用 virsh pool-autostart 命令将存储池配置为 autostart。

    # virsh pool-autostart guest_images_dir
      Pool guest_images_dir marked as autostarted

验证

  1. 使用 virsh pool-list 命令验证 Autostart 状态。

    # virsh pool-list --all
    
      Name                 State      Autostart
      -----------------------------------------
      default              active     yes
      guest_images_dir     inactive   yes
  2. 验证存储池是否已正确创建,报告的大小与预期相同,状态报告为 running

    # virsh pool-info guest_images_dir
      Name:           guest_images_dir
      UUID:           c7466869-e82a-a66c-2187-dc9d6f0877d0
      State:          running
      Persistent:     yes
      Autostart:      yes
      Capacity:       458.39 GB
      Allocation:     197.91 MB
      Available:      458.20 GB
11.2.2.1.2. 基于目录的存储池参数

这部分提供了基于目录的存储池所需的 XML 参数以及示例。

您可以根据指定文件中的 XML 配置来定义一个存储池。例如:

# virsh pool-define ~/guest_images.xml
  Pool defined from guest_images_dir

参数

下表提供了基于目录的存储池 XML 文件所需的参数列表。

表 11.1. 基于目录的存储池参数

描述XML

存储池的类型

<pool type='dir'>

存储池的名称

<name>name</name>

指定目标的路径。这将是用于存储池的路径。

<target>
   <path>target_path</path>
</target>

示例

以下是基于 /guest_images 目录的存储池的 XML 文件示例:

<pool type='dir'>
  <name>dirpool</name>
  <target>
    <path>/guest_images</path>
  </target>
</pool>

其它资源

有关创建基于目录的存储池的详情,请参考 第 11.2.2.1.1 节 “使用 CLI 创建基于目录的存储池”

11.2.2.2. 使用 CLI 为虚拟机创建并分配基于磁盘的存储

以下提供了有关创建基于磁盘的存储池和存储卷以及将卷分配给虚拟机的信息。

11.2.2.2.1. 使用 CLI 创建基于磁盘的存储池

以下提供了创建基于磁盘存储池的说明。

建议

在创建基于磁盘的存储池前请注意以下几点:

  • 根据使用的 libvirt 版本,将磁盘分配给存储池可能会重新格式化并删除所有当前存储在磁盘设备中的数据。强烈建议您在创建存储池前备份存储设备中的数据。
  • 虚拟机不应该被授予整个磁盘或者块设备的写入权限(例如: /dev/sdb)。使用分区(例如 /dev/sdb1)或者 LVM 卷。

    如果您将整个块设备传递给虚拟机,VM 可能会对该设备进行分区或者创建自己的 LVM 组。这可能导致主机机器检测到这些分区或者 LVM 组并导致错误。

先决条件

  • 确定您的管理程序支持基于磁盘的存储池:

    # virsh pool-capabilities | grep "'disk' supported='yes'"

    如果命令显示任何输出结果,则代表支持基于磁盘的池。

流程

  1. 创建存储池

    使用 virsh pool-define-as 命令定义并创建磁盘类型存储池。例如:要创建一个名为 guest_images_disk 的、使用 /dev/sdb1 分区并挂载到 /dev 目录中的存储池:

    # virsh pool-define-as guest_images_disk disk gpt --source-dev=/dev/sdb1 --target /dev
    Pool guest_images_disk defined

    如果您已经有要创建的存储池的 XML 配置,,也可以根据 XML 定义池。详情请查看 第 11.2.2.2.2 节 “基于磁盘的存储池参数”

  2. 创建存储池目标路径

    使用 virsh pool-build 命令为预格式的文件系统存储池创建存储池目标路径,初始化存储源设备,并定义数据格式。

    # virsh pool-build guest_images_disk
      Pool guest_images_disk built
    注意

    只有基于磁盘、文件系统和逻辑存储池才需要构建目标路径。如果 libvirt 检测到源存储设备的数据格式与所选存储池类型不同,则构建会失败,除非指定了 overwrite 选项。

  3. 验证是否已创建池

    使用 virsh pool-list 命令验证池是否已创建。

    # virsh pool-list --all
    
      Name                 State      Autostart
      -----------------------------------------
      default              active     yes
      guest_images_disk    inactive   no
  4. 启动存储池

    使用 virsh pool-start 命令挂载存储池。

    # virsh pool-start guest_images_disk
      Pool guest_images_disk started
    注意

    virsh pool-start 命令只适用于持久性存储池。临时存储池创建时会自动启动。

  5. [可选]自动启动过程

    默认情况下,使用 virsh 命令定义的存储池不会被设置为在每次 libvirtd 启动时自动启动。使用 virsh pool-autostart 命令将存储池配置为 autostart。

    # virsh pool-autostart guest_images_disk
      Pool guest_images_disk marked as autostarted

验证

  1. 使用 virsh pool-list 命令验证 Autostart 状态。

    # virsh pool-list --all
    
      Name                 State      Autostart
      -----------------------------------------
      default              active     yes
      guest_images_disk    inactive   yes
  2. 验证存储池是否已正确创建,报告的大小与预期相同,状态报告为 running

    # virsh pool-info guest_images_disk
      Name:           guest_images_disk
      UUID:           c7466869-e82a-a66c-2187-dc9d6f0877d0
      State:          running
      Persistent:     yes
      Autostart:      yes
      Capacity:       458.39 GB
      Allocation:     197.91 MB
      Available:      458.20 GB
11.2.2.2.2. 基于磁盘的存储池参数

这部分提供了基于磁盘存储池所需的 XML 参数以及示例。

您可以根据指定文件中的 XML 配置来定义一个存储池。例如:

# virsh pool-define ~/guest_images.xml
  Pool defined from guest_images_disk

参数

下表提供了基于磁盘存储池的 XML 文件所需的参数列表。

表 11.2. 基于磁盘的存储池参数

描述XML

存储池的类型

<pool type='disk'>

存储池的名称

<name>name</name>

指定存储设备的路径。例如: /dev/sdb

<source>
   <path>source_path</path>
</source>

指定目标设备的路径。这将是用于存储池的路径。

<target>
   <path>target_path</path>
</target>

示例

以下是基于磁盘存储池的 XML 文件示例:

<pool type='disk'>
  <name>phy_disk</name>
  <source>
    <device path='/dev/sdb'/>
    <format type='gpt'/>
  </source>
  <target>
    <path>/dev</path>
  </target>
</pool>

其它资源

有关创建基于磁盘的存储池的详情,请参考 第 11.2.2.2.1 节 “使用 CLI 创建基于磁盘的存储池”

11.2.2.3. 使用 CLI 为虚拟机创建并分配基于文件系统的存储

以下提供了有关创建基于文件系统的存储池和存储卷以及将卷分配给虚拟机的信息。

11.2.2.3.1. 使用 CLI 创建基于文件系统的存储池

以下提供了创建基于文件系统的存储池的说明。

建议

不要使用这个步骤将整个磁盘分配为存储池(例如 /dev/sdb)。不应该为虚拟机授予对整个磁盘或块设备的写入权限。这个方法应该只用于为存储池分配分区(例如 /dev/sdb1)。

先决条件

  • 确保您的管理程序支持基于文件系统的存储池:

    # virsh pool-capabilities | grep "'fs' supported='yes'"

    如果该命令显示任何输出结果,则代表支持基于文件的池。

流程

  1. 创建存储池

    使用 virsh pool-define-as 命令定义并创建文件系统类型的存储池。例如:要创建一个名为 guest_images_fs 的、使用 /dev/sdc1 分区并挂载到 /guest_images 目录中的存储池:

    # virsh pool-define-as guest_images_fs fs --source-dev /dev/sdc1 --target /guest_images
    Pool guest_images_fs defined

    如果您已经有要创建的存储池的 XML 配置,,也可以根据 XML 定义池。详情请查看 第 11.2.2.3.2 节 “基于文件系统的存储池参数”

  2. 定义存储池目标路径

    使用 virsh pool-build 命令为预格式的文件系统存储池创建存储池目标路径,初始化存储源设备,并定义数据格式。

    # virsh pool-build guest_images_fs
      Pool guest_images_fs built
    
    # ls -la /guest_images
      total 8
      drwx------.  2 root root 4096 May 31 19:38 .
      dr-xr-xr-x. 25 root root 4096 May 31 19:38 ..
  3. 验证是否已创建池

    使用 virsh pool-list 命令验证池是否已创建。

    # virsh pool-list --all
    
      Name                 State      Autostart
      -----------------------------------------
      default              active     yes
      guest_images_fs      inactive   no
  4. 启动存储池

    使用 virsh pool-start 命令挂载存储池。

    # virsh pool-start guest_images_fs
      Pool guest_images_fs started
    注意

    virsh pool-start 命令只适用于持久性存储池。临时存储池创建时会自动启动。

  5. [可选]自动启动过程

    默认情况下,使用 virsh 命令定义的存储池不会被设置为在每次 libvirtd 启动时自动启动。使用 virsh pool-autostart 命令将存储池配置为 autostart。

    # virsh pool-autostart guest_images_fs
      Pool guest_images_fs marked as autostarted
  6. 验证 Autostart 状态

    使用 virsh pool-list 命令验证 Autostart 状态。

    # virsh pool-list --all
    
      Name                 State      Autostart
      -----------------------------------------
      default              active     yes
      guest_images_fs      inactive   yes
  7. 验证存储池

    验证存储池是否已正确创建,报告的大小与预期相同,状态报告为 running。验证文件系统的目标路径中存在 lost+found 目录,这代表挂载了该设备。

    # virsh pool-info guest_images_fs
      Name:           guest_images_fs
      UUID:           c7466869-e82a-a66c-2187-dc9d6f0877d0
      State:          running
      Persistent:     yes
      Autostart:      yes
      Capacity:       458.39 GB
      Allocation:     197.91 MB
      Available:      458.20 GB
    
    # mount | grep /guest_images
      /dev/sdc1 on /guest_images type ext4 (rw)
    
    # ls -la /guest_images
      total 24
      drwxr-xr-x.  3 root root  4096 May 31 19:47 .
      dr-xr-xr-x. 25 root root  4096 May 31 19:38 ..
      drwx------.  2 root root 16384 May 31 14:18 lost+found
11.2.2.3.2. 基于文件系统的存储池参数

以下提供了有关基于文件系统的存储池和示例所需的参数的信息。

您可以根据指定文件中的 XML 配置来定义一个存储池。例如:

# virsh pool-define ~/guest_images.xml
  Pool defined from guest_images_fs

参数

下表提供了基于文件系统的存储池 XML 文件所需的参数列表。

表 11.3. 基于文件系统的存储池参数

描述XML

存储池的类型

<pool type='fs'>

存储池的名称

<name>name</name>

指定分区的路径。例如: /dev/sdc1

<source>
   <device path=device_path />

文件系统类型,例如 ext4

    <format type=fs_type />
</source>

指定目标的路径。这将是用于存储池的路径。

<target>
    <path>path-to-pool</path>
</target>

示例

以下是基于 /dev/sdc1 分区的存储池的 XML 文件示例:

<pool type='fs'>
  <name>guest_images_fs</name>
  <source>
    <device path='/dev/sdc1'/>
    <format type='auto'/>
  </source>
  <target>
    <path>/guest_images</path>
  </target>
</pool>

其它资源

有关创建基于文件系统的存储池的详情,请参考 第 11.2.2.3.1 节 “使用 CLI 创建基于文件系统的存储池”

11.2.2.4. 使用 CLI 为虚拟机创建并分配 GlusterFS 存储

以下提供了有关创建基于 GlusterFS 的存储池和存储卷以及将卷分配给虚拟机的信息。

11.2.2.4.1. 使用 CLI 创建基于 GlusterFS 的存储池

Glusterfs 是一个用户空间文件系统,它在 Userspace(FUSE)中使用文件系统。以下提供了创建基于 GlusterFS 的存储池的说明。

先决条件

  • 在主机上创建基于 GlusterFS 的存储池前,先准备 Gluster。

    1. 使用以下命令列出 Gluster 服务器的状态来获取 Gluster 服务器的 IP 地址:

      # gluster volume status
      Status of volume: gluster-vol1
      Gluster process                           Port	Online	Pid
      ------------------------------------------------------------
      Brick 222.111.222.111:/gluster-vol1       49155	  Y    18634
      
      Task Status of Volume gluster-vol1
      ------------------------------------------------------------
      There are no active volume tasks
    2. 如果没有安装,请安装 glusterfs-fuse 软件包。
    3. 如果没有启用,请启用 virt_use_fusefs 布尔值。检查是否已启用。

      # setsebool virt_use_fusefs on
      # getsebool virt_use_fusefs
      virt_use_fusefs --> on
  • 确保您的管理程序支持基于 GlusterFS 的存储池:

    # virsh pool-capabilities | grep "'gluster' supported='yes'"

    如果命令显示任何输出结果,则支持基于 GlusterFS 的池。

流程

  1. 创建存储池

    使用 virsh pool-define-as 命令定义并创建基于 GlusterFS 的存储池。例如,要创建一个名为 guest_images_glusterfs 的存储池,它使用名为 gluster-vol1 的 Gluster 服务器,使用 IP 111.222.111.222,并挂载到 Gluster 服务器的根目录中:

    # virsh pool-define-as --name guest_images_glusterfs --type gluster --source-host 111.222.111.222 --source-name gluster-vol1 --source-path /
    Pool guest_images_glusterfs defined

    如果您已经有要创建的存储池的 XML 配置,,也可以根据 XML 定义池。详情请查看 第 11.2.2.4.2 节 “glusterfs 基于存储池参数”

  2. 验证是否已创建池

    使用 virsh pool-list 命令验证池是否已创建。

    # virsh pool-list --all
    
      Name                    State      Autostart
      --------------------------------------------
      default                 active     yes
      guest_images_glusterfs  inactive   no
  3. 启动存储池

    使用 virsh pool-start 命令挂载存储池。

    # virsh pool-start guest_images_glusterfs
      Pool guest_images_glusterfs started
    注意

    virsh pool-start 命令只适用于持久性存储池。临时存储池创建时会自动启动。

  4. [可选]自动启动过程

    默认情况下,使用 virsh 命令定义的存储池不会被设置为在每次 libvirtd 启动时自动启动。使用 virsh pool-autostart 命令将存储池配置为 autostart。

    # virsh pool-autostart guest_images_glusterfs
      Pool guest_images_glusterfs marked as autostarted

验证

  1. 使用 virsh pool-list 命令验证 Autostart 状态。

    # virsh pool-list --all
    
      Name                    State      Autostart
      --------------------------------------------
      default                 active     yes
      guest_images_glusterfs  inactive   yes
  2. 验证存储池是否已正确创建,报告的大小与预期相同,状态报告为 running

    # virsh pool-info guest_images_glusterfs
      Name:           guest_images_glusterfs
      UUID:           c7466869-e82a-a66c-2187-dc9d6f0877d0
      State:          running
      Persistent:     yes
      Autostart:      yes
      Capacity:       458.39 GB
      Allocation:     197.91 MB
      Available:      458.20 GB
11.2.2.4.2. glusterfs 基于存储池参数

以下提供了有关基于 GlusterFS 的存储池和示例所需的参数的信息。

您可以根据指定文件中的 XML 配置来定义一个存储池。例如:

# virsh pool-define ~/guest_images.xml
  Pool defined from guest_images_glusterfs

参数

下表提供了基于 GlusterFS 的存储池 XML 文件所需的参数列表。

表 11.4. glusterfs 基于存储池参数

描述XML

存储池的类型

<pool type='gluster'>

存储池的名称

<name>name</name>

Gluster 服务器的主机名或 IP 地址

<source>
   <name=gluster-name />

用于存储池的 Gluster 服务器上的路径。

    <dir path=gluster-path />
</source>

示例

以下是基于 111.222.111.222 Gluster 文件系统的存储池 XML 文件示例:

<pool type='gluster'>
  <name>Gluster_pool</name>
  <source>
    <host name='111.222.111.222'/>
    <dir path='/'/>
    <name>gluster-vol1</name>
  </source>
</pool>

有关创建基于文件系统的存储池的详情,请参考 第 11.2.2.4.1 节 “使用 CLI 创建基于 GlusterFS 的存储池”

11.2.2.5. 使用 CLI 为虚拟机创建并分配基于 iSCSI 的存储

以下提供了有关创建基于 iSCSI 的存储池和存储卷的信息,使用 libvirt secret 保护基于 iSCSI 的存储池,并将卷分配给虚拟机。

建议

Internet Small Computer System Interface(iSCSI)是用于共享存储设备的网络协议。iSCSI 通过 IP 层使用 SCSI 指令连接到目标(存储服务器)。

使用基于 iSCSI 的设备存储虚拟机可提供更灵活的存储选项,比如使用 iSCSI 作为块存储设备。iSCSI 设备使用 Linux-IO(LIO)目标。这是 Linux 的多协议 SCSI 目标。除了 iSCSI,LIO 还支持使用以太网(FCoE)的光纤通道和光纤通道。

如果您需要阻止对 iSCSI 存储池的访问,您可以使用 libvirt secret 来保护它。

先决条件
  • 在创建基于 iSCSI 的存储池前,您必须创建 iSCSI 对象。您可以使用 targetcli 软件包创建 iSCSI 目标,该软件包为创建软件支持的 iSCSI 目标提供了一个命令集。

    有关创建 iSCSI 对象的详情请参考管理存储设备文档

11.2.2.5.1. 使用 CLI 创建基于 iSCSI 的存储池

以下提供了创建基于 iSCSI 的存储池的说明。

先决条件

  • 确定您的管理程序支持基于 iSCSI 的存储池:

    # virsh pool-capabilities | grep "'iscsi' supported='yes'"

    如果该命令显示任何输出结果,则代表支持基于 iSCSI 的池。

流程

  1. 创建存储池

    使用 virsh pool-define-as 命令定义并创建 iSCSI 类型的存储池。例如,要创建一个名为 guest_images_iscsi 的存储池,它使用 server1.example.com 上的 iqn.2010-05.com.example.server1:iscsirhel7guest IQN,并挂载到 /dev/disk/by-path 路径上:

    # virsh pool-define-as --name guest_images_iscsi --type iscsi --source-host server1.example.com --source-dev iqn.2010-05.com.example.server1:iscsirhel7guest --target /dev/disk/by-path
    Pool guest_images_iscsi defined

    如果您已经有要创建的存储池的 XML 配置,也可以根据 XML 定义池。详情请查看 第 11.2.2.5.2 节 “基于 iSCSI 的存储池参数”

  2. 验证是否已创建池

    使用 virsh pool-list 命令验证池是否已创建。

    # virsh pool-list --all
    
      Name                 State      Autostart
      -----------------------------------------
      default              active     yes
      guest_images_iscsi   inactive   no
  3. 启动存储池

    使用 virsh pool-start 命令挂载存储池。

    # virsh pool-start guest_images_iscsi
      Pool guest_images_iscsi started
    注意

    virsh pool-start 命令只适用于持久性存储池。临时存储池创建时会自动启动。

  4. [可选]自动启动过程

    默认情况下,使用 virsh 命令定义的存储池不会被设置为在每次 libvirtd 启动时自动启动。使用 virsh pool-autostart 命令将存储池配置为 autostart。

    # virsh pool-autostart guest_images_iscsi
      Pool guest_images_iscsi marked as autostarted

验证

  1. 使用 virsh pool-list 命令验证 Autostart 状态。

    # virsh pool-list --all
    
      Name                 State      Autostart
      -----------------------------------------
      default              active     yes
      guest_images_iscsi   inactive   yes
  2. 验证存储池是否已正确创建,报告的大小与预期相同,状态报告为 running。验证文件系统的目标路径中存在 lost+found 目录,这代表挂载了该设备。

    # virsh pool-info guest_images_iscsi
      Name:           guest_images_iscsi
      UUID:           c7466869-e82a-a66c-2187-dc9d6f0877d0
      State:          running
      Persistent:     yes
      Autostart:      yes
      Capacity:       458.39 GB
      Allocation:     197.91 MB
      Available:      458.20 GB
11.2.2.5.2. 基于 iSCSI 的存储池参数

以下提供了有关基于 iSCSI 存储池和示例所需的参数的信息。

您可以根据指定文件中的 XML 配置来定义一个存储池。例如:

# virsh pool-define ~/guest_images.xml
  Pool defined from guest_images_iscsi

参数

下表提供了基于 iSCSI 存储池的 XML 文件所需的参数列表。

表 11.5. 基于 iSCSI 的存储池参数

描述XML

存储池的类型

<pool type='iscsi'>

存储池的名称

<name>name</name>

主机的名称

<source>
  <host name=hostname />

iSCSI IQN

    <device path= iSCSI_IQN />
</source>

指定目标的路径。这将是用于存储池的路径。

<target>
   <path>/dev/disk/by-path</path>
</target>

[可选] iSCSI initiator 的 IQN。只有 ACL 将 LUN 限制为特定发起方时才需要。

<initiator>
   <iqn name='initiator0' />
</initiator>

注意

iSCSI initiator 的 IQN 可使用 virsh find-storage-pool-sources-as iscsi 命令确定。

示例

以下是基于指定 iSCSI 设备的存储池的 XML 文件示例:

<pool type='iscsi'>
  <name>iSCSI_pool</name>
  <source>
    <host name='server1.example.com'/>
    <device path='iqn.2010-05.com.example.server1:iscsirhel7guest'/>
  </source>
  <target>
    <path>/dev/disk/by-path</path>
  </target>
</pool>

其它资源

有关创建基于 iSCSCI 的存储池的详情,请参考 第 11.2.2.5.1 节 “使用 CLI 创建基于 iSCSI 的存储池”

11.2.2.5.3. 使用 libvirt secret 保护 iSCSI 存储池

可以使用 virsh 配置用户名和密码参数来保护 iSCSI 存储池的安全。您可以在定义池之前或之后配置它,但必须启动池才能使验证设置生效。

以下提供了使用 libvirt secret 保护基于 iSCSI 的存储池的说明。

注意

如果在创建 iSCSI 目标时定义了 user_IDpassword,则需要这个过程。

流程

  1. 创建一个带有 challenge-handshake 验证协议(CHAP)用户名的 libvirt secret 文件。例如:

    <secret ephemeral='no' private='yes'>
        <description>Passphrase for the iSCSI example.com server</description>
        <usage type='iscsi'>
            <target>iscsirhel7secret</target>
        </usage>
    </secret>
  2. 使用 virsh secret-define 命令定义 libvirt secret。

    # virsh secret-define secret.xml

  3. 使用 virsh secret-list 命令验证 UUID。

    # virsh secret-list
    UUID                                  Usage
    -------------------------------------------------------------------
    2d7891af-20be-4e5e-af83-190e8a922360  iscsi iscsirhel7secret
  4. 使用 virsh secret-set-value 命令为上一步输出中的 UUID 分配 secret。这样可保证 CHAP 用户名和密码位于由 libvirt 控制的 secret 列表中。例如:

    # virsh secret-set-value --interactive 2d7891af-20be-4e5e-af83-190e8a922360
    Enter new value for secret:
    Secret value set
  5. 使用 virsh edit 命令在存储池的 XML 文件中添加身份验证条目,并添加 <auth> 元素,指定 authentication typeusernamesecret usage

    例如:

    <pool type='iscsi'>
      <name>iscsirhel7pool</name>
        <source>
           <host name='192.168.122.1'/>
           <device path='iqn.2010-05.com.example.server1:iscsirhel7guest'/>
           <auth type='chap' username='redhat'>
              <secret usage='iscsirhel7secret'/>
           </auth>
        </source>
      <target>
        <path>/dev/disk/by-path</path>
      </target>
    </pool>
    注意

    <auth> 子元素存在于虚拟机 <pool><disk> XML 元素的不同位置。对于 <pool>, <auth><source> 元素中指定,因为这描述了在哪里查找池源,因为身份验证是某些池源(iSCSI 和 RBD)的属性。对于 <disk> (域的子元素),对 iSCSI 或 RBD 磁盘的验证是磁盘的属性。另外,磁盘的 <auth> 子元素与存储池的不同。

    <auth username='redhat'>
      <secret type='iscsi' usage='iscsirhel7secret'/>
    </auth>
  6. 要激活更改,激活存储池。如果池已启动,停止并重启存储池:

    # virsh pool-destroy iscsirhel7pool
    # virsh pool-start iscsirhel7pool

11.2.2.6. 使用 CLI 为虚拟机创建并分配基于 LVM 的存储

以下提供了有关创建基于 LVM 的存储池和存储卷以及将卷分配给虚拟机的信息。

11.2.2.6.1. 使用 CLI 创建基于 LVM 的存储池

以下提供了创建基于 LVM 的存储池的说明。

建议

在创建基于 LVM 的存储池前请注意以下几点:

  • 基于 LVM 的存储池不能为 LVM 提供完整的灵活性。
  • libvirt 支持精简逻辑卷,但不提供精简存储池的功能。
  • 基于 LVM 的存储池是卷组。您可以使用逻辑卷管理器命令或 virsh 命令创建卷组。要使用 virsh 接口管理卷组,使用 virsh 命令创建卷组。

    有关卷组的详情,请参阅 Red Hat Enterprise Linux Logical Volume Manager Administration Guide

  • 基于 LVM 的存储池需要一个完整磁盘分区。如果用这些步骤激活新分区或设备,分区将被格式化并删除所有数据。如果使用主机已有的卷组(VG),则不会删除任何问题。建议您在启动前备份存储设备。

先决条件

  • 确定您的管理程序支持基于 LVM 的存储池:

    # virsh pool-capabilities | grep "'logical' supported='yes'"

    如果命令显示任何输出结果,则支持基于 LVM 的池。

流程

  1. 创建存储池

    使用 virsh pool-define-as 命令定义并创建 LVM 类型的存储池。例如:下面创建了一个名为 guest_images_logical 的存储池,它使用挂载到 /dev/sdc 中的 libvirt_lvm LVM 设备。创建的存储池挂载为 /dev/libvirt_lvm

    # virsh pool-define-as guest_images_logical logical --source-dev=/dev/sdc --source-name libvirt_lvm --target /dev/libvirt_lvm
    Pool guest_images_logical defined

    如果您已经有要创建的存储池的 XML 配置,也可以根据 XML 定义池。详情请查看 第 11.2.2.6.2 节 “基于 LVM 的存储池参数”

  2. 验证是否已创建池

    使用 virsh pool-list 命令验证池是否已创建。

    # virsh pool-list --all
    
      Name                   State      Autostart
      -------------------------------------------
      default                active     yes
      guest_images_logical   inactive   no
  3. 启动存储池

    使用 virsh pool-start 命令挂载存储池。

    # virsh pool-start guest_images_logical
      Pool guest_images_logical started
    注意

    virsh pool-start 命令只适用于持久性存储池。临时存储池创建时会自动启动。

  4. [可选]自动启动过程

    默认情况下,使用 virsh 命令定义的存储池不会被设置为在每次 libvirtd 启动时自动启动。使用 virsh pool-autostart 命令将存储池配置为 autostart。

    # virsh pool-autostart guest_images_logical
      Pool guest_images_logical marked as autostarted

验证

  1. 使用 virsh pool-list 命令验证 Autostart 状态。

    # virsh pool-list --all
    
      Name                   State      Autostart
      -------------------------------------------
      default                active     yes
      guest_images_logical   inactive   yes
  2. 验证存储池是否已正确创建,报告的大小与预期相同,状态报告为 running

    # virsh pool-info guest_images_logical
      Name:           guest_images_logical
      UUID:           c7466869-e82a-a66c-2187-dc9d6f0877d0
      State:          running
      Persistent:     yes
      Autostart:      yes
      Capacity:       458.39 GB
      Allocation:     197.91 MB
      Available:      458.20 GB
11.2.2.6.2. 基于 LVM 的存储池参数

以下提供了有关基于 LVM 的存储池和示例所需的参数的信息。

您可以根据指定文件中的 XML 配置来定义一个存储池。例如:

# virsh pool-define ~/guest_images.xml
  Pool defined from guest_images_logical

参数

下表提供了基于 LVM 的存储池 XML 文件所需的参数列表。

表 11.6. 基于 LVM 的存储池参数

描述XML

存储池的类型

<pool type='logical'>

存储池的名称

<name>name</name>

存储池设备的路径

<source>
   <device path='device_path' />`

卷组名称

    <name>VG-name</name>

虚拟组格式

    <format type='lvm2' />
</source>

目标路径

<target>
   <path=target_path />
</target>

注意

如果逻辑卷组由多个磁盘分区组成,则可能会列出多个源设备。例如:

<source>
  <device path='/dev/sda1'/>
  <device path='/dev/sdb3'/>
  <device path='/dev/sdc2'/>
  ...
</source>

示例

以下是基于指定 LVM 的存储池的 XML 文件示例:

<pool type='logical'>
  <name>guest_images_lvm</name>
  <source>
    <device path='/dev/sdc'/>
    <name>libvirt_lvm</name>
    <format type='lvm2'/>
  </source>
  <target>
    <path>/dev/libvirt_lvm</path>
  </target>
</pool>

其它资源

有关创建基于 iSCSCI 的存储池的详情,请参考 第 11.2.2.6.1 节 “使用 CLI 创建基于 LVM 的存储池”

11.2.2.7. 使用 CLI 为虚拟机创建并分配基于网络的存储

以下提供了有关创建基于网络的存储池和存储卷并将卷分配给虚拟机的信息。

先决条件

  • 要创建基于网络文件系统(NFS)的存储池,应该已经将 NFS 服务器配置为主机机器使用。有关 NFS 的详情,请参考 Red Hat Enterprise Linux Storage Administration Guide
  • 确定在主机上安装了您要使用的文件系统所需的工具。例如:通用互联网文件系统(CIFS)为 cifs-utils,或用于 GlusterFS 的 glusterfs.fuse
11.2.2.7.1. 使用 CLI 创建基于 NFS 的存储池

以下是根据网络文件系统(NFS)创建存储池的说明。

先决条件

  • 确定您的管理程序支持基于 NFS 的存储池:

    # virsh pool-capabilities | grep "<value>nfs</value>"

    如果该命令显示任何输出结果,则代表支持基于 NFS 的池。

流程

  1. 创建存储池

    使用 virsh pool-define-as 命令定义并创建一个 NFS 类型的存储池。例如:要创建一个名为 guest_images_netfs 的存储池,它使用一个名为 111.222.111.222 的 NFS 服务器挂载到服务器目录 /home/net_mount 中,使用目标目录 /var/lib/libvirt/images/nfspool:

    # virsh pool-define-as --name guest_images_netfs --type netfs --source-host='111.222.111.222' source-path='/home/net_mount' --source-format='nfs' --target='/var/lib/libvirt/images/nfspool'

    如果您已经有要创建的存储池的 XML 配置,也可以根据 XML 定义池。详情请查看 第 11.2.2.7.2 节 “基于 NFS 的存储池参数”

  2. 验证是否已创建池

    使用 virsh pool-list 命令验证池是否已创建。

    # virsh pool-list --all
    
      Name                 State      Autostart
      -----------------------------------------
      default              active     yes
      guest_images_netfs   inactive   no
  3. 启动存储池

    使用 virsh pool-start 命令挂载存储池。

    # virsh pool-start guest_images_netfs
      Pool guest_images_netfs started
    注意

    virsh pool-start 命令只适用于持久性存储池。临时存储池创建时会自动启动。

  4. [可选]自动启动过程

    默认情况下,使用 virsh 命令定义的存储池不会被设置为在每次 libvirtd 启动时自动启动。使用 virsh pool-autostart 命令将存储池配置为 autostart。

    # virsh pool-autostart guest_images_netfs
      Pool guest_images_netfs marked as autostarted

验证

  1. 使用 virsh pool-list 命令验证 Autostart 状态。

    # virsh pool-list --all
    
      Name                 State      Autostart
      -----------------------------------------
      default              active     yes
      guest_images_netfs   inactive   yes
  2. 验证存储池是否已正确创建,报告的大小与预期相同,状态报告为 running。验证文件系统的目标路径中存在 lost+found 目录,这代表挂载了该设备。

    # virsh pool-info guest_images_netfs
      Name:           guest_images_netfs
      UUID:           c7466869-e82a-a66c-2187-dc9d6f0877d0
      State:          running
      Persistent:     yes
      Autostart:      yes
      Capacity:       458.39 GB
      Allocation:     197.91 MB
      Available:      458.20 GB
11.2.2.7.2. 基于 NFS 的存储池参数

以下提供了有关基于 NFS 的存储池和示例所需的参数的信息。

您可以根据指定文件中的 XML 配置来定义一个存储池。例如:

# virsh pool-define ~/guest_images.xml
  Pool defined from guest_images_netfs

参数

下表提供了基于 NFS 的存储池 XML 文件所需的参数列表。

表 11.7. 基于 NFS 的存储池参数

描述XML

存储池的类型

<pool type='netfs'>

存储池的名称

<name>name</name>

挂载点所在的网络服务器的主机名。这可以是主机名或 IP 地址。

<source>
   <host name=hostname
/>

存储池的格式

下面是其中之一:

    <format type='nfs' />

    <format type='glusterfs' />

    <format type='cifs' />

网络服务器上使用的目录

    <dir path=source_path />
</source>

指定目标的路径。这将是用于存储池的路径。

<target>
   <path>target_path</path>
</target>

示例

以下是一个基于 file_server NFS 服务器的 /home/net_mount 目录的存储池的 XML 文件示例:

<pool type='netfs'>
  <name>nfspool</name>
  <source>
    <host name='file_server'/>
    <format type='nfs'/>
    <dir path='/home/net_mount'/>
  </source>
  <target>
    <path>/var/lib/libvirt/images/nfspool</path>
  </target>
</pool>

其它资源

有关创建基于 NFS 的存储池的详情,请参考 第 11.2.2.7.1 节 “使用 CLI 创建基于 NFS 的存储池”

11.2.2.8. 使用 CLI 为虚拟机创建并分配基于 SCSI 的存储

以下提供了有关使用 vHBA 设备创建基于 SCSI 的存储池和存储卷的信息,以及将卷分配给虚拟机(VM)。

建议

N_Port ID Virtualization (NPIV)是一个软件技术,它允许共享单一物理光纤通道主机总线适配器(HBA)。这可让多个虚拟机查看来自多个物理主机的同一存储,从而可以更轻松地迁移存储路径。因此,只要指定了正确的存储路径,迁移便不需要创建或复制存储。

在虚拟化中,虚拟主机总线适配器 (或称为 vHBA)控制虚拟机的逻辑单元号(LUN)。要让主机在多个虚拟机间共享一个光纤通道设备路径,您必须为每个虚拟机创建一个 vHBA。多个虚拟机无法使用单个 vHBA。

NPIV 的每个 vHBA 都由其父 HBA 及其自己的 World Wide Node Name(WWNN)和 World Wide Port Name(WWPN)标识。存储的路径由 WWNN 和 WWPN 值决定。父 HBA 可以定义为 scsi_host# 或 WWN/WWPN 对。

注意

如果父 HBA 定义为 scsi_host#,且在主机机器中添加了硬件,则 scsi_host# 分配可能会改变。因此,建议您使用 WWNN/WWPN 对定义父 HBA。

建议您基于 vHBA 定义 libvirt 存储池,因为这会保留 vHBA 配置。

使用 libvirt 存储池有两个主要优点:

  • libvirt 代码可以通过 virsh 命令输出轻松查找 LUN 路径。
  • 您可以迁移虚拟机只需要在目标机器上定义和启动具有相同 vHBA 名称的存储池。要做到这一点,必须在虚拟机 XML 配置中指定 vHBA LUN、libvirt 存储池和卷名称。
注意

在创建 vHBA 前,建议您在主机 LUN 中配置存储阵列(SAN)端的分区,以在虚拟机间提供隔离,并防止可能的数据崩溃。

要创建持久的 vHBA 配置,首先请创建一个 libvirt 'scsi' 存储池 XML 文件。有关 XML 文件的详情,请参考创建 vHBA。当创建一个使用同一物理 HBA 中的存储池的 vHBA 时,建议您对 <path> 值使用一个稳定的位置,比如系统中的 /dev/disk/by-{path|id|uuid|label} 位置之一。

当创建多个使用同一物理 HBA 上的存储池的 vHBA 时, <path> 字段的值只能是 /dev/,否则存储池卷只可以看到其中一个 vHBA,且主机的设备无法公开到带有 NPIV 配置的多个虚拟机。

如需有关 <path><target> 中元素的更多信息,请参阅 上游 libvirt 文档

11.2.2.8.1. 创建 vHBA

以下提供了有关创建虚拟主机总线适配器(vHBA)的步骤。

流程

  1. 使用 virsh nodedev-list --cap vports 命令在主机系统中找到 HBA。

    以下示例显示了支持 vHBA 的两个 HBA 的主机:

    # virsh nodedev-list --cap vports
    scsi_host3
    scsi_host4
  2. 使用 virsh nodedev-dumpxml HBA_device 命令查看 HBA 的详情。

    # virsh nodedev-dumpxml scsi_host3

    命令的输出列出了用于创建 vHBA 的 <name><wwnn><wwpn> 字段。<max_vports> 显示支持的 vHBA 的最大数量。例如:

    <device>
      <name>scsi_host3</name>
      <path>/sys/devices/pci0000:00/0000:00:04.0/0000:10:00.0/host3</path>
      <parent>pci_0000_10_00_0</parent>
      <capability type='scsi_host'>
        <host>3</host>
        <unique_id>0</unique_id>
        <capability type='fc_host'>
          <wwnn>20000000c9848140</wwnn>
          <wwpn>10000000c9848140</wwpn>
          <fabric_wwn>2002000573de9a81</fabric_wwn>
        </capability>
        <capability type='vport_ops'>
          <max_vports>127</max_vports>
          <vports>0</vports>
        </capability>
      </capability>
    </device>

    在这个示例中, <max_vports> 值显示 HBA 配置中有 127 个虚拟端口可用。<vports> 值显示当前使用的虚拟端口数。这些值在创建 vHBA 后更新。

  3. 为 vHBA 主机创建类似如下的 XML 文件。在这些示例中,该文件名为 vhba_host3.xml

    这个示例使用 scsi_host3 来描述父 vHBA。

    <device>
      <parent>scsi_host3</parent>
      <capability type='scsi_host'>
        <capability type='fc_host'>
        </capability>
      </capability>
    </device>

    这个示例使用 WWNN/WWPN 对描述父 vHBA。

    <device>
      <name>vhba</name>
      <parent wwnn='20000000c9848140' wwpn='10000000c9848140'/>
      <capability type='scsi_host'>
        <capability type='fc_host'>
        </capability>
      </capability>
    </device>
    注意

    WWNN 和 WWPN 值必须与上一步中 HBA 详情中的值匹配。

    <parent> 字段指定要与这个 vHBA 设备关联的 HBA 设备。<device> 标签中的详情在下一步中使用来为主机创建新 vHBA 设备。有关 nodedev XML 格式的更多信息,请参阅 libvirt 上游页面

    注意

    virsh 命令不提供定义 parent_wwnnparent_wwpnparent_fabric_wwn 属性的方法。

  4. 使用 virsh nodev-create 命令基于上一步中创建的 XML 文件创建 VHBA。

    # virsh nodedev-create vhba_host3
    Node device scsi_host5 created from vhba_host3.xml

验证

  • 使用 virsh nodedev-dumpxml 命令验证新的 vHBA 详情(scsi_host5):

    # virsh nodedev-dumpxml scsi_host5
    <device>
      <name>scsi_host5</name>
      <path>/sys/devices/pci0000:00/0000:00:04.0/0000:10:00.0/host3/vport-3:0-0/host5</path>
      <parent>scsi_host3</parent>
      <capability type='scsi_host'>
        <host>5</host>
        <unique_id>2</unique_id>
        <capability type='fc_host'>
          <wwnn>5001a4a93526d0a1</wwnn>
          <wwpn>5001a4ace3ee047d</wwpn>
          <fabric_wwn>2002000573de9a81</fabric_wwn>
        </capability>
      </capability>
    </device>
11.2.2.8.2. 通过 CLI,创建带有 vHBA 设备的基于 SCSI 的存储池

以下提供了使用虚拟主机总线适配器(vHBA)设备创建基于 SCSI 的存储池的说明。

先决条件

  • 确定您的管理程序支持基于 SCSI 的存储池:

    # virsh pool-capabilities | grep "'scsi' supported='yes'"

    如果该命令显示任何输出结果,则代表支持基于 SCSI 的池。

  • 在使用 vHBA 设备创建基于 SCSI 的存储池前,先创建一个 vHBA。如需更多信息,请参阅 创建 vHBA

流程

  1. 创建存储池

    使用 virsh pool-define-as 命令定义并创建带有 vHBA 的 SCSI 存储池。例如,以下命令会创建一个名为 guest_images_vhba 的存储池,它使用由 scsi_host3 父适配器识别的 vHBA、全局范围的端口号 5001a4ace3ee047d 以及全局范围节点号 5001a4a93526d0a1。存储池挂载到 /dev/disk/ 目录中:

    # virsh pool-define-as guest_images_vhba scsi --adapter-parent scsi_host3 --adapter-wwnn 5001a4a93526d0a1 --adapter-wwpn 5001a4ace3ee047d --target /dev/disk/
    Pool guest_images_vhba defined

    如果您已经有要创建的存储池的 XML 配置,也可以根据 XML 定义池。详情请查看 第 11.2.2.8.3 节 “使用 vHBA 设备的基于 SCSI 的存储池的参数”

  2. 验证是否已创建池

    使用 virsh pool-list 命令验证池是否已创建。

    # virsh pool-list --all
    
      Name                 State      Autostart
      -----------------------------------------
      default              active     yes
      guest_images_vhba    inactive   no
  3. 启动存储池

    使用 virsh pool-start 命令挂载存储池。

    # virsh pool-start guest_images_vhba
      Pool guest_images_vhba started
    注意

    virsh pool-start 命令只适用于持久性存储池。临时存储池创建时会自动启动。

  4. [可选]自动启动过程

    默认情况下,使用 virsh 命令定义的存储池不会被设置为在每次 libvirtd 启动时自动启动。使用 virsh pool-autostart 命令将存储池配置为 autostart。

    # virsh pool-autostart guest_images_vhba
      Pool guest_images_vhba marked as autostarted

验证

  1. 使用 virsh pool-list 命令验证 Autostart 状态。

    # virsh pool-list --all
    
      Name                 State      Autostart
      -----------------------------------------
      default              active     yes
      guest_images_vhba    inactive   yes
  2. 验证存储池是否已正确创建,报告的大小与预期相同,状态报告为 running

    # virsh pool-info guest_images_vhba
      Name:           guest_images_vhba
      UUID:           c7466869-e82a-a66c-2187-dc9d6f0877d0
      State:          running
      Persistent:     yes
      Autostart:      yes
      Capacity:       458.39 GB
      Allocation:     197.91 MB
      Available:      458.20 GB
11.2.2.8.3. 使用 vHBA 设备的基于 SCSI 的存储池的参数

以下介绍了使用虚拟主机适配器总线(vHBA)设备基于 SCSi 的存储池所需的参数。

您可以根据指定文件中的 XML 配置来定义一个存储池。例如:

# virsh pool-define ~/guest_images.xml
  Pool defined from guest_images_vhba

参数

下表提供了使用 vHBA 的基于 SCSI 的存储池 XML 文件所需的参数列表。

表 11.8. 使用 vHBA 设备的基于 SCSI 的存储池的参数

描述XML

存储池的类型

<pool type='scsi'>

存储池的名称

<name>name</name>

vHBA 的标识符。parent 属性是可选的。

<source>
   <adapter type='fc_host'
   [parent=parent_scsi_device]
   wwnn='WWNN'
   wwpn='WWPN' />
</source>

目标路径。这将是用于存储池的路径。

<target>
   <path=target_path />
</target>

重要

<path> 字段是 /dev/ 时, libvirt 为卷设备路径生成一个唯一的短设备路径。例如: /dev/sdc。否则会使用物理主机路径。例如: /dev/disk/by-path/pci-0000:10:00.0-fc-0x5006016044602198-lun-0。唯一的短设备路径允许由多个存储池在多个虚拟机(VM)中列出相同的卷。如果多个虚拟机使用了物理主机路径,则可能会出现重复的设备类型警告。

注意

parent 属性可在 <adapter> 字段中使用,用于标识可使用不同路径的 NPIV LUN 的物理 HBA 父级。这个字段 scsi_hostNvportsmax_vports 属性合并来完成父身份。parentparent_wwnnparent_wwpnparent_fabric_wwn 属性提供了不同的保证,保证在主机重启后会使用相同的 HBA。

  • 如果没有指定 parent, libvirt 将使用支持 NPIV 的第一个 scsi_hostN 适配器。
  • 如果只指定 parent,则在配置中添加额外的 SCSI 主机适配器时会出现问题。
  • 如果指定了 parent_wwnnparent_wwpn,则在主机重启后使用相同的 HBA。
  • 如果使用 parent_fabric_wwn,在主机重启同一光纤中的 HBA 后,无论使用的 scsi_hostN 是什么,都会选择同一光纤中的 HBA。

示例

以下是使用 vHBA 的基于 SCSI 的存储池的 XML 文件示例。

  • 它是 HBA 中唯一存储池的存储池:

    <pool type='scsi'>
      <name>vhbapool_host3</name>
      <source>
        <adapter type='fc_host' wwnn='5001a4a93526d0a1' wwpn='5001a4ace3ee047d'/>
      </source>
      <target>
        <path>/dev/disk/by-path</path>
      </target>
    </pool>
  • 存储池是使用单一 vHBA 并使用 parent 属性识别 SCSI 主机设备的几个存储池之一:

    <pool type='scsi'>
      <name>vhbapool_host3</name>
      <source>
        <adapter type='fc_host' parent='scsi_host3' wwnn='5001a4a93526d0a1' wwpn='5001a4ace3ee047d'/>
      </source>
      <target>
        <path>/dev/disk/by-path</path>
      </target>
    </pool>

其它资源

有关使用 vHBA 创建基于 SCSI 的存储池的详情,请参考 第 11.2.2.8.2 节 “通过 CLI,创建带有 vHBA 设备的基于 SCSI 的存储池”

11.2.2.9. 使用 CLI 创建并分配存储卷

要获取磁盘镜像并将其作为虚拟磁盘附加到虚拟机(VM),请创建存储卷并将其 XML 配置分配给虚拟机。

先决条件

  • 主机上存在带有未分配空间的存储池。要验证,列出主机上的存储池:

    # virsh pool-list --details
    
    Name               State     Autostart   Persistent   Capacity     Allocation   Available
    --------------------------------------------------------------------------------------------
    default            running   yes         yes          48.97 GiB    36.34 GiB    12.63 GiB
    Downloads          running   yes         yes          175.92 GiB   121.20 GiB   54.72 GiB
    VM-disks           running   yes         yes          175.92 GiB   121.20 GiB   54.72 GiB

流程

  1. 使用 virsh vol-create-as 命令创建存储卷。例如,基于 guest-images-fs 存储池创建 20 GB qcow2 卷:

    # virsh vol-create-as --pool guest-images-fs --name vm-disk1 --capacity 20 --format qcow2

    重要: 特定存储池类型不支持 virsh vol-create-as 命令,而是需要特定的进程来创建存储卷:

    • 基于 glusterfs - 使用 qemu-img 命令创建存储卷。
    • 基于 iSCSI - 事先在 iSCSI 服务器中准备 iSCSI LUN。
    • 基于多路径 - 使用 multipathd 命令准备或管理多路径。
    • 基于 vHBA - 事先准备光纤通道卡。
  2. 创建一个 XML 文件,并在其中添加以下几行。此文件将用于将存储卷作为磁盘添加到虚拟机。

    <disk type='volume' device='disk'>
        <driver name='qemu' type='qcow2'/>
        <source pool='guest-images-fs' volume='vm-disk1'/>
        <target dev='hdk' bus='ide'/>
    </disk>

    这个示例指定了一个使用在上一步中创建的 vm-disk1 卷的虚拟磁盘,并将卷设置为 ide 总线上的磁盘 hdk。根据您的环境修改对应的参数。

    重要: 通过特定的存储池类型,您必须使用不同的 XML 格式描述存储卷磁盘。

    • 对于 基于 GlusterFS 的池:

        <disk type='network' device='disk'>
          <driver name='qemu' type='raw'/>
          <source protocol='gluster' name='Volume1/Image'>
            <host name='example.org' port='6000'/>
          </source>
          <target dev='vda' bus='virtio'/>
          <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/>
        </disk>
    • 对于 基于多路径的池:

      <disk type='block' device='disk'>
      <driver name='qemu' type='raw'/>
      <source dev='/dev/mapper/mpatha' />
      <target dev='sda' bus='scsi'/>
      </disk>
    • 对于 基于 RBD 存储的池:

        <disk type='network' device='disk'>
          <driver name='qemu' type='raw'/>
          <source protocol='rbd' name='pool/image'>
            <host name='mon1.example.org' port='6321'/>
          </source>
          <target dev='vdc' bus='virtio'/>
        </disk>
  3. 使用 XML 文件为虚拟机分配存储卷。例如,要将 ~/vm-disk1.xml 中定义的磁盘分配给 testguest1 虚拟机:

    # attach-device --config testguest1 ~/vm-disk1.xml

验证

  • 在虚拟机的客户端操作系统中,确认磁盘镜像已作为未格式化的、未分配的磁盘可用。

11.2.3. 使用 CLI 删除虚拟机存储

以下提供了有关使用 CLI 删除存储池和存储卷的信息。

11.2.3.1. 使用 CLI 删除存储池

要从主机系统中删除存储池,您必须停止池并删除其 XML 定义。

流程

  1. 使用 virsh pool-list 命令列出定义的存储池。

    # virsh pool-list --all
    Name                 State      Autostart
    -------------------------------------------
    default              active     yes
    Downloads            active     yes
    RHEL8-Storage-Pool   active     yes
  2. 使用 virsh pool-destroy 命令停止您要删除的存储池。

    # virsh pool-destroy Downloads
    Pool Downloads destroyed
  3. :对于某些类型的存储池,您可以使用 virsh pool-delete 命令删除存储池所在的目录。请注意,要做到这一点,目录必须为空。

    # virsh pool-delete Downloads
    Pool Downloads deleted
  4. 使用 virsh pool-undefine 命令删除存储池的定义。

    # virsh pool-undefine Downloads
    Pool Downloads has been undefined

验证

  • 确认删除了存储池。

    # virsh pool-list --all
    Name                 State      Autostart
    -------------------------------------------
    default              active     yes
    RHEL8-Storage-Pool   active     yes

11.2.3.2. 使用 CLI 删除存储卷

要从主机系统中删除存储卷,您必须停止池并删除它的 XML 定义。

先决条件

  • 任何使用您要删除的存储卷的虚拟机都会被关闭。

流程

  1. 使用 virsh vol-list 命令列出存储池中定义的存储卷。该命令必须指定存储池的名称或路径。

    # virsh vol-list --pool RHEL8-Storage-Pool
     Name                 Path
    ---------------------------------------------------------------
     .bash_history        /home/VirtualMachines/.bash_history
     .bash_logout         /home/VirtualMachines/.bash_logout
     .bash_profile        /home/VirtualMachines/.bash_profile
     .bashrc              /home/VirtualMachines/.bashrc
     .git-prompt.sh       /home/VirtualMachines/.git-prompt.sh
     .gitconfig           /home/VirtualMachines/.gitconfig
     RHEL8_Volume.qcow2   /home/VirtualMachines/RHEL8_Volume.qcow2
  2. 使用 virsh vol-delete 命令删除存储卷。该命令必须指定存储卷的名称或路径以及提取存储卷的存储池。

    # virsh vol-delete --pool RHEL-Storage-Pool RHEL8_Volume.qcow2
    Pool RHEL8_Volume.qcow2 deleted

验证

  • 再次列出定义的存储卷,检查输出是否不再显示已删除卷。

    # virsh vol-list --pool RHEL8-Storage-Pool
     Name                 Path
    ---------------------------------------------------------------
     .bash_history        /home/VirtualMachines/.bash_history
     .bash_logout         /home/VirtualMachines/.bash_logout
     .bash_profile        /home/VirtualMachines/.bash_profile
     .bashrc              /home/VirtualMachines/.bashrc
     .git-prompt.sh       /home/VirtualMachines/.git-prompt.sh
     .gitconfig           /home/VirtualMachines/.gitconfig

11.3. 使用 web 控制台管理虚拟机的存储

通过 RHEL 8 web 控制台,您可以管理虚拟机(VM 的)存储的各个方面。您可以使用 Web 控制台:

11.3.1. 使用 Web 控制台查看存储池信息

以下流程描述了如何查看 web 控制台会话可访问的虚拟机(VM)存储池的详细存储池信息。

先决条件

流程

  1. Virtual Machines 接口顶部的 Storage Pools。此时会出现存储池窗口,显示配置的存储池列表。

    Web 控制台存储池窗口

    该信息包括:

    • 名称 - 存储池的名称。
    • 大小 - 存储池的大小。
    • connection - 用于访问存储池的连接。
    • State - 存储池的状态。
  2. 点击您要查看的存储行。

    行会展开,并包含以下有关所选存储池的信息的 Overview 窗格:

    • Path - 存储池的路径。
    • persistent - 存储池是否持久。
    • autostart - 是否自动启动存储池。
    • 类型 - 存储池的类型。
    Web 控制台存储池概述
  3. 要查看从存储池中创建的存储卷列表,请点存储卷

    此时会出现 Storage Volumes 窗格,显示配置的存储卷的大小以及使用的空间量。

    Web 控制台存储池存储卷

其它资源

11.3.2. 使用 Web 控制台创建存储池

虚拟机(VM)需要一个文件、目录或存储设备,可用于创建存储卷来存储虚拟机镜像或作为额外存储。您可以从本地或网络资源创建存储池,然后用来创建存储卷。

要使用 RHEL web 控制台创建存储池,请参阅以下步骤。

先决条件

流程

  1. 点击 Virtual Machines 选项卡顶部的 Storage Pools。此时会出现存储池窗口,显示配置的存储池列表。

    Web 控制台存储池窗口
  2. Create Storage Pool。此时会出现 Create Storage Pool 对话框。

    Cockpit 创建存储池
  3. 在 Create Storage Pool 对话框中输入以下信息:

    • 名称 - 存储池的名称。
    • 类型 - 存储池的类型。这可以是文件系统目录、网络文件系统、iSCSI 目标、物理磁盘驱动器或者 LVM 卷组。
    • 目标路径 - 主机文件系统中的存储池路径。
    • 启动」 - 主机引导时是否启动存储池。
  4. Create。创建存储池, Create Storage Pool 对话框会关闭,新的存储池会出现在存储池列表中。

其它资源

11.3.3. 使用 Web 控制台删除存储池

您可以删除存储池来释放主机或网络中的资源,以提高系统性能。删除存储池还可释放可供其他虚拟机(VM)使用的资源。

重要

除非明确指定,删除存储池不会同时删除该池中的存储卷。

要使用 RHEL web 控制台删除存储池,请参阅以下步骤。

注意

如果要临时取消激活存储池而不是删除它,请参阅使用 Web 控制台取消激活存储池

先决条件

流程

  1. 点击 Virtual Machines 选项卡顶部的 Storage Pools。此时会出现存储池窗口,显示配置的存储池列表。

    Web 控制台存储池窗口
  2. Storage Pools 窗口中,点击您要删除的存储池。

    该行展开,显示 Overview 窗格,其中包含有关所选存储池的基本信息,以及用于取消激活或删除存储池的控制。

    Web 控制台存储池概述
  3. 删除

    此时会出现确认对话框。

    Cockpit 存储池删除确认
  4. 可选: 要删除池中的存储卷,请在对话框中选择复选框。
  5. 删除

    存储池已删除。如果您在上一步中选择了复选框,相关的存储卷也会被删除。

其它资源

11.3.4. 使用 Web 控制台取消激活存储池

如果您不想永久删除存储池,您可以临时取消激活它。

当您取消激活存储池时,无法在那个池中创建新卷。但是,任何在那个池中卷的虚拟机(VM)都会继续运行。这对于许多原因很有用,例如:您可以限制可在池中创建的卷数量来提高系统性能。

要使用 RHEL web 控制台取消激活存储池,请参阅以下步骤。

先决条件

流程

  1. 点击 Virtual Machines 选项卡顶部的 Storage Pools。此时会出现存储池窗口,显示配置的存储池列表。

    Web 控制台存储池窗口
  2. Storage Pools 窗口中,点击您要取消激活的存储池。

    该行展开,显示 Overview 窗格,其中包含有关所选存储池的基本信息,以及用于取消激活和删除虚拟机的控制。

    Web 控制台存储池概述
  3. 取消激活

    Web 控制台存储池概述

    存储池将停用。

其它资源

11.3.5. 使用 Web 控制台创建存储卷

要创建可正常工作的虚拟机(VM),您需要为虚拟机分配一个本地存储设备,可存储虚拟机镜像和与虚拟机相关的数据。您可以在存储池中创建存储卷,并将其分配为作为存储磁盘的虚拟机。

要使用 Web 控制台创建存储卷,请参阅以下步骤。

先决条件

流程

  1. 点击 Virtual Machines 选项卡顶部的 Storage Pools。此时会出现存储池窗口,显示配置的存储池列表。

    Web 控制台存储池窗口
  2. Storage Pools 窗口中,点击您要创建存储卷的存储池。

    行会展开,以显示包含所选存储池基本信息的 Overview 窗格。

    Web 控制台存储池概述
  3. 点展开行中的 Overview 选项卡旁的 Storage Volumes

    Storage Volume 选项卡会出现有关现有存储卷的基本信息。

    Cockpit 存储卷概述
  4. 创建卷

    此时会出现 Create Storage Volume 对话框。

    Cockpit 创建存储卷
  5. 在 Create Storage Volume 对话框中输入以下信息:

    • 名称 - 存储卷的名称。
    • size - MiB 或 GiB 存储卷的大小。
    • 格式 - 存储卷的格式。支持的类型有 qcow2raw
  6. Create

    创建存储卷时, Create Storage Volume 对话框会关闭,新的存储卷会出现在存储卷列表中。

其它资源

11.3.6. 使用 Web 控制台删除存储卷

您可以删除存储卷来释放存储池中的空间,或删除与失效虚拟机(VM)关联的存储项目。

要使用 RHEL web 控制台删除存储卷,请查看以下步骤。

先决条件

流程

  1. 点击 Virtual Machines 选项卡顶部的 Storage Pools。此时会出现存储池窗口,显示配置的存储池列表。

    Web 控制台存储池窗口
  2. Storage Pools 窗口中,点您要从中删除存储卷的存储池。

    行会展开,以显示包含所选存储池基本信息的 Overview 窗格。

    Web 控制台存储池概述
  3. 点展开行中的 Overview 选项卡旁的 Storage Volumes

    Storage Volume 选项卡会出现有关现有存储卷的基本信息。

    Cockpit 存储卷概述
  4. 选择您要删除的存储卷。

    Cockpit 删除存储卷
  5. 点击 删除 1 卷

其它资源

11.3.7. 使用 web 控制台管理虚拟机磁盘

您可以使用 RHEL 8 web 控制台管理为 web 控制台连接的虚拟机配置的磁盘。

您可以:

11.3.7.1. 在 web 控制台中查看虚拟机磁盘信息

以下流程描述了如何查看 web 控制台会话连接到的虚拟机(VM)的磁盘信息。

先决条件

要使用 Web 控制台来管理虚拟机,请安装 Web 控制台虚拟机插件

流程

  1. 点击您要查看信息的虚拟机行。

    行会展开,以显示有关所选虚拟机以及用于关闭和删除虚拟机的基本信息 Overview 窗格。

  2. Disks

    Disks 窗格会出现有关分配给虚拟机的磁盘的信息。

Cockpit 磁盘信息

该信息包括:

  • 设备 - 该磁盘的设备类型。
  • 使用的 - 使用的磁盘大小。
  • Capacity - 磁盘的大小。
  • 总线 - 磁盘的总线类型。
  • access - 磁盘是可写入还是只读。
  • Source - 磁盘设备或者文件。

其它资源

11.3.7.2. 使用 web 控制台向虚拟机添加新磁盘

您可以通过创建新存储卷,并使用 RHEL 8 web 控制台将其附加到虚拟机,向虚拟机(VM)添加新磁盘。

先决条件

流程

  1. Virtual Machines 接口中,点击您要为其创建并附加新磁盘的虚拟机行。

    行会展开,以显示有关所选虚拟机以及用于关闭和删除虚拟机的基本信息 Overview 窗格。

  2. Disks

    Disks 窗格会出现有关为虚拟机配置磁盘的信息。

    cockpit disk info

  3. Add Disk

    此时会出现 Add Disk 对话框。

    cockpit add disk

  4. 选择 Create New 选项。
  5. 配置新磁盘。

    • Pool - 选择创建虚拟磁盘的存储池。
    • Name - 为要创建的虚拟磁盘输入一个名称。
    • Size - 输入大小并选择要创建的虚拟磁盘的单元(MiB 或 GiB)。
    • Format - 选择要创建的虚拟磁盘的格式。支持的类型有 qcow2raw
    • 持久性 - 如果选中,虚拟磁盘是持久性的。如果没有选择,虚拟磁盘就是临时的。

      注意

      临时磁盘只能添加到正在运行的虚拟机中。

    • 其它选项」 - 为虚拟磁盘设置附加配置。

      • Cache - 为虚拟磁盘选择缓存类型。
      • 总线 - 为虚拟磁盘选择总线类型。
  6. 添加

    虚拟磁盘已创建并连接到虚拟机。

其它资源

11.3.7.3. 使用 web 控制台将现有磁盘附加到虚拟机

以下流程描述了如何使用 RHEL 8 web 控制台将现有存储卷作为磁盘附加到虚拟机(VM)。

先决条件

流程

  1. Virtual Machines 接口中,点击您要将现有磁盘附加到的虚拟机行。

    行会展开,以显示有关所选虚拟机以及用于关闭和删除虚拟机的基本信息 Overview 窗格。

  2. Disks

    Disks 窗格会出现有关为虚拟机配置磁盘的信息。

    Cockpit 磁盘信息
  3. Add Disk

    此时会出现 Add Disk 对话框。

    cockpit 添加磁盘
  4. 使用现有按钮。

    正确的配置字段会出现在 Add Disk 对话框中。

    cockpit attach disk
  5. 为虚拟机配置磁盘。

    • - 选择要从中附加虚拟磁盘的存储池。
    • - 选择将被附加的存储卷。
    • 持久性 - 查看是否永久保留虚拟磁盘。清除以使虚拟磁盘为临时的。
    • 其它选项 - 为虚拟磁盘设置附加配置。

      • Cache - 为虚拟磁盘选择缓存类型。
      • 总线 - 为虚拟磁盘选择总线类型。
  6. 添加

    所选虚拟磁盘附加到虚拟机。

其它资源

11.3.7.4. 从虚拟机中分离磁盘

下面介绍如何使用 RHEL 8 web 控制台从虚拟机中分离磁盘。

先决条件

流程

  1. 虚拟机接口中,点您要从中分离现有磁盘的虚拟机行。

    行会展开,以显示有关所选虚拟机以及用于关闭和删除虚拟机的基本信息 Overview 窗格。

  2. Disks

    Disks 窗格会出现有关为虚拟机配置磁盘的信息。

    cockpit disk info

  3. 点您要从虚拟机中分离的磁盘旁的删除按钮。此时会出现 Remove Disk 确认对话框。
  4. 在确认对话框中,点 Remove

    虚拟磁盘与虚拟机分离。

其它资源

第 12 章 在虚拟机中管理 GPU 设备

为提高 RHEL 8 主机上的虚拟机(VM)的图形性能,您可以为虚拟机分配主机 GPU。要做到这一点:

  • 您可以从主机上分离 GPU,并将 GPU 的完整控制直接传递给虚拟机。
  • 您可以从物理 GPU 创建多个介质设备,将这些设备作为虚拟 GPU(vGPU)分配给多个客户机。目前,这只在所选 NVIDIA GPU 中支持,且只有一个介质设备可以分配给单个客户机。

12.1. 将 GPU 分配给虚拟机

要访问和控制附加到主机系统的 GPU,您必须将主机系统配置为将 GPU 直接控制传递给虚拟机(VM)。

注意

如果您要查找分配虚拟 GPU 的信息, 请参阅管理 NVIDIA vGPU 设备

先决条件

  • 您必须在主机机器内核中启用 PoliciesMU 支持。

    • 在 Intel 主机上,您必须启用 VT-d:

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

        # grubby --args="intel_iommu=on" --update-kernel DEFAULT
      2. 如果 intel_iommu=on 正常工作,您可以尝试用 iommu=pt 替换它来切换到 passthrough 模式。

        # grubby --args="iommu=pt" --update-kernel DEFAULT
        注意

        pt 选项只为使用 pass-through 模式的设备启用 HOMU,并提供更好的主机性能。然而,并非所有硬件都支持该选项。如果 iommu=pt 选项在您的主机上无法正常工作,则恢复到 intel_iommu=on 选项。

      3. 重启主机。
    • 在 AMD 主机上,您必须启用 AMD-Vi。

      请注意,在 AMD 主机上,ITMU 默认启用,您可以添加 iommu=pt 来切换到 pass-through 模式:

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

        # grubby --args="iommu=pt" --update-kernel DEFAULT
        注意

        pt 选项只为使用 pass-through 模式的设备启用 HOMU,并提供更好的主机性能。然而,并非所有硬件都支持该选项。无论是否启用这个选项,您仍可以分配设备。

      2. 重启主机。

流程

  1. 防止驱动程序绑定到 GPU。

    1. 标识附加 GPU 的 PCI 总线地址。

      # lspci -Dnn | grep VGA
      0000:02:00.0 VGA compatible controller [0300]: NVIDIA Corporation GK106GL [Quadro K4000] [10de:11fa] (rev a1)
    2. 防止主机的图形驱动程序使用 GPU。要做到这一点,请使用带有 pci-stub 驱动程序的 GPU 的 PCI ID。

      例如,以下命令可防止驱动程序绑定到在 10de:11fa bus 上附加的 GPU:

      # grubby --args="pci-stub.ids=10de:11fa" --update-kernel DEFAULT
    3. 重启主机。
  2. 选: 如果因为支持限制,某些 GPU 功能(比如音效)无法传递给虚拟机,您可以修改 FTMU 组中端点的驱动程序绑定,以只传递必要的 GPU 功能。

    1. 将 GPU 设置转换为 XML,并记录您要防止附加到主机驱动程序的端点的 PCI 地址。

      要做到这一点,通过在地址中添加 pci_ 前缀将 GPU 的 PCI 总线地址转换为 libvirt 兼容格式,并将分隔符转换为下划线。

      例如,以下命令显示附加到 0000:02:00.0 总线地址的 GPU 的 XML 配置。

      # virsh nodedev-dumpxml pci_0000_02_00_0
      <device>
       <name>pci_0000_02_00_0</name>
       <path>/sys/devices/pci0000:00/0000:00:03.0/0000:02:00.0</path>
       <parent>pci_0000_00_03_0</parent>
       <driver>
        <name>pci-stub</name>
       </driver>
       <capability type='pci'>
        <domain>0</domain>
        <bus>2</bus>
        <slot>0</slot>
        <function>0</function>
        <product id='0x11fa'>GK106GL [Quadro K4000]</product>
        <vendor id='0x10de'>NVIDIA Corporation</vendor>
        <iommuGroup number='13'>
         <address domain='0x0000' bus='0x02' slot='0x00' function='0x0'/>
         <address domain='0x0000' bus='0x02' slot='0x00' function='0x1'/>
        </iommuGroup>
        <pci-express>
         <link validity='cap' port='0' speed='8' width='16'/>
         <link validity='sta' speed='2.5' width='16'/>
        </pci-express>
       </capability>
      </device>
    2. 防止端点附加到主机驱动程序。

      在这个示例中,要将 GPU 分配给虚拟机,防止与 audio 功能 <address domain='0x0000' bus='0x02' slot='0x00' function='0x1'/> 对应的端点附加到主机 audio 驱动程序,而是将端点附加到 VFIO-PCI。

      # driverctl set-override 0000:02:00.1 vfio-pci
  3. 将 GPU 附加到虚拟机

    1. 使用 PCI 总线地址为 GPU 创建 XML 配置文件。

      例如,您可以使用 GPU 的总线地址中的参数来创建以下 XML 文件 GPU-Assign.xml。

      <hostdev mode='subsystem' type='pci' managed='yes'>
       <driver name='vfio'/>
       <source>
        <address domain='0x0000' bus='0x02' slot='0x00' function='0x0'/>
       </source>
      </hostdev>
    2. 在主机系统中保存该文件。
    3. 将文件与虚拟机 XML 配置合并。

      例如,以下命令将 GPU XML 文件 GPU-Assign.xml 与 System1 虚拟机的 XML 配置文件合并。

      # virsh attach-device System1 --file /home/GPU-Assign.xml --persistent
      Device attached successfully.
      注意

      GPU 作为辅助图形设备附加到虚拟机。分配 GPU,因为主图形设备不被支持,因此红帽不推荐在虚拟机 XML 配置中删除主模拟图形设备。

验证

12.2. 管理 NVIDIA vGPU 设备

vGPU 功能可将物理 NVIDIA GPU 设备划分为多个虚拟设备,称为 mediated devices。然后可将这些 mediated devices 分配给多个虚拟机(VM)作为虚拟 GPU。因此,这些虚拟机可以共享单个物理 GPU 的性能。

重要

为虚拟机分配物理 GPU,在使用或不使用 mediated devices 时,会导致主机无法使用 GPU。

12.2.1. 设置 NVIDIA vGPU 设备

要设置 NVIDIA vGPU 功能,您需要为 GPU 设备下载 NVIDIA vGPU 驱动程序,创建介质设备,并将其分配给预期的虚拟机。具体步骤请查看以下说明。

先决条件

  • 已安装 mdevctl 软件包。

    # yum install mdevctl
  • 您的 GPU 支持 vGPU 介质设备。有关支持创建 vGPU 的 NVIDIA GPU 的最新列表,请参阅 NVIDIA GPU 软件文档

    • 如果您不知道您的主机正在使用哪个 GPU,请安装 lshw 软件包并使用 lshw -C display 命令。以下示例显示系统使用与 vGPU 兼容的 NVIDIA Tesla P4 GPU。

      # lshw -C display
      
      *-display
             description: 3D controller
             product: GP104GL [Tesla P4]
             vendor: NVIDIA Corporation
             physical id: 0
             bus info: pci@0000:01:00.0
             version: a1
             width: 64 bits
             clock: 33MHz
             capabilities: pm msi pciexpress cap_list
             configuration: driver=vfio-pci latency=0
             resources: irq:16 memory:f6000000-f6ffffff memory:e0000000-efffffff memory:f0000000-f1ffffff

流程

  1. 下载 NVIDIA vGPU 驱动程序并在您的系统中安装它们。具体步骤请查看 NVIDIA 文档
  2. 如果 NVIDIA 软件安装程序没有创建 /etc/modprobe.d/nvidia-installer-disable-nouveau.conf 文件,请在 /etc/modprobe.d/ 中创建可以是任何名称的 conf 文件,并在文件中添加以下行:

    blacklist nouveau
    options nouveau modeset=0
  3. 为当前内核重新生成初始 ramdisk,然后重启。

    # dracut --force
    # reboot
  4. 检查内核是否已载入 nvidia_vgpu_vfio 模块以及 nvidia-vgpu-mgr.service 服务是否正在运行。

    # lsmod | grep nvidia_vgpu_vfio
    nvidia_vgpu_vfio 45011 0
    nvidia 14333621 10 nvidia_vgpu_vfio
    mdev 20414 2 vfio_mdev,nvidia_vgpu_vfio
    vfio 32695 3 vfio_mdev,nvidia_vgpu_vfio,vfio_iommu_type1
    
    # systemctl status nvidia-vgpu-mgr.service
    nvidia-vgpu-mgr.service - NVIDIA vGPU Manager Daemon
       Loaded: loaded (/usr/lib/systemd/system/nvidia-vgpu-mgr.service; enabled; vendor preset: disabled)
       Active: active (running) since Fri 2018-03-16 10:17:36 CET; 5h 8min ago
     Main PID: 1553 (nvidia-vgpu-mgr)
     [...]
  5. 生成设备 UUID。

    # uuidgen
    30820a6f-b1a5-4503-91ca-0c10ba58692a
  6. 从您探测到的 GPU 硬件创建介质设备,并将生成的 UUID 分配给该设备。

    以下示例演示了如何在运行在 0000:01:00.0 PCI 总线的 NVIDIA Tesla P4 卡中创建 nvidia-63 vGPU 类型的 media 设备:

    # mdevctl start -u 30820a6f-b1a5-4503-91ca-0c10ba58692a -p 0000:01:00.0 --type nvidia-63
    注意

    有关特定 GPU 设备的 vGPU 类型值,请参阅 Virtual GPU 软件文档

  7. 使 mediated 设备持久:

    # mdevctl define --auto --uuid 30820a6f-b1a5-4503-91ca-0c10ba58692a

  8. 将 mediated 设备附加到要共享 vGPU 资源的虚拟机。要做到这一点,请将以下行以及之前生成的 UUID 添加到虚拟机 XML 配置的 <devices/> 部分。

    <hostdev mode='subsystem' type='mdev' managed='no' model='vfio-pci'>
      <source>
        <address uuid='30820a6f-b1a5-4503-91ca-0c10ba58692a'/>
      </source>
    </hostdev>

    请注意,每个 UUID 每次只能分配给一个虚拟机。

  9. 为了在分配的虚拟机上完全正常工作 vGPU 介质设备,请在虚拟机上设置 NVIDIA vGPU 客户机软件许可证。有关详情和说明,请参阅 NVIDIA Virtual GPU Software License Server User Guide

验证

  • 列出主机上的活动介质设备。如果输出显示有使用 UUID 的定义设备,则代表正确配置了 NVIDIA vGPU。例如:

    # mdevctl list
    85006552-1b4b-45ef-ad62-de05be9171df 0000:01:00.0 nvidia-63
    30820a6f-b1a5-4503-91ca-0c10ba58692a 0000:01:00.0 nvidia-63 (defined)

其它资源

  • 有关使用 mdevctl 工具的更多信息,请使用 man mdevctl

12.2.2. 删除 NVIDIA vGPU 设备

要更改分配的 vGPU 介质设备 的配置,您需要从分配的虚拟机中删除现有设备。具体步骤请查看以下操作:

先决条件

  • 已安装 mdevctl 软件包。

    # yum install mdevctl
  • 要从中删除该设备的虚拟机关闭。

流程

  1. 获取您要删除的介质设备的 UUID。要做到这一点,使用 mdevctl list 命令:

    # mdevctl list
    85006552-1b4b-45ef-ad62-de05be9171df 0000:01:00.0 nvidia-63 (defined)
    30820a6f-b1a5-4503-91ca-0c10ba58692a 0000:01:00.0 nvidia-63 (defined)
  2. 停止 mediated vGPU 设备的运行实例。要做到这一点,使用带有该设备的 UUID 的 mdevctl stop 命令。例如:要停止 30820a6f-b1a5-4503-91ca-0c10ba58692a 设备:

    # mdevctl stop -u 30820a6f-b1a5-4503-91ca-0c10ba58692a
  3. 从虚拟机 XML 配置中删除该设备。要做到这一点,使用 virsh edit 实用程序编辑虚拟机 XML 配置,并删除 mdev 的配置片段。这个片段类似如下:

    <hostdev mode='subsystem' type='mdev' managed='no' model='vfio-pci'>
      <source>
        <address uuid='30820a6f-b1a5-4503-91ca-0c10ba58692a'/>
      </source>
    </hostdev>

    请注意,停止和分离 mediated 设备不会删除它,而是将其保留为 defined。因此,您可以 重启 该设备并 将其附加 到不同的虚拟机。

  4. 可选: 要删除已停止的介质设备,请移除其定义:

    # mdevctl undefine -u 30820a6f-b1a5-4503-91ca-0c10ba58692a

验证

  • 如果您只停止和分离该设备,请列出活跃的介质设备以及定义的介质设备。

    # mdevctl list
    85006552-1b4b-45ef-ad62-de05be9171df 0000:01:00.0 nvidia-63 (defined)
    # mdevctl list --defined
    85006552-1b4b-45ef-ad62-de05be9171df 0000:01:00.0 nvidia-63 auto (active)
    30820a6f-b1a5-4503-91ca-0c10ba58692a 0000:01:00.0 nvidia-63 manual

    如果第一个命令没有显示该设备,但第二个命令会成功执行。

  • 如果您也删除了该设备,第二个命令不应该显示该设备。

    # mdevctl list
    85006552-1b4b-45ef-ad62-de05be9171df 0000:01:00.0 nvidia-63 (defined)
    # mdevctl list --defined
    85006552-1b4b-45ef-ad62-de05be9171df 0000:01:00.0 nvidia-63 auto (active)

其它资源

  • 有关使用 mdevctl 工具的更多信息,请使用 man mdevctl

12.2.3. 获取有关您系统的 NVIDIA vGPU 信息

要评估您可使用的 vGPU 功能的功能,您可以获取系统中 mediated devices 的更多信息,例如:

  • 可创建给定类型的 mediated 设备
  • 您的系统中已经配置了哪些介质设备。

先决条件

  • 已安装 mdevctl 软件包。

    # yum install mdevctl

流程

  • 要在主机上查看可用的 vGPU 类型,请使用 mdevctl types 命令。

    例如,下面的显示了使用 0000:41:00.0 PCI 总线下使用物理 Tesla T4 卡的系统信息:

    # mdevctl types
    0000:41:00.0
      nvidia-222
        Available instances: 0
        Device API: vfio-pci
        Name: GRID T4-1B
        Description: num_heads=4, frl_config=45, framebuffer=1024M, max_resolution=5120x2880, max_instance=16
      nvidia-223
        Available instances: 0
        Device API: vfio-pci
        Name: GRID T4-2B
        Description: num_heads=4, frl_config=45, framebuffer=2048M, max_resolution=5120x2880, max_instance=8
      nvidia-224
        Available instances: 0
        Device API: vfio-pci
        Name: GRID T4-2B4
        Description: num_heads=4, frl_config=45, framebuffer=2048M, max_resolution=5120x2880, max_instance=8
      nvidia-225
        Available instances: 0
        Device API: vfio-pci
        Name: GRID T4-1A
        Description: num_heads=1, frl_config=60, framebuffer=1024M, max_resolution=1280x1024, max_instance=16
        [...]
  • 要查看主机上的活跃 vGPU 设备,包括它们的类型、UUID 和父设备的 PCI buses,请使用 mdevctl list 命令:

    # mdevctl list
    85006552-1b4b-45ef-ad62-de05be9171df 0000:41:00.0 nvidia-223
    83c32df7-d52e-4ec1-9668-1f3c7e4df107 0000:41:00.0 nvidia-223 (defined)

    这个示例显示 85006552-1b4b-45ef-ad62-de05be9171df 设备正在运行但没有定义,83c32df7-d52e-4ec1-9668-1f3c7e4df107 则已定义并正在运行。

其它资源

  • 有关使用 mdevctl 工具的更多信息,请使用 man mdevctl

12.2.4. 用于 NVIDIA vGPU 的远程桌面流服务

以下远程桌面流服务已被成功测试以与 RHEL 8 主机中的 NVIDIA vGPU 功能一起使用:

  • HP-RGS - 请注意,当前无法在 RHEL 8 虚拟机中使用 HP-RGS。
  • Mechdyne TGX - 请注意,目前无法将 Mechdyne TGX 与 Windows Server 2016 虚拟机搭配使用。
  • NICE DCV - 在使用这个流传输服务时,红帽建议使用固定的解析设置,因为在某些情况下,使用动态解析功能会导致一个黑色屏幕。另外,当前还无法在 RHEL 8 虚拟机中使用 NICE DCV。

第 13 章 配置虚拟机网络连接

要让虚拟机(VM)通过网络连接到主机、主机上的其他虚拟机以及外部网络中的位置,必须相应地配置 VM 网络。为了提供虚拟机网络,RHEL 8 hypervisor 和新创建的虚拟机具有默认的网络配置,这些配置也可以进一步修改。例如:

  • 您可以启用主机上的虚拟机被发现并连接到主机以外的位置,就像虚拟机与主机位于同一个网络一样。
  • 您可以部分或完全将虚拟机与入站网络流量隔离,以便提高它的安全性,并尽可能降低影响主机的虚拟机问题的风险。

以下小节解释了各种虚拟机网络配置类型,并提供了有关设置所选虚拟机网络配置的说明。

13.1. 了解虚拟网络

虚拟机(VM)与网络中其它设备和位置的连接必须由主机硬件启用。以下小节解释了虚拟机网络连接的机制,并描述了默认的虚拟机网络设置。

13.1.1. 虚拟网络的工作方式

虚拟网络使用了虚拟网络交换机的概念。虚拟网络交换机是在主机机器中运行的软件构造。VM 通过虚拟网络交换机连接到网络。根据虚拟交换机的配置,虚拟机可以使用虚拟机监控程序管理的现有虚拟网络,或者使用不同的网络连接方法。

下图显示了将两个虚拟机连接到网络的虚拟网络开关:

vn 02 switchand 双 guests

从客户端操作系统的角度来看,虚拟网络连接与物理网络连接相同。主机机器将虚拟网络交换机视为网络接口。当 libvirtd 服务第一次安装并启动时,它会为虚拟机创建 virbr 0

要查看这个接口的信息,请在主机上使用 ip 工具。

$ ip addr show virbr0
3: virbr0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state
 UNKNOWN link/ether 1b:c4:94:cf:fd:17 brd ff:ff:ff:ff:ff:ff
 inet 192.168.122.1/24 brd 192.168.122.255 scope global virbr0

默认情况下,单一主机上的所有虚拟机都连接到同一个 NAT 类型的 虚拟网络,名为 default, 它使用 virbr 0 接口。详情请查看 第 13.1.2 节 “虚拟网络默认配置”

对于只对虚拟机的基本的出站网络访问,通常不需要额外网络设置,因为默认网络与 libvirt 软件包一起安装,并在 libvirtd 服务启动时自动启动。

如果需要不同的虚拟机网络功能,您可以创建额外的虚拟网络和网络接口,并配置虚拟机来使用它们。除了默认的 NAT 外,这些网络和接口可以被配置为使用以下模式之一:

13.1.2. 虚拟网络默认配置

libvirtd 服务首次安装在虚拟化主机上时,它会在网络地址转换(NAT)模式中包含初始虚拟网络配置。默认情况下,主机上的所有虚拟机都连接到同一个名为 default 的 libvirt 虚拟网络。这个网络中的虚拟机可以连接到主机上和主机外的网络上的位置,但有以下限制:

  • 网络中的虚拟机对主机上的主机和其他虚拟机可见,但网络流量会受到客户端操作系统网络堆栈中的防火墙以及附加到客户端接口的 libvirt 网络过滤规则的影响。
  • 网络中的虚拟机可以在主机外的位置看到。出站流量受 NAT 规则以及主机系统的防火墙影响。

下图演示了默认虚拟机网络配置:

vn 08 网络概述

13.2. 使用 web 控制台管理虚拟机网络接口

使用 RHEL 8 web 控制台,您可以管理连接到 web 控制台的虚拟机的虚拟网络接口。您可以:

13.2.1. 在 web 控制台中查看和编辑虚拟网络接口信息

使用 RHEL 8 web 控制台,您可以在所选虚拟机(VM)上查看和修改虚拟网络接口:

先决条件

流程

  1. Virtual Machines 界面中,点您要查看信息的虚拟机行。

    行会展开,以显示有关所选虚拟机以及用于关闭和删除虚拟机的基本信息 Overview 窗格。

  2. Network Interfaces

    Networks Interfaces 窗格会出现,其中包含为虚拟机配置的虚拟网络接口的信息。

    cockpit vNIC 信息

    该信息包括:

    • 类型 - 虚拟机的网络接口类型。类型包括虚拟网络、网桥到 LAN 以及直接附加。

      注意

      RHEL 8.2 不支持通用以太网连接。

    • 型号类型 - 虚拟网络接口的型号。
    • MAC 地址 - 虚拟网络接口的 MAC 地址。
    • IP 地址 - 虚拟网络接口的 IP 地址。
    • Source - 网络接口源。这取决于网络类型。
    • State - 虚拟网络接口的状态。
  3. 要编辑虚拟网络接口设置,请点 Edit。此时会打开「虚拟网络接口设置」对话框。

    Web 控制台虚拟网络,如果设置
  4. 更改接口类型、源或型号。
  5. Save。已修改网络接口。

    注意

    对虚拟网络接口设置的更改仅在重启虚拟机后生效。

其它资源

13.2.2. 在 web 控制台中连接虚拟网络接口

使用 RHEL 8 web 控制台,您可以为所选虚拟机重新连接断开连接的虚拟网络接口。

先决条件

流程

  1. Virtual Machines 接口中,点击您要连接的虚拟网络接口的虚拟机行。

    该行展开,显示 Overview 窗格,其中包含有关所选虚拟机和控制关闭虚拟机的基本信息。

  2. Network Interfaces

    此时会出现有关为虚拟机配置的虚拟网络接口的信息。

    cockpit vNIC plug

  3. 点您要连接的虚拟网络接口行中的 Plug

    所选虚拟网络接口连接至虚拟机。

13.2.3. 在 web 控制台中断开虚拟网络接口

使用 RHEL 8 web 控制台,您可以断开连接到所选虚拟机(VM)的虚拟网络接口。

先决条件

流程

  1. Virtual Machines 接口中,点击您要断开连接的虚拟网络接口的虚拟机行。

    行会展开,以显示有关所选虚拟机以及用于关闭和删除虚拟机的基本信息 Overview 窗格。

  2. Network Interfaces

    此时会出现有关为虚拟机配置的虚拟网络接口的信息。

    Cockpit vNIC 断开连接
  3. 在您要断开连接的虚拟网络接口行中点 Unplug

    所选虚拟网络接口断开与虚拟机的连接。

13.5. 虚拟机网络连接的类型

要修改虚拟机的网络属性和行为,更改虚拟机使用的虚拟网络或接口类型。以下小节描述了 RHEL 8 中虚拟机可用的连接类型。

13.5.1. 使用网络地址转换进行虚拟联网

默认情况下,虚拟网络交换机在网络地址转换(NAT)模式下操作。它们使用 IP 伪装而不是 Source-NAT(SNAT)或者 Destination-NAT(DNAT)。IP 伪装可让连接的虚拟机使用主机机器的 IP 地址与任何外部网络通信。当虚拟网络交换机以 NAT 模式操作时,主机外的计算机无法与主机上的虚拟机通信。

vn 04 hostwithnatswitch
警告

虚拟网络交换机使用 iptables 规则配置的 NAT。不建议在交换机运行时编辑这些规则,因为不正确的规则可能会导致切换无法通信。

13.5.2. 以路由模式的虚拟网络

当使用 Routed 模式时,虚拟交换机会连接到连接到主机的物理 LAN 中,并在不使用 NAT 的情况下传输数据。虚拟交换机可检查所有流量,并使用网络数据包中包含的信息来做出路由决策。使用此模式时,虚拟机(VM)都位于独立于主机机器的单个子网中。VM 子网通过主机上存在的虚拟交换机路由。这可启用入站连接,但需要为外部网络中的系统提供额外的路由可路由条目。

路由模式使用基于 IP 地址的路由:

vn 06 路由交换机

使用路由模式的常见拓扑包括 DMZ 和虚拟服务器托管。

DMZ

您可以创建一个网络,并处于安全考虑,将一个或多个节点放在这个受控的子网络中。这样的子网络被称为“非军事区(DMZ)”。

vn 99 路由模式 DMZ

DMZ 中的主机机器通常为 WAN(外部)主机机器以及 LAN(内部)主机机器提供服务。这需要从多个位置访问这些位置,并且这些位置的安全性和信任级别以不同的方式控制并操作,所以路由模式是这种环境的最佳配置。

虚拟服务器托管

虚拟服务器托管供应商可能有几台主机,各自有两个物理网络连接。一个接口用于管理和核算,另一个用于要连接的虚拟机。每个虚拟机都有自己的公共 IP 地址,但主机机器使用私有 IP 地址,以便只有内部管理员才能管理虚拟机。

vn 10 路由模式数据中心

13.5.3. 以桥接模式的虚拟网络

在大多数 VM 网络模式中,虚拟机会自动创建和连接 virbr0 虚拟网桥。相反,在桥接模式中,VM 会连接到主机上的一个已存在的 Linux 网桥。因此,虚拟机可以在物理网络中直接看到。这就可以允许进入的连接,但不需要任何额外的路由表条目。

网桥模式使用基于 MAC 地址的连接切换:

vn 桥接模式图

在桥接模式中,虚拟机与主机机器位于同一个子网中。同一物理网络中的所有其他物理机器都可以检测虚拟机并访问它。

网桥网络绑定

虚拟机监控程序上可以使用多个物理桥接接口,方法是将它们与绑定接合在一起。然后该绑定可以添加到桥接中,之后虚拟机也可以添加到桥接中。但是,绑定驱动程序有几个操作模式,并非所有这些模式都可用于使用虚拟机的桥接。

以下 绑定模式 可用:

  • 模式 1
  • 模式 2
  • 模式 4

而使用模式 0、3、5 或 6 可能会导致连接失败。另请注意,应该使用介质独立接口(MII)监控绑定模式,因为地址解析协议(ARP)监控无法正常工作。

有关绑定模式的详情,请参考红帽知识库

常见情况

使用桥接模式的最常见用例包括:

  • 主机机器和虚拟机一起出现在现有网络中,最终用户看不到虚拟机和物理机器之间的不同。
  • 在不更改现有物理网络配置设置的情况下部署虚拟机。
  • 部署需要被现有物理网络轻松访问的虚拟机。将虚拟机放置到必须访问 DHCP 服务的物理网络中。
  • 将虚拟机连接到使用虚拟 LAN(VLAN)的现有网络。

其它资源

13.5.4. 在隔离模式中的虚拟网络

使用 隔离 模式时,连接到虚拟交换机的虚拟机可以相互通信并与主机机器通信,但它们的流量不会在主机机器外传递,它们无法从主机外部接收流量。在这个模式下需要使用 dnsmasq 的基本功能,比如 DHCP。

vn 07 隔离交换

13.5.5. 打开模式的虚拟网络

当在网络中使用开放 模式时, libvirt 不会为网络生成任何 iptables 规则。因此, libvirt 不覆盖主机提供的 iptables 规则,因此用户可以手动管理虚拟机的 iptables 规则。

13.5.6. 虚拟网络设备的直接附加

您可以使用 macvtap 驱动程序将虚拟机的 NIC 直接附加到主机的指定物理接口。macvtap 连接有多种模式,包括私有模式

在这个模式中,所有数据包都发送到外部交换机,且只有在通过外部路由器或网关发送并返回主机时,才会在同一主机上传送到目标虚拟机。可以使用专用模式来防止单一主机上的独立虚拟机相互通信。

virt macvtap 模式私有

其它资源

13.5.7. 虚拟机连接类型比较

下表提供了所选虚拟机(VM)网络配置可连接的位置信息,以及它们可见到的位置。

表 13.1. 虚拟机连接类型

 连接到主机连接到主机上的其他虚拟机连接到外部位置可查看外部位置

网桥模式

NAT

路由模式

隔离模式

私有模式

开放模式

取决于主机的 iptables 规则

13.6. 其它资源

第 14 章 在主机及其虚拟机间共享文件

您可能需要在主机系统及其运行的虚拟机(VM)间共享数据。要快速有效地这样做,您可以在您的系统中设置 NFS 或者 Samba 文件共享。

14.1. 在主机和 Linux 虚拟机间共享文件

为了在主机系统与其连接的 Linux 虚拟机间进行有效的文件共享,您可以导出一个 NFS 共享,供虚拟机挂载和访问。

先决条件

  • nfs-utils 软件包安装在主机上。
  • 要与虚拟机共享的目录。如果您不想共享任何现有目录,请创建一个新目录,例如: shared-files

    # mkdir shared-files
  • 主机可以通过虚拟机的网络可见并可访问。通常情况下,如果虚拟机使用 NAT网桥类型虚拟网络进行连接,则会出现这种情况。然而,对于 macvtap 连接,您必须首先在主机上设置 macvlan 功能。要做到这一点:

    1. 在主机的 /etc/systemd/network/ 目录中创建一个网络设备文件,例如 vm-macvlan.netdev

      # vim /etc/systemd/network/vm-macvlan.netdev
    2. 编辑网络设备文件,使其包含以下内容。您可以将 vm-macvlan 替换为您为网络设备选择的名称。

      [NetDev]
      Name=vm-macvlan
      Kind=macvlan
      
      [MACVLAN]
      Mode=bridge
    3. 为您的 macvlan 网络设备创建网络配置文件,例如 vm-macvlan.network

      # vim /etc/systemd/network/vm-macvlan.network
    4. 编辑网络配置文件使其包含以下内容。您可以将 vm-macvlan 替换为您为网络设备选择的名称。

      [Match]
      Name=_vm-macvlan_
      
      [Network]
      IPForward=yes
      Address=192.168.250.33/24
      Gateway=192.168.250.1
      DNS=192.168.250.1
    5. 为您的物理网络接口创建网络配置文件。例如,如果您的接口是 enp4s0:

      # vim /etc/systemd/network/enp4s0.network

      如果您不确定要使用的接口名称,您可以使用主机上的 ifconfig 命令获取活跃网络接口列表。

    6. 编辑物理网络配置文件,使物理网络成为 macvlan 接口的一部分,在本例中为 vm-macvlan

      [Match]
      Name=enp4s0
      
      [Network]
      MACVLAN=vm-macvlan
    7. 重启您的主机。
  • 可选: 为了提高安全性,请确保您的虚拟机与 NFS 版本 4 或更高版本兼容。

流程

  1. 在主机上,导出您要作为网络文件系统(NFS)共享的文件的目录。

    1. 获取您要共享文件的每个虚拟机的 IP 地址。以下示例获取 testguest1testguest2 的 IP 地址。

      # virsh domifaddr testguest1
      Name       MAC address          Protocol     Address
      ----------------------------------------------------------------
      vnet0      52:53:00:84:57:90    ipv4         192.168.124.220/24
      
      # virsh domifaddr testguest2
      Name       MAC address          Protocol     Address
      ----------------------------------------------------------------
      vnet1      52:53:00:65:29:21    ipv4         192.168.124.17/24
    2. 编辑主机上的 /etc/exports 文件并添加包括您要共享的目录、您要共享的虚拟机 IP 和共享选项的行。

      Shared directory VM1-IP(options) VM2-IP(options) [...]

      例如,以下会把主机上的 /usr/local/shared-files 目录与 testguest1testguest2 共享,并允许虚拟机编辑目录的内容:

      /usr/local/shared-files/ 192.168.124.220(rw,sync) 192.168.124.17(rw,sync)
    3. 导出更新的文件系统。

      # exportfs -a
    4. 确定启动 NFS 进程:

      # systemctl start nfs-server
    5. 获取主机系统的 IP 地址。这可用于以后在虚拟机上挂载共享目录。

      # ip addr
      [...]
      5: virbr0: [BROADCAST,MULTICAST,UP,LOWER_UP] mtu 1500 qdisc noqueue state UP group default qlen 1000
          link/ether 52:54:00:32:ff:a5 brd ff:ff:ff:ff:ff:ff
          inet 192.168.124.1/24 brd 192.168.124.255 scope global virbr0
             valid_lft forever preferred_lft forever
      [...]

      请注意,您要共享文件的虚拟机用来连接到主机的网络是相关网络。通常,这是 virbr0

  2. /etc/exports 文件中指定的虚拟机的客户机操作系统中挂载导出的文件系统。

    1. 创建您要用作共享文件系统挂载点的目录,例如 /mnt/host-share:

      # mkdir /mnt/host-share
    2. 在挂载点挂载主机导出的目录。这个示例在客户端的 /mnt/host-share 中挂载由 192.168.124.1 主机导出的 /usr/local/shared-files 目录:

      # mount 192.168.124.1:/usr/local/shared-files /mnt/host-share
    3. 要验证挂载是否已成功,访问并探索挂载点上的共享目录:

      # cd /mnt/host-share
      # ls
      shared-file1  shared-file2  shared-file3

14.2. 在主机和 Windows 虚拟机间共享文件

为了在主机系统和连接到它的 Windows 虚拟机间有效文件共享,您需要准备一个可被虚拟机访问的 Samba 服务器。

先决条件

  • samba 软件包安装在您的主机上。如果没有:

    # yum install samba
  • 主机可以通过虚拟机的网络可见并可访问。通常情况下,如果虚拟机使用 NAT网桥类型虚拟网络进行连接,则会出现这种情况。然而,对于 macvtap 连接,您必须首先在主机上设置 macvlan 功能。要做到这一点:

    1. 创建网络设备文件,例如在主机的 /etc/systemd/network/ 目录中称为 vm-macvlan.netdev 的文件。

      # vim /etc/systemd/network/vm-macvlan.netdev
    2. 编辑网络设备文件,使其包含以下内容。您可以将 vm-macvlan 替换为您为网络设备选择的名称。

      [NetDev]
      Name=vm-macvlan
      Kind=macvlan
      
      [MACVLAN]
      Mode=bridge
    3. 为您的 macvlan 网络设备创建网络配置文件,例如 vm-macvlan.network

      # vim /etc/systemd/network/vm-macvlan.network
    4. 编辑网络配置文件使其包含以下内容。您可以将 vm-macvlan 替换为您为网络设备选择的名称。

      [Match]
      Name=_vm-macvlan_
      
      [Network]
      IPForward=yes
      Address=192.168.250.33/24
      Gateway=192.168.250.1
      DNS=192.168.250.1
    5. 为您的物理网络接口创建网络配置文件。例如,如果您的接口是 enp4s0:

      # vim /etc/systemd/network/enp4s0.network

      如果您不确定要使用的接口,可以使用主机上的 ifconfig 命令获取活跃网络接口列表。

    6. 编辑物理网络配置文件,使物理网络成为 macvlan 接口的一部分,在本例中为 vm-macvlan

      [Match]
      Name=enp4s0
      
      [Network]
      MACVLAN=vm-macvlan
    7. 重启您的主机。

流程

  1. 在主机中,创建一个 Samba 共享并使其可以被外部系统访问。

    1. 为 Samba 添加防火墙权限。

      # firewall-cmd --permanent --zone=public --add-service=samba
      success
      # firewall-cmd --reload
      success
    2. 编辑 /etc/samba/smb.conf 文件:

      1. [global] 部分添加以下内容:

        map to guest = Bad User
      2. 在文件的末尾添加以下内容:

        #=== Share Definitions ===
        [VM-share]
        path = /samba/VM-share
        browsable = yes
        guest ok = yes
        read only = no
        hosts allow = 192.168.122.0/24

        请注意,hosts allow 行限制了共享仅可以被 VM 网络上的主机访问。如果您希望共享可以被任何人访问,请删除该行。

    3. 创建 /samba/VM-share 目录。

      # mkdir -p /samba/VM-share
    4. 启用 Samba 服务。

      # systemctl enable smb.service
      Created symlink /etc/systemd/system/multi-user.target.wants/smb.service → /usr/lib/systemd/system/smb.service.
    5. 重启 Samba 服务。

      # systemctl restart smb.service
    6. 允许虚拟机访问该 VM-share 目录并进行修改。

      # chmod -R 0755 /samba/VM-share/
      # chown -R nobody:nobody /samba/VM-share/
    7. 将 SELinux Samba 共享标签添加到 /etc/samba/VM-share/

      # chcon -t samba_share_t /samba/VM-share/
  2. 在 Windows 客户机操作系统上,将 Samba 共享作为网络位置附加。

    1. 打开文件 Explorer 并右键点击 "This PC"。
    2. 在上下文菜单中点 Add a network location

      virt Win10 network loc1
    3. 在打开的 Add Network Location 向导中,选择 "Choose a custom network location" 并点 Next
    4. 在"Internet 或 network address"字段中,输入 host-IP/VM-share,其中 host-IP 是主机的 IP 地址。通常,主机 IP 是虚拟机的默认网关。之后,点 Next

      virt Win10 网络 loc2
    5. 当向导询问共享目录是否要重命名时,保留默认名称。这样可保证跨虚拟机和客户端文件共享配置的一致性。点 Next
    6. 如果访问网络位置成功,您可以点击 Finish 并打开共享目录。

第 15 章 保护虚拟机

作为使用虚拟机(VM)的 RHEL 8 系统管理员,保护虚拟机的安全可尽可能降低您的客户端和主机操作系统被恶意软件破坏的风险。

本文档概述了 在 RHEL 8 主机上保护虚拟机 的工具程序 ,并提供了提高虚拟机安全性的方法列表

15.1. 虚拟机中的安全性是如何工作的

通过使用虚拟机,可在单一主机机器中托管多个操作系统。这些系统通过虚拟机监控程序(hypervisor)连接到主机,通常还通过虚拟网络连接。因此,每个虚拟机都可用作使用恶意软件攻击主机的向量,主机可以用作攻击任何虚拟机的向量。

图 15.1. 在虚拟化主机上潜在的恶意软件攻击向量

virt sec 成功攻击

因为虚拟机监控程序使用主机内核来管理虚拟机,所以在虚拟机操作系统中运行的服务通常会被利用来将恶意代码注入主机系统。但是,您可以使用主机和您的客体系统中的安全功能来保护您的系统不受此类安全隐患。

这些功能,如 SELinux 或 QEMU 沙盒,提供了各种措施,使恶意代码更难以攻击虚拟机监控程序,并在您的主机和虚拟机间进行传输。

图 15.2. 防止对虚拟化主机进行恶意软件攻击

Virt sec 阻止安全攻击

RHEL 8 为虚拟机安全性提供的许多功能始终活跃,无需启用或配置。详情请查看 第 15.4 节 “虚拟机安全性的自动功能”

另外,您可以遵循各种最佳实践,以尽量减小虚拟机和虚拟机监控程序的安全漏洞。更多信息请参阅 第 15.2 节 “保护虚拟机的最佳实践”

15.2. 保护虚拟机的最佳实践

根据以下步骤,您的虚拟机被恶意代码利用,并用作攻击向量攻击您的主机系统的风险会大幅降低。

在客户端中:

  • 象保护物理机器一样保护虚拟机的安全。增强安全性的具体方法取决于客户端操作系统。

    如果您的虚拟机正在运行 RHEL 8,请参阅在 RHEL 8 中配置和管理安全性 以了解有关提高客户端系统安全性的详细说明。

在主机端:

  • 当远程管理虚拟机时,请使用加密的工具(如 SSH)和网络协议(如 SSL)连接到虚拟机。
  • 确定 SELinux 处于 Enforcing 模式:

    # getenforce
    Enforcing

    如果 SELinux 被禁用或者处于 Permissive 模式,请参阅使用 SELinux 文档来激活 Enforcing 模式。

    注意

    SELinux Enforcing 模式还启用 sVirt RHEL 8 功能。这是用于虚拟化的一组特殊的 SELinux 布尔值,可手动调整,以便进行细致的虚拟机安全管理。

  • 使用带有 SecureBoot 的虚拟机:

    SecureBoot 是一个确保虚拟机运行以加密方式签名的操作系统的功能。这可防止因为恶意软件攻击而更改了操作系统的虚拟机引导。

    SecureBoot 只能在安装使用 OVMF 固件的 Linux 虚拟机时使用。具体步骤请查看 第 15.3 节 “创建 SecureBoot 虚拟机”

  • 不要使用 qemu-* 命令,如 qemu-img

    QEMU 是 RHEL 8 中虚拟化架构的一个基本组件,但很难手动管理,而不正确的 QEMU 配置可能会导致安全漏洞。因此,红帽不支持使用 qemu-* 命令。强烈建议您使用 libvirt 工具(如 virshvirt-installvirt-xml )与 QEMU 进行交互,因为这些工具会根据最佳实践编配 QEMU。

其它资源

15.3. 创建 SecureBoot 虚拟机

以下提供了有关创建使用 SecureBoot 功能的 Linux 虚拟机(VM)的步骤,可确保您的虚拟机运行以加密方式签名的操作系统。如果虚拟机的客户机操作系统被恶意软件所更改,则 SecureBoot 会阻止虚拟机引导,这可以停止恶意软件向您的主机分散的可能性。

先决条件

  • 虚拟机使用 Q35 机器类型。
  • 已安装 edk2-OVMF 软件包:

    # yum install edk2-ovmf
  • 操作系统(OS)安装源可存在于本地或者网络中。可以是以下格式之一:

    • 安装介质的 ISO 镜像
    • 现有虚拟机安装的磁盘镜像
  • 可选:对于快速、简单的配置安装,可以使用 Kickstart 文件。

流程

  1. 使用 virt-install 命令创建虚拟机,如 第 2.2.1 节 “使用命令行界面创建虚拟机” 所述。对于 --boot 选项,使用 uefi,nvram_template=/usr/share/OVMF/OVMF_VARS.secboot.fd 值。这使用 OVMF_VARS.secboot.fdOVMF_CODE.secboot.fd 文件作为虚拟机非 volatile RAM(NVRAM)设置的模板,它启用了 SecureBoot 功能。

    例如:

    # virt-install --name rhel8sb --memory 4096 --vcpus 4 --os-variant rhel8.0 --boot uefi,nvram_template=/usr/share/OVMF/OVMF_VARS.secboot.fd --disk boot_order=2,size=10 --disk boot_order=1,device=cdrom,bus=scsi,path=/images/RHEL-8.0-installation.iso
  2. 根据屏幕中的说明按照 OS 安装过程进行操作。

验证

  1. 安装客户端操作系统后,通过在 图形客户机控制台 中打开终端或 使用 SSH 连接到客户端操作系统来访问虚拟机的命令行
  2. 要确认虚拟机上启用了 SecureBoot,请使用 mokutil --sb-state 命令:

    # mokutil --sb-state
    SecureBoot enabled

其它资源

  • 有关创建使用 RHEL 8 作为客户机操作系统的虚拟机时的安装过程详情,请参阅 引导 RHEL 8 安装

15.4. 虚拟机安全性的自动功能

除了手动方法提高 第 15.2 节 “保护虚拟机的最佳实践” 中列出的虚拟机安全性外,很多安全功能还由 libvirt 软件套件提供,并在 RHEL 8 中使用虚拟化时自动启用。它们是:

系统及用户会话

要访问 RHEL 8 中虚拟机管理的所有可用工具,您需要使用 libvirt 系统会话。要做到这一点,您必须在系统中具有 root 权限,或者是 libvirt 用户组的一部分。

没有在 libvirt 组中的非 root 用户只能访问 libvirt 的 用户会话,该会话必须在访问资源时遵守本地用户的访问权利。例如,在用户会话中,您无法检测或访问系统会话或其他用户创建的虚拟机。另外,可用的 VM 网络配置选项也有很大限制。

注意

RHEL 8 文档假定您有 libvirt 系统会话权限。

虚拟机分离
单个虚拟机作为隔离进程在主机上运行,并依赖于主机内核强制的安全性。因此,虚拟机无法读取或访问同一主机上其他虚拟机的内存或者存储。
QEMU 沙盒
防止 QEMU 代码执行系统调用的功能可能会破坏主机的安全。
内核地址空间需求(KASLR)
启用随机化内核镜像压缩的物理地址和虚拟地址。因此,KASLR 会防止客户机安全漏洞根据内核对象的位置进行安全攻击。

15.5. 虚拟化布尔值

要在 RHEL 8 系统中精细配置虚拟机安全性,您可以在主机上配置 SELinux 布尔值,以确保虚拟机监控程序以特定的方式进行操作。

要列出所有与虚拟化相关的布尔值及其状态,请使用 getsebool -a | grep virt 命令:

$ getsebool -a | grep virt
[...]
virt_sandbox_use_netlink --> off
virt_sandbox_use_sys_admin --> off
virt_transition_userdomain --> off
virt_use_comm --> off
virt_use_execmem --> off
virt_use_fusefs --> off
[...]

要启用特定的布尔值,以 root 用户身份使用 setsebool -P boolean_name on 命令。要禁用布尔值,请使用 setsebool -P boolean_name off

下表列出了 RHEL 8 中可用的与虚拟化相关的布尔值以及启用后的功能:

表 15.1. SELinux 虚拟化布尔值

SELinux 布尔值描述

staff_use_svirt

启用非 root 用户创建并转换虚拟机至 sVirt。

unprivuser_use_svirt

启用非特权用户创建虚拟机并将其转换至 sVirt。

virt_sandbox_use_audit

启用沙盒容器来发送审核信息。

virt_sandbox_use_netlink

启用沙盒容器使用 netlink 系统调用。

virt_sandbox_use_sys_admin

启用沙盒容器使用 sys_admin 系统调用,如 mount。

virt_transition_userdomain

启用虚拟进程作为用户域运行。

virt_use_comm

启用 virt 使用串行/并行通信端口。

virt_use_execmem

允许受限制的虚拟客户机使用可执行内存和可执行堆栈。

virt_use_fusefs

启用 virt 读取 FUSE 挂载的文件。

virt_use_nfs

启用 virt 管理 NFS 挂载的文件。

virt_use_rawip

启用 virt 与 rawip 套接字交互。

virt_use_samba

启用 virt 管理 CIFS 挂载的文件。

virt_use_sanlock

启用受限制的虚拟客户机与 sanlock 交互。

virt_use_usb

启用 virt 使用 USB 设备。

virt_use_xserver

启用虚拟机与 X 窗口系统交互。

15.6. 在 IBM Z 中设置 IBM Secure Execution

当使用 IBM Z 硬件来运行 RHEL 8 主机时,您可以通过为虚拟机配置 IBM Secure Execution 来提高虚拟机(VM)的安全性。

IBM Secure Execution(也称 Protected Virtualization)可防止主机系统访问虚拟机的状态和内存内容。因此,即使主机被攻击,也无法用作攻击客户端操作系统的向量。另外,安全执行也可以用来防止不可信主机从虚拟机获取敏感信息。

以下流程描述了如何将 IBM Z 主机上的现有虚拟机转换为安全虚拟机。

先决条件

  • 系统硬件是以下之一:

    • IBM z15 或更高版本
    • IBM LinuxONE III 或更高版本
  • 为您的系统启用安全执行功能。要验证,请使用:

    # grep facilities /proc/cpuinfo | grep 158

    如果这个命令显示任何输出,代表您的 CPU 与安全执行兼容。

  • 内核包含对安全执行的支持。要确认,请使用:

    # ls /sys/firmware | grep uv

    如果该命令生成任何输出结果,您的内核支持安全执行。

  • 主机 CPU 模型包含 unpack 工具。要确认,请使用:

    # virsh domcapabilities | grep unpack
    <feature policy='require' name='unpack'/>

    如果命令生成上述输出,则您的 CPU 主机模型与安全执行兼容。

  • 虚拟机的 CPU 模式设置为 host-model。要确认这一点,请使用以下内容并将 vm-name 替换为虚拟机的名称。

    # virsh dumpxml vm-name | grep "<cpu mode='host-model'/>"

    如果该命令生成任何输出结果,则会正确设置虚拟机的 CPU 模式。

流程

  1. 在主机的 引导配置 中添加 prot_virt=1 内核参数。

    # # grubby --update-kernel=ALL --args="prot_virt=1"
  2. 为您要保护的虚拟机创建参数文件。例如:

    # touch ~/secure-parameters
  3. 在主机的 /boot/loader/entries 目录中,使用最新版本识别引导装载程序条目:

    # ls /boot/loader/entries -l
    [...]
    -rw-r--r--. 1 root root  281 Oct  9 15:51 3ab27a195c2849429927b00679db15c1-4.18.0-240.el8.s390x.conf
  4. 检索引导装载程序条目的内核选项行:

    # cat /boot/loader/entries/3ab27a195c2849429927b00679db15c1-4.18.0-240.el8.s390x.conf | grep options
    options root=/dev/mapper/rhel-root crashkernel=auto rd.lvm.lv=rhel/root rd.lvm.lv=rhel/swap
  5. 将选项行和 swiotlb=262144 的内容添加到创建的参数文件。

    # echo "root=/dev/mapper/rhel-root crashkernel=auto rd.lvm.lv=rhel/root rd.lvm.lv=rhel/swap swiotlb=262144" > ~/secure-parameters
  6. 为所选虚拟机生成 IBM Secure Execution 镜像。

    例如,以下内容基于 /boot/vmlinuz-4.18.0-240.el8.s390x 镜像创建一个 /boot/secure-image 安全镜像,使用 secure-parameters 文件、/boot/initramfs-4.18.0-240.el8.s390x.img 初始 RAM 磁盘文件和 HKD-8651-000201C048.crt 主机密钥文档。

    # genprotimg -i /boot/vmlinuz-4.18.0-240.el8.s390x -r /boot/initramfs-4.18.0-240.el8.s390x.img -p ~/secure-parameters -k HKD-8651-00020089A8.crt -o /boot/secure-image

    使用 genprotimg 实用程序创建安全镜像,其中包含内核参数、初始 RAM 磁盘和引导镜像。

  7. 在虚拟机的客户端操作系统中,更新虚拟机的引导菜单以从安全镜像引导。另外,删除以 initrdoptions 开头的行,因为不需要它们。

    例如,在 RHEL 8.3 虚拟机中,可在 /boot/loader/entries/ 目录中编辑引导菜单:

    # cat /boot/loader/entries/3ab27a195c2849429927b00679db15c1-4.18.0-240.el8.s390x.conf
    title Red Hat Enterprise Linux 8.3
    version 4.18.0-240.el8.s390x
    linux /boot/secure-image
    [...]
  8. 启用 virtio 设备以使用共享缓冲区。要做到这一点,使用 virsh edit 修改虚拟机的 XML 配置,并将 iommu='on' 添加到所有设备的 <driver> 行中。例如:

    <interface type='network'>
      <source network='default'/>
      <model type='virtio'/>
      <driver name='vhost' iommu='on'/>
    </interface>

    如果设备配置不包含任何 <driver> 行,请添加 <driver iommu='on'\>

  9. 禁用虚拟机上的内存 Ballooning,因为此功能与安全执行不兼容。要做到这一点,请在虚拟机 XML 配置中添加以下行。

    <memballoon model='none'/>
  10. 创建可引导磁盘镜像

    # zipl -V
  11. 安全地删除原始的未保护的文件。例如:

    # shred /boot/vmlinuz-4.18.0-240.el8.s390x
    # shred /boot/initramfs-4.18.0-240.el8.s390x.img
    # shred secure-parameters

    原始引导镜像、初始 RAM 镜像和 kernel 参数文件不受保护。如果没有删除它们,启用安全执行功能的虚拟机仍可能会被抓取尝试或敏感数据处理。

验证

  • 在主机上,使用 virsh dumpxml 实用程序确认安全虚拟机的 XML 配置。配置必须包含 <driver iommu='on'/><memballoon model='none'/> 项。

    # virsh dumpxml vm-name
    [...]
      <cpu mode='host-model'/>
      <devices>
        <disk type='file' device='disk'>
          <driver name='qemu' type='qcow2' cache='none' io='native' iommu='on'>
          <source file='/var/lib/libvirt/images/secure-guest.qcow2'/>
          <target dev='vda' bus='virtio'/>
        </disk>
        <interface type='network'>
          <driver iommu='on'/>
          <source network='default'/>
          <model type='virtio'/>
        </interface>
        <console type='pty'/>
        <memballoon model='none'/>
      </devices>
    </domain>

其它资源

15.7. 将加密 coprocessors 附加到 IBM Z 上的虚拟机

要在 IBM Z 主机上的虚拟机中使用硬件加密,请从加密的 coprocessor 设备创建介质设备并将其分配给预期的虚拟机。具体步骤请查看以下说明。

先决条件

  • 您的主机运行在 IBM Z 硬件上。
  • 加密 coprocessor 与设备分配兼容。要确认这一点,请确保您的 coprocessor 的 type 列为 CEX4 或更高版本。

    # lszcrypt -V
    
    CARD.DOMAIN TYPE  MODE        STATUS  REQUESTS  PENDING HWTYPE QDEPTH FUNCTIONS  DRIVER
    --------------------------------------------------------------------------------------------
    05         CEX5C CCA-Coproc  online         1        0     11     08 S--D--N--  cex4card
    05.0004    CEX5C CCA-Coproc  online         1        0     11     08 S--D--N--  cex4queue
    05.00ab    CEX5C CCA-Coproc  online         1        0     11     08 S--D--N--  cex4queue
  • 已安装 mdevctl 软件包。
  • 载入 vfio_ap 内核模块。要验证,请使用:

    # lsmod | grep vfio_ap
    vfio_ap         24576  0
    [...]

    要载入模块,请使用:

    # modprobe vfio_ap

流程

  1. 在主机上,将加密设备重新分配给 vfio-ap 驱动程序。以下示例为 vfio-ap 分配了两个位掩码 ID 为 (0x05, 0x0004)(0x05, 0x00ab) 的加密设备。

    #  echo -0x05 > /sys/bus/ap/apmask
    #  echo -0x0004, -0x00ab > /sys/bus/ap/aqmask

    有关识别位掩码 ID 值的详情,请参考来自 IBM 的 KVM Virtual Server Management 文档中 的为加密适配器资源准备 pass-through 设备 的信息。

  2. 验证是否正确分配了加密设备。

    # lszcrypt -V
    
    CARD.DOMAIN TYPE  MODE        STATUS  REQUESTS  PENDING HWTYPE QDEPTH FUNCTIONS  DRIVER
    --------------------------------------------------------------------------------------------
    05          CEX5C CCA-Coproc  -              1        0     11     08 S--D--N--  cex4card
    05.0004     CEX5C CCA-Coproc  -              1        0     11     08 S--D--N--  vfio_ap
    05.00ab     CEX5C CCA-Coproc  -              1        0     11     08 S--D--N--  vfio_ap

    如果域队列的 DRIVER 值更改为 vfio_ap,则代表状态可以成功。

  3. 生成设备 UUID。

    # uuidgen
    669d9b23-fe1b-4ecb-be08-a2fabca99b71

    在此流程的以下步骤中,将 669d9b23-fe1b-4ecb-be08-a2fabca99b71 替换为您生成的 UUID。

  4. 使用 UUID,创建新的 vfio_ap 设备。

    以下示例演示了创建永久介质设备并为它分配队列。例如,以下命令将域适配器 0x05 以及域队列 0x00040x00ab 分配给设备 669d9b23-fe1b-4ecb-be08-a2fabca99b71

    # mdevctl define --uuid 669d9b23-fe1b-4ecb-be08-a2fabca99b71 --parent matrix --type vfio_ap-passthrough
    # mdevctl modify --uuid 669d9b23-fe1b-4ecb-be08-a2fabca99b71 --addattr=assign_adapter --value=0x05
    # mdevctl modify --uuid 669d9b23-fe1b-4ecb-be08-a2fabca99b71 --addattr=assign_domain --value=0x0004
    # mdevctl modify --uuid 669d9b23-fe1b-4ecb-be08-a2fabca99b71 --addattr=assign_domain --value=0x00ab
  5. 启动 mediated device。

    # mdevctl start --uuid 669d9b23-fe1b-4ecb-be08-a2fabca99b71
  6. 检查配置是否已正确应用

    # cat /sys/devices/vfio_ap/matrix/mdev_supported_types/vfio_ap-passthrough/devices/669d9b23-fe1b-4ecb-be08-a2fabca99b71
    05.0004
    05.00ab

    如果输出包含您之前分配给 vfio-ap 的队列的数字值,则代表过程成功。

  7. 使用 virsh edit 命令打开您要使用加密设备的虚拟机 XML 配置。

    # virsh edit vm-name
  8. 在 XML 配置的 <devices> 部分添加以下行,并保存它。

    <hostdev mode='subsystem' type='mdev' managed='no' model='vfio-ap'>
      <source>
        <address uuid='669d9b23-fe1b-4ecb-be08-a2fabca99b71'/>
      </source>
    </hostdev>

    请注意,每个 UUID 每次只能分配给一个虚拟机。

验证

  1. 启动您为其分配该介质设备的虚拟机。
  2. 客户端操作系统引导后,请确定它检测到分配的加密设备。

    # lszcrypt -V
    
    CARD.DOMAIN TYPE  MODE        STATUS  REQUESTS  PENDING HWTYPE QDEPTH FUNCTIONS  DRIVER
    --------------------------------------------------------------------------------------------
    05          CEX5C CCA-Coproc  online         1        0     11     08 S--D--N--  cex4card
    05.0004     CEX5C CCA-Coproc  online         1        0     11     08 S--D--N--  cex4queue
    05.00ab     CEX5C CCA-Coproc  online         1        0     11     08 S--D--N--  cex4queue

    客户机操作系统中的这个命令的输出,与在有相同加密的 coprocessor 设备的主机逻辑分区中是一致的。

15.8. 在 Windows 虚拟机中启用标准硬件安全性

要保护 Windows 虚拟机,您可以使用 Windows 设备的标准硬件功能启用基本级别的安全性。

先决条件

  • 请确定您安装了最新的 WHQL 认证的 VirtIO 驱动程序。
  • 确保虚拟机固件支持 UEFI 引导。
  • 在主机机器上安装 edk2-OVMF 软件包。

    # yum install edk2-ovmf
  • 在主机机器上安装 vTPM 软件包。

    # yum install swtpm libtpms
  • 确保虚拟机使用 Q35 机器架构。
  • 请确定您有 Windows 安装介质。

流程

  1. 通过在虚拟机 XML 配置的 <devices> 部分添加以下参数来启用 TPM 2.0。

    <devices>
    [...]
      <tpm model='tpm-crb'>
        <backend type='emulator' version='2.0'/>
      </tpm>
    [...]
    </devices>
  2. 在 UEFI 模式中安装 Windows。有关如何操作的更多信息,请参阅创建 SecureBoot 虚拟机
  3. 在 Windows 虚拟机上安装 VirtIO 驱动程序。有关如何操作的详情,请参考在 Windows 客户端中安装 virtio 驱动程序
  4. 在 UEFI 中,启用安全引导。有关如何进行此操作的更多信息,请参阅 安全引导

验证

  • 确定 Windows 机器中的设备安全性页面显示以下信息:

    设置 > Update & Security > Windows Security > 设备安全

    Your device meets the requirements for standard hardware security.

15.9. 在 Windows 虚拟机中启用增强的硬件安全性

为了进一步保护 Windows 虚拟机(VM),您可以启用基于虚拟化的代码完整性保护,也称 Hypervisor-protected Code Integrity(HVCI)。

先决条件

  • 确定启用了标准硬件安全性。如需更多信息,请参阅 在 Windows 虚拟机中启用标准硬件安全性
  • 确定启用了 KVM 嵌套。如需更多信息,请参阅 创建嵌套虚拟机
  • 在 KVM 命令行中,

    • 指定 CPU 型号。
    • 启用虚拟机扩展(VMX)功能。
    • 启用 Hyper-V 引擎。

      # -cpu Skylake-Client-v3,hv_stimer,hv_synic,hv_relaxed,hv_reenlightenment,hv_spinlocks=0xfff,hv_vpindex,hv_vapic,hv_time,hv_frequencies,hv_runtime,+kvm_pv_unhalt,+vmx

流程

  1. 在 Windows 虚拟机上,导航到 Core 隔离详情页:

    设置 > Update & Security > Windows Security > Device Security > Core isolated details

  2. 切换开关来启用 内存完整性
  3. 重启虚拟机。
注意

有关启用 HVCI 的其他方法,请参阅相关的 Microsoft 文档。

验证步骤

  • 确保 Windows 虚拟机上的 设备安全 页面显示以下信息:

    设置 > Update & Security > Windows Security > 设备安全

    Your device meets the requirements for enhanced hardware security.
  • 或者,检查 Windows 虚拟机的系统信息:

    1. 在命令提示符中运行 msinfo32.exe
    2. 检查 凭证 Guard 是否在 基于虚拟化的安全服务 Running 下列出,Hypervisor 强制 代码完整性

第 16 章 优化虚拟机性能

与主机相比,虚拟机的性能总会有所降低。以下小节解释了此架构的原因,并提供了有关如何最小化 RHEL 8 中虚拟化性能影响的说明,以便尽可能有效地使用您的硬件基础架构资源。

16.1. 影响虚拟机性能的因素

虚拟机作为用户空间进程在主机上运行。因此管理程序需要转换主机的系统资源,以便虚拟机可使用它们。因此,部分资源会被转换消耗,因此虚拟机无法获得与主机相同的性能效率。

虚拟化对系统性能的影响

体虚拟机性能损失的原因包括:

  • 虚拟 CPU(vCPU)是主机上的线,,由 Linux 调度程序处理。
  • VM 不会自动继承主机内核的优化功能,比如 NUMA 或巨页。
  • 主机的磁盘和网络 I/O 设置可能会对虚拟机有显著的性能影响。
  • 网络流量通常通过基于软件的网桥到达虚拟机。
  • 根据主机设备及其模型,可能会因为模拟特定的硬件而开销。

虚拟化对虚拟机性能的影响的严重性由各种因素决定,其中包括:

  • 并行运行的虚拟机数量。
  • 每个虚拟机使用的虚拟设备数量。
  • 虚拟机使用的设备类型。

降低虚拟机性能损失

RHEL 8 提供很多功能,可用于降低虚拟化的负面影响。值得注意的是:

重要

调整虚拟机性能会对其他虚拟化功能造成负面影响。例如,它可以使迁移修改过的虚拟机更为困难。

16.2. 使用 tuned 优化虚拟机性能

tuned 工具是一个调整配置集交付机制,它可根据特定的工作负载特征(如 CPU 密集型任务要求或存储网络吞吐量响应)修改 RHEL。它提供了很多调整配置集,它们预先配置了这些配置集,以便提高性能并在很多特定用例中减少电源消耗。您可以编辑这些配置集,或创建新配置集来创建适合您的环境的性能解决方案,包括虚拟环境。

红帽建议在 RHEL 8 中使用以下配置集:

  • 对于 RHEL 8 虚拟机,使用 virtual-guest 配置集。它基于 throughput-performance 配置集,但也会降低虚拟内存的交换性。
  • 对于 RHEL 8 虚拟化主机,请使用 virtual-host 配置集。这可提高脏内存页面的主动回写,这有助于主机性能。

先决条件

流程

启用特定的 tuned 配置集:

  1. 列出可用的 tuned 配置集。

    # tuned-adm list
    
    Available profiles:
    - balanced             - General non-specialized tuned profile
    - desktop              - Optimize for the desktop use-case
    [...]
    - virtual-guest        - Optimize for running inside a virtual guest
    - virtual-host         - Optimize for running KVM guests
    Current active profile: balanced
  2. 可选: 创建新 tuned 配置集或编辑现有的 tuned 配置集。

    如需更多信息,请参阅自定义 tuned 配置集

  3. 激活 tuned 配置集。

    # tuned-adm profile selected-profile
    • 要优化虚拟化主机,请使用 virtual-host 配置集。

      # tuned-adm profile virtual-host
    • 在 RHEL 虚拟机操作系统中,使用 virtual-guest 配置集。

      # tuned-adm profile virtual-guest

其它资源

16.3. 配置虚拟机内存

要提高虚拟机(VM)的性能,您可以为虚拟机分配额外的主机 RAM。同样,您可以减少分配给虚拟机的内存量,以便主机内存可以分配给其他虚拟机或任务。

要执行这些操作,您可以使用 Web 控制台命令行界面

16.3.1. 使用 web 控制台添加和删除虚拟机内存

要提高虚拟机(VM)的性能或释放其使用的主机资源,您可以使用 web 控制台调整分配给虚拟机的内存量。

先决条件

  • 客户端操作系统正在运行内存 balloon 驱动程序。请执行以下命令校验:

    1. 确定虚拟机的配置包含 memballoon 设备:

      # virsh dumpxml testguest | grep memballoon
      <memballoon model='virtio'>
          </memballoon>

      如果这个命令显示了输出结果,且模型没有设置为 none,则代表 memballoon 设备存在。

    2. 确定 ballon 驱动程序正在客户端操作系统中运行。

  • 要使用 Web 控制台来管理虚拟机,请安装 Web 控制台虚拟机插件

流程

  1. 可选:包含有关虚拟机最大内存和当前使用的内存的信息。这将作为您更改的基准,并进行验证。

    # virsh dominfo testguest
    Max memory:     2097152 KiB
    Used memory:    2097152 KiB
  2. 虚拟机接口中,点包含您要查看和调整分配的内存的虚拟机名称的一行。

    行会展开,以显示 Overview 窗格中有关所选虚拟机的基本信息。

  3. 点击 Overview 窗格中的 Memory 行值。

    此时会出现 Memory Adjustment 对话框。

    virt 内存 cockpit
  4. 为所选虚拟机配置虚拟 CPU。

    • 最大分配 - 设置虚拟机可用于其进程的最大主机内存量。增加这个值可以提高虚拟机的性能风险,降低这个值会降低虚拟机在主机上的性能占用空间。

      只有在关闭虚拟机上才能调整最大内存分配。

    • 当前分配 - 设置分配给虚拟机的实际内存量。您可以调整这个值来规范虚拟机进程可用的内存。这个值不能超过最大分配值。
  5. Save

    调整了虚拟机的内存分配。

其它资源

16.3.2. 使用命令行界面添加和删除虚拟机内存

要提高虚拟机(VM)的性能或释放其使用的主机资源,您可以使用 CLI 调整分配给虚拟机的内存量。

先决条件

  • 客户端操作系统正在运行内存 balloon 驱动程序。请执行以下命令校验:

    1. 确定虚拟机的配置包含 memballoon 设备:

      # virsh dumpxml testguest | grep memballoon
      <memballoon model='virtio'>
          </memballoon>

      如果这个命令显示了输出结果,且模型没有设置为 none,则代表 memballoon 设备存在。

    2. 确定 ballon 驱动程序正在客户端操作系统中运行。

流程

  1. 可选:包含有关虚拟机最大内存和当前使用的内存的信息。这将作为您更改的基准,并进行验证。

    # virsh dominfo testguest
    Max memory:     2097152 KiB
    Used memory:    2097152 KiB
  2. 调整分配给虚拟机的最大内存。增加这个值可以提高虚拟机的性能风险,降低这个值会降低虚拟机在主机上的性能占用空间。请注意,这个更改只能在关闭虚拟机中执行,因此调整正在运行的虚拟机需要重启才能生效。

    例如,要将 testguest 虚拟机可以使用 最大内存改为 4096 MiB:

    # virt-xml testguest --edit --memory memory=4096,currentMemory=4096
    Domain 'testguest' defined successfully.
    Changes will take effect after the domain is fully powered off.
  1. 可选: 您还可以调整虚拟机当前使用的内存,最多不超过最大分配数。这在不更改虚拟机最大分配的情况下,规范虚拟机在主机上的内存负载,直到下次重启为止。

    # virsh setmem testguest --current 2048

验证

  1. 确认虚拟机使用的内存已更新:

    # virsh dominfo testguest
    Max memory:     4194304 KiB
    Used memory:    2097152 KiB
  2. 可选:如果您调整了当前虚拟机内存,您可以获取虚拟机的内存 balloon 统计,以评估它如何有效地控制其内存使用量。

     # virsh domstats --balloon testguest
    Domain: 'testguest'
      balloon.current=365624
      balloon.maximum=4194304
      balloon.swap_in=0
      balloon.swap_out=0
      balloon.major_fault=306
      balloon.minor_fault=156117
      balloon.unused=3834448
      balloon.available=4035008
      balloon.usable=3746340
      balloon.last-update=1587971682
      balloon.disk_caches=75444
      balloon.hugetlb_pgalloc=0
      balloon.hugetlb_pgfail=0
      balloon.rss=1005456

其它资源

16.3.3. 其它资源

  • 要增加正在运行的虚拟机的最大内存,您可以将内存设备附加到虚拟机。这也被称为内存热插拔。详情请查看 第 10.2 节 “将设备附加到虚拟机”

    请注意,在 RHEL 8 中不支持从虚拟机中删除内存设备,也称为内存热拔。红帽强烈建议不要使用它。

16.4. 优化虚拟机 I/O 性能

虚拟机(VM)的输入和输出(I/O)功能可能会显著限制虚拟机的整体效率。要解决这个问题,您可以通过配置块 I/O 参数来优化虚拟机的 I/O。

16.4.1. 在虚拟机中调整块 I/O

当一个或多个虚拟机正在使用多个块设备时,可能需要通过修改虚拟设备的 I/O 优先级来调整虚拟设备的 I/O 权重

增加设备的 I/O 权重会增加设备的 I/O 带宽的优先级,从而为它提供更多主机资源。同样的,降低设备的权重可使其消耗较少的主机资源。

注意

每个设备的 weight 值都必须在 1001000 范围内。或者,该值可以是 0,它从每个设备列表中删除该设备。

流程

显示和设置虚拟机的块 I/O 参数:

  1. 显示虚拟机的当前 <blkio> 参数:

    # virsh dumpxml VM-name

    <domain>
      [...]
      <blkiotune>
        <weight>800</weight>
        <device>
          <path>/dev/sda</path>
          <weight>1000</weight>
        </device>
        <device>
          <path>/dev/sdb</path>
          <weight>500</weight>
        </device>
      </blkiotune>
      [...]
    </domain>
  2. 编辑指定设备的 I/O 加权:

    # virsh blkiotune VM-name --device-weights device, I/O-weight

    例如:以下将 liftrul 虚拟机中的 /dev/sda 设备的权重改为 500。

    # virsh blkiotune liftbrul --device-weights /dev/sda, 500

16.4.2. 虚拟机中的磁盘 I/O 节流

当同时运行多个虚拟机时,它们可能会使用过量磁盘 I/O 来影响系统性能。KVM 虚拟化中的磁盘 I/O 节流提供对虚拟机发送到主机的磁盘 I/O 请求设定限制的功能。这可防止虚拟机过度使用共享资源并影响其他虚拟机的性能。

要启用磁盘 I/O 节流,请设置来自附加到虚拟机的每个块设备的磁盘 I/O 请求的限制。

流程

  1. 使用 virsh domblklist 命令列出指定虚拟机中的所有磁盘设备名称。

    # virsh domblklist rollin-coal
    Target     Source
    ------------------------------------------------
    vda        /var/lib/libvirt/images/rollin-coal.qcow2
    sda        -
    sdb        /home/horridly-demanding-processes.iso
  2. 找到您要节流的虚拟磁盘挂载的主机块设备。

    例如:如果您想要将 sdb 虚拟磁盘从上一步中减慢,以下输出会显示该磁盘挂载到 /dev/nvme0n1p3 分区中。

    $ lsblk
    NAME                                          MAJ:MIN RM   SIZE RO TYPE  MOUNTPOINT
    zram0                                         252:0    0     4G  0 disk  [SWAP]
    nvme0n1                                       259:0    0 238.5G  0 disk
    ├─nvme0n1p1                                   259:1    0   600M  0 part  /boot/efi
    ├─nvme0n1p2                                   259:2    0     1G  0 part  /boot
    └─nvme0n1p3                                   259:3    0 236.9G  0 part
      └─luks-a1123911-6f37-463c-b4eb-fxzy1ac12fea 253:0    0 236.9G  0 crypt /home
  3. 使用 virsh blkiotune 命令为块设备设置 I/O 限值。

    # virsh blkiotune VM-name --parameter device,limit

    以下示例将 rollin-coal 虚拟机中的 sdb 磁盘节流为每秒 1000 个读写 I/O 操作,每秒的读写 I/O 操作吞吐量 50 MB。

    # virsh blkiotune rollin-coal --device-read-iops-sec /dev/nvme0n1p3,1000 --device-write-iops-sec /dev/nvme0n1p3,1000 --device-write-bytes-sec /dev/nvme0n1p3,52428800 --device-read-bytes-sec /dev/nvme0n1p3,52428800

附加信息

  • 磁盘 I/O 节流在不同情况下很有用,例如,属于不同客户的虚拟机在同一主机上运行,或者为不同的虚拟机提供服务质量保障。磁盘 I/O 节流还可用来模拟较慢的磁盘。
  • I/O 节流可独立应用于附加到虚拟机的每个块设备,并支持对吞吐量和 I/O 操作的限制。
  • 红帽不支持使用 virsh blkdeviotune 命令在虚拟机中配置 I/O 节流。如需了解在使用 RHEL 8 作为虚拟机主机时不支持的功能的更多信息,请参阅 第 20.3 节 “RHEL 8 虚拟化不支持的功能”

16.4.3. 启用多队列 virtio-scsi

在虚拟机(VM)中使用 virtio-scsi 存储设备时, 多队列 virtio-scsi 功能提高了存储性能和可扩展性。它可让每个虚拟 CPU(vCPU)在不影响其他 vCPU 的情况下使用单独的队列和中断。

流程

  • 要为特定虚拟机启用多队列 virtio-scsi 支持,请在虚拟机的 XML 配置中添加以下内容,其中 N 是 vCPU 队列的总数:

    <controller type='scsi' index='0' model='virtio-scsi'>
       <driver queues='N' />
    </controller>

16.5. 优化虚拟机 CPU 性能

与主机机器中的物理 CPU 类似,vCPU 对于虚拟机(VM)性能至关重要。因此,优化 vCPU 可能会严重影响虚拟机的资源效率。优化 vCPU:

  1. 调整分配给虚拟机的主机 CPU 数。您可以使用 CLIWeb 控制台进行此操作。
  2. 确保 vCPU 模型与主机的 CPU 型号一致。例如,将 testguest1 虚拟机设置为使用主机的 CPU 型号:

    # virt-xml testguest1 --edit --cpu host-model
  3. 取消激活内核相同的页面合并(KSM)
  4. 如果您的主机机器使用 Non-Uniform Memory Access(NUMA),您也可以为其虚拟机 配置 NUMA。这会将主机的 CPU 和内存进程映射到虚拟机的 CPU 和内存进程。实际上, NUMA 调整为 vCPU 提供了对分配给虚拟机的系统内存的更简化的访问,这可以改进 vCPU 处理方式。

    详情请查看 第 16.5.3 节 “在虚拟机中配置 NUMA”第 16.5.4 节 “vCPU 性能调整场景示例”

16.5.1. 使用命令行界面添加和删除虚拟 CPU

要提高或优化虚拟机(VM)的 CPU 性能,您可以添加或删除分配给虚拟机的虚拟 CPU(vCPU)。

当在运行的虚拟机上执行时,这也被称为 vCPU 热插和热拔。但请注意,RHEL 8 不支持 vCPU 热拔,红帽不建议使用它。

先决条件

  • 可选:查看目标虚拟机中的 vCPU 的当前状态。例如,显示 testguest 虚拟机上的 vCPU 数量:

    # virsh vcpucount testguest
    maximum      config         4
    maximum      live           2
    current      config         2
    current      live           1

    此输出显示 testguest 目前使用 1 个 vCPU,另外 1 个 vCPu 可以热插入以提高虚拟机性能。但是,重新引导后,vCPU testguest 使用的数量会改为 2,而且能够热插 2 个 vCPU。

流程

  1. 调整可附加到虚拟机的最大 vCPU 数量,这对虚拟机的下次引导生效。

    例如,要将 testguest 虚拟机的最大 vCPU 数量增加到 8:

    # virsh setvcpus testguest 8 --maximum --config

    请注意,最大值可能受 CPU 拓扑、主机硬件、虚拟机监控程序和其他因素的限制。

  2. 调整当前附加到虚拟机的 vCPU 数量,以达到上一步中配置的最大值。例如:

    • 将附加到正在运行的 testguest 虚拟机的 vCPU 数量增加到 4:

      # virsh setvcpus testguest 4 --live

      这会增加虚拟机的性能和主机的 testguest 负载占用,直到虚拟机下次引导为止。

    • 将附加到 testguest 虚拟机的 vCPU 数量永久减少至 1:

      # virsh setvcpus testguest 1 --config

      这会降低虚拟机的性能和 testguest 的主机负载占用。但是,如果需要可热插入虚拟机以暂时提高性能。

验证

  • 确认虚拟机的 vCPU 的当前状态反映了您的更改。

    # virsh vcpucount testguest
    maximum      config         8
    maximum      live           4
    current      config         1
    current      live           4

其它资源

16.5.2. 使用 Web 控制台管理虚拟 CPU

使用 RHEL 8 web 控制台,您可以查看并配置 web 控制台连接的虚拟机使用的虚拟 CPU。

先决条件

流程

  1. Virtual Machines 界面中,点一个带有您要查看和配置虚拟 CPU 参数的虚拟机名称的行。

    该行展开,显示 Overview 窗格以及所选虚拟机的基本信息,包括虚拟 CPU 的数量,以及关闭和删除虚拟机的控制。

  2. 点击 Overview 窗格中的 vCPU 数量。

    此时会出现 vCPU 详情对话框。

    Cockpit 配置 vCPU
    注意

    只有在更改虚拟 CPU 设置后,vCPU 详情对话框中的警告会出现。

  3. 为所选虚拟机配置虚拟 CPU。

    • vCPU 数量 - 当前正在使用的 vCPU 数量。

      注意

      vCPU 数量不能超过 vCPU 的最大值。

    • vCPU 最大 - 可为虚拟机配置的最大虚拟 CPU 数。如果这个值大于 vCPU Count,可以为虚拟机附加额外的 vCPU。
    • 插槽 - 向虚拟机公开的插槽数量。
    • 每个插槽的内核数 - 向虚拟机公开的每个插槽的内核数。
    • 每个内核的线程数 - 向虚拟机公开的每个内核的线程数。

      请注意, 插槽每个插槽的内核数每个内核的线程数选项调整了虚拟机的 CPU 拓扑。这可能对 vCPU 性能很有帮助,并可能会影响客户端操作系统中某些软件的功能。如果您的部署不需要不同的设置,红帽建议保留默认值。

  4. 应用

    配置了虚拟机的虚拟 CPU。

    注意

    对虚拟 CPU 设置的更改仅在重启虚拟机后生效。

其他资源:

16.5.3. 在虚拟机中配置 NUMA

以下方法可用于在 RHEL 8 主机上配置虚拟机(VM)的 Non-Uniform Memory Access(NUMA)设置。

先决条件

  • 主机是一个与 NUMA 兼容的机器。要检测是否是这种情况,使用 virsh nodeinfo 命令并查看 NUMA cell(s) 行:

    # virsh nodeinfo
    CPU model:           x86_64
    CPU(s):              48
    CPU frequency:       1200 MHz
    CPU socket(s):       1
    Core(s) per socket:  12
    Thread(s) per core:  2
    NUMA cell(s):        2
    Memory size:         67012964 KiB

    如果行的值为 2 或更高,则主机与 NUMA 兼容。

流程

为便于使用,您可以使用自动工具和服务设置虚拟机的 NUMA 配置。但是,手动 NUMA 设置可能会显著提高性能。

自动方法

  • 将虚拟机的 NUMA 策略设置为 Preferred。例如,对于 testguest5 虚拟机要这样做:

    # virt-xml testguest5 --edit --vcpus placement=auto
    # virt-xml testguest5 --edit --numatune mode=preferred
  • 在主机上启用自动 NUMA 均衡:

    # echo 1 > /proc/sys/kernel/numa_balancing
  • 使用 numad 命令自动将虚拟机 CPU 与内存资源匹配。

    # numad

手动方法

  1. 将特定 vCPU 线程固定到特定主机 CPU 或者 CPU 范围。在非 NUMA 主机和虚拟机上也可以这样做,我们推荐您使用一种安全的方法来提高 vCPU 性能。

    例如,以下命令将 testguest6 虚拟机的 vCPU 线程 0 到 5 分别固定到主机 CPU 1、3、5、7、9 和 11:

    # virsh vcpupin testguest6 0 1
    # virsh vcpupin testguest6 1 3
    # virsh vcpupin testguest6 2 5
    # virsh vcpupin testguest6 3 7
    # virsh vcpupin testguest6 4 9
    # virsh vcpupin testguest6 5 11

    之后,您可以验证操作是否成功:

    # virsh vcpupin testguest6
    VCPU   CPU Affinity
    ----------------------
    0      1
    1      3
    2      5
    3      7
    4      9
    5      11
  2. 固定 vCPU 线程后,您还可以 pin QEMU 进程将与指定虚拟机关联的线程到特定主机 CPU 或 CPU 范围。例如:以下命令将 testguest6 的 QEMU 进程线程 固定到 CPU 13 和 15,确认成功:

    # virsh emulatorpin testguest6 13,15
    # virsh emulatorpin testguest6
    emulator: CPU Affinity
    ----------------------------------
           *: 13,15
  3. 最后,您还可以指定将哪些主机 NUMA 节点专门分配给特定的虚拟机。这可提高虚拟机 vCPU 的主机内存用量。例如,以下命令将 testguest6 设置为使用主机 NUMA 节点 3 到 5,确认成功:

    # virsh numatune testguest6 --nodeset 3-5
    # virsh numatune testguest6

其它资源

16.5.4. vCPU 性能调整场景示例

要获得最佳 vCPU 性能,红帽建议您一起使用手动 vcpupinemulatorpinnumatune 设置,例如在以下情况下。

起始场景

  • 您的主机有以下与硬件相关的信息:

    • 2 个 NUMA 节点
    • 每个节点上的 3 个 CPU 内核
    • 每个内核有 2 个线程

    这类机器的 virsh nodeinfo 的输出类似于:

    # virsh nodeinfo
    CPU model:           x86_64
    CPU(s):              12
    CPU frequency:       3661 MHz
    CPU socket(s):       2
    Core(s) per socket:  3
    Thread(s) per core:  2
    NUMA cell(s):        2
    Memory size:         31248692 KiB
  • 您将现有虚拟机修改为 8 个 vCPU,这意味着它不适用于单个 NUMA 节点。

    因此,您应该在每个 NUMA 节点上发布 4 个 vCPU,使 vCPU 拓扑与主机拓扑类似。这意味着,作为给定物理 CPU 的同级线程运行的 vCPU 应该被固定到主机同一内核的线程中。详情请查看以下解决方案:

解决方案

  1. 获取主机拓扑的信息:

    # virsh capabilities

    输出应包含类似如下的部分:

    <topology>
      <cells num="2">
        <cell id="0">
          <memory unit="KiB">15624346</memory>
          <pages unit="KiB" size="4">3906086</pages>
          <pages unit="KiB" size="2048">0</pages>
          <pages unit="KiB" size="1048576">0</pages>
          <distances>
            <sibling id="0" value="10" />
            <sibling id="1" value="21" />
          </distances>
          <cpus num="6">
            <cpu id="0" socket_id="0" core_id="0" siblings="0,3" />
            <cpu id="1" socket_id="0" core_id="1" siblings="1,4" />
            <cpu id="2" socket_id="0" core_id="2" siblings="2,5" />
            <cpu id="3" socket_id="0" core_id="0" siblings="0,3" />
            <cpu id="4" socket_id="0" core_id="1" siblings="1,4" />
            <cpu id="5" socket_id="0" core_id="2" siblings="2,5" />
          </cpus>
        </cell>
        <cell id="1">
          <memory unit="KiB">15624346</memory>
          <pages unit="KiB" size="4">3906086</pages>
          <pages unit="KiB" size="2048">0</pages>
          <pages unit="KiB" size="1048576">0</pages>
          <distances>
            <sibling id="0" value="21" />
            <sibling id="1" value="10" />
          </distances>
          <cpus num="6">
            <cpu id="6" socket_id="1" core_id="3" siblings="6,9" />
            <cpu id="7" socket_id="1" core_id="4" siblings="7,10" />
            <cpu id="8" socket_id="1" core_id="5" siblings="8,11" />
            <cpu id="9" socket_id="1" core_id="3" siblings="6,9" />
            <cpu id="10" socket_id="1" core_id="4" siblings="7,10" />
            <cpu id="11" socket_id="1" core_id="5" siblings="8,11" />
          </cpus>
        </cell>
      </cells>
    </topology>
  2. 可选:使用 适用的工具和工具测试虚拟机的性能
  3. 在主机上设置并挂载 1 GiB 巨页:

    1. 在主机的内核命令行中添加以下行:

      default_hugepagesz=1G hugepagesz=1G
    2. 使用以下内容创建 /etc/systemd/system/hugetlb-gigantic-pages.service 文件:

      [Unit]
      Description=HugeTLB Gigantic Pages Reservation
      DefaultDependencies=no
      Before=dev-hugepages.mount
      ConditionPathExists=/sys/devices/system/node
      ConditionKernelCommandLine=hugepagesz=1G
      
      [Service]
      Type=oneshot
      RemainAfterExit=yes
      ExecStart=/etc/systemd/hugetlb-reserve-pages.sh
      
      [Install]
      WantedBy=sysinit.target
    3. 使用以下内容创建 /etc/systemd/hugetlb-reserve-pages.sh 文件:

      #!/bin/sh
      
      nodes_path=/sys/devices/system/node/
      if [ ! -d $nodes_path ]; then
      	echo "ERROR: $nodes_path does not exist"
      	exit 1
      fi
      
      reserve_pages()
      {
      	echo $1 > $nodes_path/$2/hugepages/hugepages-1048576kB/nr_hugepages
      }
      
      reserve_pages 4 node1
      reserve_pages 4 node2

      这会从 node1 保留 4 个 1GiB 巨页,并在 node2 中保留 4 个 1GiB 巨页。

    4. 使在上一步中创建的脚本可执行:

      # chmod +x /etc/systemd/hugetlb-reserve-pages.sh
    5. 在引导时启用巨页保留:

      # systemctl enable hugetlb-gigantic-pages
  4. 使用 virsh edit 命令编辑您要优化的虚拟机的 XML 配置,在这个示例中 super-VM

    # virsh edit super-vm
  5. 用以下方法调整虚拟机的 XML 配置:

    1. 将虚拟机设置为使用 8 个静态 vCPU。使用 <vcpu/> 项进行此操作。
    2. 将每个 vCPU 线程固定到拓扑中镜像的对应主机 CPU 线程。要做到这一点,使用 <cputune> 部分中的 <vcpupin/> 项。

      请注意,如上面的 virsh capabilities 工具所示,主机 CPU 线程不会在相应的内核中按顺序排序。另外, vCPU 线程应该被固定到同一 NUMA 节点上最多可用的主机内核集合中。有关表格示例,请参阅以下 附加资源 部分。

      步骤 a. 和 b. 的 XML 配置类似:

      <cputune>
        <vcpupin vcpu='0' cpuset='1'/>
        <vcpupin vcpu='1' cpuset='4'/>
        <vcpupin vcpu='2' cpuset='2'/>
        <vcpupin vcpu='3' cpuset='5'/>
        <vcpupin vcpu='4' cpuset='7'/>
        <vcpupin vcpu='5' cpuset='10'/>
        <vcpupin vcpu='6' cpuset='8'/>
        <vcpupin vcpu='7' cpuset='11'/>
        <emulatorpin cpuset='6,9'/>
      </cputune>
    3. 将虚拟机设置为使用 1 GiB 巨页:

      <memoryBacking>
        <hugepages>
          <page size='1' unit='GiB'/>
        </hugepages>
      </memoryBacking>
    4. 配置虚拟机的 NUMA 节点,使其使用主机上对应的 NUMA 节点的内存。要做到这一点,使用 <numatune/> 部分中的 <memnode/> 元素:

      <numatune>
        <memory mode="preferred" nodeset="1"/>
        <memnode cellid="0" mode="strict" nodeset="0"/>
        <memnode cellid="1" mode="strict" nodeset="1"/>
      </numatune>
    5. 确保 CPU 模式被设置为 host-passthrough,且 CPU 在 passthrough 模式中使用缓存:

      <cpu mode="host-passthrough">
        <topology sockets="2" cores="2" threads="2"/>
        <cache mode="passthrough"/>
  6. 虚拟机的 XML 配置应该包括以下部分:

    [...]
      <memoryBacking>
        <hugepages>
          <page size='1' unit='GiB'/>
        </hugepages>
      </memoryBacking>
      <vcpu placement='static'>8</vcpu>
      <cputune>
        <vcpupin vcpu='0' cpuset='1'/>
        <vcpupin vcpu='1' cpuset='4'/>
        <vcpupin vcpu='2' cpuset='2'/>
        <vcpupin vcpu='3' cpuset='5'/>
        <vcpupin vcpu='4' cpuset='7'/>
        <vcpupin vcpu='5' cpuset='10'/>
        <vcpupin vcpu='6' cpuset='8'/>
        <vcpupin vcpu='7' cpuset='11'/>
        <emulatorpin cpuset='6,9'/>
      </cputune>
      <numatune>
        <memory mode="preferred" nodeset="1"/>
        <memnode cellid="0" mode="strict" nodeset="0"/>
        <memnode cellid="1" mode="strict" nodeset="1"/>
      </numatune>
      <cpu mode="host-passthrough">
        <topology sockets="2" cores="2" threads="2"/>
        <cache mode="passthrough"/>
        <numa>
          <cell id="0" cpus="0-3" memory="2" unit="GiB">
            <distances>
              <sibling id="0" value="10"/>
              <sibling id="1" value="21"/>
            </distances>
          </cell>
          <cell id="1" cpus="4-7" memory="2" unit="GiB">
            <distances>
              <sibling id="0" value="21"/>
              <sibling id="1" value="10"/>
            </distances>
          </cell>
        </numa>
      </cpu>
    </domain>
  7. :使用可用工具和实用程序 来测试虚拟机性能,以评估虚拟机优化的影响。

其它资源

  • 下表演示了 vCPU 和主机 CPU 之间的连接:

    表 16.1. 主机拓扑

    CPU 线程

    0

    3

    1

    4

    2

    5

    6

    9

    7

    10

    8

    11

    内核

    0

    1

    2

    3

    4

    5

    插槽

    0

    1

    NUMA 节点

    0

    1

    表 16.2. VM 拓扑

    vCPU 线程

    0

    1

    2

    3

    4

    5

    6

    7

    内核

    0

    1

    2

    3

    插槽

    0

    1

    NUMA 节点

    0

    1

    表 16.3. 合并主机和虚拟机拓扑

    vCPU 线程

     

    0

    1

    2

    3

     

    4

    5

    6

    7

    主机 CPU 线程

    0

    3

    1

    4

    2

    5

    6

    9

    7

    10

    8

    11

    内核

    0

    1

    2

    3

    4

    5

    插槽

    0

    1

    NUMA 节点

    0

    1

    在这种情况下,有 2 个 NUMA 节点和 8 个 vCPU。因此,应该为每个节点固定 4 个 vCPU 线程。

    另外,红帽建议在每个节点中保留至少一个 CPU 线程用于主机系统操作。

    因为在这个示例中,每个 NUMA 节点都包含 3 个内核,每个内核都有 2 个主机 CPU 线程,所以节点 0 的设置会按照如下所示转换:

    <vcpupin vcpu='0' cpuset='1'/>
    <vcpupin vcpu='1' cpuset='4'/>
    <vcpupin vcpu='2' cpuset='2'/>
    <vcpupin vcpu='3' cpuset='5'/>

16.5.5. 取消激活内核相同的页面合并

虽然内核相同的页面合并(KSM)提高了内存密度,但会增加 CPU 使用率,并可能会根据工作负载对整体性能造成负面影响。在这种情况下,您可以通过取消激活 KSM 来提高虚拟机(VM)性能。

根据您的要求,您可以为单一会话取消激活 KSM,或者永久激活 KSM。

流程

  • 要在一个会话中取消激活 KSM,请使用 systemctl 工具停止 ksmksmtuned 服务。

    # systemctl stop ksm
    
    # systemctl stop ksmtuned
  • 要永久取消激活 KSM,使用 systemctl 工具禁用 ksmksmtuned 服务。

    # systemctl disable ksm
    Removed /etc/systemd/system/multi-user.target.wants/ksm.service.
    # systemctl disable ksmtuned
    Removed /etc/systemd/system/multi-user.target.wants/ksmtuned.service.
注意

取消激活 KSM 前在虚拟机间共享的内存页将保持共享。要停止共享,使用以下命令删除系统中的所有 PageKSM 页面:

# echo 2 > /sys/kernel/mm/ksm/run

在匿名页面替换了 KSM 页面后,khugepaged 内核服务将在虚拟机物理内存上重建透明巨页。

16.6. 优化虚拟机网络性能

由于虚拟机网络接口卡(NIC)的虚拟特性,VM 会丢失一部分分配的主机网络带宽,这可以降低虚拟机的总工作负载效率。以下提示可以最小化虚拟 NIC(vNIC)吞吐量的负面影响。

流程

使用以下任一方法并观察它是否对虚拟机网络性能有帮助:

启用 vhost_net 模块

在主机上,确定启用了 vhost_net 内核功能:

# lsmod | grep vhost
vhost_net              32768  1
vhost                  53248  1 vhost_net
tap                    24576  1 vhost_net
tun                    57344  6 vhost_net

如果这个命令的输出为空白,启用 vhost_net 内核模块:

# modprobe vhost_net
设置多队列 virtio-net

要为虚拟机设置 多队列 virtio-net 功能,使用 virsh edit 命令编辑虚拟机的 XML 配置。在 XML 中,将以下内容添加到 <devices> 部分,并使用虚拟机中的 vCPU 数量替换 N,最多为 16:

<interface type='network'>
      <source network='default'/>
      <model type='virtio'/>
      <driver name='vhost' queues='N'/>
</interface>

如果虚拟机正在运行,重启它以使更改生效。

批量网络数据包

在带有长传输路径的 Linux 虚拟机配置中,在将数据包提交到内核前,批量数据包可能会提高缓存使用率。要设置数据包批处理,请在主机上使用以下命令,并将 tap0 替换为虚拟机使用的网络接口名称:

# ethtool -C tap0 rx-frames 128
SR-IOV
如果您的主机 NIC 支持 SR-IOV,请为您的 vNIC 使用 SR-IOV 设备分配。更多信息请参阅 第 10.8 节 “管理 SR-IOV 设备”

其它资源

16.7. 虚拟机性能监控工具

要确定最消耗虚拟机资源以及虚拟机性能优化的哪些方面,可使用一般的和针对虚拟机的性能诊断工具。

默认操作系统性能监控工具

要进行标准性能评估,您可以使用主机和客户机操作系统默认提供的工具:

  • 在 RHEL 8 主机上,以 root 用户身份使用 top 实用程序或 系统监控应用程序,并在输出中查找 qemuvirt。这显示了您的虚拟机消耗的主机系统资源量。

    • 如果监控工具显示任何 qemuvirt 进程消耗大量主机 CPU 或内存容量,请使用 perf 工具程序进行调查。详情请查看以下信息。
    • 另外,如果 vhost_net 线程进程(如 vhost_net-1234) 显示为消耗大量主机 CPU 容量,请考虑使用 虚拟网络优化功能,如 multi-queue virtio-net
  • 在客户端操作系统中,使用系统中可用的性能工具和应用程序来评估哪些进程消耗了最多的系统资源。

    • 在 Linux 系统中,您可以使用 top 工具。
    • 在 Windows 系统中,您可以使用 Task Manager 应用程序。

perf kvm

您可以使用 perf 实用程序收集有关 RHEL 8 主机性能的特定虚拟化统计。要做到这一点:

  1. 在主机上安装 perf 软件包:

    # yum install perf
  2. 使用 perf kvm stat 命令之一显示虚拟化主机的 perf 统计:

    • 对于虚拟机监控程序的实时监控,请使用 perf kvm stat live 命令。
    • 要记录虚拟机监控程序的 perf 数据,请使用 perf kvm stat record 命令激活日志。取消或中断命令后,数据保存在 perf.data.guest 文件中,该命令可使用 perf kvm stat report 命令分析。
  3. 分析 VM-EXIT 事件类型及其分布的 perf 输出。例如: PAUSE_INSTRUCTION 事件应该不频繁,但在以下输出中,此事件发生率表示主机 CPU 没有正确处理正在运行的 vCPU。在这种情况下,请考虑关闭一些活跃的虚拟机,从这些虚拟机中删除 vCPU,或者 调整 vCPU 的性能

    # perf kvm stat report
    
    Analyze events for all VMs, all VCPUs:
    
    
                 VM-EXIT    Samples  Samples%     Time%    Min Time    Max Time         Avg time
    
      EXTERNAL_INTERRUPT     365634    31.59%    18.04%      0.42us  58780.59us    204.08us ( +-   0.99% )
               MSR_WRITE     293428    25.35%     0.13%      0.59us  17873.02us      1.80us ( +-   4.63% )
        PREEMPTION_TIMER     276162    23.86%     0.23%      0.51us  21396.03us      3.38us ( +-   5.19% )
       PAUSE_INSTRUCTION     189375    16.36%    11.75%      0.72us  29655.25us    256.77us ( +-   0.70% )
                     HLT      20440     1.77%    69.83%      0.62us  79319.41us  14134.56us ( +-   0.79% )
                  VMCALL      12426     1.07%     0.03%      1.02us   5416.25us      8.77us ( +-   7.36% )
           EXCEPTION_NMI         27     0.00%     0.00%      0.69us      1.34us      0.98us ( +-   3.50% )
           EPT_MISCONFIG          5     0.00%     0.00%      5.15us     10.85us      7.88us ( +-  11.67% )
    
    Total Samples:1157497, Total events handled time:413728274.66us.

    可在 perf kvm stat 输出中指示问题的其他事件类型包括:

有关使用 perf 监控虚拟化性能的详情请参考 perf-kvm man page。

numastat

要查看系统的当前 NUMA 配置,您可以使用 numastat 工具程序,通过安装 numactl 软件包来提供该工具。

以下显示了一个有 4 个运行虚拟机的主机,各自从多个 NUMA 节点获取内存。这不是 vCPU 性能的最佳方案,并保证调整

# numastat -c qemu-kvm

Per-node process memory usage (in MBs)
PID              Node 0 Node 1 Node 2 Node 3 Node 4 Node 5 Node 6 Node 7 Total
---------------  ------ ------ ------ ------ ------ ------ ------ ------ -----
51722 (qemu-kvm)     68     16    357   6936      2      3    147    598  8128
51747 (qemu-kvm)    245     11      5     18   5172   2532      1     92  8076
53736 (qemu-kvm)     62    432   1661    506   4851    136     22    445  8116
53773 (qemu-kvm)   1393      3      1      2     12      0      0   6702  8114
---------------  ------ ------ ------ ------ ------ ------ ------ ------ -----
Total              1769    463   2024   7462  10037   2672    169   7837 32434

相反,以下显示单个节点为每个虚拟机提供内存,这效率显著提高。

# numastat -c qemu-kvm

Per-node process memory usage (in MBs)
PID              Node 0 Node 1 Node 2 Node 3 Node 4 Node 5 Node 6 Node 7 Total
---------------  ------ ------ ------ ------ ------ ------ ------ ------ -----
51747 (qemu-kvm)      0      0      7      0   8072      0      1      0  8080
53736 (qemu-kvm)      0      0      7      0      0      0   8113      0  8120
53773 (qemu-kvm)      0      0      7      0      0      0      1   8110  8118
59065 (qemu-kvm)      0      0   8050      0      0      0      0      0  8051
---------------  ------ ------ ------ ------ ------ ------ ------ ------ -----
Total                 0      0   8072      0   8072      0   8114   8110 32368

第 17 章 安装和管理 Windows 虚拟机

要在 RHEL 8 主机上使用 Microsoft Windows 作为虚拟机(VM)中的客户机操作系统,红帽建议采取额外步骤来确保这些虚拟机正常运行。

为此,以下小节提供有关在主机上安装和优化 Windows 虚拟机的信息,以及在这些虚拟机中安装和配置驱动程序的信息。

17.1. 安装 Windows 虚拟机

下面提供了有关如何在 RHEL 8 主机上创建完全虚拟 Windows 机器、在虚拟机(VM)中启动图形 Windows 安装程序以及优化安装的 Windows 客户机操作系统(OS)的信息。

您可以使用 virt-install 命令或 RHEL 8 web 控制台创建虚拟机并安装它。

先决条件

流程

  1. 创建虚拟机。具体步骤请查看 第 2.2 节 “创建虚拟机”

    • 如果使用 virt-install 实用程序创建虚拟机,请在该命令中添加以下选项:

      • 使用 KVM virtio 驱动程序的存储介质。例如:

        --disk path=/usr/share/virtio-win/virtio-win.iso,device=disk,bus=virtio
      • 要安装的 Windows 版本。例如:对于 Windows 10:

        --os-variant win10

        要获得可用 Windows 版本列表以及相应的选项,请使用以下命令:

        # osinfo-query os
    • 如果使用 Web 控制台创建虚拟机,在 Create New Virtual Machine 窗口的 Operating System 字段中指定您的 Windows 版本。创建虚拟机并安装客户机操作系统后,使用 Disks 接口将带有 virtio 驱动程序的存储介质附加到虚拟机。具体步骤请查看 第 11.3.7.3 节 “使用 web 控制台将现有磁盘附加到虚拟机”
  2. 在虚拟机中安装 Windows OS。

    有关如何安装 Windows 操作系统的详情,请参考相关微软安装文档。

  3. 在 Windows 客户机操作系统中配置 KVM virtio 驱动程序。详情请查看 第 17.2.1 节 “为 Windows 虚拟机安装 KVM 半虚拟驱动程序”

其它资源

17.2. 优化 Windows 虚拟机

当在 RHEL 8 中托管的虚拟机(VM)中使用 Microsoft Windows 作为客户机操作系统时,客户端的性能可能会受到负面影响。

因此,红帽建议您使用以下组合来优化 Windows 虚拟机:

17.2.1. 为 Windows 虚拟机安装 KVM 半虚拟驱动程序

提高 Windows 虚拟机(VM)性能的主要方法是在客户端操作系统(OS)上安装用于 Windows 的 KVM 参数化(virtio)驱动程序。

要做到这一点:

  1. 准备主机机器上的安装介质。更多信息请参阅 第 17.2.1.2 节 “在主机中准备 virtio 驱动程序安装介质”
  2. 将安装介质附加到现有 Windows 虚拟机中,或者在创建新 Windows 虚拟机时附加该介质。
  3. 在 Windows 客户机操作系统上安装 virtio 驱动程序。更多信息请参阅 第 17.2.1.3 节 “在 Windows 客户端中安装 virtio 驱动程序”

17.2.1.1. Windows virtio 驱动程序如何工作

通过降低 I/O 延迟并将吞吐量增加到几乎裸机级别,半虚拟化驱动程序可以提高虚拟机(VM)的性能。红帽建议您对运行 I/O-heavy 任务和应用程序的虚拟机使用半虚拟化驱动程序。

virtio 驱动程序是 KVM 的半虚拟化设备驱动程序,可用于在 KVM 主机上运行的 Windows VM。这些驱动程序由 virtio-win 软件包提供,其中包括用于以下目的的驱动:

  • 块(存储)设备
  • 网络接口控制器
  • 视频控制器
  • 内存 ballooning 设备
  • 半虚拟串口设备
  • 熵源设备
  • 半虚拟 panic 设备
  • 输入设备,如 mice、键盘或 tablets
  • 一组小型模拟设备
注意

有关模拟、virtio 和分配的设备的更多信息,请参阅 第 10 章 管理虚拟设备

使用 KVM virtio 驱动程序,以下 Microsoft Windows 版本应该和物理系统相似:

17.2.1.2. 在主机中准备 virtio 驱动程序安装介质

要在 Windows 虚拟机(VM)上安装 KVM virtio 驱动程序,您必须首先为主机上的 virtio 驱动程序准备安装介质。要做到这一点,在主机上安装 virtio-win 软件包,并使用它提供的 .iso 文件作为虚拟机存储。

先决条件

  • 确定在 RHEL 8 主机系统中启用了虚拟化。

流程

  1. 下载驱动程序

    1. 浏览 下载 Red Hat Enterprise Linux
    2. 选择与系统架构相关的 Product Variant。例如,对于 Intel 64 和 AMD64,选择 Red Hat Enterprise Linux for x86_64
    3. 确定 Version8
    4. Packages 中,搜索 virtio-win
    5. Download Latest

      RPM 文件下载。

  2. 从下载目录中安装 virtio-win 软件包。例如:

    # yum install ~/Downloads/virtio-win-1.9.9-3.el8.noarch.rpm
    [...]
    Installed:
      virtio-win-1.9.9-3.el8.noarch

    如果安装成功,virtio-win 驱动程序文件会在 /usr/share/virtio-win/ 目录中准备。这包括 ISO 文件和一个带有目录中驱动程序文件的 drivers 目录,每个架构都有一个,受支持的 Windows 版本。

    # ls /usr/share/virtio-win/
    drivers/  guest-agent/  virtio-win-1.9.9.iso  virtio-win.iso
  3. virtio-win.iso 文件附加到 Windows 虚拟机。要做到这一点,请执行以下操作之一:

    • 创建新 Windows 虚拟机时,使用该文件作为磁盘。
    • 将文件作为光盘添加到现有 Windows 虚拟机中。例如:

      # virt-xml WindowsVM --add-device --disk virtio-win.iso,device=cdrom
      Domain 'WindowsVM' defined successfully.

其它资源

17.2.1.3. 在 Windows 客户端中安装 virtio 驱动程序

要在 Windows 客户机操作系统(OS)上安装 KVM virtio 驱动程序,您必须添加包含驱动程序的存储设备 - 在创建虚拟机(VM)或之后,并在 Windows 客户机操作系统中安装驱动程序。

先决条件

流程

  1. 在 Windows 客户机操作系统中,打开 File Explorer 应用程序。
  2. This PC
  3. Devices and drives 窗格中,打开 virtio-win 介质。
  4. 根据虚拟机 vCPU 的构架,在介质上运行一个安装程序。

    • 如果使用 32 位 vCPU,请运行 virtio-win-gt-x86 安装程序。
    • 如果使用 64 位 vCPU,请运行 virtio-win-gt-x64 安装程序。
    virtio win installer 1
  5. 在打开的 Virtio-win-guest-tools 设置向导中,按照显示的步骤进行操作,直到您到达 Custom Setup 步骤。

    Virtio win 安装程序 2
  6. 在 Custom Setup 窗口中,选择您要安装的设备驱动程序。推荐的驱动程序集是自动选择的,驱动程序的描述会显示在列表右边。
  7. 点下 一步,然后点 Install
  8. 安装完成后,点完成
  9. 重启虚拟机以完成驱动程序安装。

验证

  1. This PC 中,打开系统磁盘。这通常是 (C:)
  2. Program Files 目录中,打开 Virtio-Win 目录。

    如果 Virtio-Win 目录存在并包含每个所选驱动程序的子目录,则安装可以成功。

    virtio win installer 3

其它资源

  • 您可以使用 Microsoft Windows 安装程序(MSI)命令行界面(CLI)而不是图形界面来安装驱动程序。有关 MSI 的详情,请查看微软文档
  • 如果安装 NetKVM 驱动程序,您可能需要配置 Windows 客户机的网络参数。具体步骤请查看 第 17.2.3 节 “配置 NetKVM 驱动程序参数”

17.2.2. 启用 Hyper-Vlightenments

hyper-Vlightenments 为 KVM 提供了一个模拟 Microsoft Hyper-V 管理程序的方法。这提高了 Windows 虚拟机的性能。

以下小节提供了有关支持的 Hyper-Vlightenments 以及如何启用它们的信息。

17.2.2.1. 在 Windows 虚拟机上启用 Hyper-V 激活

在 RHEL 8 主机上运行的 Windows 虚拟机(VM)提供了更好的性能。有关如何启用它们的步骤,请查看以下操作。

流程

  1. 使用 virsh edit 命令打开虚拟机 XML 配置。例如:

    # virsh edit windows-vm
  2. 在 XML 中添加以下行:

    <hyperv>
      <relaxed state='on'/>
      <vapic state='on'/>
      <spinlocks state='on' retries='8191'/>
      <vpindex state='on'/>
      <runtime state='on' />
      <synic state='on'/>
      <stimer state='on'/>
      <frequencies state='on'/>
    </hyperv>
  3. 按如下方式更改配置的 clock 部分:

    <clock offset='localtime'>
      <timer name='hypervclock' present='yes'/>
    </clock>
  4. 保存并退出 XML 配置。
  5. 如果虚拟机正在运行,重启它。

验证

  • 使用 virsh dumpxml 命令显示正在运行的虚拟机的 XML 配置。如果包括以下片段,则虚拟机上会启用 Hyper-Vlightenments。

    <hyperv>
      <relaxed state='on'/>
      <vapic state='on'/>
      <spinlocks state='on' retries='8191'/>
      <vpindex state='on'/>
      <runtime state='on' />
      <synic state='on'/>
      <stimer state='on'/>
      <frequencies state='on'/>
    </hyperv>
    
    <clock offset='localtime'>
      <timer name='hypervclock' present='yes'/>
    </clock>

17.2.2.2. 可配置 Hyper-V enlightenments

您可以配置特定的 Hyper-V 功能来优化 Windows 虚拟机。下表提供了有关这些可配置 Hyper-V 功能及其值的信息。

表 17.1. 可配置 Hyper-V 功能

Enlightenment描述

evmcs

在 L0(KVM)和 L1(Hyper-V)hypervisor 间实现半虚拟化协议,这样可更快地退出虚拟机监控程序。这个功能只供 Intel 处理器使用。

on, off

frequencies

启用 Hyper-V 频率 Machine Specific Registers(MSR)。

on, off

ipi

启用 IPI 支持半虚拟化处理器中断(IPI)支持。

on, off

no-nonarch-coresharing

通知客户端操作系统,虚拟处理器永远不会共享物理内核,除非它们被报告为同级 SMT 线程。Windows 和 Hyper-V 客户机需要这些信息来正确地缓解并发多线程(SMT)相关的 CPU 漏洞。

on, off, auto

reenlightenment

通知何时存在迁移期间才会发生的时间戳计数器(TSC)频率更改。它还允许客户端使用旧的频率,直到准备好切换到新频率。

on, off

relaxed

禁用 Windows 完整性检查,当虚拟机在大量加载主机上运行时,通常会导致 BSOD。这和 Linux 内核选项 no_timer_check 类似,它会在 Linux 在 KVM 中运行时自动启用。

on, off

reset

启用 Hyper-V 重置。

on, off

runtime

设定运行客户机代码以及代表客户端代码的处理器时间。

on, off

spinlock

  • 虚拟机的操作系统用来通知 Hyper-V,调用虚拟处理器试图获取可能由同一分区中另一个虚拟处理器保存的资源。
  • Hyper-V 用于在虚拟机的操作系统中指示在 Hyper-V 显示过量旋转前,应该尝试使用 spinlock 的次数。

on, off

stimer

为虚拟处理器启用合成计时器。请注意,当未提供此浏览功能时,某些 Windows 版本会恢复使用 HPET(甚至 RTC,如果 HPET 不可用时也会使用 RTC),这可能导致大量 CPU 消耗,即使虚拟 CPU 处于闲置状态。

on, off

stimer-direct

当一个过期事件是通过普通中断发送时,启用合成计时器。

on, off.

synic

与 stimer 一起激活合计计时器。Windows 8 以周期性模式使用此功能。

on, off

time

启用以下虚拟机可用的特定于 Hyper-V 的时钟源,

  • 基于 MSR 的 82 Hyper-V clock 源(HV_X64_MSR_TIME_REF_COUNT, 0x40000020)
  • 通过 MSR 启用的 TSC83 页(HV_X64_MSR_REFERENCE_TSC, 0x40000021)

on, off

tlbflush

清除虚拟处理器的 TLB。

on, off

vapic

启用虚拟 APIC,它为用户提供了一个对高使用内存的高级编程中断控制器(APIC)寄存器的加速 MSR 访问权限。

on, off

vendor_id

设置 Hyper-V 厂商 id。

  • on, off
  • id 值 - 最多 12 个字符的字符串

vpindex

启用虚拟处理器索引。

on, off

17.2.3. 配置 NetKVM 驱动程序参数

安装 NetKVM 驱动程序后,您可以将其配置为更好地适应您的环境。这部分中列出的参数可使用 Windows 设备管理器(devmgmt.msc)进行配置。

重要

修改驱动程序的参数会导致 Windows 重新载入该驱动程序。这会中断现有的网络活动。

先决条件

流程

  1. 打开 Windows Device Manager。

    有关打开设备管理器的详情,请参考 Windows 文档。

  2. 找到红帽 VirtIO 以太网适配器。

    1. 在 Device Manager 窗口中,点 Network adapters 旁边的 +
    2. 在网络适配器列表中,双击 Red Hat VirtIO Ethernet Adapter。该设备的属性窗口将打开。
  3. 查看设备参数。

    在 Properties 窗口中点 Advanced 选项卡。

  4. 修改设备参数。

    1. 点击您要修改的参数。此时会显示那个参数的选项。
    2. 根据需要修改选项。

      有关 NetKVM 参数选项的详情,请参考 第 17.2.4 节 “NetKVM 驱动程序参数”

    3. OK 保存更改。

17.2.4. NetKVM 驱动程序参数

下表提供了可配置的 NetKVM 驱动程序日志记录参数。

表 17.2. 日志参数

参数描述 2

Logging.Enable

确定是否启用日志记录的布尔值。默认值为 Enabled。

Logging.Level

定义日志级别的整数。当整数增加时,日志的详细程度也会增加。

  • 默认值为 0(仅错误)。
  • 1-2 添加配置信息。
  • 3-4 添加数据包流信息。
  • 5-6 添加中断以及 DPC 级别追踪信息。
注意

高日志级别会减慢您的虚拟机速度。

下表提供了可配置的 NetKVM 驱动程序初始参数信息。

表 17.3. 初始参数

参数描述

分配 MAC

为半虚拟 NIC 定义本地管理的 MAC 地址的字符串。默认不设置。

Init.ConnectionRate(Mb)

代表每秒(以 MB 为单位)的连接率的整数。Windows 2008 及之后的版本的默认值为 10G(每秒10,000MB)。

Init.Do802.1PQ

启用 Priority/VLAN 标签填充和删除支持的布尔值。默认值为 Enabled。

Init.MTUSize

定义最大传输单元(MTU)的整数。默认值为 1500。从 500 到 65500 的值都可以接受。

Init.MaxTxBuffers

代表将被分配的 TX 环描述符数的整数。

默认值为 1024。

有效值有: 16、32、64、128、256、512 和 1024。

Init.MaxRxBuffers

代表将要分配的 RX 环描述符数的整数。

默认值为 256。

有效值有: 16、32、64、128、256、512 和 1024。

Offload.Tx.Checksum

指定 TX checksum 卸载模式。

在 Red Hat Enterprise Linux 8 中,这个参数的有效值为:

* All(默认),为 IPv4 和 IPv6 都启用 IP、TCP 和 UDP checksum offloading

* TCP/UDP(v4,v6) ,为 IPv4 和 IPv6 都启用 TCP 和 UDP checksum offloading

* TCP/UDP(v4),只为 IPv4 启用 TCP 和 UDP checksum offloading

* TCP(v4),只为 IPv4 启用 TCP checksum

17.2.5. 在 Windows 虚拟机中优化后台进程

要优化运行 Windows OS 的虚拟机(VM)的性能,您可以配置或禁用各种 Windows 进程。

警告

如果您更改配置,某些进程可能无法按预期工作。

流程

您可以通过执行以下任一组合来优化 Windows 虚拟机:

  • 删除未使用的设备,比如 USB 或者 CD-ROM,并禁用端口。
  • 禁用自动 Windows 更新。有关如何进行此操作的更多信息,请参阅 配置组策略设置用于自动更新 配置 Windows 更新 for©

    请注意,对于从微软安装最新的更新和修补程序来说, Windows 更新非常重要。因此,红帽不推荐禁用 Windows 更新

  • 禁用后台服务,如 SuperFetch 和 Windows Search。有关停止服务的详情,请参考禁用系统服务Stop-Service
  • 禁用 useplatformclock。为此,请运行以下命令:

    # bcdedit /set useplatformclock No
  • 检查和禁用不必要的调度任务,如调度的磁盘清除。有关如何操作的更多信息,请参阅禁用调度任务
  • 确定磁盘没有加密。
  • 减少服务器应用程序的周期性活动。您可以编辑对应的计时器。如需更多信息,请参阅多媒体计时器
  • 关闭虚拟机上的 Server Manager 应用程序。
  • 禁用 antivirus 软件。请注意,禁用 antivirus 可能会破坏虚拟机的安全。
  • 禁用屏保。
  • 在没有使用时,仍然将 Windows OS 保持在登录屏幕中。

第 18 章 创建嵌套虚拟机

在 RHEL 8 及之后的版本中,可以创建嵌套虚拟机(VM)。这意味着,在 RHEL 8 物理主机上(0 L0)运行的 RHEL 8 虚拟机(也称为级别 1L1)可以充当虚拟机监控程序并创建自己的虚拟机(2L2)。

换句话说,L0 主机可以运行 L1 虚拟机(VM),每个 L1 虚拟机都可以托管自己的 L2 虚拟机。请注意,在这种情况下,L0 和 L1 主机都必须是 RHEL 8 系统,而 L2 虚拟机可以是任何支持的 RHEL 或 Windows 系统。

警告

红帽当前仅作为 技术预览 提供嵌套虚拟化,因此不受支持。

另外,红帽不推荐在生产环境中使用嵌套虚拟化,因为 功能有各种限制。嵌套虚拟化主要用于开发和测试场景,例如:

  • 在受限环境中调试虚拟机监控程序
  • 在有限的物理资源中测试较大的虚拟部署

也可以在多个构架中创建嵌套虚拟机,如 IntelAMDIBM POWER9IBM Z。请注意,无论使用了什么架构,嵌套都是 技术预览,因此红帽不支持。

18.1. 在 Intel 上创建嵌套虚拟机

按照以下步骤在 Intel 主机中启用和配置嵌套虚拟化。

警告

当前,嵌套虚拟化仅作为 Intel 架构的一个 技术预览 提供,因此不受支持。

先决条件

  • 运行 L1 虚拟机(VM)的 L0 RHEL8 主机。
  • 管理程序 CPU 必须支持嵌套虚拟化。要验证,使用 L0 hypervisor 上的 cat /proc/cpuinfo 命令。如果命令的输出包含 vmxept 标记,则可以创建 L2 虚拟机。通常在 Intel Xeon v3 内核及之后的版本中的情况。
  • 确定在 L0 主机上启用了嵌套虚拟化:

    # cat /sys/module/kvm_intel/parameters/nested
    • 如果命令返回 1,则代表启用该功能,您可以执行以下步骤。
    • 如果该命令返回 0 或者 N,而您的系统支持嵌套虚拟化,则使用以下步骤启用该功能。

      1. 卸载 kvm_intel 模块:

        # modprobe -r kvm_intel
      2. 激活嵌套功能:

        # modprobe kvm_intel nested=1
      3. 现在启用嵌套功能,但只有在下次重启 L0 主机时才启用。要永久启用它,在 /etc/modprobe.d/kvm.conf 文件中添加以下行:

        options kvm_intel nested=1

流程

  1. 为嵌套虚拟化配置 L1 虚拟机。

    1. 打开虚拟机的 XML 配置。以下示例打开 Intel-L1 虚拟机的配置:

      # virsh edit Intel-L1
    2. 在配置中添加以下行:

      <cpu mode='host-passthrough'/>

      如果虚拟机的 XML 配置文件已经包含 <cpu> 元素,重写它。

  2. 在 L1 虚拟机中创建 L2 虚拟机。要做到这一点,请遵循创建 L1 虚拟机的相同步骤。

18.2. 在 AMD 上创建嵌套虚拟机

按照以下步骤在 AMD 主机中启用和配置嵌套虚拟化。

警告

当前,嵌套虚拟化仅作为 AMD64 架构的一个 技术预览 提供,因此不受支持。

先决条件

  • 运行 L1 虚拟机(VM)的 L0 RHEL8 主机。
  • 管理程序 CPU 必须支持嵌套虚拟化。要验证,使用 L0 hypervisor 上的 cat /proc/cpuinfo 命令。如果该命令的输出包含 svmnpt 标记,则可以创建 L2 虚拟机。这通常是在 AMD EPYC 内核中和之后的版本。
  • 确定在 L0 主机上启用了嵌套虚拟化:

    # cat /sys/module/kvm_amd/parameters/nested
    • 如果命令返回 Y1,则代表启用了该功能,您可以执行以下步骤。
    • 如果命令返回 0N,请使用以下步骤启用该功能。

      1. 在 L0 主机上停止所有运行的虚拟机。
      2. 卸载 kvm_amd 模块:

        # modprobe -r kvm_amd
      3. 激活嵌套功能:

        # modprobe kvm_amd nested=1
      4. 现在启用嵌套功能,但只有在下次重启 L0 主机时才启用。要永久启用它,在 /etc/modprobe.d/kvm.conf 文件中添加以下内容:

        options kvm_amd nested=1

流程

  1. 为嵌套虚拟化配置 L1 虚拟机。

    1. 打开虚拟机的 XML 配置。以下示例将打开 AMD-L1 虚拟机的配置:

      # virsh edit AMD-L1
    2. 将虚拟机的 CPU 配置为使用 host-passthrough 模式。

      <cpu mode='host-passthrough'/>

      如果您要求虚拟机使用特定 CPU 而不是 host-passthrough,在 CPU 配置中添加 <feature policy='require' name='vmx'/> 行。例如:

      <cpu mode ='custom' match ='exact' check='partial'>
      <model fallback='allow'>Haswell-noTSX</model>
      <feature policy='require' name='vmx'/>
  2. 在 L1 虚拟机中创建 L2 虚拟机。要做到这一点,请遵循创建 L1 虚拟机的相同步骤。

18.3. 在 IBM Z 上创建嵌套虚拟机

按照以下步骤在 IBM Z 主机中启用和配置嵌套虚拟化。

警告

当前,嵌套虚拟化仅作为 IBM Z 架构中的一个 技术预览 提供,因此不受支持。

先决条件

  • 运行 L1 虚拟机(VM)的 L0 RHEL8 主机。
  • 管理程序 CPU 必须支持嵌套虚拟化。要验证情况,请使用 L0 hypervisor 中的 cat /proc/cpuinfo 命令。如果该命令的输出中包含 sie 标记,则可以创建 L2 虚拟机。
  • 确定在 L0 主机上启用了嵌套虚拟化:

    # cat /sys/module/kvm/parameters/nested
    • 如果命令返回 Y1,则代表启用了该功能,您可以执行以下步骤。
    • 如果命令返回 0N,请使用以下步骤启用该功能。

      1. 在 L0 主机上停止所有运行的虚拟机。
      2. 卸载 kvm 模块:

        # modprobe -r kvm
      3. 激活嵌套功能:

        # modprobe kvm nested=1
      4. 现在启用嵌套功能,但只有在下次重启 L0 主机时才启用。要永久启用它,在 /etc/modprobe.d/kvm.conf 文件中添加以下行:

        options kvm nested=1

流程

  • 在 L1 虚拟机中创建 L2 虚拟机。要做到这一点,请遵循创建 L1 虚拟机的相同步骤。

18.4. 在 IBM POWER9 上创建嵌套虚拟机

按照以下步骤在 IBM POWER9 主机中启用和配置嵌套虚拟化。

警告

当前,嵌套虚拟化仅作为 IBM POWER9 架构中的一个 技术预览 提供,因此不受支持。另外,在以前的 IBM POWER 系统版本中无法创建嵌套虚拟机(VM),如 IBM POWER8。

先决条件

  • L0 RHEL8 主机正在运行 L1 虚拟机。L1 虚拟机使用 RHEL 8 作为客户机操作系统。
  • 在 L0 主机上启用嵌套虚拟化:

    # cat /sys/module/kvm_hv/parameters/nested
    • 如果命令返回 Y1,则代表启用了该功能,您可以执行以下步骤。
    • 如果命令返回 0N,请使用以下步骤启用该功能:

      1. 在 L0 主机上停止所有运行的虚拟机。
      2. 卸载 kvm 模块:

        # modprobe -r kvm_hv
      3. 激活嵌套功能:

        # modprobe kvm_hv nested=1
      4. 现在启用嵌套功能,但只有在下次重启 L0 主机时才启用。要永久启用它,在 /etc/modprobe.d/kvm.conf 文件中添加以下行:

        options kvm_hv nested=1

流程

  1. 为确保 L1 虚拟机可以创建 L2 虚拟机,将 cap-nested-hv 参数添加到 L1 虚拟机的机器类型中。要做到这一点,使用 virsh edit 命令修改 L1 虚拟机的 XML 配置,并在 <features> 部分的以下行:

    <nested-hv state='on'/>
  2. 在 L1 虚拟机中创建 L2 虚拟机。要做到这一点,请遵循创建 L1 虚拟机的相同步骤。

    为了显著提高 L2 虚拟机的性能,红帽建议在 L2 虚拟机的 XML 配置中添加'cap-nested-hv' 参数。具体步骤请查看上一步。

附加信息

  • 请注意,使用 IBM POWER8 作为 L2 虚拟机的架构目前无法正常工作。

18.5. 嵌套虚拟化的限制

在使用嵌套虚拟化时请记住以下限制。

警告

红帽目前不支持嵌套虚拟化,仅提供嵌套作为 技术预览功能

支持的构架

  • L0 主机必须是 Intel、AMD、IBM POWER9 或 IBM Z 系统。嵌套虚拟化目前无法在其它构架中使用。

支持的客户端操作系统

  • 要创建嵌套虚拟机,您必须使用以下客户端操作系统(OS):

    • L0 主机 上 - RHEL 8.2 及更新的版本
    • L1 虚拟机 上 - RHEL 7.8 及更新的版本,或 RHEL 8.2 及更新的版本

      注意

      这个支持不适用于在 L1 虚拟机中使用基于 RHEL 7 和 RHEL 8 的虚拟化服务。它们是:

      • Red Hat Virtualization
      • Red Hat OpenStack Platform
      • OpenShift Virtualization
    • L2 虚拟机 上 - 您必须使用以下操作系统之一:

      • RHEL 7.8 及更新的版本
      • RHEL 8.2 及更新的版本
      • Microsoft Windows Server 2016
      • Microsoft Windows Server 2019
  • 另外,在 IBM POWER9 上,嵌套虚拟化目前仅在以下情况下工作:

    • L0 主机和 L1 虚拟机都使用 RHEL 8
    • L2 虚拟机使用带有 rhel-alt 内核的 RHEL 8 或 RHEL 7。
    • L1 VM 和 L2 虚拟机没有在 POWER8 兼容模式下运行。

虚拟机监控程序限制

  • 目前,红帽只支持在 RHEL-KVM 中嵌套。当 RHEL 用作 L0 hypervisor 时,您可以使用 RHEL 8 或 Windows 用于 WSL 2 作为 L1 hypervisor。
  • 当在非 KVM L0 hypervisor(如 VMware ESXi 或 Amazon Web Services(AWS)中使用 L1 RHEL 8 虚拟机时,在 RHEL 8 客户机操作系统中创建 L2 虚拟机可能会正常工作,但不被支持。

功能限制

  • 使用 L2 虚拟机作为虚拟机监控器并创建 L3 虚拟机还没有经过正确测试,因此无法正常工作。
  • 如果在 L0 主机上启用了嵌套虚拟化,则迁移虚拟机目前无法在 AMD 系统上工作。
  • 在 IBM Z 系统中,巨页后端存储和嵌套虚拟化不能同时使用。

    # modprobe kvm hpage=1 nested=1
    modprobe: ERROR: could not insert 'kvm': Invalid argument
    # dmesg |tail -1
    [90226.508366] kvm-s390: A KVM host that supports nesting cannot back its KVM guests with huge pages
  • L0 主机中的一些特性可能不适用于 L1 管理程序。

    例如,在 IBM POWER 9 硬件上,外部中断虚拟化引擎(XIVE)无法正常工作。但是,L1 虚拟机可以使用模拟的 CloudFormVE 中断控制器来启动 L2 虚拟机。

第 19 章 诊断虚拟机问题

在使用虚拟机(VM)时,您可能会遇到不同严重性的问题。有些问题可能需要快速而容易的修复,而对于其他问题来说,您可能需要捕获与虚拟机相关的数据和日志来报告或诊断问题。

以下小节详细介绍了生成日志并诊断一些常见虚拟机问题,以及报告这些问题。

19.1. 生成虚拟机调试日志

要诊断虚拟机(VM)问题,需要生成并查看 debug 日志。当请求支持解决与虚拟机相关的问题时,附加 debug 日志也很有用。

以下小节解释了 debug 日志是什么,如何 将它们设置为持久性, 在运行时启用 并在报告问题时 附加它们

19.1.1. 了解虚拟机调试日志

Debug 日志是文本文件,其中包含虚拟机(VM)运行时发生事件的数据。日志提供有关基本服务器端功能的信息,如主机库和 libvirtd 服务。日志文件还包含所有正在运行的虚拟机的标准错误输出(stderr)。

默认不启用 debug 日志记录,且必须在 libvirt 启动时启用。您可以为单个会话启用日志记录,或 永久启用日志记录。您还可以 修改守护进程运行时设置,在 libvirtd 守护进程会话已在运行时启用日志记录

在请求对虚拟机问题的支持时,附加 libvirt 调试日志也很有用。

19.1.2. 为虚拟机调试日志启用持久性设置

您可以通过编辑位于 /etc/libvirt 目录中的 libvirtd.conf 配置文件,将虚拟机(VM)调试日志记录配置为在 libvirt 启动时自动启用。

流程

  1. 在编辑器中打开 libvirtd.conf 文件。
  2. 根据您的要求替换或设置过滤器。

    将过滤器值设置为:

    • 1:记录 libvirt 生成的所有信息。
    • 2: 记录所有非清理信息。
    • 3:记录所有警告和错误消息。这是默认值。
    • 4: 只记录错误消息。

    例如,使用以下命令:

    • 记录来自 remoteutil.jsonrpc 层的所有错误和警告信息
    • 仅记录 event 层的错误消息。
    • 将过滤的日志保存到 /var/log/libvirt/libvirtd.log

      log_filters="3:remote 4:event 3:util.json 3:rpc"
      log_outputs="1:file:/var/log/libvirt/libvirtd.log"
  3. 保存并退出。
  4. 重启 libvirtd 服务。

    $ systemctl restart libvirtd.service

19.1.3. 在运行时启用虚拟机调试日志

您可以修改 libvirt 守护进程的运行时设置,以启用调试日志并将其保存到输出文件中。

这在重启 libvirtd 时无法使用,因为重启会解决了这个问题,或者同时运行另一个进程,如迁移或备份。如果您要在不编辑配置文件或重启守护进程的情况下尝试命令,修改运行时设置也很有用。

先决条件

  • 请确定安装了 libvirt-admin 软件包。

流程

  1. 可选:备份活跃的日志过滤器集合。

    # virt-admin daemon-log-filters >> virt-filters-backup
    注意

    建议您备份活跃的过滤器集合,以便在生成日志后恢复它们。如果没有恢复过滤器,则消息将继续被记录,这可能会影响系统性能。

  2. 使用 virt-admin 实用程序启用调试并根据您的要求设置过滤器。

    将过滤器值设置为:

    • 1:记录 libvirt 生成的所有信息。
    • 2: 记录所有非清理信息。
    • 3:记录所有警告和错误消息。这是默认值。
    • 4: 只记录错误消息。

    例如,使用以下命令:

    • 记录来自 remoteutil.jsonrpc 层的所有错误和警告信息
    • 仅记录 event 层的错误消息。

      # virt-admin daemon-log-filters "3:remote 4:event 3:util.json 3:rpc"
  3. 使用 virt-admin 实用程序将日志保存到特定文件或目录中。
    例如,以下命令将日志输出保存到 /var/log/libvirt/ 目录中的 libvirt.log 文件。

    # virt-admin daemon-log-outputs "1:file:/var/log/libvirt/libvirtd.log"
  4. 可选: 您还可以删除过滤器来生成包含所有与虚拟机相关的信息的日志文件。但不建议您这样做,因为这个文件可能包含由 libvirt 模块生成的大量冗余信息。

    • 使用 virt-admin 实用程序指定一组空的过滤器。

      # virt-admin daemon-log-filters
        Logging filters:
  5. 可选:使用备份文件将过滤器恢复到其原始状态。
    使用保存的值执行第二步来恢复过滤器。

19.1.4. 附加虚拟机调试日志来支持请求

您可能需要额外支持来诊断和解决虚拟机(VM)问题。强烈建议您将 debug 日志附加到支持请求中,以确保支持团队能够访问它们提供快速解决虚拟机相关问题所需的信息。

流程

  • 要报告问题并请求支持,创建一个支持问题单
  • 根据遇到的问题,将以下日志与您的报告一起附加:

    • 对于 libvirt 服务的问题,请附加来自主机的 /var/log/libvirt/libvirtd.log 文件。
    • 对于特定虚拟机的问题,请附加对应的日志文件。

      例如,对于 testguest 1 虚拟机,请附加 testguest1.log 文件,该文件可在 /var/log/libvirt/qemu/testguest1.log 中找到。

其它资源

19.2. 转储虚拟机内核

要分析虚拟机(VM)崩溃或发生故障的原因,您可以将虚拟机内核转储到磁盘上的文件中,以便稍后进行分析和诊断。

本节概述了 内核转储, 并说明如何 将虚拟机内核转储到特定 文件中。

19.2.1. 虚拟机内核转储的工作原理

虚拟机(VM)需要大量运行进程才能准确有效地工作。在某些情况下,在使用时,正在运行的虚拟机可能会意外终止或出现故障。重启虚拟机可能会导致重新设置或丢失数据,这使得很难诊断导致虚拟机崩溃的确切问题。

在这种情况下,您可以在重启虚拟机前使用 virsh dump 实用程序将虚拟机的内核保存(或 转储)到文件中。core dump 文件包含虚拟机的原始物理内存镜像,其中包含有关虚拟机的详细信息。这些信息可用于手动诊断虚拟机问题,也可以使用如 crash 的工具进行。

其它资源

  • 有关使用 crash 工具程序的详情,请查看 crash man page 和 crash 工具主页

19.2.2. 创建虚拟机内核转储文件

虚拟机(VM)内核转储包含有关虚拟机在任意给定时间状态的详细信息。这些信息与虚拟机的快照类似,可帮助您在出现虚拟机故障或意外关闭时检测问题。

先决条件

  • 请确定您有足够的磁盘空间保存该文件。请注意,虚拟机消耗的空间取决于分配给虚拟机的 RAM 量。

流程

  • 使用 virsh dump 工具。

    例如,以下命令将 lander1 虚拟机的内核、其内存和 CPU 通用注册文件转储到 /core/file 目录中的 gargantua.file

    # virsh dump lander1 /core/file/gargantua.file --memory-only
      Domain lander1 dumped to /core/file/gargantua.file
重要

crash 工具不再支持 virsh dump 命令的默认文件格式。要使用 crash 分析内核转储文件,您必须使用 --memory-only 选项创建该文件。

另外,在创建内核转储文件时必须使用 --memory-only 选项来附加到红帽支持问题单中。

其它资源

  • 有关其他 virsh dump 参数,请使用 virsh dump --help 或者查看 virsh man page。
  • 有关创建支持问题单的详情,请参考 创建支持问题单

19.3. 回溯虚拟机进程

当与虚拟机(VM)故障相关的进程时,您可以使用 gstack 命令和进程标识符(PID)来生成发生故障进程的执行堆栈追踪。如果该进程是线程组的一部分,那么也会跟踪所有线程。

先决条件

  • 确定安装了 GDB 软件包。

    有关安装 GDB 和可用组件的详情,请参阅安装 GNU Debugger

  • 请确定您知道要追踪进程的 PID。

    您可以使用 pgrep 命令后接进程的名称来查找 PID,。例如:

    # pgrep libvirt
    22014
    22025

流程

  • 使用 gstack 工具以及您想要备份的进程的 PID。

    例如:以下命令追踪 PID 为 22014 的 libvirt 进程。

    # gstack 22014
    Thread 3 (Thread 0x7f33edaf7700 (LWP 22017)):
    #0  0x00007f33f81aef21 in poll () from /lib64/libc.so.6
    #1  0x00007f33f89059b6 in g_main_context_iterate.isra () from /lib64/libglib-2.0.so.0
    #2  0x00007f33f8905d72 in g_main_loop_run () from /lib64/libglib-2.0.so.0
    ...

其它资源

  • 有关其他 gstack 参数,请查看 gstack man page。
  • 有关 GDB 的更多信息,请参阅 GNU Debugger

19.4. 用于报告虚拟机问题并提供日志的其他资源

要请求额外的帮助和支持,您可以:

第 20 章 RHEL 8 虚拟化的功能支持和限制

本文档提供有关 Red Hat Enterprise Linux 8(RHEL 8)虚拟化功能支持和限制的信息。

20.1. RHEL 8 虚拟化支持如何工作

一组支持限制适用于 Red Hat Enterprise Linux 8(RHEL 8)中的虚拟化。这意味着,当您在 RHEL 8 中使用虚拟机时使用某些功能或超过分配的资源时,红帽将不支持这些客户端,除非您有特定的订阅计划。

红帽已测试并认证了 第 20.2 节 “RHEL 8 虚拟化中推荐的功能” 中列出的功能,以便与 RHEL 8 系统中的 KVM 管理程序一起工作。因此,它们被完全支持,推荐在 RHEL 8 的虚拟化中使用它们。

第 20.3 节 “RHEL 8 虚拟化不支持的功能” 中列出的功能可以正常工作,但不被支持,且不推荐在 RHEL 8 中使用。因此,红帽强烈建议您在 KVM 的 RHEL 8 中不使用这些功能。

第 20.4 节 “RHEL 8 虚拟化中的资源分配限制” 列出 RHEL 8 中 KVM 虚拟机中支持的最大特定资源量。红帽不支持超过这些限制的客户端。

另外,除非有其他说明,RHEL 8 虚拟化文档使用的所有功能和解决方案都被支持。然而,其中有些还没有进行充分测试,因此可能无法完全优化。

重要

许多这些限制不适用于红帽提供的其他虚拟化解决方案,如 Red Hat Virtualization(RHV)、OpenShift Virtualization 或 Red Hat OpenStack Platform(RHOSP)。

20.3. RHEL 8 虚拟化不支持的功能

Red Hat Enterprise Linux 8(RHEL 8)中的 KVM 管理程序不支持以下功能:

重要

许多这些限制可能不适用于红帽提供的其他虚拟化解决方案,如 Red Hat Virtualization(RHV)、OpenShift Virtualization 或 Red Hat OpenStack Platform(RHOSP)。

RHV 4.2 及更新的版本(或 RHOSP 13 及更新的版本)支持的功能在以下步骤中被描述。

客户机操作系统

不支持在 RHEL 8 主机上使用以下客户机操作系统(OS)的 KVM 虚拟机(VM):

  • Microsoft Windows 8.1 及更早版本
  • Microsoft Windows Server 2012 及更早版本
  • macOS
  • 用于 x86 系统的 Solaris
  • 2009 年之前发布的所有操作系统

有关 RHEL 主机上支持的 客户机操作系统列表,请参阅使用 KVM 的 Red Hat Enterprise Linux 认证客户机操作系统

有关红帽提供的其他虚拟化解决方案支持的客户机 操作系统列表,请参阅 Red Hat OpenStack Platform 和 Red Hat Virtualization 中的认证 客户机操作系统。

有关 RHV 特别支持的客户机操作系统列表,请参阅 RHV 中支持的客户端操作系统

vCPU 热拔

RHEL 8 不支持从正在运行的虚拟机(也称为 vCPU)中删除虚拟 CPU(vCPU)。

请注意 RHV 支持 vCPU 热拔。详情请查看 热插拔 VCPU

内存热拔

RHEL 8 不支持删除附加到正在运行的虚拟机的内存设备(也称为热插拔)。

请注意 RHV,支持内存热拔,但仅在运行带有特定客户机配置的 RHEL 的虚拟机上进行。详情请参阅热拔虚拟内存

QEMU 端的 I/O 节流

RHEL 8 不支持使用 virsh blkdeviotune 工具为虚拟磁盘上的操作(也称为 QEMU 端 I/O 节流)配置最大输入和输出等级。

要在 RHEL 8 中设置 I/O 节流,使用 virsh blkiotune。这也被称为 libvirt-side I/O 节流。具体步骤请查看 第 16.4.2 节 “虚拟机中的磁盘 I/O 节流”

请注意 RHV 支持 QEMU 边的 I/O 节流。详情请参阅存储服务质量

RHOSP 还支持 QEMU 边的 I/O 节流。详情请参阅 RHOSP 存储指南的在磁盘上设置资源限制 和" 使用质量-Service 规格 "部分。

另外,OpenShift Virtualizaton 也支持 QEMU 端 I/O 节流。

存储动态迁移

RHEL 8 不支持在主机间迁移运行的虚拟机的磁盘镜像。

请注意 RHV 支持存储实时迁移。详情请查看实时存储迁移概述

RHOSP 还支持存储实时迁移,但有一些限制。详情请参阅迁移卷

实时快照

RHEL 8 不支持创建或加载正在运行的虚拟机的快照(也称为实时快照)。

另外请注意,在 RHEL 8 中,已弃用了非实时的虚拟机快照功能。因此,虽然可以为关闭的虚拟机创建或载入快照,但红帽建议不要使用它。

请注意,RHV 支持实时快照。详情请参阅 Red Hat Virtualization 中的实时快照

RHOSP 还支持实时快照。详情请参阅把虚拟机导入到 overcloud 部分。

vhost-user

RHEL 8 不支持实现用户空间 vHost 接口。

请注意,RHOSP 支持 vhost-user,但只适用于 virtio-net 接口。详情请查看 virtio-net 实现vhost 用户端口

S3 和 S4 系统电源状态

不支持将虚拟机挂 起至 Suspend to RAM (S3) 或者 Suspend to disk (S4)系统电源状态。请注意,这些功能默认是禁用的,启用它们会使您的虚拟机不被红帽支持。

请注意,RHV 和 RHOSP 当前还不支持 S3 和 S4 状态。

多路径 vDisk 中的 s3-PR

RHEL 8 不支持多路径 vDisk 上的 SCSI3 持久性保留(S3-PR)。因此,RHEL 8 不支持 Windows 集群。

请注意 RHV 支持多路径 vDisk 上的 S3-PR。因此,如果您需要 Windows 集群支持,红帽建议使用 RHV 作为虚拟化解决方案。详情请查看 RHV 客户端中的集群支持

virtio-crypto

RHEL 8.0 内核中有 virtio-crypto 设备的驱动程序,因此在某些情况下可在 KVM hypervisor 中启用该设备。但是,不支持在 RHEL 8 中使用 virtio-crypto 设备,因此强烈不建议使用它。

请注意,RHV 或 RHOSP 不支持 virtio-crypto 设备。

增量实时备份

在 RHEL 8 中不支持配置只保存自上次备份(也称为增量实时备份)以来虚拟机变化的虚拟机备份。红帽强烈不建议使用它。

请注意,在 RHV 4.4 及更新的版本中,会作为技术预览提供增量实时备份。

net_failover

RHEL 8 不支持使用 net_failover 驱动程序设置自动网络设备故障转移机制。

请注意,RHV 和 RHOSP 目前还不支持 net_failover

vTPM

不支持将虚拟信任平台模块(vTPM)设备附加到 RHEL 8 系统上托管的虚拟机中。

请注意,RHV 和 RHOSP 当前还不支持 vTPM。

多 FD 迁移

RHEL 8 不支持使用多个文件描述符(FD)迁移虚拟机,也称多 FD 迁移。

请注意,RHV 或 RHOSP 目前还不支持多 FD 迁移。

virtiofs

RHEL8 不支持在主机及其虚拟机间使用 virtiofs 文件系统共享文件。

请注意,RHV 或 RHOSP 目前不支持使用 virtiofs

NVMe 设备

不支持将 Non-volatile Memory Express(NVMe)设备附加到 RHEL 8 中隐藏的虚拟机。

请注意,RHV 或 RHOSP 目前不支持将 NVMe 设备附加到虚拟机。

TCG

QEMU 和 libvirt 包含使用 QEMU Tiny Code Generator(TCG)的动态转换模式。这个模式不需要硬件虚拟化支持。但是,红帽不支持 TCG。

通过检查其 XML 配置可识别基于 TCG 的客户端,例如使用 "virsh dumpxml" 命令。

  • TCG 客户端的配置文件包括以下行:

    <domain type='qemu'>
  • KVM 客户端的配置文件包含以下行:

    <domain type='kvm'>

其它资源

20.4. RHEL 8 虚拟化中的资源分配限制

以下限制适用于可在 Red Hat Enterprise Linux 8(RHEL 8)主机上分配给单个 KVM 虚拟机(VM)的虚拟化资源。

重要

许多这些限制不适用于红帽提供的其他虚拟化解决方案,如 Red Hat Virtualization(RHV)、OpenShift Virtualization 或 Red Hat OpenStack Platform(RHOSP)。

每个虚拟机的最大 vCPU

RHEL 8 最多支持为单个虚拟机分配 384 个 vCPU。

每个虚拟机的 PCI 设备

RHEL 8 支持 每个 VM 总线 32 PCI 设备插槽,每个设备插槽有 8 个 PCI 功能。当虚拟机中启用了多功能且没有使用 PCI 桥接时,每个总线最多可以提供 256 个 PCI 功能。

每个 PCI 网桥都添加了一个新的总线,可能会启用其它 256 设备地址。但是,对于一些总线,用户不能使用所有 256 个设备地址,例如: root 总线有几个内置设备占用的插槽。

虚拟 IDE 设备

KVM 限制为每个虚拟机最多 4 个虚拟 IDE 设备。

20.5. 支持虚拟化功能概述

下表提供有关在支持的系统构架中 RHEL 8 中所选虚拟化功能支持状态的信息。

表 20.1. 设备热插和热拔

 Intel 64 和 AMD64IBM ZIBM POWER

CPU 热插

支持

支持

支持

CPU 热拔

不支持

不支持

不支持

内存热插拔

支持

不支持

支持

内存热拔

不支持

不支持

不支持

PCI 热插

支持

支持 [a]

支持

PCI 热拔

支持

支持 [a]

支持

[a] 需要使用 virtio-*-ccw 设备而不是使用 virtio-*-pci

表 20.2. 其他选择的功能

 Intel 64 和 AMD64IBM ZIBM POWER

NUMA 调整

支持

不支持

支持

SR-IOV 设备

支持

不支持

支持

virt-v2v 和 p2v

支持

不支持

不支持

其他资源

法律通告

Copyright © 2021 Red Hat, Inc.
The text of and illustrations in this document are licensed by Red Hat under a Creative Commons Attribution–Share Alike 3.0 Unported license ("CC-BY-SA"). An explanation of CC-BY-SA is available at http://creativecommons.org/licenses/by-sa/3.0/. In accordance with CC-BY-SA, if you distribute this document or an adaptation of it, you must provide the URL for the original version.
Red Hat, as the licensor of this document, waives the right to enforce, and agrees not to assert, Section 4d of CC-BY-SA to the fullest extent permitted by applicable law.
Red Hat, Red Hat Enterprise Linux, the Shadowman logo, the Red Hat logo, JBoss, OpenShift, Fedora, the Infinity logo, and RHCE are trademarks of Red Hat, Inc., registered in the United States and other countries.
Linux® is the registered trademark of Linus Torvalds in the United States and other countries.
Java® is a registered trademark of Oracle and/or its affiliates.
XFS® is a trademark of Silicon Graphics International Corp. or its subsidiaries in the United States and/or other countries.
MySQL® is a registered trademark of MySQL AB in the United States, the European Union and other countries.
Node.js® is an official trademark of Joyent. Red Hat is not formally related to or endorsed by the official Joyent Node.js open source or commercial project.
The OpenStack® Word Mark and OpenStack logo are either registered trademarks/service marks or trademarks/service marks of the OpenStack Foundation, in the United States and other countries and are used with the OpenStack Foundation's permission. We are not affiliated with, endorsed or sponsored by the OpenStack Foundation, or the OpenStack community.
All other trademarks are the property of their respective owners.

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