搜索

虚拟化部署和管理指南

download PDF
Red Hat Enterprise Linux 7

在 RHEL 物理机器上安装、配置和管理虚拟机

摘要

本指南介绍了如何配置 Red Hat Enterprise Linux 7 机器来作为虚拟化主机系统,以及如何使用 KVM hypervisor 来安装和配置客户机虚拟机。其他主题包括 PCI 设备配置、SR-IOV、网络、存储、设备和客户机虚拟机管理,以及故障排除、兼容性和限制。需要在客户机虚拟机上运行的流程会被明确标记为这样。
重要
本指南中描述的所有流程都应该在 AMD64 或 Intel 64 主机机器上执行,除非另有说明。有关在 AMD64 和 Intel 64 以外的构架上使用 Red Hat Enterprise Linux 7 虚拟化说明,请参考 附录 B, 在多个构架中使用 KVM 虚拟化
有关红帽提供的虚拟化解决方案的更通用的介绍,请参阅 Red Hat Enterprise Linux 7 虚拟化入门指南

部分 I. Deployment

这部分提供了有关如何安装和配置 Red Hat Enterprise Linux 7 机器来作为虚拟化主机系统的说明,以及如何使用 KVM hypervisor 来安装和配置客户机虚拟机。

第 1 章 系统要求

Intel 64 和 AMD64 构架上 Red Hat Enterprise Linux 7 的 KVM hypervisor 提供虚拟化。本章列出了运行虚拟机(也称为 VM)的系统要求。
有关安装虚拟化软件包的详情,请参考 第 2 章 安装虚拟化软件包

1.1. 主机系统要求

最低主机系统要求

  • 6 GB 空闲磁盘空间。
  • 2 GB RAM。
第 7 章 使用 KVM 进行过量使用 中进一步概述了客户机虚拟机的要求。

1.2. KVM Hypervisor 要求

KVM Hypervisor 要求:
  • 一个具有适用于基于 x86 系统的 Intel VT-x 和 Intel 64 虚拟化扩展的 Intel 处理器;或者
  • 一个具有 AMD-V 和 AMD64 虚拟化扩展的 AMD 处理器。
完全虚拟化需要虚拟化扩展(Intel VT-x 或 AMD-V)。输入以下命令来确定您的系统是否有硬件虚拟化扩展,以及它们是否已启用。

过程 1.1. 验证虚拟化扩展

  1. 验证 CPU 虚拟化扩展是否可用

    输入以下命令来验证 CPU 虚拟化扩展是否可用:
    $ grep -E 'svm|vmx' /proc/cpuinfo
  2. 分析输出

    • 以下示例输出包含了一个 vmx 条目,表示一个具有 Intel VT-x 扩展的 Intel 处理器:
      flags   : fpu tsc msr pae mce cx8 vmx apic mtrr mca cmov pat pse36 clflush
      dts acpi mmx fxsr sse sse2 ss ht tm syscall lm constant_tsc pni monitor ds_cpl
      vmx est tm2 cx16 xtpr lahf_lm
      
    • 以下示例输出包含了一个 svm 条目,表示一个具有 AMD-V 扩展的 AMD 处理器:
      flags   :  fpu tsc msr pae mce cx8 apic mtrr mca cmov pat pse36 clflush
      mmx fxsr sse sse2 ht syscall nx mmxext svm fxsr_opt lm 3dnowext 3dnow pni cx16
      lahf_lm cmp_legacy svm cr8legacy ts fid vid ttp tm stc
      
    如果 grep -E 'svm|vmx' /proc/cpuinfo 命令返回任何输出,则处理器包含硬件虚拟化扩展。在某些情况下,制造商在 BIOS 中禁用了虚拟化扩展。如果没有显示扩展,或者完整虚拟化无法正常工作,请参阅 过程 A.3, “在 BIOS 中启用虚拟化扩展”有关在 BIOS 配置工具中启用扩展的说明。
  3. 确定 KVM 内核模块是否已加载

    另外,还可以使用以下命令验证 kvm 模块是否已被加载到内核中:
    # lsmod | grep kvm
    如果输出包括 kvm_intelkvm_amd,则 kvm 硬件虚拟化模块已加载。
注意
virsh 工具(由 libvirt-client 软件包提供)可通过以下命令输出系统虚拟化功能的完整列表:
# virsh capabilities

1.3. KVM 客户机虚拟机兼容性

Red Hat Enterprise Linux 7 服务器有一定的支持限制。
以下 URL 解释了 Red Hat Enterprise Linux 的处理器和内存量限制:
以下 URL 列出了认证的、可以在 Red Hat Enterprise Linux KVM 主机上运行的客户机操作系统:
注意
有关 KVM hypervisor 的限制和支持限制的其它信息,请参考 附录 C, 虚拟化限制

1.4. 支持的客户机 CPU 型号

每个 hypervisor 对 CPU 功能都有自己的策略,客户机默认都会看到。hypervisor 呈现给客户机的 CPU 功能集取决于客户机虚拟机配置中选择的 CPU 型号。

1.4.1. 列出客户机 CPU 型号

要查看一个架构类型所支持的 CPU 型号的完整列表,请运行 virsh cpu-models architecture 命令。例如:
$ virsh cpu-models x86_64
486
pentium
pentium2
pentium3
pentiumpro
coreduo
n270
core2duo
qemu32
kvm32
cpu64-rhel5
cpu64-rhel6
kvm64
qemu64
Conroe
Penryn
Nehalem
Westmere
SandyBridge
Haswell
athlon
phenom
Opteron_G1
Opteron_G2
Opteron_G3
Opteron_G4
Opteron_G5
$ virsh cpu-models ppc64
POWER7
POWER7_v2.1
POWER7_v2.3
POWER7+_v2.1
POWER8_v1.0
支持的 CPU 型号和功能的完整列表包含在 cpu_map.xml 文件中,位于 /usr/share/libvirt/ 中:
# cat /usr/share/libvirt/cpu_map.xml
客户机的 CPU 型号和功能可在域 XML 文件的 <cpu> 部分进行更改。如需更多信息,请参阅 第 23.12 节 “CPU 型号和拓扑”
可以根据需要将主机型号配置为使用指定的功能集。如需更多信息,请参阅 第 23.12.1 节 “更改指定 CPU 的 Feature Set”

第 2 章 安装虚拟化软件包

要使用虚拟化,必须在您的计算机上安装红帽虚拟化软件包。虚拟化软件包可以在安装 Red Hat Enterprise Linux 时安装,或使用 yum 命令和订阅管理器应用程序来安装。
KVM hypervisor 使用默认的带有 kvm 内核模块的 Red Hat Enterprise Linux 内核。

2.1. 在 Red Hat Enterprise Linux 安装过程中安装虚拟化软件包

这部分提供了有关在安装 Red Hat Enterprise Linux 过程中安装虚拟化软件包的信息。
注意
有关安装 Red Hat Enterprise Linux 的详情,请查看 Red Hat Enterprise Linux 7 安装指南
重要
Anaconda 界面只提供在安装 Red Hat Enterprise Linux 服务器过程中安装红帽虚拟化软件包的选项。
安装 Red Hat Enterprise Linux 工作站时,只能在工作站安装完成后安装红帽虚拟化软件包。请查看 第 2.2 节 “在现有 Red Hat Enterprise Linux 系统上安装虚拟化软件包”

过程 2.1. 安装虚拟化软件包

  1. 选择软件

    按照安装流程操作,直到 安装概述 屏幕出现。

    图 2.1. 安装概述屏幕

    图像显示了 安装概述 屏幕,它列出了组标题下可配置的选项。本地化 标题下:日期和时间 、语言支持 以及 键盘 。在 软件 标题下:安装源 和 软件选择.在 系统 标题下:安装目的地 和 网络及主机名。
    安装概述 屏幕中,点击 软件选择。此时会打开 软件选择 屏幕。
  2. 选择服务器类型和软件包组

    您只能安装带有基本虚拟化软件包或带有允许通过图形用户界面管理客户机的软件包的 Red Hat Enterprise Linux 7。执行以下操作之一:
    • 安装最小虚拟化主机
      Base Environment 窗格中选择 Virtualization Host 单选按钮,在Add-Ons for Selected Environment 窗格中选择 Virtualization Platform 复选框。这会安装一个基本的虚拟化环境,可以使用 virsh 或通过网络远程运行它。

      图 2.2. 软件选择屏幕中选择的虚拟化主机

      图像显示了 软件选择 屏幕,其列出了两个标题下的选项:Base Environment 和 Add-Ons for Selected Environment 。在 Base Environment 下的选项中突出显示 Virtualization Host,并且在 Add-Ons for Selected Environment 下的选项中突出显示 Virtualization Platform。
    • 使用图形用户界面安装虚拟化主机
      Base Environment 窗格中选择 Server with GUI 单选按钮,在 Add-Ons for Selected Environment窗格中选择 Virtualization ClientVirtualization HypervisorVirtualization Tools 复选框。这会安装一个虚拟化环境,以及用于安装和管理客户机虚拟机的图形工具。

      图 2.3. 在软件选择屏幕中选择带有 GUI 的服务器

      图像显示了 软件选择 屏幕,其列出了两个标题下的选项:Base Environment 和 Add-Ons for Selected Environment 。Base Environment 下的选项中突出显示了 Server with GUI,Add-Ons for Selected Environment 下的选项中突出显示了 Virtualization Client、Virtualization Hypervisor 和 Virtualization Tools 。
  3. 完成安装

    点击 Done 并继续安装。
重要
您需要一个有效的 Red Hat Enterprise Linux 订阅才能接受虚拟化软件包的更新。

2.1.1. 使用 Kickstart 文件安装 KVM 软件包

要使用 Kickstart 文件来安装带有虚拟化软件包的 Red Hat Enterprise Linux,请在 Kickstart 文件的 %packages 部分中追加以下软件包组:
@virtualization-hypervisor
@virtualization-client
@virtualization-platform
@virtualization-tools
有关使用 Kickstart 文件安装的详情,请参考 Red Hat Enterprise Linux 7 安装指南

2.2. 在现有 Red Hat Enterprise Linux 系统上安装虚拟化软件包

这部分描述了在现有 Red Hat Enterprise Linux 7 系统上安装 KVM 管理程序的步骤。
要安装软件包,您的计算机必须在红帽客户门户网站已进行了注册和订阅。要使用 Red Hat Subscription Manager 进行注册,请运行 subscription-manager register 命令,并按照提示进行操作。或者,从桌面上的 ApplicationsSystem Tools 运行 Red Hat Subscription Manager 应用程序来注册。
如果您没有有效的红帽订阅,请访问 红帽在线商店 来获取一个红帽订阅。有关在红帽客户门户网站注册和订阅系统的更多信息,请参阅 https://access.redhat.com/solutions/253273

2.2.1. 手动安装虚拟化软件包

要在 Red Hat Enterprise Linux 上使用虚拟化,您至少需要安装以下软件包:
  • qemu-kvm :这个软件包提供了用户级的 KVM 模拟器,方便了主机和客户机虚拟机之间的通信。
  • qemu-img :这个软件包为客户机虚拟机提供磁盘管理。
    注意
    qemu-img 软件包是作为 qemu-kvm 软件包的依赖项安装的。
  • libvirt :此软件包提供用于与 hypervisor 和主机系统进行交互的服务器和主机端的库,以及用于处理库调用、管理虚拟机和控制 hypervisor 的 libvirtd 守护进程。
要安装这些软件包,请输入以下命令:
# yum install qemu-kvm libvirt
还提供了几个额外的虚拟化管理软件包,在使用虚拟化时推荐使用:
  • virt-install:这个软件包提供 virt-install 命令,可用于从命令行创建虚拟机。
  • libvirt-python:这个软件包包含一个模块,它允许使用 Python 编程语言编写的应用程序可以使用 libvirt API 提供的接口。
  • virt-manager :这个软件包提供了 virt-manager 工具,也称为 虚拟机管理器。这是用于管理虚拟机的图形化工具。它使用 libvirt-client 库作为管理 API。
  • libvirt-client:这个软件包提供了用于访问 libvirt 服务器的客户端 API 和库。libvirt-client 软件包包括 virsh 命令行工具,用于从命令行或特殊的虚拟化 shell 来管理和控制虚拟机及 hypervisor 。
您可以使用以下命令安装所有这些推荐的虚拟化软件包:
# yum install virt-install libvirt-python virt-manager virt-install libvirt-client

2.2.2. 安装虚拟化软件包组

虚拟化软件包也可以从软件包组来安装。您可以通过运行 yum grouplist hidden 命令来查看可用的组的列表。
在可用的包组的完整列表中,下表描述了虚拟化软件包组及其所提供的内容。
表 2.1. 虚拟化软件包组
软件包组 描述 强制的软件包 可选的软件包
虚拟化 Hypervisor 最小的虚拟化主机安装 libvirt、qemu-kvm、qemu-img qemu-kvm-tools
虚拟化客户端 用于安装和管理虚拟化实例的客户端 gnome-boxes, virt-install, virt-manager, virt-viewer, qemu-img virt-top, libguestfs-tools, libguestfs-tools-c
虚拟化平台 提供用于访问和控制虚拟机和容器的接口 libvirt、libvirt-client、virt-who、qemu-img fence-virtd-libvirt, fence-virtd-multicast, fence-virtd-serial, libvirt-cim, libvirt-java, libvirt-snmp, perl-Sys-Virt
虚拟化工具 用于离线虚拟镜像管理的工具 libguestfs, qemu-img libguestfs-java, libguestfs-tools, libguestfs-tools-c
要安装软件包组,请运行 yum group install package_group 命令。例如,要安装带有所有软件包类型的 Virtualization Tools 软件包组,请运行:
# yum group install "Virtualization Tools" --setopt=group_package_types=mandatory,default,optional
有关安装软件包组的详情,请参考 如何在 Red Hat Enterprise Linux 上使用 yum 安装一组软件包?知识库文章。

第 3 章 创建虚拟机

在 Red Hat Enterprise Linux 7 主机系统上安装了 虚拟化软件包 后,您可以使用 virt-manager 界面创建虚拟机并安装客户机操作系统。或者,您可以使用 virt-install 命令行工具和一个参数列表或使用脚本。本章将涵盖这两种方法。

3.1. 客户机虚拟机部署注意事项

创建任何客户机虚拟机之前应考虑各种因素。部署前应评估虚拟机的角色,但也应根据可变因素(负载,客户端的数量)来定期监控和评估。因素包括:
性能
应根据预期的任务来部署和配置客户机虚拟机。有些客户端系统(例如,运行数据库服务器的客户机)可能需要特殊的性能考虑。可能需要根据客户机的角色和预计的系统负载来给它们分配更多的 CPU 或内存。
输入/输出要求和输入/输出类型
某些客户机虚拟机可能有特别的高 I/O 要求,或者可能根据 I/O 类型(例如,典型的磁盘块大小访问或客户端的数量)需要做进一步的考虑或预测。
存储
有些客户虚拟机可能需要更高的优先级来访问存储或快速的磁盘类型,或者可能需要对存储区域进行独占访问。在部署和维护存储时,还应定期监控和考虑虚拟机所使用的存储量。请务必阅读 Red Hat Enterprise Linux 7 虚拟化安全指南 中概述的所有注意事项。另请务必了解您的物理存储可能会限制您的虚拟存储中的选项。
网络和网络基础架构
根据您的环境,某些客户机虚拟机可能需要比其他客户机更快的网络连接。在部署和维护客户机时,带宽或延迟通常是要考虑的因素,特别是在需求或负载发生变化时。
请求要求
如果整个磁盘都支持 virtio 驱动器,则只能对 virtio 驱动器上的客户机虚拟机发出 SCSI 请求,磁盘设备参数在 域 XML 文件 中被设为 lun,如下例所示:
<devices>
  <emulator>/usr/libexec/qemu-kvm</emulator>
  <disk type='block' device='lun'>

3.2. 使用 virt-install 创建客户机

您可以使用 virt-install 命令来创建虚拟机,并通过命令行在这些虚拟机上安装操作系统。virt-install 可以交互式使用,也可以作为脚本的一部分来自动创建虚拟机。如果您使用的是交互式图形安装,则必须在运行 virt-install 之前安装 virt-viewer。另外,您可以使用 virt-install 和 kickstart 文件启动虚拟机操作系统的无人值守安装。
注意
您可能需要 root 特权才能使某些 virt-install 命令成功完成。
virt-install 工具使用很多命令行选项。但是,大多数 virt-install 选项都不需要。
虚拟客户机安装的主要所需选项为:
--name
虚拟机的名称。
--memory
分配给客户机的内存量(RAM),以 MiB 为单位。
客户机存储
使用以下客户机存储选项之一:
  • --disk
    虚拟机的存储配置详情。如果您使用 --disk none 选项,则创建的虚拟机没有磁盘空间。
  • --filesystem
    虚拟客户机的文件系统的路径。
安装方法
使用以下安装方法之一:
  • --location
    安装介质的位置。
  • --cdrom
    用作虚拟 CD-ROM 设备的文件或设备。它可以是 ISO 镜像的路径,也可以是要从中获取或访问最小引导 ISO 镜像的 URL。但是,它不能是 物理主机的 CD-ROM 或 DVD-ROM 设备。
  • --pxe
    使用 PXE 引导协议来加载初始 ramdisk 和内核以启动客户机安装过程。
  • --import
    跳过操作系统安装过程,并围绕现有磁盘镜像构建客户机。用于引导的设备是 diskfilesystem 选项指定的第一个设备。
  • --boot
    安装后虚拟机的引导配置。这个选项允许指定引导设备的顺序,使用可选的内核参数永久引导内核和 initrd,并启用 BIOS 引导菜单。
要查看选项的完整列表,请输入以下命令:
# virt-install --help
要查看某个选项的属性的完整列表,请输入以下命令:
# virt install --option=?
virt-install 手册页还记录了每个命令选项、重要的变量和示例。
运行 virt-install 之前,您可能还需要使用 qemu-img 来配置存储选项。有关使用 qemu-img 的说明,请参考 第 14 章 使用 qemu-img

3.2.1. 从 ISO 镜像安装虚拟机

以下示例从 ISO 镜像安装虚拟机:
# virt-install \ 
  --name guest1-rhel7 \ 
  --memory 2048 \ 
  --vcpus 2 \ 
  --disk size=8 \ 
  --cdrom /path/to/rhel7.iso \ 
  --os-variant rhel7 
--cdrom /path/to/rhel7.iso 选项指定虚拟机将在指定的位置从 CD 或 DVD 镜像安装。

3.2.2. 导入虚拟机镜像

以下示例从虚拟磁盘镜像导入虚拟机:
# virt-install \ 
  --name guest1-rhel7 \ 
  --memory 2048 \ 
  --vcpus 2 \ 
  --disk /path/to/imported/disk.qcow \ 
  --import \ 
  --os-variant rhel7 
--import 选项指定虚拟机将从 --disk /path/to/imported/disk.qcow 选项指定的虚拟磁盘镜像导入。

3.2.3. 从网络安装虚拟机

以下示例从网络位置安装虚拟机:
# virt-install \ 
  --name guest1-rhel7 \ 
  --memory 2048 \ 
  --vcpus 2 \ 
  --disk size=8 \ 
  --location http://example.com/path/to/os \ 
  --os-variant rhel7 
location http://example.com/path/to/os 选项指定安装树位于指定的网络位置。

3.2.4. 使用 PXE 安装虚拟机

当使用 PXE 引导协议安装虚拟机时,指定桥接网络的--network 选项和 --pxe 选项必须指定。
以下示例使用 PXE 安装虚拟机:
# virt-install \ 
  --name guest1-rhel7 \ 
  --memory 2048 \ 
  --vcpus 2 \ 
  --disk size=8 \ 
  --network=bridge:br0 \ 
  --pxe \ 
  --os-variant rhel7 

3.2.5. 使用 Kickstart 安装虚拟机

以下示例使用 kickstart 文件安装虚拟机:
# virt-install \ 
  --name guest1-rhel7 \ 
  --memory 2048 \ 
  --vcpus 2 \ 
  --disk size=8 \ 
  --location http://example.com/path/to/os \ 
  --os-variant rhel7 \
  --initrd-inject /path/to/ks.cfg \ 
  --extra-args="ks=file:/ks.cfg console=tty0 console=ttyS0,115200n8" 
initrd-injectextra-args 选项指定将要使用 Kickstarter 文件来安装虚拟机。

3.2.6. 在客户机创建过程中配置客户机虚拟机网络

在创建客户机虚拟机时,您可以为虚拟机指定和配置网络。本节提供了每种客户机虚拟机主网络类型的选项。
带有 NAT 的默认网络
默认网络使用 libvirtd 的网络地址转换(NAT)虚拟网络交换机。有关 NAT 的更多信息,请参阅 第 6.1 节 “使用 libvirt 进行网络地址转换(NAT)”
在创建带有 NAT 的默认网络的虚拟客户机之前,请确定安装了 libvirt-daemon-config-network 软件包。
要为客户端虚拟机配置 NAT 网络,请对 virt-install 使用这个选项:
--network default
注意
如果没有指定 network 选项,将使用带有 NAT 的默认网络配置客户机虚拟机。
带有 DHCP 的桥接网络
当配置带有 DHCP 的桥接网络时,客户机使用外部的 DHCP 服务器。如果主机有静态网络配置,并且客户机需要与局域网(LAN)的完全入站和出站连接,则应使用这个选项。如果需要对客户机虚拟机执行实时迁移,则应使用它。要为虚拟机配置带有 DHCP 的桥接网络,请使用以下选项:
--network br0
注意
在运行 virt-install 之前,必须单独创建网桥。有关创建网桥的详情,请参考 第 6.4.1 节 “在 Red Hat Enterprise Linux 7 主机上配置桥接网络”
带有静态 IP 地址的桥接网络
桥接网络也可用于将客户机配置为使用静态 IP 地址。要为虚拟机配置带有静态 IP 地址的桥接网络,请使用以下选项:
--network br0 \
--extra-args "ip=192.168.1.2::192.168.1.1:255.255.255.0:test.example.com:eth0:none"
有关网络引导选项的更多信息,请参阅 Red Hat Enterprise Linux 7 安装指南
无网络
要配置没有网络接口的客户机虚拟机,请使用以下选项:
--network=none

3.3. 使用 virt-manager 创建客户机

虚拟机管理器(也称为 virt-manager )是创建和管理客户机虚拟机的图形化工具。
这部分论述了如何使用 virt-manager 在 Red Hat Enterprise Linux 7 主机上安装 Red Hat Enterprise Linux 7 虚拟机 。
这些流程假设 KVM hypervisor 和所有其他必要的软件包都已安装,并已为主机配置了虚拟化。有关安装虚拟化软件包的详情,请参考 第 2 章 安装虚拟化软件包

3.3.1. virt-manager 安装概述

New VM 向导将虚拟机创建过程分为五个步骤:
  1. 选择 hypervisor 和安装类型
  2. 定位和配置安装介质
  3. 配置内存和 CPU 选项
  4. 配置虚拟机的存储
  5. 配置虚拟机名称、网络、架构和其他硬件设置
在继续之前,请确保 virt-manager 可以访问安装介质(无论是本地还是通过网络)。

3.3.2. 使用 virt-manager 创建 Red Hat Enterprise Linux 7 客户机

这个步骤涵盖了使用本地存储的安装 DVD 或 DVD 镜像创建 Red Hat Enterprise Linux 7 客户机虚拟机。Red Hat Enterprise Linux 7 DVD 镜像可以通过 红帽客户门户网站 获得。
注意
如果要安装启用了 SecureBoot 的虚拟机,请参阅 使用 virt-manager 创建 SecureBoot Red Hat Enterprise Linux 7 客户机

过程 3.1. 使用本地安装介质通过 virt-manager 创建 Red Hat Enterprise Linux 7 客户机虚拟机

  1. 可选:准备

    为虚拟机准备存储环境。有关准备存储的详情请参考 第 13 章 为虚拟机管理存储
    重要
    各种存储类型可用于存储客户机虚拟机。但是,要使虚拟机能够使用迁移功能,虚拟机必须在网络存储上创建。
    Red Hat Enterprise Linux 7 至少需要 1 GB 存储空间。但是,红帽建议为 Red Hat Enterprise Linux 7 安装以及本指南中的步骤推荐至少 5 GB 存储空间。
  2. 打开 virt-manager 并启动向导

    以 root 用户身份执行 virt-manager 命令打开 virt-manager,或打开 ApplicationsSystem ToolsVirtual Machine Manager

    图 3.1. Virtual Machine Manager 窗口

    Virtual Machine Manager 窗口
    (可选)通过选择管理程序并单击 连接 按钮打开远程管理程序。
    点击 启动新的虚拟化客户机向导。
    此时会打开 New VM 窗口。
  3. 指定安装类型

    选择安装类型:
    本地安装介质(ISO 镜像或 CDROM)
    此方法使用安装磁盘的镜像(如 .iso)。但是,无法使用 主机 CD-ROM 或者 DVD-ROM 设备。
    网络安装(HTTP、FTP 或 NFS)
    此方法涉及使用已镜像的 Red Hat Enterprise Linux 或 Fedora 安装树来安装客户机。安装树必须可通过 HTTP、FTP 或 NFS 访问。
    如果您选择 Network Install,请提供安装 URL 和 Kernel 选项(如果需要)。
    网络启动(PXE)
    此方法使用 Preboot eXecution Environment(PXE)服务器来安装客户机虚拟机。Red Hat Enterprise Linux 7 安装指南 中介绍了如何设置 PXE 服务器。要使用网络引导,客户机必须具有可路由的 IP 地址或共享网络设备。
    如果您选择 Network Boot,请继续到 STEP 5。完成所有步骤后,将发送 DHCP 请求,如果找到有效的 PXE 服务器将启动 guest 虚拟机的安装过程。
    导入现有磁盘镜像
    此方法可用于创建新的客户机虚拟机,并将磁盘镜像(包含预安装、可引导的操作系统)导入到其中。

    图 3.2. 虚拟机安装方法

    虚拟机安装方法
    Forward 继续。
  4. 选择安装源

    1. 如果选择了 Local 安装介质(ISO 镜像或 CDROM), 请指定您预期的本地安装介质。

      图 3.3. 本地 ISO 镜像安装

      本地 ISO 镜像安装
      警告
      虽然 GUI 中目前存在 选项,但无法从主机上的物理 CD-ROM 或者 DVD 设备安装。因此,选择 Use CDROM 或 DVD 选项会导致虚拟机安装失败。详情请查看 Red Hat 知识库
      要从 ISO 镜像安装,请选择 Use ISO image 并点 Browse... 按钮以打开 Locate 介质卷 窗口。
      选择要使用的安装镜像,然后单击 Choose Volume
      如果在 Locate 介质卷 窗口中没有显示镜像,点 Browse Local 按钮浏览包含安装磁盘的安装镜像或 DVD 驱动器的主机机器。选择包含安装磁盘的安装镜像或者 DVD 驱动器并点击 Open; 选择了卷供使用,并返回到 Create a new virtual machine 向导。
      重要
      对于 ISO 镜像文件和客户机存储镜像,建议使用的位置是 /var/lib/libvirt/images/。任何其他位置可能需要 SELinux 的额外配置。有关配置 SELinux 的详情,请查看 Red Hat Enterprise Linux Virtualization 安全指南 或 Red Hat Enterprise Linux SELinux User's Guide
    2. 如果选择了 Network Install,输入安装源的 URL 以及所需的内核选项(若有)。URL 必须指向安装树的根目录,它必须能够通过 HTTP、FTP 或 NFS 访问。
      要执行 kickstart 安装,请在内核选项中指定 kickstart 文件的 URL,从 ks=开始。

      图 3.4. 网络 kickstart 安装

      网络 kickstart 安装
      注意
      有关内核选项的完整列表,请参阅 Red Hat Enterprise Linux 7 安装指南
    接下来,配置安装的操作系统 类型和 版本。确保为虚拟机选择适当的操作系统类型。这可以手动指定,或者根据 安装介质复选框选择 Automatically detect operating system
    Forward 继续。
  5. 配置内存(RAM)和虚拟 CPU

    指定要分配给虚拟机的 CPU 和内存量。向导显示您可以分配的 CPU 数和内存量;这些值会影响主机和客户机的性能。
    虚拟机需要足够的物理内存(RAM)来高效地运行。红帽为虚拟机支持至少 512MB 的 RAM。红帽建议为每个逻辑内核至少 1024MB RAM。
    为虚拟机分配足够虚拟 CPU。如果虚拟机运行多线程应用程序,请分配客户机虚拟机需要运行的虚拟 CPU 数量。
    您不能分配超过主机系统中可用的物理处理器(或超线程)的虚拟 CPU。可用的虚拟 CPU 数量在 Up to X available 字段中记录。

    图 3.5. 配置内存和 CPU

    配置内存和 CPU
    配置内存和 CPU 设置后,单击" 下一步" 以继续。
    注意
    内存和虚拟 CPU 可以过量使用。有关过量使用的详情请参考 第 7 章 使用 KVM 进行过量使用
  6. 配置存储

    为您的虚拟机启用并分配足够的空间,以及它所需的任何应用程序。对于最低安装,至少为桌面安装分配 5 GB 或至少 1 GB。

    图 3.6. 配置虚拟存储

    配置虚拟存储
    注意
    实时迁移和离线迁移需要在共享网络存储上安装虚拟机。有关为虚拟机设置共享存储的详情,请参考 第 15.4 节 “共享存储示例:用于简单迁移的 NFS”
    1. 使用默认本地存储

      选择 计算机硬盘驱动器单选按钮上创建磁盘映像,以便在默认存储池中创建基于文件的镜像,即 /var/lib/libvirt/images/ 目录。输入要创建的磁盘镜像的大小。如果选择了 Allocate entire disk 复选框,则将立即创建指定大小的磁盘镜像。如果没有,磁盘镜像会在填充时增大。
      注意
      虽然存储池是一个虚拟容器,它受到两个因素的限制: 虽然它的最大大小由 qemu-kvm 和主机物理机器上的磁盘大小进行调整。存储池可能没有超过主机物理机器上磁盘的大小。最大大小如下:
      • virtio-blk = 2^63 字节或 8 Exabytes(使用原始文件或磁盘)
      • Ext4 = ~ 16 TB(使用 4 KB 的块大小)
      • XFS = ~8 Exabytes
      • 在尝试非常大的镜像大小时,应评估/调整其 metadata 和主机文件系统,保持自己的元数据和可扩展性。使用原始磁盘意味着会影响可扩展性或最大大小的层数。
      点击 Forward 在本地硬盘中创建磁盘镜像。或者,选择 Select managed 或其他现有存储,然后选择 Browse 来配置受管存储。
    2. 使用存储池

      如果您选择 Select managed 或 other existing storage 来使用存储池,请点击 Browse 打开 Locate 或 create storage volume 窗口。

      图 3.7. Choose Storage Volume 窗口

      Choose Storage Volume 窗口
      1. Storage Pools 列表中选择存储池。
      2. 可选:点击 创建新存储卷。此时会出现 Add a Storage Volume 屏幕。输入新存储卷的名称。
        Format 下拉菜单中选择 Format 选项。格式选项包括 raw、qcow2、和 qed。根据需要调整其他字段。请注意,这里使用的 qcow2 版本为版本 3。要更改 qcow 版本,请参阅 第 23.19.2 节 “设置目标元素”

        图 3.8. Add a Storage Volume 窗口

        Add a Storage Volume 窗口
    选择新卷,再单击 Choose volume。接下来,单击 Finish 以返回到 New VM 向导。点 Forward 继续。
  7. 名称和最终配置

    将虚拟机命名为。虚拟机名称可以包含字母、数字和以下字符:下划线(_)、句点( )和连字符(-)。虚拟机名称对于迁移来说必须是唯一的,且不能仅包含数字。
    默认情况下,将使用名为"default"的网络的网络地址转换(NAT)创建虚拟机。要更改网络选择,请点击 网络选择 并选择主机设备和源模式。
    验证虚拟机的设置,并在您满意时单击 "完成" ;这将创建具有指定网络设置、虚拟化类型和架构的虚拟机。

    图 3.9. 验证配置

    验证配置
    或者,要进一步配置虚拟机的硬件,请在安装前选中 Customize configuration,以更改客户机的存储或网络设备,以使用半虚拟化(virtio)驱动程序或添加额外的设备。这会打开另一个向导,供您添加、删除和配置虚拟机的硬件设置。
    注意
    Red Hat Enterprise Linux 4 或 Red Hat Enterprise Linux 5 虚拟机无法使用图形模式安装。因此,您必须选择"Cirrus"而不是"QXL"作为显卡。
    配置虚拟机硬件后,请单击" 应用 "。virt-manager 将根据指定的硬件设置创建虚拟机。
    警告
    从远程介质安装 Red Hat Enterprise Linux 7 客户机虚拟机时,但没有配置的 TCP/IP 连接时,安装会失败。但是,在这样的情况下,当安装 Red Hat Enterprise Linux 5 或 6 的客户机虚拟机时,安装程序会打开"配置 TCP/IP"接口。
    有关这一差异的更多信息,请参阅 相关知识库文章
    Finish 继续进入 Red Hat Enterprise Linux 安装序列。有关安装 Red Hat Enterprise Linux 7 的详情,请参考 Red Hat Enterprise Linux 7 安装指南
Red Hat Enterprise Linux 7 客户机虚拟机现在从 ISO 安装磁盘镜像创建。

3.4. virt-install 和 virt-manager 安装选项的比较

这个表格提供了与安装虚拟机时对应的 virt-installvirt-manager 安装选项进行比较的快速参考。
大多数 virt-install 选项都不是必须的。最低要求是 --name、--memory、guest 存储(--disk 、--filesystem--disk none),以及一个安装方法(--location 、--cdrom 、--pxe、-importboot)。这些选项可以通过参数进一步指定;要查看命令选项和相关参数的完整列表,请输入以下命令:
# virt-install --help
virt-manager 中,至少需要名称、安装方法、内存(RAM)、vCPU 和存储。
表 3.1. guest 安装的 virt-install 和 virt-manager 配置比较
虚拟机上的配置 virt-install 选项 virt-manager 安装向导标签和步骤号
虚拟机名称 --name, -n 名称(步骤 5)
分配的 RAM(MiB) --ram, -r 内存(RAM)(第 3 步)
Storage - 指定存储介质 --disk 为此虚拟机启用存储 → 在计算机的硬盘驱动器中创建磁盘镜像,或者选择托管或其他现有存储(第 4 步)
Storage - 将主机目录导出到客户端 --filesystem 为此虚拟机启用存储 → Select managed 或其它现有存储(第 4 步)
Storage - 在客户机中配置本地磁盘存储 --nodisks 取消选择此虚拟机的启用存储复选框(第 4 步)
安装介质位置(本地安装) --file 本地安装介质 → Locate your安装介质(第 1-2 步)
使用分发树(网络安装)进行安装. --location 网络 install → URL(步骤 1-2)
使用 PXE 安装客户端 --pxe 网络引导(第 1 步)
vCPU 数量 --vcpus CPU(第 3 步)
主机网络 --network 高级选项下拉菜单(第 5 步)
操作系统变体/版本 --os-variant 版本(第 2 步)
图形显示方法 --graphics, --nographics * virt-manager 只提供 GUI 安装

第 4 章 克隆虚拟机

创建客户机副本时有两种客户机虚拟机实例:
  • 克隆 是指单个虚拟机的实例。克隆可用于设置相同虚拟机的网络,也可以将它们分发到其他目的地。
  • 模板是虚拟机的 实例,设计为用作克隆的源。您可以从模板创建多个克隆,并对每个克隆进行小的修改。这对于查看系统中这些更改的影响非常有用。
克隆和模板都是虚拟机实例。它们之间的差别在于如何使用它们。
要使创建的克隆正常工作,在克隆之前,必须删除与正在克隆的虚拟机唯一的信息和配置。需要删除的信息会因使用克隆的方式而异。
要删除的信息和配置可在以下任意级别中:
  • 平台级别 信息和配置包括虚拟化解决方案分配给虚拟机的任何内容。示例包括网络接口卡(NIC)及其 MAC 地址的数量。
  • 客户机操作系统级别 信息和配置包括虚拟机中配置的任何内容。示例包括 SSH 密钥。
  • 应用程序级别 信息和配置包括在虚拟机上安装的应用程序所配置的所有内容。示例包括激活代码和注册信息。
    注意
    本章不包括有关删除应用级别的信息,因为信息和方法特定于每个应用。
因此,必须从虚拟机中删除一些信息和配置,而其他相关信息和配置必须使用虚拟化环境(如虚拟机管理器或 VMware)从虚拟机中删除。
注意
有关克隆存储卷的详情请参考 第 13.3.2.1 节 “使用 virsh 创建存储卷”

4.1. 为 Cloning 准备虚拟机

在克隆虚拟机前,必须在其磁盘镜像上运行 virt-sysprep 程序或执行以下步骤来准备:

过程 4.1. 准备虚拟机进行克隆

  1. 设置虚拟机

    1. 构建要用于克隆或模板的虚拟机。
      • 在克隆上安装所需的任何软件。
      • 为操作系统配置任何非唯一设置。
      • 配置任何非唯一应用设置。
  2. 删除网络配置

    1. 使用以下命令删除所有持久性 udev 规则:
      # rm -f /etc/udev/rules.d/70-persistent-net.rules
      注意
      如果没有删除 udev 规则,第一个 NIC 的名称可以是 eth1 而不是 eth0。
    2. 通过编辑 /etc/sysconfig/network-scripts/ifcfg-eth[x] 来删除 ifcfg 脚本中的唯一网络详情:
      1. 删除 HWADDR 和 Static 行
        注意
        如果 HWADDR 与新客户机的 MAC 地址不匹配,则会忽略 ifcfg。因此,务必要从文件中删除 HWADDR。
        DEVICE=eth[x]
        BOOTPROTO=none
        ONBOOT=yes
        #NETWORK=10.0.1.0       <- REMOVE
        #NETMASK=255.255.255.0  <- REMOVE
        #IPADDR=10.0.1.20       <- REMOVE
        #HWADDR=xx:xx:xx:xx:xx  <- REMOVE
        #USERCTL=no             <- REMOVE
        # Remove any other *unique* or non-desired settings, such as UUID.
        
      2. 确保 DHCP 配置仍不包含 HWADDR 或任何唯一信息。
        DEVICE=eth[x]
        BOOTPROTO=dhcp
        ONBOOT=yes
        
      3. 确保该文件包含以下行:
        DEVICE=eth[x]
        ONBOOT=yes
        
    3. 如果有以下文件,请确保它们包含相同的内容:
      • /etc/sysconfig/networking/devices/ifcfg-eth[x]
      • /etc/sysconfig/networking/profiles/default/ifcfg-eth[x]
      注意
      如果虚拟机使用了 NetworkManager 或任何特殊设置,请确保从 ifcfg 脚本中删除任何其他唯一信息。
  3. 删除注册详情

    1. 使用以下命令之一删除注册详情:
      • 对于 Red Hat Network(RHN)注册的客户机虚拟机,使用以下命令:
        # rm /etc/sysconfig/rhn/systemid
      • 对于 Red Hat Subscription Manager(RHSM)注册的客户机虚拟机:
        • 如果没有使用原始虚拟机,使用以下命令:
          # subscription-manager unsubscribe --all
          # subscription-manager unregister
          # subscription-manager clean
        • 如果使用原始虚拟机,请只运行以下命令:
          # subscription-manager clean
          原始 RHSM 配置集保留在门户网站中。要在克隆虚拟机后重新激活 RHSM 注册,请执行以下操作:
          1. 获取您的客户身份代码:
            # subscription-manager identity
            subscription-manager identity: 71rd64fx-6216-4409-bf3a-e4b7c7bd8ac9
            
          2. 使用获取的 ID 代码注册虚拟机:
            # subscription-manager register --consumerid=71rd64fx-6216-4409-bf3a-e4b7c7bd8ac9
  4. 删除其他唯一详情

    1. 使用以下命令删除任何 sshd 公钥/私钥对:
      # rm -rf /etc/ssh/ssh_host_*
      注意
      删除 ssh 密钥可防止 ssh 客户端不信任这些主机的问题。
    2. 删除任何其他特定于应用的标识符或配置,这可能在多台计算机上运行时造成冲突。
  5. 将虚拟机配置为在下一次启动时运行配置向导

    1. 将虚拟机配置为在下一次引导时运行相关的配置向导,方法是执行以下操作之一:
      • 对于 Red Hat Enterprise Linux 6 和以下项,使用以下命令在 root 文件系统中创建一个名为 .un configure 的空文件:
        # touch /.unconfigured
      • 对于 Red Hat Enterprise Linux 7,运行以下命令启用第一个引导和 initial-setup 向导:
        # sed -ie 's/RUN_FIRSTBOOT=NO/RUN_FIRSTBOOT=YES/' /etc/sysconfig/firstboot
        # systemctl enable firstboot-graphical
        # systemctl enable initial-setup-graphical
      注意
      在下次引导时运行的向导取决于已从虚拟机中删除的配置。另外,在第一次引导克隆时,建议您更改主机名。

4.2. 克隆虚拟机

在继续克隆前,请关闭虚拟机。您可以使用 virt-clonevirt-manager 克隆虚拟机。

4.2.1. 使用 virt-clone 克隆虚拟机

您可以使用 virt-clone 从命令行克隆虚拟机。
请注意,您需要 root 权限让 virt-clone 成功完成。
virt-clone 命令提供了可以在命令行上传递的多个选项。这包括常规选项、存储配置选项、网络配置选项和各种选项。只需要 --original。要查看选项的完整列表,请输入以下命令:
# virt-clone --help
virt-clone man page 还记录了每个命令选项、重要的变量和示例。
以下示例演示了如何在默认连接上克隆名为"demo"的客户机虚拟机,并自动生成新的名称和磁盘克隆路径。

例 4.1. 使用 virt-clone 克隆客户端

# virt-clone --original demo --auto-clone
以下示例演示了如何使用多个磁盘克隆名为"demo"的 QEMU 客户机代理虚拟机。

例 4.2. 使用 virt-clone 克隆客户端

# virt-clone --connect qemu:///system --original demo --name newdemo --file /var/lib/libvirt/images/newdemo.img --file /var/lib/libvirt/images/newdata.img

4.2.2. 使用 virt-manager 克隆客户机

这个步骤描述了使用 virt-manager 实用程序克隆客户机虚拟机。

过程 4.2. 使用 virt-manager 克隆虚拟机

  1. open virt-manager

    启动 virt-manager。从 应用程序菜单系统工具 子菜单 启动虚拟机管理器 应用程序。或者,以 root 身份运行 virt-manager 命令。
    Virtual Machine Manager 中的客户机虚拟机列表中选择您要克隆的客户机虚拟机。
    在您要克隆的 guest 虚拟机上单击鼠标右键,然后选择 Clone。此时会打开 Clone Virtual Machine 窗口。

    图 4.1. 克隆虚拟机窗口

    克隆虚拟机窗口
  2. 配置克隆

    • 要更改克隆的名称,请为克隆输入新名称。
    • 要更改网络配置,请点击 Details
      为克隆输入新的 MAC 地址。
      确定

      图 4.2. 更改 MAC 地址窗口

      更改 MAC 地址窗口
    • 对于克隆的客户机虚拟机中的每个磁盘,请选择以下选项之一:
      • 克隆此磁盘 - 将克隆为克隆的客户机虚拟机的磁盘
      • guest 虚拟机名称共享磁盘 - 磁盘将由将被克隆及其克隆的客户端虚拟机共享
      • Details - 打开更改存储路径窗口,该窗口为磁盘启用新路径

        图 4.3. 更改 存储路径 窗口

        更改 存储路径 窗口
  3. 克隆客户机虚拟机

    单击 Clone

第 5 章 KVM 半虚拟化(virtio)驱动程序

半虚拟化驱动程序可增强客户机性能,降低客户机 I/O 延迟,并将吞吐量几乎增加到裸机级别。建议将半虚拟化驱动程序用于运行 I/O 密集型任务和应用程序的完全虚拟化客户机。
VirtIO 驱动程序是 KVM 泛虚拟化设备驱动程序,可用于 KVM 主机上运行的 虚拟机。这些驱动程序包含在 virtio 软件包中。virtio 软件包支持块(存储)设备和网络接口控制器。
注意
PCI 设备受虚拟化系统架构的限制。在使用分配的设备时,请参阅 第 16 章 虚拟机设备配置 以了解其他限制。

5.1. 为现有存储设备使用 KVM virtio 驱动程序

您可以修改附加到客户机的现有硬盘设备,以使用 virtio 驱动程序,而不是虚拟化 IDE 驱动程序。本节中显示的示例编辑 libvirt 配置文件。请注意,不需要关闭客户端虚拟机来执行这些步骤,但更改不会应用,直到 guest 完全关闭并重新引导为止。

过程 5.1. 为现有设备使用 KVM virtio 驱动程序

  1. 在继续执行此流程前,请确保您已安装了适当的驱动程序( viostor )。
  2. 以 root 身份运行 virsh edit guestname 命令,编辑设备的 XML 配置文件。例如: virsh edit guest1。配置文件位于 /etc/libvirt/qemu/ 目录中。
  3. 以下是使用虚拟化 IDE 驱动程序基于文件的块设备。这对于虚拟机的典型条目不使用 virtio 驱动程序。
    <disk type='file' device='disk'>
    	 ...
       <source file='/var/lib/libvirt/images/disk1.img'/>
       <target dev='hda' bus='ide'/>
    	 <address type='pci' domain='0x0000' bus='0x00' slot='0x07' function='0x0'/>
    </disk>
  4. 通过将 bus= 条目修改为 virtio,将条目更改为使用 virtio 设备。请注意,如果磁盘之前是 IDE,它有一个类似于 hdahdbhdc 的目标。当更改为 bus=virtio 时,目标需要相应地更改为 vdavdbvdc
    <disk type='file' device='disk'>
       ...
       <source file='/var/lib/libvirt/images/disk1.img'/>
       <target dev='vda' bus='virtio'/>
    	 <address type='pci' domain='0x0000' bus='0x00' slot='0x07' function='0x0'/>
    </disk>
  5. 删除 磁盘标签 中的 地址 标签。此过程必须完成。libvirt 将在虚拟机下次启动时正确重新生成地址 标签。
或者,virt-managervirsh attach-diskvirsh attach-interface 可使用 virtio 驱动程序添加新设备。
有关使用 Virtio 的详情,请查看 libvirt 网站: http://www.linux-kvm.org/page/Virtio

5.2. 为新存储设备使用 KVM virtio 驱动程序

此流程涵盖在 virt-manager 中使用 KVM virtio 驱动程序创建新存储设备。
或者,可以使用 virsh attach-diskvirsh attach-interface 命令使用 virtio 驱动程序附加设备。
重要
在继续安装新设备前,请确保已在客户机上安装驱动程序。如果驱动程序不可用,该设备将无法识别且无法使用。

过程 5.2. 使用 virtio 存储驱动程序添加存储设备

  1. 通过双击 virt-manager 中的 guest 名称,打开 guest 虚拟机。
  2. 点击 打开 Show Virtual hardware details 选项卡。
  3. 显示虚拟硬件详细信息 选项卡中,单击 添加硬件 按钮。
  4. 选择硬件类型

    选择 Storage 作为 硬件类型

    图 5.1. Add new virtual hardware 向导

    Add new virtual hardware 向导,存储被选为硬件类型。
  5. 选择存储设备和驱动程序

    创建新磁盘镜像或选择存储池卷。
    设备类型设置为 磁盘设备,并将 Bus type 设为 VirtIO 以使用 virtio 驱动程序。

    图 5.2. Add New Virtual Hardware 向导

    Add new virtual hardware 向导存储窗口,选择 "Create a disk image on the computer 的硬盘"。
    Finish 以完成此流程。

过程 5.3. 使用 virtio 网络驱动程序添加网络设备

  1. 通过双击 virt-manager 中的 guest 名称,打开 guest 虚拟机。
  2. 点击 打开 Show Virtual hardware details 选项卡。
  3. 显示虚拟硬件详细信息 选项卡中,单击 添加硬件 按钮。
  4. 选择硬件类型

    选择 Network 作为 硬件类型

    图 5.3. Add new virtual hardware 向导

    Add new virtual hardware 向导,其 Network 被选为硬件类型。
  5. 选择网络设备和驱动程序

    设备模型 设置为 virtio 以使用 virtio 驱动程序。选择所需的 主机设备

    图 5.4. Add new virtual hardware 向导

    Add new virtual hardware 向导 Network 窗口,设备模型设置为 virtio。
    Finish 以完成此流程。
添加所有新设备后,重启虚拟机。在 guest 重新启动之前,虚拟机可能无法识别设备。

5.3. 为网络接口设备使用 KVM virtio 驱动程序

当网络接口使用 KVM VirtIO 驱动程序时,KVM 不会模拟删除处理开销的网络硬件,并可提高客户机性能。在 Red Hat Enterprise Linux 7 中,virtio 用作默认网络接口类型。但是,如果在您的系统中进行了不同的配置,您可以使用以下步骤:
  • 要将 virtio 网络设备 附加到客户端,请使用带有 model --virtio 选项的 virsh attach-interface 命令。
    或者,在 virt-manager 界面中,导航到 guest 的虚拟硬件详细信息屏幕然后单击添加硬件。在 Add New Virtual Hardware 屏幕中,选择 Network,并将 设备模型 改为 virtio
  • 要将现有接口的类型更改为 virtio, 请使用 virsh edit 命令编辑预期客户机的 XML 配置,并将 型号类型 属性改为 virtio,例如:
      <devices>
        <interface type='network'>
          <source network='default'/>
          <target dev='vnet1'/>
          <model type='virtio'/>
          <driver name='vhost' txmode='iothread' ioeventfd='on' event_idx='off'/>
        </interface>
      </devices>
      ...
    
    或者,在 virt-manager 界面中,导航到客户机 的虚拟硬件详细信息屏幕,选择 NIC 项,并将 设备模型 改为 virtio
注意
如果客户机中的网络接口命名在重新引导时不一致,请确保向客户机提供的所有接口都使用相同的设备模型,最好是 virtio-net。详情请查看 红帽知识库

第 6 章 网络配置

本章介绍基于 libvirt 的客户机虚拟机所使用的常见网络配置。
Red Hat Enterprise Linux 7 支持以下虚拟化网络设置:
  • 使用网络地址转换(NAT)的虚拟网络.
  • 使用 PCI 设备分配直接分配的物理设备
  • 使用 PCIe SR-IOV 直接分配的虚拟功能
  • 网桥网络
您必须启用 NAT、网络桥接或直接分配 PCI 设备,以允许外部主机访问客户机虚拟机上的网络服务。

6.1. 使用 libvirt 进行网络地址转换(NAT)

共享网络连接的最常见方法是使用网络地址转换(NAT)转发(也称为虚拟网络)。

主机配置

每个标准 libvirt 安装都提供虚拟机的基于 NAT 的连接作为默认虚拟网络。使用 virsh net-list --all 命令验证它可用。

# virsh net-list --all
Name                 State      Autostart
-----------------------------------------
default              active     yes
如果缺少这个选项,可针对客户机在 XML 配置文件(如 /etc/libvirtd/qemu/myguest.xml)中使用以下内容:
# ll /etc/libvirt/qemu/
total 12
drwx------. 3 root root 4096 Nov  7 23:02 networks
-rw-------. 1 root root 2205 Nov 20 01:20 r6.4.xml
-rw-------. 1 root root 2208 Nov  8 03:19 r6.xml
默认网络从 /etc/libvirt/qemu/networks/default.xml定义
将默认网络标记为自动启动:
# virsh net-autostart default
Network default marked as autostarted
启动默认网络:
# virsh net-start default
Network default started
libvirt 默认网络运行后,您将看到一个隔离的网桥设备。这个设备 没有 添加任何物理接口。新设备使用 NAT 和 IP 转发来连接物理网络。不要添加新接口。
# brctl show
bridge name     bridge id               STP enabled     interfaces
virbr0          8000.000000000000       yes
libvirt 添加 iptables 规则,允许连接到 INPUTFORWARDPOSTROUTING 链中的 virbr0 设备和 guest 虚拟机的流量。libvirt 然后尝试启用 ip_forward 参数。其他某些应用程序可能会禁用 ip_forward,因此最好的选项是将以下内容添加到 /etc/sysctl.conf 中:
 net.ipv4.ip_forward = 1

虚拟机配置

主机配置完成后,客户机虚拟机就可以根据其名称连接到虚拟网络。要将客户端连接到 'default' 虚拟网络,可在 XML 配置文件中使用以下内容(如 /etc/libvirtd/qemu/myguest.xml)用于客户机:

<interface type='network'>
   <source network='default'/>
</interface>
注意
定义 MAC 地址是可选的。如果您没有定义 MAC 地址,则自动生成 MAC 地址,并将其用作网络使用的网桥设备的 MAC 地址。手动设置 MAC 地址对于在整个环境中保持一致性或便于参考,或者避免非常小的冲突几率。
<interface type='network'>
  <source network='default'/>
  <mac address='00:16:3e:1a:b3:4a'/>
</interface>

6.2. 禁用 vhost-net

vhost-net 模块是用于 virtio 网络的内核级后端,通过将 virtio 数据包处理任务移出用户空间(QEMU 进程)和到内核( vhost-net 驱动程序))。vhost-net 驱动程序只可用于 virtio 网络接口。如果载入 vhost-net 内核模块,则默认为所有 virtio 接口启用它,但如果特定的工作负载在使用中时,可以在接口配置中禁用它。
特别是,当从主机将 UDP 流量发送到该主机上的虚拟客户机虚拟机时,如果客户机虚拟机处理传入的数据的速度比主机发送的速度慢,则可能会出现性能降级。在这种情况下,启用 vhost-net 会导致 UDP 套接字接收缓冲区更快地出现溢出,这会导致数据包丢失。因此最好禁用 vhost-net,以减慢流量的速度,并提高整体性能。
要禁用 vhost-net,编辑客户机虚拟机 XML 配置文件中的 <interface> 子元素,并按如下所示定义网络:
<interface type="network">
   ...
   <model type="virtio"/>
   <driver name="qemu"/>
   ...
</interface>
将驱动程序名称设置为 qemu 会强制数据包处理到 QEMU 用户空间,从而有效地为该接口禁用 vhost-net。

6.3. 启用 vhost-net 零复制

在 Red Hat Enterprise Linux 7 中,默认禁用 vhost-net zero-copy。要永久启用此操作,请在包含以下内容的 /etc/modprobe.d 中添加新的文件 vhost-net.conf
options vhost_net  experimental_zcopytx=1
如果要再次禁用此功能,您可以运行以下命令:
modprobe -r vhost_net
modprobe vhost_net experimental_zcopytx=0
第一个命令删除旧文件,第二个命令生成新文件(如上方)并禁用零复制。您可以使用它启用,但更改不具有持久性。
要确认这已生效,请检查 cat /sys/module/vhost_net/parameters/experimental_zcopytx 的输出。它应该显示:
$ cat /sys/module/vhost_net/parameters/experimental_zcopytx
0

6.4. 网桥网络

网桥网络(也称为网络桥接或虚拟网络交换机)用于将虚拟机网络接口放在与物理接口相同的网络中。网桥需要最少的配置,并使虚拟机显示在现有网络上,从而降低管理开销和网络复杂性。由于网桥包含几个组件和配置变量,它们提供了一个透明的设置,它易于理解并进行故障排除。
可以使用标准 Red Hat Enterprise Linux 工具、virt-managerlibvirt 在虚拟化环境中配置桥接,并请参考以下部分。
但是,即使在虚拟化环境中,也可以使用主机操作系统的网络工具更轻松地创建网桥。有关此网桥创建方法的更多信息,请参阅 Red Hat Enterprise Linux 7 Networking Guide

6.4.1. 在 Red Hat Enterprise Linux 7 主机上配置桥接网络

桥接网络可以独立于虚拟化管理工具,为 Red Hat Enterprise Linux 主机上的虚拟机进行配置。强烈建议使用这个配置,当虚拟化桥接只是主机的网络接口,或者是主机的管理网络接口时。
有关使用虚拟化工具配置网络桥接的说明,请参阅 Red Hat Enterprise Linux 7 网络指南

6.4.2. 使用虚拟机管理器桥接网络

这部分提供了使用 virt-manager 从主机机器接口创建到客户机虚拟机的桥接的说明。
注意
根据您的环境,在 Red Hat Enterprise Linux 7 中使用 libvirt 工具设置桥接可能需要禁用网络管理器(红帽不推荐)。使用 libvirt 创建的网桥还需要运行 libvirtd,以便网桥维护网络连接。
建议在物理 Red Hat Enterprise Linux 主机上配置桥接网络,如 Red Hat Enterprise Linux 7 Networking Guide 所述,在创建网桥后使用 libvirt 向网桥添加虚拟机接口。

过程 6.1. 使用 virt-manager 创建桥接

  1. virt-manager 主菜单中,点击 Edit zfcp Connection Details 打开 Connection Details 窗口。
  2. Network Interfaces 选项卡。
  3. 单击窗口底部的 +,以配置新的网络接口。
  4. Interface 类型 下拉菜单中,选择 Bridge,然后单击 Forward 以继续。

    图 6.1. 添加桥接

    添加桥接
    1. Name 字段中输入网桥名称,如 br0
    2. 从下拉菜单中选择 Start 模式。从以下之一中选择:
      • none - 取消激活网桥
      • ONBOOT - 在下一个客户机虚拟机重新引导时激活桥接
      • 热插拔 - 即使客户机虚拟机正在运行,也会激活桥接
    3. 选中 激活现在 复选框以立即激活该网桥。
    4. 要配置 IP 设置 或网桥 设置,请单击相应的 配置 按钮。将打开一个单独的窗口,以指定所需的设置。进行必要的更改,完成后单击 确定
    5. 选择要连接到您的虚拟机的物理接口。 如果接口当前被另一个虚拟客户机使用,您将收到一条警告消息。
  5. Finish 和向导关闭,把您返回到 Connections 菜单。

    图 6.2. 添加桥接

    添加桥接
选择要使用的网桥,然后单击 Apply 以退出向导。
要停止接口,点 Stop Interface 键。停止网桥后,若要删除接口,可单击 Delete Interface 密钥。

6.4.3. 使用 libvirt 进行桥接网络

根据您的环境,在 Red Hat Enterprise Linux 7 中使用 libvirt 设置桥接可能需要禁用网络管理器(红帽不推荐)。这还需要 libvirtd 才能运行,以便网桥操作。
建议您在物理 Red Hat Enterprise Linux 主机上配置桥接网络,如 Red Hat Enterprise Linux 7 网络指南 所述。
重要
libvirt 现在能够利用新的内核可调项参数来管理主机桥接转发数据库(FDB)条目,从而在桥接多个虚拟机时可能会提高系统性能。在主机的 XML 配置文件中,将网络的 <bridge> 元素的 macTableManager 属性设置为 'libvirt'
<bridge name='br0' macTableManager='libvirt'/>
这将在所有网桥端口上关闭学习(flood)模式,libvirt 将根据需要添加或删除条目。除了删除学习 MAC 地址正确转发端口的开销外,这也允许内核禁用将网桥连接到网络的物理设备上的混杂模式,从而进一步减少开销。

第 7 章 使用 KVM 进行过量使用

7.1. 简介

KVM 管理程序自动过量使用 CPU 和内存。这意味着,比系统中物理资源相比,可向虚拟机分配更多虚拟化 CPU 和内存。这是因为大多数进程都无法随时访问其分配资源的 100%。
因此,利用不足的虚拟化服务器或桌面可以在更少的主机上运行,这样可以节省大量系统资源,同时降低了电源、冷却和服务器硬件投资的影响。

7.2. 过量使用内存

在 KVM 管理程序中运行的客户机虚拟机没有专用的物理 RAM 块。相反,每个客户机虚拟机作为 Linux 进程的功能,其中的主机物理机器的 Linux 内核仅在请求时分配内存。此外,主机的内存管理器也可以在自己的物理内存和交换空间之间移动客户机虚拟机的内存。
过量使用要求在主机物理机器上分配足够的交换空间,以容纳所有客户机虚拟机,并为主机物理计算机的进程提供足够的内存。作为基本规则,主机物理计算机的操作系统最多需要 4 GB 内存,至少 4 GB 交换空间。有关为 swap 分区确定适当大小的高级说明,请查看红帽知识库
重要
过量使用不是一般内存问题的理想解决方案。建议使用内存短缺的方法为每个客户机分配较少的内存,向主机添加更多物理内存,或使用 swap 空间。
如果虚拟机经常被交换,则虚拟机运行速度较慢。另外,过量使用会导致系统内存不足(OOM),这可能会导致 Linux 内核关闭重要的系统进程。如果您决定过量使用内存,请确定执行足够的测试。请联络红帽支持以获得过量使用的协助。
过量使用不可用于所有虚拟机,但发现在具有少量密集型使用情况的桌面虚拟化设置中工作,或使用 KSM 运行多个相同的虚拟机。有关 KSM 和过量使用的更多信息,请参阅 Red Hat Enterprise Linux 7 虚拟化调整和优化指南
重要
设备分配不支持内存过量使用。这是因为,当使用 设备分配 时,所有虚拟机内存都必须静态分配才能启用具有分配设备的直接内存访问(DMA)。

7.3. 过量使用虚拟化 CPU

KVM 管理程序支持过量使用虚拟化 CPU(vCPU)。虚拟化 CPU 尽可能超量,因为客户机虚拟机的负载限制允许。在提交 vCPU 时要小心,因为负载接近 100% 可能会导致请求丢失或者无法响应。
在 Red Hat Enterprise Linux 7 中,可以过量使用带有多个 vCPU 的客户机,称为对称多处理(SMP)虚拟机。但是,当您在虚拟机上运行比物理 CPU 更多的内核时,您可能会遇到性能下降。
例如,具有四个 vCPU 的虚拟机不应在具有双核心处理器的主机上运行,而是在四核主机上运行。由于程序比所需 CPU 时间更少,超过物理处理内核数量的 SMP 虚拟机会导致性能下降。另外,不建议为每个物理处理器内核分配 10 个以上 vCPU。
对于 SMP 客户机,一些处理开销固有。CPU 过量使用可能会增加 SMP 开销,因为使用时间分片将资源分配给客户端,因此客户机内的间 CPU 通信会较慢。随着具有更多 vCPU 数量或更大过量使用比例的客户机,这种开销会增加。
当单个主机有多个虚拟机时,与主机 CPU 数量相比,虚拟化 CPU 的最佳限制是较少的 vCPU。KVM 应以 5 个 vCPU(在 5 台虚拟机)与一个主机上一个物理 CPU 的比例安全支持 100% 下的客户机。KVM 管理程序将在所有虚拟机之间进行切换,确保负载是平衡的。
为了获得最佳性能,红帽建议根据运行每个客户机中的程序而需要的 vCPU 数量只分配客户机。
重要
使用 100% 内存或处理资源的应用程序可能会在过量使用的环境中不稳定。不要在生产环境中过量使用内存或 CPU,且没有广泛的测试,因为 CPU 过量使用比例和 SMP 的数量取决于工作负载。

第 8 章 KVM 客户机计时管理

虚拟化在客户端虚拟机中及时存在诸多挑战。
  • 中断无法始终同时交付到所有客户机虚拟机。这是因为虚拟机中的中断不是真正的中断。相反,它们会被主机注入到客户机虚拟机中。
  • 主机可以运行另一个虚拟客户机或不同的进程。因此,中断通常需要的精确时间可能并不总是可行。
没有准确的时间的客户机虚拟机可能遇到网络应用程序和进程的问题,因为会话有效、迁移和其他网络活动依赖于时间戳以保持正确。
KVM 通过提供带半虚拟化时钟(kvm-clock)的客户机虚拟机来避免这些问题。但是,在尝试可能受时间不准确(如虚拟机迁移)可能会受到影响的活动之前,仍然务必要测试时间。
重要
为避免上述问题,在主机和客户机虚拟机中应配置网络时间协议(NTP)。在使用红帽企业 Linux 6 及更早版本的虚拟客户机上,NTP 由 ntpd 服务实施。如需更多信息,请参阅 Red Hat Enterprise 6 部署指南
在使用 Red Hat Enterprise Linux 7 的系统上,NTP 时间同步服务可由 ntpdchronyd 服务提供。请注意,Chrony 在虚拟机上有一些优点。如需更多信息,请参阅《Red Hat Enterprise Linux 7 系统管理员指南》 中的使用 chrony 套件 配置 NTP 以及使用 ntpd 的配置 NTP 部分。

客户机虚拟机时间同步的机学

默认情况下,客户端将其时间与虚拟机监控程序同步,如下所示:

  • 当客户机系统引导时,客户机会从模拟的 Real Time Clock(RTC)读取时间。
  • 启动 NTP 协议时,它会自动同步客户机时钟。之后,在普通 guest 操作期间,NTP 在客户机执行时钟调整。
  • 当一个 guest 在暂停或恢复过程后恢复时,应由管理软件(如 virt-manager)发布将客户机时钟同步到指定值的命令。只有在客户机中安装 QEMU 客户机代理 并支持该功能时,此同步才可以正常工作。客户端时钟同步的值是主机时钟值。

恒定的时间戳计数器(TSC)

现代 Intel 和 AMD CPU 提供恒定的时间戳计数器(TSC)。当 CPU 内核本身更改频率时,恒定 TSC 的计数频率不同,例如遵守节能策略。需要具有恒定的 TSC 频率 CPU,以便使用 TSC 作为 KVM 客户机的时钟源。

如果存在 constant_tsc 标志,您的 CPU 有一个恒定的时间戳计数器。运行以下命令,检查您的 CPU 是否具有 constant_tsc 标志:
$ cat /proc/cpuinfo | grep constant_tsc
如果给出了任何输出,则您的 CPU 具有 constant_tsc 位。如果未指定输出,请遵循以下步骤。

在没有 Constant 时间戳计数器的情况下配置主机

没有恒定的 TSC 频率的系统无法使用 TSC 作为虚拟机的时钟源,需要额外的配置。电源管理功能会干扰准确的时间保留,必须禁用 guest 虚拟机才能准确使用 KVM 保持时间。

重要
这些指令仅适用于 AMD 修订 F CPU。
如果 CPU 缺少 constant_tsc 位,则禁用所有电源管理功能 。每个系统都使用多个计时器来保留时间。主机上 TSC 不稳定,有时是由 cpufreq 更改、深度 C 状态导致的,或者迁移到具有更快 TSC 的主机。C 深度睡眠状态可以停止 TSC。 为防止内核使用深度 C 状态,可将 processor.max_cstate=1 附加到内核启动中。要使这一更改持久,请在 /etc/default/grub文件中编辑 GRUB_CMDLINE_LINUX 键的值。例如,如果要为每个引导启用紧急模式,请按如下方式编辑该条目:
GRUB_CMDLINE_LINUX="emergency"
请注意,您可以为 GRUB_CMDLINE_LINUX 键指定多个参数,与在 GRUB 2 启动菜单中添加参数类似。
要禁用 cpufreq (只在没有 constant_tsc的主机上),安装 kernel-tools 并启用 cpupower.service (systemctl enable cpupower.service)。如果要在每次客户端虚拟机引导时禁用此服务,更改 /etc/sysconfig/cpupower 中的配置文件,并更改 CPUPOWER_START_OPTS 和 CPUPOWER_STOP_OPTS。有效限制可在 /sys/devices/system/cpu/cpuid/cpufreq/scaling_available_governors 文件中找到。有关此软件包或电源管理以及管理者的更多信息,请参阅 Red Hat Enterprise Linux 7 Power Management Guide

8.1. Host-wide Time sync

KVM 客户端中的虚拟网络设备不支持硬件时间戳,这意味着难以同步使用 NTP 或 PTP 等网络协议(如 NTP 或 PTP)的客户机时钟,其准确性要高于微秒的十秒。
当需要更准确的客户端同步时,建议使用 NTP 或 PTP 与硬件时间戳同步主机时钟,并将客户机直接同步到主机。Red Hat Enterprise Linux 7.5 及更新的版本提供虚拟 PTP 硬件时钟(PHC),它允许客户机与主机同步,并可以通过子微秒的准确性进行同步。
重要
请注意,为了让 PHC 正常工作,主机和客户机都需要使用 RHEL 7.5 或更高版本作为操作系统(OS)。
要启用 PHC 设备,在客户端操作系统中执行以下操作:
  1. ptp_kvm 模块设置为在重启后载入。
    # echo ptp_kvm > /etc/modules-load.d/ptp_kvm.conf
  2. /dev/ptp0 时钟添加为 chrony 配置的引用:
    # echo "refclock PHC /dev/ptp0 poll 2" >> /etc/chrony.conf
  3. 重启 chrony 守护进程:
    # systemctl restart chronyd
  4. 要验证 host-guest 时间同步是否已正确配置,请在客户机上使用 chronyc sources 命令。输出应类似于如下:
    # chronyc sources
    210 Number of sources = 1
    MS Name/IP address         Stratum Poll Reach LastRx Last sample
    ===============================================================================
    #* PHC0                          0   2   377     4     -6ns[   -6ns] +/-  726ns
    

8.2. Red Hat Enterprise Linux 客户机所需的时间管理参数

对于某些 Red Hat Enterprise Linux 客户机虚拟机,需要正确同步其系统时间需要额外的内核参数。若要设置这些参数,可将这些参数附加到 guest 虚拟机的 /etc/grub2.cfg 文件中的 /kernel 行的末尾。
注意
红帽企业 Linux 5.5 及更高版本、红帽企业 Linux 6.0 及更高版本以及红帽企业 Linux 7 使用 kvm-clock 作为默认时钟来源。运行 kvm-clock 避免了对附加内核参数的需求,红帽推荐使用它。
下表列出了 Red Hat Enterprise Linux 的版本以及指定系统中所需的参数。
表 8.1. 内核参数要求
Red Hat Enterprise Linux 版本 其他客户端内核参数
使用 kvm-clock 的 AMD64 和 Intel 64 系统中 7.0 及更新的版本 不需要额外的参数
6.1 及更新的版本在带有 kvm-clock 的 AMD64 和 Intel 64 系统中 不需要额外的参数
带有 kvm-clock 的 AMD64 和 Intel 64 系统上的 6.0 不需要额外的参数
AMD64 和 Intel 64 系统上的 6.0,没有 kvm-clock notsc lpj=n
注意
lpj 参数需要一个数字值,等于客户机虚拟机运行的特定 CPU 的每个 jiffy 值的循环。如果您不知道这个值,请不要设置 lpj 参数。

8.3. steal Time Accounting

steal time 是主机未提供的客户机虚拟机所需的 CPU 时间。当主机在其它位置分配这些资源时(例如,)到另一个客户机时,会发生 steal 时间。
增强时间会在 /proc/stat 的 CPU 时间字段中报告。它由 topvmstat 等实用程序自动报告。它显示为 "%st",或者在"st"列中显示。请注意,它无法关闭。
大量稳定时间表示 CPU 争用,这可以降低客户机性能。为了减轻 CPU 争用,增加客户机的 CPU 优先级或 CPU 配额,或在主机上运行较少的虚拟机。

第 9 章 使用 libvirt 进行网络引导

客户机虚拟机可以在启用 PXE 的情况下引导。PXE 允许客户机虚拟机启动并载入其配置本身。本节演示了使用 libvirt 配置 PXE 客户端的一些基本配置步骤。
本节不涵盖引导镜像或 PXE 服务器的创建。它用于说明如何在私有或桥接网络中配置 libvirt,从而引导启用 PXE 启动的客户机虚拟机。
警告
这些程序仅作为示例提供。在继续操作前,请确保您有足够的备份。

9.1. 准备引导服务器

要执行本章中的步骤,您需要:
  • PXE 服务器(DHCP 和 TFTP)- 可以是 libvirt 内部服务器、手动配置 dhcpd 和 tftpd、dnsmasq、一个由 Cobbler 配置的服务器或其他服务器。
  • 引导镜像 - 例如,PXELINUX 手动配置或 Cobbler。

9.1.1. 在私有 libvirt 网络中设置 PXE 引导服务器

这个示例使用 default 网络。执行以下步骤:

过程 9.1. 配置 PXE 引导服务器

  1. 将 PXE 引导镜像和配置放在 /var/lib/tftpboot 中。
  2. 使用以下命令:
    # virsh net-destroy default
    # virsh net-edit default
  3. 编辑默认 网络的配置文件中的 <ip> 元素,使其包含正确的地址、网络掩码、DHCP 地址范围和引导文件,其中 BOOT_FILENAME 代表您用来引导客户机虚拟机的文件名。
    <ip address='192.168.122.1' netmask='255.255.255.0'>
       <tftp root='/var/lib/tftpboot' />
       <dhcp>
          <range start='192.168.122.2' end='192.168.122.254' />
          <bootp file='BOOT_FILENAME' />
       </dhcp>
    </ip>
  4. 运行:
    # virsh net-start default
  5. 使用 PXE 引导客户端(请参考 第 9.2 节 “使用 PXE 启动客户机”)。

9.2. 使用 PXE 启动客户机

本节演示了如何使用 PXE 引导客户机虚拟机。

9.2.1. 使用桥接网络

过程 9.2. 使用 PXE 和桥接网络引导客户端

  1. 确保启用桥接功能,以便网络可使用 PXE 引导服务器。
  2. 引导启用了 PXE 启动的客户机虚拟机。您可以使用 virt-install 命令创建启用了 PXE 引导的新虚拟机,如下例所示:
    virt-install --pxe --network bridge=breth0 --prompt
    另外,请确保客户端网络被配置为使用桥接网络,并且 XML 客户机配置文件在 <boot dev='network'/> 元素中有一个 <os> 元素,如下例所示:
    <os>
       <type arch='x86_64' machine='pc-i440fx-rhel7.0.0'>hvm</type>
       <boot dev='network'/>
       <boot dev='hd'/>
    </os>
    <interface type='bridge'>
       <mac address='52:54:00:5a:ad:cb'/>
       <source bridge='breth0'/>
       <target dev='vnet0'/>
       <alias name='net0'/>
       <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/>
    </interface>

9.2.2. 使用私有 libvirt 网络

过程 9.3. 使用私有 libvirt 网络

  1. 在 libvirt 上配置 PXE 引导,如 第 9.1.1 节 “在私有 libvirt 网络中设置 PXE 引导服务器” 所示。
  2. 使用 libvirt 引导客户机虚拟机,并启用 PXE 引导。您可以使用 virt-install 命令使用 PXE 创建/安装新虚拟机:
    virt-install --pxe --network network=default --prompt
另外,请确保客户端网络被配置为使用您的私有 libvirt 网络,并且 XML 客户机配置文件在 <boot dev='network'/> 元素中有一个 <os> 元素,如下例所示:
<os>
   <type arch='x86_64' machine='pc-i440fx-rhel7.0.0'>hvm</type>
   <boot dev='network'/>
   <boot dev='hd'/>
</os>
还要确保客户端虚拟机已连接到私有网络:
<interface type='network'>
   <mac address='52:54:00:66:79:14'/>
   <source network='default'/>
   <target dev='vnet0'/>
   <alias name='net0'/>
   <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/>
</interface>

第 10 章 注册 Hypervisor 和虚拟机

Red Hat Enterprise Linux 6 和 7 要求每个客户机虚拟机都映射到特定的管理程序,以确保每个客户机都分配了相同的订阅服务级别。要执行此操作,您需要安装一个订阅代理,该代理会在安装和注册的每个 KVM 管理程序上自动检测所有客户机虚拟机(VM),进而创建一个位于主机上的映射文件。这个映射文件可确保所有客户机虚拟机都收到以下好处:
  • 特定于虚拟系统的订阅可以随时可用,并可应用于所有关联的虚拟机虚拟机。
  • 所有可从管理程序继承的订阅优势均可随时可用,并可应用于所有相关的客户机虚拟机。
注意
本章提供的信息仅特定于 Red Hat Enterprise Linux 订阅。如果您有红帽虚拟化订阅或 Red Hat Satellite 订阅,则您还应查阅这些订阅提供的 virt-who 信息。如需红帽订阅管理的更多信息,请参阅《 红帽订阅管理 指南》,网址为:

10.1. 在主机物理机器上安装 virt-who

  1. 注册 KVM 管理程序

    在终端中以 root 用户身份在主机物理计算机上运行 subscription-manager register [options] 命令注册 KVM 管理程序。可使用 # subscription-manager register --help 菜单获得更多选项。如果您在使用用户名和密码时,请使用 Subscription Manager 应用程序已知的凭证。如果这是您首次订阅,且您没有用户帐户,请联络客户支持。例如,要将虚拟机注册为 'admin' 使用 'secret' 作为密码,您可以发送以下命令:
    [root@rhel-server ~]# subscription-manager register --username=admin --password=secret --auto-attach
  2. 安装 virt-who 软件包

    在主机物理机器上运行以下命令来安装 virt-who 软件包:
    # yum install virt-who
  3. 创建 virt-who 配置文件

    对于每个管理程序,在 /etc/virt-who.d/ 目录中添加一个配置文件。文件必须至少包含以下片断:
    [libvirt]
    type=libvirt
    
    有关配置 virt-who 的详情请参考 第 10.1.1 节 “配置 virt-who
  4. 启动 virt-who 服务

    在主机物理机器上运行以下命令启动 virt-who 服务:
    # systemctl start virt-who.service
    # systemctl enable virt-who.service
  5. 确认 virt-who 服务正在收到客户机信息

    此时,virt-who 服务将从主机收集一组域。检查主机物理计算机上的 /var/log/rhsm/rhsm.log 文件,以确认该文件是否包含客户端虚拟机的列表。例如:
    2015-05-28 12:33:31,424 DEBUG: Libvirt domains found: [{'guestId': '58d59128-cfbb-4f2c-93de-230307db2ce0', 'attributes': {'active': 0, 'virtWhoType': 'libvirt', 'hypervisorType': 'QEMU'}, 'state': 5}]
    

过程 10.1. 在客户门户网站中管理订阅

  1. 订阅虚拟机监控程序

    由于虚拟机将获得与虚拟机监控程序相同的订阅好处,因此管理程序具有有效的订阅,且订阅可供虚拟机使用。
    1. 登录到客户门户网站

      在红帽客户门户网站中提供 您的红帽帐户凭证 以进行登录。
    2. 点系统链接

      前往 My Subscriptions 接口的 Systems 部分。
    3. 选择虚拟机监控程序

      在系统页面中,存在所有订阅的系统表。单击虚拟机监控程序的名称(如 localhost.localdomain)。在打开的详情页面中,点 Attach a subscription 并选择所有列出的订阅。单击 Attach Selected。这会将主机的物理订阅附加到管理程序,以便 guest 可从订阅中受益。
  2. 订阅客户机虚拟机 - 首次使用

    此步骤适用于拥有新订阅且之前从未订阅客户机虚拟机的用户。如果您要添加虚拟机,请跳过此步骤。要在运行 virt-who 服务的机器上使用分配给管理程序配置文件的订阅,请通过在客户机虚拟机上的终端运行以下命令自动订阅。
    [root@virt-who ~]# subscription-manager attach --auto
  3. 订阅额外的客户机虚拟机

    如果您首次订阅了虚拟机,请跳过此步骤。如果您要添加额外的虚拟机,请注意,运行此命令不一定会在客户机虚拟机中重新附加相同的订阅。这是因为,删除所有订阅后允许自动附加来解决给定客户机虚拟机需要什么操作,可能会导致与之前使用的不同订阅。这对您的系统可能没有任何影响,但应该了解它。如果您使用手动附加程序附加虚拟机(如下所述),则需要手动附加这些虚拟机,因为自动附加将无法正常工作。使用以下命令首先删除旧客户机的订阅,然后使用自动附加订阅将订阅附加到所有客户机。在客户机虚拟机中运行这些命令。
    [root@virt-who ~]# subscription-manager remove --all
    [root@virt-who ~]# subscription-manager attach --auto
  4. 确认订阅已附加

    通过在客户机虚拟机中运行以下命令来确认订阅已附加到管理程序中:
    [root@virt-who ~]# subscription-manager list --consumed
    将显示类似于如下内容的输出。请注意订阅详情。它应该说"订阅为"当前"。
    [root@virt-who ~]# subscription-manager list --consumed
    +-------------------------------------------+
       Consumed Subscriptions
    +-------------------------------------------+
    Subscription Name:	Awesome OS with unlimited virtual guests
    Provides: 		Awesome OS Server Bits
    SKU: 			awesomeos-virt-unlimited
    Contract: 		0
    Account: 		######### Your account number #####
    Serial: 		######### Your serial number ######
    Pool ID: 		XYZ123
    Provides Management: 	No
    Active: 		True
    Quantity Used: 		1
    Service Level:
    Service Type:
    Status Details:		Subscription is current
    Subscription Type:
    Starts: 		01/01/2015
    Ends: 			12/31/2015
    System Type: 		Virtual
    
    ???
    The ID for the subscription to attach to the system is displayed here. You will need this ID if you need to attach the subscription manually.
    ???
    Indicates if your subscription is current. If your subscription is not current, an error message appears. One example is Guest has not been reported on any host and is using a temporary unmapped guest subscription. In this case the guest needs to be subscribed. In other cases, use the information as indicated in 第 10.5.2 节 “我有订阅状态错误,我有什么作用?”.
  5. 注册其他客户端

    当您在 hypervisor 中安装新客户机虚拟机时,您必须注册新虚拟机并使用附加到虚拟机监控程序的订阅,方法是在客户机虚拟机中运行以下命令:
    # subscription-manager register
    # subscription-manager attach --auto
    # subscription-manager list --consumed

10.1.1. 配置 virt-who

virt-who 服务使用以下文件进行配置:
  • /etc/virt-who.conf - 包含常规配置信息,包括检查连接的虚拟机监控程序的间隔。
  • /etc/virt-who.d/hypervisor_name.conf - 包含特定管理程序的配置信息。
提供了一个基于 web 的向导来生成虚拟机监控程序配置文件和 virt-who.conf 所需的代码片段。要运行向导,请浏览客户门户上的 Red Hat Virtualization Agent(virt-who)Configuration Helper
在向导的第二页面中,选择以下选项:
  • 您的 virt-who 报告在哪里?订阅资产管理器
  • 管理程序类型:libvirt
按照向导完成配置。如果正确执行配置,则 virt-who 将自动为指定管理程序上的现有和将来的客户机提供所选订阅。
有关虚拟机监控程序配置文件的详情,请查看 virt-who-config man page。

10.2. 注册新客户机虚拟机

如果需要在已经注册并运行的主机上创建新的 guest 虚拟机,则必须运行 virt-who 服务。这样可保证 virt-who 服务将 guest 映射到管理程序,以便系统正确注册为虚拟系统。要注册虚拟机,请输入以下命令:
[root@virt-server ~]# subscription-manager register --username=admin --password=secret --auto-attach

10.3. 删除客户机虚拟机条目

如果客户机虚拟机正在运行,取消注册系统,在客户机上以 root 用户身份在终端窗口中运行以下命令:
[root@virt-guest ~]# subscription-manager unregister
但是,如果删除了系统,则虚拟服务无法判断是否删除或暂停该服务。在这种情况下,您必须使用以下步骤从服务器端手动删除系统:
  1. 登录到 Subscription Manager

    订阅管理器位于 红帽客户门户网站 中。点击屏幕顶部的登录图标,使用您的用户名和密码登录到客户门户网站。
  2. 点订阅标签页

    Subscriptions 选项卡。
  3. 点系统链接

    向下滚动页面,再单击 Systems 链接。
  4. 删除系统

    要删除系统配置文件,请在表中找到指定系统的配置文件,选中其名称旁边的复选框,然后单击 Delete

10.4. 手动安装 virt-who

本节将介绍如何手动附加由管理程序提供的订阅。

过程 10.2. 如何手动附加订阅

  1. 列出订阅信息并查找池 ID

    首先,您需要列出虚拟类型的可用订阅。使用以下命令:
    [root@server1 ~]# subscription-manager list --avail --match-installed | grep 'Virtual' -B12
    Subscription Name: Red Hat Enterprise Linux ES (Basic for Virtualization)
    Provides:          Red Hat Beta
                       Oracle Java (for RHEL Server)
                       Red Hat Enterprise Linux Server
    SKU:               -------
    Pool ID:           XYZ123
    Available:         40
    Suggested:         1
    Service Level:     Basic
    Service Type:      L1-L3
    Multi-Entitlement: No
    Ends:              01/02/2017
    System Type:       Virtual
    
    请注意显示的池 ID。在下一步中复制此 ID。
  2. 使用池 ID 附加订阅

    使用您在上一步中复制的池 ID 运行 attach 命令。将池 ID XYZ123 替换为您检索到的池 ID。使用以下命令:
    [root@server1 ~]# subscription-manager attach --pool=XYZ123
    
    Successfully attached a subscription for: Red Hat Enterprise Linux ES (Basic for Virtualization)
    

10.5. 对 virt-who 进行故障排除

10.5.1. 为什么管理程序状态红色?

场景:在服务器端,您将在没有订阅的系统管理程序上部署客户机。之后 24 小时,管理程序将其状态显示为红色。要纠正这种情况,您必须获得该管理程序的订阅。或者,通过订阅将 guest 永久迁移到 hypervisor。

10.5.2. 我有订阅状态错误,我有什么作用?

场景:显示以下出错信息:
  • 系统没有正确订阅
  • Status unknown
  • 通过 virt-who(主机/虚拟机映射)将客户机绑定到管理程序.
要查找错误的原因,请打开名为 rhsm.log 的 virt-who 日志文件,该文件位于 /var/log/rhsm/ 目录中。

第 11 章 使用 QEMU 客户机代理和 SPICE 代理增强虚拟化

可以部署 Red Hat Enterprise Linux 中的代理,如 QEMU 客户机代理和 SPICE 代理,以帮助虚拟化工具在您的系统中运行更加最佳。本章介绍了这些代理。
注意
要进一步优化和调整主机和客户机性能,请参阅 Red Hat Enterprise Linux 7 虚拟化调整和优化指南

11.1. QEMU 客户机代理

QEMU 客户机代理在客户机中运行,并允许主机使用 libvirt 向客户机操作系统发出命令,帮助有 freezing 和 thawing 文件系统等功能。然后,客户端操作系统会异步响应这些命令。在 Red Hat Enterprise Linux 7 中,QEMU 客户机代理软件包 qemu-guest-agent 默认安装。
这部分论述了客户端代理可用的 libvirt 命令和选项。
重要
请注意,只有在受信任的客户机运行时,才安全地依赖 QEMU 客户机代理。不受信任的访客可能会恶意忽略或滥用客户机代理协议,虽然存在内置保护机制以防止对主机上的服务攻击进行拒绝,主机需要客户合作才能正常运行。
请注意,QEMU 客户机代理可用于在客户机运行时启用和禁用虚拟 CPU(vCPU),从而在不使用热插拔和热拔功能的情况下调整 vCPU 数量。如需更多信息,请参阅 第 20.36.6 节 “配置虚拟 CPU 数”

11.1.1. 设置 QEMU 客户机代理和主机之间的通信

主机机器通过主机和客户机机器之间的 VirtIO 串行连接与 QEMU 客户机代理通信。VirtIO 串行通道通过字符设备驱动程序(通常是 Unix 套接字)连接到主机,客户机则侦听此串行通道。
注意
qemu-guest-agent 不会检测主机是否侦听 VirtIO 串行频道。但是,由于此频道的当前用途是侦听主机到客户机事件,因此通过写入没有监听器的频道来出现问题的客户机虚拟机的概率非常低。另外,qemu-guest-agent 协议包含同步标记,它允许主机物理机器在发出命令时强制客户端虚拟机同步,并且 libvirt 已使用这些标记,因此客户机虚拟机能够安全地丢弃任何早期待处理的未发响应。
11.1.1.1. 在 Linux 客户机上配置 QEMU 客户机代理
可在正在运行或关闭虚拟机上配置 QEMU 客户机代理。如果在正在运行的虚拟客户机中配置了,客户机将立即开始使用客户机代理。如果 guest 关闭,则将在下次引导时启用 QEMU 客户机代理。
virshvirt-manager 可用于配置客户机和 QEMU 客户机代理之间的通信。下面的说明描述了如何在 Linux 客户端中配置 QEMU 客户机代理。

过程 11.1. 在关闭 Linux 客户机中使用 virsh 设置客户机代理与主机之间的通信

  1. 关闭虚拟机

    在配置 QEMU 客户机代理前,请确定虚拟机(本例中为 rhel 7)被关闭:
    # virsh shutdown rhel7 
  2. 在客户机 XML 配置中添加 QEMU 客户机代理频道

    编辑客户机的 XML 文件以添加 QEMU 客户机代理详情:
    # virsh edit rhel7
    在客户机的 XML 文件中添加以下内容并保存更改:
    <channel type='unix'>
       <target type='virtio' name='org.qemu.guest_agent.0'/>
    </channel>
  3. 启动虚拟机

    # virsh start rhel7
  4. 在客户端中安装 QEMU 客户机代理

    安装 QEMU 客户机代理(如果尚未在客户机虚拟机中安装):
    # yum install qemu-guest-agent
  5. 在客户机中启动 QEMU 客户机代理

    在客户机中启动 QEMU 客户机代理服务:
    # systemctl start qemu-guest-agent
另外,可以使用以下步骤在运行的客户机中配置 QEMU 客户机代理:

过程 11.2. 在正在运行的 Linux 客户机中设置客户机代理和主机之间的通信

  1. 为 QEMU 客户机代理创建 XML 文件

    # cat agent.xml
    <channel type='unix'>
       <target type='virtio' name='org.qemu.guest_agent.0'/>
    </channel>
  2. 将 QEMU 客户机代理附加到虚拟机

    使用以下命令,将 QEMU 客户机代理附加到正在运行的虚拟机(本例中为 rhel7 ):
    # virsh attach-device rhel7 agent.xml
  3. 在客户端中安装 QEMU 客户机代理

    安装 QEMU 客户机代理(如果尚未在客户机虚拟机中安装):
    # yum install qemu-guest-agent
  4. 在客户机中启动 QEMU 客户机代理

    在客户机中启动 QEMU 客户机代理服务:
    # systemctl start qemu-guest-agent

过程 11.3. 使用 virt-manager在 QEMU 客户机代理和主机间设置通信

  1. 关闭虚拟机

    在配置 QEMU 客户机代理前,确保虚拟机已关闭。
    要关闭虚拟机,请从 Virtual Machine Manager 中的虚拟机列表中选择,然后单击菜单栏中的 light 开关图标。
  2. 将 QEMU 客户机代理频道添加到客户端

    单击 guest 窗口顶部的 lightbulb 图标,打开虚拟机的硬件详细信息。
    点击 Add Hardware 按钮,打开 Add New Virtual Hardware 窗口,然后选择 Channel
    Name 下拉列表中选择 QEMU 客户机代理并点 Finish:

    图 11.1. 选择 QEMU 客户机代理频道设备

    选择 QEMU 客户机代理频道设备
  3. 启动虚拟机

    要启动虚拟机,请从 Virtual Machine Manager 中的虚拟机列表中选择,然后点击
  4. 在客户端中安装 QEMU 客户机代理

    使用 virt-manager 打开客户端,如果尚未在客户机虚拟机中安装 QEMU 客户机代理:
    # yum install qemu-guest-agent
  5. 在客户机中启动 QEMU 客户机代理

    在客户机中启动 QEMU 客户机代理服务:
    # systemctl start qemu-guest-agent
QEMU 客户机代理现在在 rhel7 虚拟机上配置。

11.2. 使用带有 libvirt 的 QEMU 客户机代理

安装 QEMU 客户机代理可让各种 libvirt 命令变得更加强大。客户机代理增强了以下 virsh 命令:
  • virsh shutdown --mode=agent - 此关机方法比 virsh shutdown --mode=acpi 可靠,因为 QEMU 客户机代理使用的 virsh shutdown 可以保证以干净状态关闭合作虚拟机。如果代理不存在,libvirt 必须依赖于注入 ACPI 关闭事件,但有些客户机会忽略该事件,因此不会关闭。
    可与 virsh reboot 相同的语法一起使用。
  • virsh snapshot-create --quiesce - 允许客户机在创建快照之前将其 I/O 清空到稳定状态,这允许使用快照而无需执行 fsck 或丢失部分数据库事务。通过提供客户机合作,客户机代理可以实现高级别的磁盘内容稳定性。
  • virsh domfsfreezevirsh domfsthaw - 隔离 guest 文件系统.
  • virsh domfstrim - 结构 guest 以修剪其文件系统。
  • virsh domtime - Queries 或 set the guest 的时钟.
  • virsh setvcpus --guest - Instructs the guest 使 CPU 离线。
  • virsh domifaddr --source 代理 - 通过客户机代理查询客户机操作系统的 IP 地址。
  • virsh domfsinfo - 显示正在运行的客户端中挂载文件系统的列表。
  • virsh set-user-password - 在 guest 中设置用户帐户的密码。

11.2.1. 创建客户机磁盘备份

libvirt 可以与 qemu-guest-agent 通信,以确保客户机虚拟机文件系统的快照在内部一致,并可根据需求使用。虚拟客户机系统管理员可编写和安装特定于应用程序的 freeze/thaw hook 脚本。在释放文件系统前,qemu-guest-agent 调用主 hook 脚本(包括在 qemu-guest-agent 软件包中)。freezing 进程临时取消激活所有客户机虚拟机应用程序。
快照过程由以下步骤组成:
  • 文件系统应用/数据库将工作缓冲区清空到虚拟磁盘,并停止接受客户端连接
  • 应用程序将其数据文件变为一致的状态
  • 主 hook 脚本返回
  • qemu-guest-agent 冻结文件系统,管理堆栈会拍摄快照
  • 已确认快照
  • 文件系统功能恢复
Thawing 以相反的顺序发生。
要创建客户端文件系统的快照,请运行 virsh snapshot-create --quiesce --disk-only 命令(此外,运行 virsh snapshot-create-as guest_name --quiesce --disk-only,在 第 20.39.2 节 “为当前客户机虚拟机创建快照”中进一步介绍)。
注意
应用程序特定的 hook 脚本可能需要各种 SELinux 权限才能正确运行,就像需要连接到套接字才能与数据库通信时所执行的操作。通常,应该针对这些目的开发并安装本地 SELinux 策略。访问文件系统节点应该开箱即用,在标记为 /etc/qemu-ga/fsfreeze-hook.d/ 的表行中列出的 restorecon -FvvR 命令后。表 11.1 “QEMU 客户机代理软件包内容”
qemu-guest-agent 二进制 RPM 包括以下文件:
表 11.1. QEMU 客户机代理软件包内容
文件名 描述
/usr/lib/systemd/system/qemu-guest-agent.service 用于 QEMU 客户机代理的服务控制脚本(启动/停止)。
/etc/sysconfig/qemu-ga QEMU 客户机代理的配置文件,因为它由 /usr/lib/systemd/system/qemu-guest-agent.service 控制脚本读取。设置记录在 文件中,shell 脚本注释。
/usr/bin/qemu-ga QEMU 客户机代理二进制文件。
/etc/qemu-ga hook 脚本的根目录。
/etc/qemu-ga/fsfreeze-hook 主 hook 脚本。这里不需要修改。
/etc/qemu-ga/fsfreeze-hook.d 单个、特定于应用程序的 hook 脚本的目录。客户机系统管理员应手动将 hook 脚本复制到这个目录中,确保它们的正确文件模式位,然后在该目录中运行 restorecon -FvvR
/usr/share/qemu-kvm/qemu-ga/ 带有示例脚本的目录(例如,仅用于使用)。此处包含的脚本不会执行。
主 hook 脚本 /etc/qemu-ga/fsfreeze-hook 可记录自己的消息,以及特定于应用程序的标准输出和错误消息: /var/log/qemu-ga/fsfreeze-hook.log。如需更多信息,请参阅 libvirt 上游网站

11.3. SPICE 代理

SPICE 代理有助于通过帮助将客户机操作系统与 SPICE 客户端集成,从而更加顺利地运行图形应用程序。
例如,当在 virt-manager 中重新定义窗口大小时,SPICE 代理允许自动 X 会话解析调整客户端解析。SPICE 代理也支持在主机和客户机之间进行复制和粘贴,并防止鼠标光标放大。
有关 SPICE 代理功能的系统特定信息,请参阅 spice-vdagent 软件包的 README 文件。

11.3.1. 设置 SPICE 代理和主机之间的通信

可以在正在运行或关闭虚拟机上配置 SPICE 代理。如果在正在运行的虚拟客户机中配置了,客户机将立即开始使用客户机代理。如果 guest 关闭,则将在下次引导时启用 SPICE 代理。
virshvirt-manager 可用于配置客户机和 SPICE 代理之间的通信。下面的说明描述了如何在 Linux 虚拟机上配置 SPICE 代理。

过程 11.4. 在 Linux 客户机中使用 virsh 设置客户机代理与主机之间的通信

  1. 关闭虚拟机

    在配置 SPICE 代理前,请确定虚拟机(本例中为 rhel 7)被关闭:
    # virsh shutdown rhel7 
  2. 在客户机 XML 配置中添加 SPICE 代理频道

    编辑客户端的 XML 文件以添加 SPICE 代理详情:
    # virsh edit rhel7
    在客户机的 XML 文件中添加以下内容并保存更改:
    <channel type='spicevmc'>
       <target type='virtio' name='com.redhat.spice.0'/>
    </channel>
  3. 启动虚拟机

    # virsh start rhel7
  4. 在客户端中安装 SPICE 代理

    如果尚未在客户机虚拟机中安装 SPICE 代理:
    # yum install spice-vdagent
  5. 在客户机中启动 SPICE 代理

    在客户机中启动 SPICE 代理服务:
    # systemctl start spice-vdagent
或者,可使用以下步骤在运行的客户机中配置 SPICE 代理:

过程 11.5. 在正在运行的 Linux 客户机中设置 SPICE 代理与主机之间的通信

  1. 为 SPICE 代理创建 XML 文件

    # cat agent.xml
    <channel type='spicevmc'>
       <target type='virtio' name='com.redhat.spice.0'/>
    </channel>
  2. 将 SPICE 代理附加到虚拟机

    用这个命令将 SPICE 代理附加到正在运行的虚拟机(本例中为 rhel7 ):
    # virsh attach-device rhel7 agent.xml
  3. 在客户端中安装 SPICE 代理

    如果尚未在客户机虚拟机中安装 SPICE 代理:
    # yum install spice-vdagent
  4. 在客户机中启动 SPICE 代理

    在客户机中启动 SPICE 代理服务:
    # systemctl start spice-vdagent

过程 11.6. 使用 virt-manager在 SPICE 代理和主机间设置通信

  1. 关闭虚拟机

    在配置 SPICE 代理前,确保虚拟机已关闭。
    要关闭虚拟机,请从 Virtual Machine Manager 中的虚拟机列表中选择,然后单击菜单栏中的 light 开关图标。
  2. 将 SPICE 代理频道添加到客户端

    单击 guest 窗口顶部的 lightbulb 图标,打开虚拟机的硬件详细信息。
    点击 Add Hardware 按钮,打开 Add New Virtual Hardware 窗口,然后选择 Channel
    名称 下拉列表中选择 SPICE 代理,编辑频道地址,然后点 Finish:

    图 11.2. 选择 SPICE 代理频道设备

    选择 SPICE 代理频道设备
  3. 启动虚拟机

    要启动虚拟机,请从 Virtual Machine Manager 中的虚拟机列表中选择,然后点击
  4. 在客户端中安装 SPICE 代理

    使用 virt-manager 打开客户机,并在客户机虚拟机上尚未安装 SPICE 代理:
    # yum install spice-vdagent
  5. 在客户机中启动 SPICE 代理

    在客户机中启动 SPICE 代理服务:
    # systemctl start spice-vdagent
SPICE 代理现在已在 rhel7 虚拟机上配置。

第 12 章 嵌套虚拟化

12.1. 概述

从 Red Hat Enterprise Linux 7.5 开始,嵌套虚拟化 是 KVM 客户机虚拟机的技术预览。https://access.redhat.com/support/offerings/techpreview/借助此功能,在物理主机( 级别0 或 L0)上运行的客户机虚拟机(也称为级别 1L1)可以充当虚拟机监控程序,然后创建自己的 guest 虚拟机(L2)
嵌套虚拟化在各种场景中很有用,例如在受限环境中调试虚拟机监控程序,并在有限的物理资源上测试大型虚拟部署。但请注意,在生产环境中不支持嵌套虚拟化,主要用于开发和测试。
嵌套虚拟化依赖于主机虚拟化扩展来实现功能,它不应该使用 QEMU Tiny Code Generator(TCG)模拟(在 Red Hat Enterprise Linux 不支持)虚拟环境中运行客户机。

12.2. 设置

按照以下步骤启用、配置和启动使用嵌套虚拟化:
  1. 启用 :此功能默认为禁用。要启用它,请在 L0 主机物理机上使用以下步骤。
    对于 Intel:
    1. 检查主机系统中是否有嵌套虚拟化可用。
      $ cat /sys/module/kvm_intel/parameters/nested
      如果这个命令返回 Y1,则代表启用了该功能。
      如果命令返回 0N,请使用 iiiii 的步骤。
    2. 卸载 kvm_intel 模块:
      # modprobe -r kvm_intel
    3. 激活嵌套功能:
      # modprobe kvm_intel nested=1
    4. 现在,嵌套功能只有在下一次重启 L0 主机时才会启用。要永久启用它,请在 /etc/modprobe.d/kvm.conf 文件中添加以下行:
      options kvm_intel nested=1
    AMD:
    1. 检查系统中是否有嵌套虚拟化可用:
      $ cat /sys/module/kvm_amd/parameters/nested
      如果这个命令返回 Y1,则代表启用了该功能。
      如果命令返回 0N,请使用 iiiii 的步骤。
    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
  2. 使用以下方法之一为嵌套虚拟化配置 L1 虚拟机:
    virt-manager
    1. 打开所需 guest 的 GUI 并单击 Show Virtual Hardware Details 图标。
    2. 选择 Processor 菜单,并在 Configuration 部分中键入 host-passthrough in the Model 字段(不要使用下拉菜单),然后单击" 应用 "。
    域 XML
    在客户机的域 XML 文件中添加以下行:
    <cpu mode='host-passthrough'/>
    如果客户机的 XML 配置文件已经包含 <cpu> 元素,重写它。
  3. 要开始使用 嵌套虚拟化,请在 L1 客户端中安装 L2 客户机。要做到这一点,请按照安装 L1 客户端时相同的步骤 - 请参阅 第 3 章 创建虚拟机 了解更多信息。

12.3. 限制和限制

  • 强烈建议在 L0 主机和 L1 客户端中运行 Red Hat Enterprise Linux 7.2 或更高版本。L2 虚拟机可以包含红帽支持的任何 guest 系统。
  • 不支持迁移 L1 或 L2 客户机。
  • 不支持将 L2 虚拟机用作虚拟机监控程序,并创建 L3 虚拟机。
  • L1 管理程序不能使用主机上的全部功能。例如,L1 管理程序无法使用 IOMMU/VT-d 或 APICv。
  • 要使用嵌套虚拟化,主机 CPU 必须具有所需的功能标记。要确定 L0 和 L1 管理程序是否已正确设置,请在 L0 和 L1 上使用 cat /proc/cpuinfo 命令,并确保在两个 hypervisor 上为相应的 CPU 列出了以下标记:
    • 对于 Intel - vmx (Hardware Virtualization)和 ept (扩展页表)
    • AMD - svm (等同于 vmx)和 npt (等同于 ept)

部分 II. 管理

这部分涵盖了与虚拟机管理相关的主题,并解释了虚拟化功能(如虚拟网络、存储和 PCI 分配)的工作方式。这部分还提供有关使用 qemu-imgvirt-managervirsh 工具管理的设备和客户机虚拟机管理的说明。

第 13 章 为虚拟机管理存储

本章提供有关虚拟机存储的信息。虚拟存储从分配给虚拟机连接的物理存储抽象化。存储使用半虚拟化或模拟块设备驱动程序附加到虚拟机。

13.1. 存储概念

存储池是 客户端虚拟机供客户机使用而设置的存储数量。存储池被分成一个 存储卷。每个存储卷都以客户机总线上的块设备形式分配给客户机虚拟机。
存储池和卷使用 libvirt 管理。使用 libvirt 的远程协议,可以管理客户机虚拟机生命周期的所有方面,以及客户机虚拟机所需的资源的配置。这些操作可以在远程主机上执行。因此,使用 libvirt 等管理应用程序可以允许用户执行为客户机虚拟机配置主机物理机器所需的所有任务。这包括分配资源、运行客户机虚拟机、将其关闭和取消分配资源,而无需 shell 访问或任何其他控制频道。
libvirt API 可用于查询存储池中的卷列表,或者获取存储池中容量、分配和可用存储的信息。可能会查询存储池中的存储卷以获取分配和容量等信息,稀疏卷可能会有所不同。
注意
有关稀疏卷的更多信息,请参阅 虚拟化入门指南
对于支持它的存储池,可以使用 libvirt API 来创建、克隆、调整大小和删除存储卷。API 也可用于将数据上传到存储卷,从存储卷下载数据,或者从存储卷擦除数据。
启动存储池后,可以使用存储池名称和存储卷名称而非域 XML 中卷的主机路径,将存储卷分配给客户机。
注意
有关域 XML 的详情,请参考 第 23 章 操作域 XML
存储池可以被停止(销毁)。这会删除数据的抽象,但保持数据不受影响。
例如,使用 mount -t nfs nfs.example.com:/path/to/share /path/to/data 的 NFS 服务器。负责管理存储管理员在虚拟化主机上定义 NFS 存储池,以描述导出的服务器路径和客户端目标路径。这将允许 libvirt 在启动 libvirt 时或者根据需要在 libvirt 运行时自动执行挂载。NFS 服务器导出目录的文件在 NFS 存储池中被列为存储卷。
当存储卷添加到客户端时,管理员不需要为卷添加目标路径。他只需要根据名称添加存储池和存储卷。因此,如果目标客户端路径改变,它不会影响虚拟机。
启动存储池时,libvirt 将共享挂载到指定目录中,就像系统管理员登录并执行 nfs.example.com:/path/to/share /vmdata 一样。如果存储池被配置为 autostart,则 libvirt 可确保将 NFS 共享磁盘挂载到 libvirt 启动时指定的目录中。
启动存储池后,NFS 共享磁盘中的文件报告为存储卷,且可以使用 libvirt API 查询存储卷的路径。然后可将存储卷的路径复制到客户机虚拟机 XML 定义的部分,该部分描述了客户机虚拟机块设备的源存储。对于 NFS,使用 libvirt API 的应用程序可以在存储池中创建和删除存储卷(NFS 共享中的文件)到池大小的限制(共享的存储容量)。
并非所有存储池类型都支持创建和删除卷。停止存储池(pool-destroy)会撤销启动操作,在这种情况下,卸载 NFS 共享。销毁操作不会修改共享中的数据,即使该命令的名称看似象要删除。详情请查看 man virsh

过程 13.1. 创建并分配存储

此流程提供了对为虚拟机创建和分配存储所需的步骤的高级了解。
  1. 创建存储池

    从可用存储介质创建一个或多个存储池。如需更多信息,请参阅 第 13.2 节 “使用存储池”
  2. 创建存储卷

    从可用存储池创建一个或多个存储卷。如需更多信息,请参阅 第 13.3 节 “使用存储卷”
  3. 为虚拟机分配存储设备。

    将从存储卷中提取的一个或多个存储设备分配给客户机虚拟机。如需更多信息,请参阅 第 13.3.6 节 “在客户机中添加存储设备”

13.2. 使用存储池

这部分提供有关将存储池与虚拟机搭配使用的信息。它提供了 概念的信息,以及使用 virsh 命令和虚拟机管理器 创建配置 和删除 存储池的详细说明。

13.2.1. 存储池概念

存储池是由 libvirt 管理的文件、目录或存储设备,用于为虚拟机提供存储。存储池被分成存储虚拟机镜像或作为额外存储附加到虚拟机的存储卷。多个虚拟机可以共享同一存储池,从而更好地分配存储资源。
存储池可以是本地的也可以基于网络的(共享):
本地存储池
本地存储池直接附加到主机服务器。它们包括本地设备中的本地目录、直接附加磁盘、物理分区以及逻辑卷管理(LVM)卷组。本地存储池对不需要迁移或大量虚拟机的部署非常有用。本地存储池可能不适用于许多生产环境,因为它们无法用于实时迁移。
联网的(共享)存储池
联网的存储池包括使用标准协议通过网络共享的存储设备。当使用 virt-manager 在主机间迁移虚拟机时,需要联网的存储,但在迁移 virsh 时是可选的。
有关迁移虚拟机的更多信息,请参阅 第 15 章 KVM 迁移
以下是 Red Hat Enterprise Linux 支持的存储池类型列表:
  • 基于目录的存储池
  • 基于磁盘的存储池
  • 基于分区的存储池
  • glusterfs 存储池
  • 基于 iSCSI 的存储池
  • 基于 LVM 的存储池
  • 基于 NFS 的存储池
  • 使用 SCSI 设备的基于 vHBA 的存储池
以下是 Red Hat Enterprise Linux 不支持的 libvirt 存储池类型列表:
  • 基于多路径的存储池
  • 基于 RBD 的存储池
  • 基于 Sheepdog 的存储池
  • 基于 Vstorage 的存储池
  • 基于 ZFS 的存储池
注意
一些不受支持的存储池类型会出现在 Virtual Machine Manager 界面中。但是,它们不应被使用。

13.2.2. 创建存储池

这部分介绍了使用 virshVirtual Machine Manager 创建存储池的一般说明。使用 virsh 可让您指定所有参数,而使用虚拟机管理器 提供了创建更简单的存储池的图形方法。
13.2.2.1. 使用 virsh 创建存储池
注意
本节演示了创建基于分区的存储池作为示例。

过程 13.2. 使用 virsh 创建存储池

  1. 阅读建议并确保满足所有先决条件

    对于某些存储池,本指南建议您使用某些实践。另外,某些类型的存储池有一些先决条件。要查看建议和先决条件,如果有,请参阅 第 13.2.3 节 “存储池特定”
  2. 定义存储池

    存储池可以是持久性或临时的。主机系统重启后,持久性存储池会保留下来。临时存储池仅在主机重启前存在。
    执行以下操作之一:
    • 使用 XML 文件定义存储池。
      a.创建包含新设备所需的存储池信息的临时 XML 文件。
      XML 文件必须包含根据存储池类型的特定字段。如需更多信息,请参阅 第 13.2.3 节 “存储池特定”
      下面显示了一个存储池定义 XML 文件示例。在本例中,该文件被保存到 ~/guest_images.xml
      <pool type='fs'>
        <name>guest_images_fs</name>
        <source>
          <device path='/dev/sdc1'/>
        </source>
        <target>
          <path>/guest_images</path>
        </target>
      </pool>
      b.使用 virsh pool-define 命令创建持久性存储池或 virsh pool-create 命令,以创建并启动临时存储池。
      # virsh pool-define ~/guest_images.xml
      Pool defined from guest_images_fs
      
      # virsh pool-create ~/guest_images.xml
      Pool created from guest_images_fs
      c.删除步骤中创建的 XML 文件。
    • 使用 virsh pool-define-as 命令创建持久性存储池或 virsh pool-create-as 命令,以创建临时存储池。
      以下示例从 /guest_images 目录中创建一个永久、基于文件系统的存储池,映射到 /dev/sdc1
      # virsh pool-define-as guest_images_fs fs - - /dev/sdc1 - "/guest_images"
      Pool guest_images_fs defined
      # virsh pool-create-as guest_images_fs fs - - /dev/sdc1 - "/guest_images"
      Pool guest_images_fs created
      注意
      当使用 virsh 接口时,命令中的选项名称是可选的。如果没有使用选项名称,请将横线用于不需要指定的字段。
  3. 验证是否已创建池

    使用 virsh pool-list --all 列出所有现有存储池。
    # virsh pool-list --all
    Name                 State      Autostart
    -----------------------------------------
    default              active     yes
    guest_images_fs      inactive   no
    
  4. 定义存储池目标路径

    使用 virsh pool-build 命令为预格式化的文件系统存储池创建存储池目标路径,初始化存储源设备,并定义数据的格式。然后使用 virsh pool-list 命令,确保列出存储池。
    # 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 ..
    # virsh pool-list --all
    Name                 State      Autostart
    -----------------------------------------
    default              active     yes
    guest_images_fs      inactive   no
    
    注意
    构建目标路径只适用于基于磁盘、基于文件系统以及逻辑存储池。如果 libvirt 检测到源存储设备的数据格式与所选存储池类型的不同,构建将失败,除非指定了 覆盖 选项。
  5. 启动存储池

    使用 virsh pool-start 命令准备源设备以供使用。
    执行的操作取决于存储池类型。例如,对于基于文件系统的存储池,virsh pool-start 命令会挂载文件系统。对于基于 LVM 的存储池,virsh pool-start 命令可激活卷组 usng the vgchange 命令。
    然后,使用 virsh pool-list 命令来确保 存储池处于活动状态。
    # virsh pool-start guest_images_fs
    Pool guest_images_fs started
    # virsh pool-list --all
    Name                 State      Autostart
    -----------------------------------------
    default              active     yes
    guest_images_fs      active     no
    
    注意
    virsh pool-start 命令只适用于持久性存储池。临时存储池创建时会自动启动。
  6. 启用自动启动(可选)

    默认情况下,使用 virsh 定义的存储池不会被设置为在每次 libvirtd 启动时自动启动。您可以使用 virsh pool-autostart 命令将存储池配置为自动启动。
    # virsh pool-autostart guest_images_fs
    Pool guest_images_fs marked as autostarted
    
    # virsh pool-list --all
    Name                 State      Autostart
    -----------------------------------------
    default              active     yes
    guest_images_fs      active     yes
    
    现在,每次 libvirtd 启动时都会自动启动存储池。
  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
    
13.2.2.2. 使用虚拟机管理器创建存储池
注意
本节演示了创建基于磁盘的存储池作为示例。

过程 13.3. 使用虚拟机管理器创建存储池

  1. 准备创建存储池的中

    这将因不同类型的存储池而异。详情请查看 第 13.2.3 节 “存储池特定”
    在本例中,您可能需要使用 GUID 分区表 重新标记磁盘。
  2. 打开存储设置

    1. Virtual Machine Manager 中,选择您要配置的主机连接。
      打开 Edit 菜单,再选择 Connection Details
    2. Connection Details 窗口中的 Storage 选项卡。

      图 13.1. Storage 标签页

      Storage 标签页
  3. 创建新存储池

    注意
    使用 虚拟机管理器,您只能创建持久性存储池。临时存储池只能使用 virsh 创建。
    1. 添加新存储池(第 1 部分)

      点击窗口底部的 按钮。此时会出现 Add a New Storage Pool 向导。
      输入存储池的 Name。这个示例使用名称 guest_images_fs
      Type 下拉列表中,选择要创建的存储池类型。这个示例使用 fs:预先填充块设备

      图 13.2. 存储池名称和类型

      存储池名称和类型
      单击 "转发 "按钮继续。
    2. 添加新池(第 2 部分)

      图 13.3. 存储池路径

      存储池路径
      使用相关参数配置存储池。有关每种存储池的参数的详情,请参考 第 13.2.3 节 “存储池特定”
      对于某些类型的存储池,对话框中会出现一个 Build Pool 复选框。如果要从存储构建存储池,请选中 Build Pool 复选框。
      验证详细信息,然后单击 Finish 按钮以创建存储池。

13.2.3. 存储池特定

本节提供了与每种类型的存储池相关的信息,包括先决条件、参数和其他信息。它包括以下主题:
13.2.3.1. 基于目录的存储池
参数
下表提供了 XML 文件、virsh pool-define-as 命令和 Virtual Machine Manager 应用程序所需的参数列表,用于创建基于目录的存储池。
表 13.1. 基于目录的存储池参数
描述XMLpool-define-as虚拟机管理器
存储池的类型 <pool type='dir'> [type] 目录 dir:文件系统目录
存储池的名称 <name>name</name> [name] name Name
指定目标的路径。这将是用于存储池的路径。

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

目标 path_to_pool 目标路径
如果您使用 virsh 创建存储池,请通过 验证池是否已创建来继续
示例
以下是基于 /guest_images 目录的存储池的 XML 文件示例:
<pool type='dir'>
  <name>dirpool</name>
  <target>
    <path>/guest_images</path>
  </target>
</pool>
以下是基于 /guest_images 目录创建存储池的命令示例:
# virsh pool-define-as dirpool dir --target "/guest_images"
Pool FS_directory defined
下图显示了 虚拟机管理器 Add a New Storage Pool 对话框的示例,它用于创建基于 /guest_images 目录的存储池:

图 13.4. 添加新基于目录的存储池示例

添加新基于目录的存储池示例
13.2.3.2. 基于磁盘的存储池
建议
在创建基于磁盘的存储池前请注意以下几点:
  • 根据所使用的 libvirt 版本,将磁盘专用于存储池,可以重新格式化并擦除当前存储在磁盘设备上的所有数据。强烈建议您在创建存储池前备份存储设备中的数据。
  • 不应向 guest 授予对整个磁盘或块设备(例如 /dev/sdb)的写入权限。使用分区(例如 /dev/sdb1)或 LVM 卷。
    如果您将整个块设备传递给客户端,客户机可能会对它进行分区,或者创建自己的 LVM 组。这可能导致主机物理机器检测到这些分区或 LVM 组并导致错误。
先决条件
注意
只有在您不运行 virsh pool-build 命令时才需要本节中的步骤。
在主机磁盘上可创建基于磁盘的存储池前,必须使用 GUID 分区表 (GPT)磁盘标签重新标记磁盘。GPT 磁盘标签允许在每个设备上创建最多 128 个分区。
# parted /dev/sdb
GNU Parted 2.1
Using /dev/sdb
Welcome to GNU Parted! Type 'help' to view a list of commands.
(parted) mklabel
New disk label type? gpt
(parted) quit
Information: You may need to update /etc/fstab.
#
重新标记磁盘后,继续使用 定义存储池来创建存储池
参数
下表提供了 XML 文件、virsh pool-define-as 命令和 Virtual Machine Manager 应用程序所需的参数列表,用于创建基于磁盘的存储池。
表 13.2. 基于磁盘的存储池参数
描述XMLpool-define-as虚拟机管理器
存储池的类型 <pool type='disk'> [type] 磁盘 磁盘:物理磁盘设备
存储池的名称 <name>name</name> [name] name Name
指定存储设备的路径。例如: /dev/sdb

<source>
  <device path=/dev/sdb/>
<source>

source-dev path_to_disk 源路径
指定目标的路径。这将是用于存储池的路径。

<target>
  <path>/path_to_pool</path>
</target>

目标 path_to_pool 目标路径
如果您使用 virsh 创建存储池,请继续 定义存储池
示例
以下是基于磁盘存储池的 XML 文件示例:
<pool type='disk'>
  <name>phy_disk</name>
  <source>
    <device path='/dev/sdb'/>
    <format type='gpt'/>
  </source>
  <target>
    <path>/dev</path>
  </target>
</pool>
以下是创建基于磁盘存储池的命令示例:
# virsh pool-define-as phy_disk disk --source-format=gpt --source-dev=/dev/sdb --target /dev
Pool phy_disk defined
下图显示了虚拟机 XML 配置虚拟机管理器 来添加 New Storage Pool 对话框的例子,用于创建基于磁盘的存储池:

图 13.5. 添加新的基于磁盘的存储池示例

添加新的基于磁盘的存储池示例
13.2.3.3. 基于文件系统的存储池
建议
不要使用本节中的步骤分配整个磁盘作为存储池(如 /dev/sdb)。不应为 guest 授予对整个磁盘或块设备的写入权限。这个方法只应该被用来将分区(例如 /dev/sdb1)分配给存储池。
先决条件
注意
只有在您不运行 virsh pool-build 命令时才需要。
要从分区创建存储池,请将文件系统挂载到 ext4。
# mkfs.ext4 /dev/sdc1
格式化文件系统后,继续使用 定义存储池来继续创建存储池
参数
下表提供了 XML 文件、virsh pool-define-as 命令和 Virtual Machine Manager 应用程序所需的参数列表,用于从分区创建基于文件系统的存储池。
表 13.3. 基于文件系统的存储池参数
描述XMLpool-define-as虚拟机管理器
存储池的类型 <pool type='fs'> [type] fs fs:预先填充块设备
存储池的名称 <name>name</name> [name] name Name
指定分区的路径。例如: /dev/sdc1

<source>
  <device path='source_path' />

[source] path_to_partition 源路径
文件系统类型,例如 ext4

  <format type='fs_type' />
</source>

[source 格式] FS-format 不适用
指定目标的路径。这将是用于存储池的路径。

<target>
  <path>/path_to_pool</path>
</target>

[target] path_to_pool 目标路径
如果您使用 virsh 创建存储池,请继续 验证存储池是否已创建
示例
以下是基于文件系统的存储池的 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>
以下是创建基于分区的存储池的命令示例:
# virsh pool-define-as guest_images_fs fs --source-dev /dev/sdc1 --target /guest_images
Pool guest_images_fs defined
下图显示了虚拟机 XML 配置虚拟机管理器 来添加 New Storage Pool 对话框的例子,用于创建基于文件系统的存储池:

图 13.6. 添加一个基于文件系统的存储池示例

添加一个基于文件系统的存储池示例
13.2.3.4. 基于 glusterfs 的存储池
建议
GlusterFS 是一个用户空间文件系统,在用户空间(FUSE)中使用文件系统。
先决条件
在在主机上创建基于 GlusterFS 的存储池前,必须准备好 Gluster 服务器。

过程 13.4. 准备 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
    
确保安装并启用所需的软件包后,继续创建存储池,继续创建存储池,并 定义了存储池
参数
下表提供了 XML 文件、virsh pool-define-as 命令和 Virtual Machine Manager 应用程序所需的参数列表,用于创建基于 GlusterFS 的存储池。
表 13.4. glusterfs 基于存储池参数
描述XMLpool-define-as虚拟机管理器
存储池的类型 <pool type='gluster'> [type] gluster Gluster:Gluster Filesystem
存储池的名称 <name>name</name> [name] name Name
Gluster 服务器的主机名或 IP 地址

<source>
  <hostname='hostname' />

source-host hostname 主机名
Gluster 服务器的名称   <name='Gluster-name' /> source-name Gluster-name 源名称
用于存储池的 Gluster 服务器上的路径

  <dir path='Gluster-path' />
</source>

source-path Gluster-path 源路径
如果您使用 virsh 创建存储池,请继续 验证存储池是否已创建
示例
以下是基于 GlusterFS 的存储池的 XML 文件示例:
<pool type='gluster'>
  <name>Gluster_pool</name>
  <source>
    <host name='111.222.111.222'/>
    <dir path='/'/>
    <name>gluster-vol1</name>
  </source>
</pool>
以下是创建基于 GlusterFS 的存储池的命令示例:
# pool-define-as --name Gluster_pool --type gluster --source-host 111.222.111.222 --source-name gluster-vol1 --source-path /
Pool Gluster_pool defined
下图显示了虚拟机 XML 配置虚拟机管理器 添加 New Storage Pool 对话框的例子,用于创建基于 GlusterFS 的存储池:

图 13.7. 添加新的基于 GlusterFS 的存储池示例

添加新的基于 GlusterFS 的存储池示例
13.2.3.5. 基于 iSCSI 的存储池
建议
Internet Small Computer System Interface(iSCSI)是用于共享存储设备的网络协议。iSCSI 通过 IP 层使用 SCSI 指令连接到目标(存储服务器)。
使用基于 iSCSI 的设备存储客户机虚拟机允许更灵活的存储选项,比如将 iSCSI 用作块存储设备。iSCSI 设备使用 Linux-IO(LIO)目标。这是 Linux 的多协议 SCSI 目标。除了 iSCSI 外,LIO 还支持通过以太网光纤通道和光纤通道(FCoE)。
先决条件
在创建基于 iSCSI 的存储池前,必须创建 iSCSI 目标。iSCSI 目标使用 targetcli 软件包创建,该软件包提供了用于创建软件支持的 iSCSI 目标的命令集。

过程 13.5. 创建 iSCSI 目标

  1. 安装 targetcli 软件包

    # yum install targetcli
  2. 启动 targetcli 命令集

    # targetcli
  3. 创建存储对象

    使用存储池创建三个存储对象。
    1. 创建块存储对象
      1. 导航到 /backstores/block 目录。
      2. 运行 create 命令。
        # create [block-name][filepath]
        例如:
        # create block1 dev=/dev/sdb1
    2. 创建 fileio 对象
      1. 进入 /fileio 目录。
      2. 运行 create 命令。
        # create [fileio-name][image-name] [image-size]
        例如:
        # create fileio1 /foo.img 50M
    3. 创建 ramdisk 对象
      1. 导航到 /ramdisk 目录。
      2. 运行 create 命令。
        # create [ramdisk-name] [ramdisk-size]
        例如:
        # create ramdisk1 1M
    4. 记录这一步中创建的磁盘名称。稍后将使用它们。
  4. 创建 iSCSI 目标

    1. 导航到 /iscsi 目录。
    2. 以两种方式之一创建目标:
      • 运行 create 命令(不带参数)。
        iSCSI 限定名称( IQN)会自动生成。
      • 运行 create 命令并指定 IQN 和服务器。例如:
        # create iqn.2010-05.com.example.server1:iscsirhel7guest
  5. 定义门户 IP 地址

    要通过 iSCSI 导出块存储,必须先配置门户、LUN 和 访问控制列表 ACL。
    该门户包括目标监控器的 IP 地址和 TCP,以及它连接到的启动器。iSCSI 使用端口 3260。默认配置了这个端口。
    连接到端口 3260:
    1. 进入 /tpg 目录。
    2. 运行以下命令:
      # portals/ create
      此命令提供侦听端口 3260 的所有可用 IP 地址。
      如果只使用单个 IP 地址侦听端口 3260,请将 IP 地址添加到 命令的末尾。例如:
      # portals/ create 143.22.16.33
  6. 配置 LUN,并将存储对象分配到光纤

    此步骤使用创建存储对象 中创建的 存储对象
    1. 导航到 定义门户 IP 地址 中创建的 TPG 的 lun 目录。例如:
      # iscsi>iqn.iqn.2010-05.com.example.server1:iscsirhel7guest
    2. 将第一个 LUN 分配给 ramdisk。例如:
      # create /backstores/ramdisk/ramdisk1
    3. 将第二个 LUN 分配给块磁盘。例如:
      # create /backstores/block/block1
    4. 将第三个 LUN 分配给 fileio 磁盘。例如:
      # create /backstores/fileio/fileio1
    5. 列出生成的 LUN。
      /iscsi/iqn.20...csirhel7guest ls
      
      o- tgp1 ............................................................[enabled, auth]
        o- acls...................................................................[0 ACL]
        o- luns..................................................................[3 LUNs]
        | o- lun0......................................................[ramdisk/ramdisk1]
        | o- lun1...............................................[block/block1 (dev/vdb1)]
        | o- lun2................................................[fileio/file1 (foo.img)]
        o- portals.............................................................[1 Portal]
          o- IP-ADDRESS:3260.........................................................[OK]
      
  7. 为每个启动器创建 ACL

    在启动器连接时启用身份验证。您还可以将指定的 LUN 重新变为指定的非联网器。目标和启动器具有唯一名称。iSCSI 启动器使用 IQN。
    1. 使用启动器名称查找 iSCSI initiator 的 IQN。例如:
      # cat /etc/iscsi/initiator2.iscsi
      InitiatorName=create iqn.2010-05.com.example.server1:iscsirhel7guest
      此 IQN 用于创建 ACL。
    2. 进入 acls 目录。
    3. 通过执行以下操作之一创建 ACL:
      • 通过运行 create 命令(不带参数)为所有 LUN 和启动器创建 ACLS。
        # create
      • 为特定 LUN 和启动器创建 ACL,运行指定 iSCSI intiator 的 IQN 的 create 命令。例如:
        # create iqn.2010-05.com.example.server1:888
      • 配置内核目标,以为所有启动器使用单个用户 ID 和密码。
        # set auth userid=user_ID
        # set auth password=password
        # set attribute authentication=1
        # set attribute generate_node_acls=1
    完成此步骤后,通过 保护存储池来继续
  8. 保存配置

    通过覆盖之前的引导设置使配置持久。
    # saveconfig
  9. 启用服务

    要在下一次启动时应用保存的设置,请启用该服务。
    # systemctl enable target.service
可选流程
在创建基于 iSCSI 的存储池前,您可以使用 iSCSI 目标执行多个可选步骤。

过程 13.6. 在 RAID 阵列中配置逻辑卷

  1. 创建 RAID5 阵列

    有关创建 RAID5 阵列的详情,请参考 Red Hat Enterprise Linux 7 存储管理指南
  2. 在 RAID5 阵列中创建 LVM 逻辑卷

    有关在 RAID5 阵列中创建 LVM 逻辑卷的详情,请参考 Red Hat Enterprise Linux 7 逻辑卷管理器管理指南

过程 13.7. 测试发现性

  • 确保新的 iSCSI 设备可被发现。

    # iscsiadm --mode discovery --type sendtargets --portal server1.example.com
    143.22.16.33:3260,1 iqn.2010-05.com.example.server1:iscsirhel7guest

过程 13.8. 测试设备附加

  1. 附加新的 iSCSI 设备

    连接新设备(iqn.2010-05.com.example.server1:iscsirhel7guest),以确定是否可以附加该设备。
    # iscsiadm -d2 -m node --login
    scsiadm: Max file limits 1024 1024
    
    Logging in to [iface: default, target: iqn.2010-05.com.example.server1:iscsirhel7guest, portal: 143.22.16.33,3260]
    Login to [iface: default, target: iqn.2010-05.com.example.server1:iscsirhel7guest, portal: 143.22.16.33,3260] successful.
    
  2. 分离设备

    # iscsiadm -d2 -m node --logout
    scsiadm: Max file limits 1024 1024
    
    Logging out of session [sid: 2, target: iqn.2010-05.com.example.server1:iscsirhel7guest, portal: 143.22.16.33,3260
    Logout of [sid: 2, target: iqn.2010-05.com.example.server1:iscsirhel7guest, portal: 143.22.16.33,3260] successful.

过程 13.9. 为 iSCSI 存储池使用 libvirt secret

注意
如果在创建 iSCSI 目标时定义了 user_ID 和密码 则需要这个过程。
可以使用 virsh 配置用户名和密码参数来保护 iSCSI 存储池的安全。这可以在定义池之前或之后配置,但必须启动池才能使身份验证设置生效。
  1. 创建 libvirt secret 文件

    创建一个带有质询身份验证协议(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. 定义 secret

    # virsh secret-define secret.xml
  3. 验证 UUID

    # virsh secret-list
    UUID                                  Usage
    --------------------------------------------------------------------------------
    2d7891af-20be-4e5e-af83-190e8a922360  iscsi iscsirhel7secret
  4. 为 UID 分配 secret

    使用以下命令,将密码分配给上一步输出中的 UUID。这样可保证 CHAP 用户名和密码位于由 libvirt 控制的 secret 列表中。
    # MYSECRET=`printf %s "password123" | base64`
    # virsh secret-set-value 2d7891af-20be-4e5e-af83-190e8a922360 $MYSECRET
  5. 在存储池中添加身份验证条目

    使用 virsh edit 修改存储池 XML 文件中的 <source> 条目,再添加一个 <auth> 元素,指定 验证类型用户名secret 使用
    例如:
    <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> 子元素存在于客户机 XML 的 <pool><disk> 元素的不同位置。对于 <pool><auth><source> 元素中指定,这描述了查找池源的位置,因为身份验证是某些池源(iSCSI 和 RBD)的属性。对于 <disk>,这是域的子元素,对 iSCSI 或 RBD 磁盘的身份验证是磁盘的属性。
    另外,磁盘的 <auth> 子元素与存储池的不同。
    <auth username='redhat'>
      <secret type='iscsi' usage='iscsirhel7secret'/>
    </auth>
  6. 激活更改

    必须启动存储池才能激活这些更改。
参数
下表提供了 XML 文件、virsh pool-define-as 命令和 Virtual Machine Manager 应用程序所需的参数列表,用于创建基于 iSCSI 的存储池。
表 13.5. 基于 iSCSI 的存储池参数
描述XMLpool-define-as虚拟机管理器
存储池的类型 <pool type='iscsi'> [type] iscsi iSCSI:iSCSI 目标
存储池的名称 <name>name</name> [name] name Name
主机的名称。

<source>
  <host name='hostname' />

source-host hostname 主机名
iSCSI IQN。

  device path="iSCSI_IQN" />
</source>

source-dev iSCSI_IQN 源 IQN
指定目标的路径。这将是用于存储池的路径。

<target>
  <path>/dev/disk/by-path</path>
</target>

目标 path_to_pool 目标路径
(可选)iSCSI initiator 的 IQN。只有 ACL 将 LUN 限制为特定发起方时才需要。

<initiator>
  <iqn name='initiator0' />
</initiator>

请参见以下注释。 启动器 IQN
注意
iSCSI initiator 的 IQN 可使用 virsh find-storage-pool-sources-as iscsi 命令确定。
如果您使用 virsh 创建存储池,请继续 验证存储池是否已创建
示例
以下是基于 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>

以下是创建基于 iSCSI 的存储池的命令示例:
# virsh pool-define-as --name iSCSI_pool --type iscsi --source-host server1.example.com --source-dev iqn.2010-05.com.example.server1:iscsirhel7guest --target /dev/disk/by-path
Pool iSCSI_pool defined
下图显示了虚拟机 XML 配置虚拟机管理器 来添加 New Storage Pool 对话框的例子,用于创建基于 iSCSI 的存储池:

图 13.8. 添加新的基于 iSCSI 的存储池示例

添加新的基于 iSCSI 的存储池示例
13.2.3.6. 基于 LVM 的存储池
建议
在创建基于 LVM 的存储池前请注意以下几点:
  • 基于 LVM 的存储池不能为 LVM 提供完整的灵活性。
  • libvirt 支持精简逻辑卷,但不提供精简存储池的功能。
  • 基于 LVM 的存储池是卷组。您可以使用逻辑卷管理器命令或 virsh 命令创建卷组。要使用 virsh 接口管理卷组,请使用 virsh 命令创建卷组。
    有关卷组的详情,请查看 Red Hat Enterprise Linux 逻辑卷管理器管理指南
  • 基于 LVM 的存储池需要一个完整磁盘分区。如果用这些步骤激活新分区或设备,分区将被格式化并删除所有数据。如果使用主机的现有卷组(VG),则不会删除任何内容。建议您在完成以下步骤前备份存储设备。
    有关创建 LVM 卷组的详情,请参考 Red Hat Enterprise Linux Logical Volume Manager Administration Guide
  • 如果您在现有 VG 上创建基于 LVM 的存储池,则不应运行 pool-build 命令。
确保准备好 VG 后,继续使用 定义存储池来继续创建存储池
参数
下表提供了 XML 文件、virsh pool-define-as 命令和 Virtual Machine Manager 应用程序所需的参数列表,用于创建基于 LVM 的存储池。
表 13.6. 基于 LVM 的存储池参数
描述XMLpool-define-as虚拟机管理器
存储池的类型 <pool type='logical'> [type] logical 逻辑:LVM 卷组
存储池的名称 <name>name</name> [name] name Name
存储池设备的路径

<source>
  <device path='device_path' />

source-dev device_path 源路径
卷组名称   <name='VG-name' /> source-name VG-name 源路径
虚拟组格式

  <format type='lvm2' />
</source>

source-format lvm2 不适用
目标路径

<target>
  <path='target-path' />
</target>

target target-path 目标路径
注意
如果逻辑卷组由多个磁盘分区组成,则可能会列出多个源设备。例如:
<source>
  <device path='/dev/sda1'/>
  <device path='/dev/sdb3'/>
  <device path='/dev/sdc2'/>
  ...
  </source>
如果您使用 virsh 创建存储池,请继续 验证存储池是否已创建
示例
以下是基于 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>
以下是创建基于 LVM 的存储池的命令示例:
# virsh pool-define-as guest_images_lvm logical --source-dev=/dev/sdc --source-name libvirt_lvm --target /dev/libvirt_lvm
Pool guest_images_lvm defined
下图显示了虚拟机 XML 配置虚拟机管理器 来添加 New Storage Pool 对话框的例子,用于创建基于 LVM 的存储池:

图 13.9. 添加一个基于 LVM 的新存储池示例

添加一个基于 LVM 的新存储池示例
13.2.3.7. 基于 NFS 的存储池
先决条件
要创建基于网络文件系统(NFS)的存储池,主机机器应该已经配置了一个 NFS 服务器。有关 NFS 的详情,请查看 Red Hat Enterprise Linux Storage Administration Guide
确保正确配置了 NFS 服务器后,使用 定义存储池来继续创建存储池
参数
下表提供了 XML 文件、virsh pool-define-as 命令和 Virtual Machine Manager 应用程序所需的参数列表,用于创建基于 NFS 的存储池。
表 13.7. 基于 NFS 的存储池参数
描述XMLpool-define-as虚拟机管理器
存储池的类型 <pool type='netfs'> [type] netfs NETFS:网络导出的目录
存储池的名称 <name>name</name> [name] name Name
挂载点所在的 NFS 服务器的主机名称。这可以是主机名或 IP 地址。

<source>
  <host name='host_name' />

source-host host_name 主机名
NFS 服务器中使用的目录

  <dir path='source_path' />
</source>

source-path source_path 源路径
指定目标的路径。这将是用于存储池的路径。

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

target target_path 目标路径
如果您使用 virsh 创建存储池,请继续 验证存储池是否已创建
示例
以下是基于 NFS 的存储池的 XML 文件示例:
<pool type='netfs'>
  <name>nfspool</name>
  <source>
    <host name='localhost'/>
    <dir path='/home/net_mount'/>
  </source>
  <target>
    <path>/var/lib/libvirt/images/nfspool</path>
  </target>
</pool>
以下是创建基于 NFS 的存储池的命令示例:
# virsh pool-define-as nfspool netfs --source-host localhost --source-path /home/net_mount --target /var/lib/libvirt/images/nfspool
Pool nfspool defined
下图显示了虚拟机 XML 配置虚拟机管理器 来添加 New Storage Pool 对话框的例子,用于创建基于 NFS 的存储池:

图 13.10. 添加新的基于 NFS 的存储池示例

添加新的基于 NFS 的存储池示例
13.2.3.8. 使用 SCSI 设备使用基于 vHBA 的存储池
注意
您不能使用 Virtual Machine Manager 使用 SCSI 设备创建基于 vHBA 的存储池。
建议
N_Port ID 虚拟化(NPIV)是一种软件技术,允许共享单一物理光纤通道主机总线适配器(HBA)。这样,多个虚拟机可以从多个物理主机查看相同的存储,因而能轻松查看存储的迁移路径。因此,只要指定了正确的存储路径,迁移不需要创建或复制存储。
在虚拟化中,虚拟主机总线适配器vHBA 控制虚拟机的逻辑单元号(LUN)。要使主机在多个 KVM 虚拟机间共享一个光纤通道设备路径,必须为每个虚拟机创建一个 vHBA。多个 KVM 客户机不得使用单个 vHBA。
NPIV 的每个 vHBA 都由其父 HBA 以及自己的 World Wide Node Name(WWN)和 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 存储池和卷名称。例如,请参阅 第 13.2.3.8 节 “使用 SCSI 设备使用基于 vHBA 的存储池”
注意
在创建 vHBA 前,建议您在主机 LUN 中配置存储阵列(SAN)侧 zoning,以提供客户机之间的隔离,并防止数据崩溃的可能性。
要创建持久的 vHBA 配置,首先使用以下格式创建一个 libvirt 'scsi' 存储池 XML 文件。当创建一个使用同一物理 HBA 中的存储池的 vHBA 时,建议为 <path> 值使用一个稳定的位置,比如系统中的 /dev/disk/by-{path|id|uuid|label} 位置之一。
当创建多个使用同一物理 HBA 中的存储池的 vHBA 时,<path> 字段的值只能是 /dev/,否则存储池卷只对其中一个 vHBA 可见,主机中的设备无法通过 NPIV 配置公开给多个客户机。
有关 <path><target> 中的元素的更多信息,请参阅 上游 libvirt 文档
先决条件
在使用 SCSI 设备创建基于 vHBA 的存储池前,先创建一个 vHBA:

过程 13.10. 创建 vHBA

  1. 在主机系统中找到 HBA

    要在主机系统中找到 HBA,请使用 virsh nodedev-list --cap vports 命令。
    以下示例显示了支持 vHBA 的两个 HBA 的主机:
    # virsh nodedev-list --cap vports
    scsi_host3
    scsi_host4
    
  2. 检查 HBA 的详情

    使用 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 主机设备

    为 vHBA 主机创建类似如下的 XML 文件。在本例中,该文件名为 vhba_host3.xml
    这个示例使用 scsi_host3 来描述父 vHBA。
    # cat vhba_host3.xml
    <device>
      <parent>scsi_host3</parent>
      <capability type='scsi_host'>
        <capability type='fc_host'>
        </capability>
      </capability>
    </device>
    这个示例使用 WWNN/WWPN 对描述父 vHBA。
    # cat vhba_host3.xml
    <device>
      <name>vhba</name>
      <parent wwnn='20000000c9848140' wwpn='10000000c9848140'/>
      <capability type='scsi_host'>
        <capability type='fc_host'>
        </capability>
      </capability>
    </device>
    注意
    WWNN 和 WWPN 值必须与 过程 13.10, “创建 vHBA” 中所示的 HBA 详情中的值匹配。
    <parent> 字段指定要与这个 vHBA 设备关联的 HBA 设备。<device> 标签中的详情在下一步中使用来为主机创建新 vHBA 设备。有关 nodedev XML 格式的详情,请查看 libvirt 上游页面
  4. 在 vHBA 主机设备中创建新 vHBA

    要基于 vhba_host3 创建 vHBA,请使用 virsh nodedev-create 命令:
    # virsh nodedev-create vhba_host3.xml
    Node device scsi_host5 created from vhba_host3.xml
  5. 验证 vHBA

    使用 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>
验证 vHBA 后,继续使用 定义存储池 的存储池
参数
下表提供了 XML 文件、virsh pool-define-as 命令和 Virtual Machine Manager 应用程序所需的参数列表,用于创建基于 vHBA 的存储池。
表 13.8. 基于 vHBA 的存储池参数
描述XMLpool-define-as
存储池的类型 <pool type='scsi'> scsi
存储池的名称 <name>name</name> --adapter-name name
vHBA 的标识符。 属性为可选。

<source>
  <adapter type='fc_host'
  [parent=parent_scsi_device]
  wwnn='WWNN'
  wwpn='WWPN' />
</source>

[--adapter-parent parent]
--adapter-wwnn wwnn
--adapter-wpnn wwpn

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

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

目标 path_to_pool
重要
<path> 字段是 /dev/ 时,libvirt 为卷设备路径生成唯一的短设备路径。例如: /dev/sdc。否则会使用物理主机路径。例如: /dev/disk/by-path/pci-0000:10:00.0-fc-0x5006016044602198-lun-0。唯一的短设备路径允许多个存储池在多个客户机中列出同一个卷。如果多个虚拟机使用了物理主机路径,则可能会出现重复的设备类型警告。
注意
parent 属性可以在 <adapter> 字段中使用它来识别不同路径可使用 NPIV LUN 的物理 HBA 父父项。此字段 scsi_hostNvportsmax_vports 属性相结合,以完成父项识别。parentparent_wwnnparent_wwpnparent_fabric_wwn 属性提供在主机重启后使用相同的 HBA 的不同保证程度。
  • 如果没有指定 parentlibvirt 将使用支持 NPIV 的第一个 scsi_hostN 适配器。
  • 如果只指定 parent,则在配置中添加额外的 SCSI 主机适配器时会出现问题。
  • 如果指定了 parent_wwnnparent_wwpn,则在主机重启后使用相同的 HBA。
  • 如果使用 parent_fabric_wwn,在主机重启同一光纤中的 HBA 后,无论使用的 scsi_hostN 是什么,都会选择同一光纤中的 HBA。
如果您使用 virsh 创建存储池,请继续 验证存储池是否已创建
示例
以下是基于 vHBA 的存储池的 XML 文件示例。第一个示例是 HBA 中唯一存储池的存储池示例。第二个示例是存储池之一,它是使用多个存储池之一,它使用单个 vHBA 并使用 parent 属性来识别 SCSI 主机设备。
<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>
<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 的存储池的命令示例:
# virsh pool-define-as vhbapool_host3 scsi --adapter-parent scsi_host3 --adapter-wwnn 5001a4a93526d0a1 --adapter-wwpn 5001a4ace3ee047d --target /dev/disk/by-path
Pool vhbapool_host3 defined
注意
virsh 命令不提供定义 parent_wwnnparent_wwpnparent_fabric_wwn 属性的方法。
配置虚拟机以使用 vHBA LUN
为 vHBA 创建存储池后,必须将 vHBA LUN 添加到虚拟机配置中。
  1. 在虚拟机 XML 的虚拟机中创建一个磁盘卷。
  2. storage pool 参数中指定 storage volume<source>
以下示例显示了:
<disk type='volume' device='disk'>
  <driver name='qemu' type='raw'/>
  <source pool='vhbapool_host3' volume='unit:0:4:0'/>
  <target dev='hda' bus='ide'/>
</disk>
指定 lun 设备而不是 disk,请参阅以下示例:
<disk type='volume' device='lun' sgio='unfiltered'>
  <driver name='qemu' type='raw'/>
  <source pool='vhbapool_host3' volume='unit:0:4:0' mode='host'/>
  <target dev='sda' bus='scsi'/>
  <shareable />
</disk>
有关在客户机中添加基于 SCSI LUN 的存储的 XML 配置示例,请参考 第 13.3.6.3 节 “在客户机中添加基于 SCSI LUN 的存储”
请注意,为了确保在硬件故障时确保成功连接到 LUN,建议您编辑 fast_io_fail_tmodev_loss_tmo 选项。如需更多信息,请参阅在硬件故障后重新连接到公开的 LUN

13.2.4. 删除存储池

您可以使用 virsh Virtual Machine Manager 删除存储池。
13.2.4.1. 删除存储池的先决条件
为了避免对使用您要删除的存储池的其他客户机虚拟机造成负面影响,建议您停止存储池并释放它所使用的任何资源。
13.2.4.2. 使用 virsh 删除存储池
  1. 列出定义的存储池:
    # virsh pool-list --all
    Name                 State      Autostart
    -----------------------------------------
    default              active     yes
    guest_images_pool    active     yes
    
  2. 停止您要删除的存储池。
    # virsh pool-destroy guest_images_disk
  3. (可选) 对于某些类型的存储池,您可以选择删除存储池所在的目录:
    # virsh pool-delete guest_images_disk
  4. 删除存储池的定义。
    # virsh pool-undefine guest_images_disk
  5. 确认池未定义:
    # virsh pool-list --all
    Name                 State      Autostart
    -----------------------------------------
    default              active     yes
    
    
13.2.4.3. 使用虚拟机管理器删除存储池
  1. Connection Details 窗口的 Storage 选项卡中,选择您要删除的存储池列表。
  2. 点 Storage 窗口底部的 。这会停止存储池,并释放其正在使用的任何资源。
  3. 注意
    只有在存储池停止时才会启用 图标。
    存储池已删除。

13.3. 使用存储卷

本节提供有关使用存储卷的信息。它提供了概念的信息,以及使用 virsh 命令和虚拟机管理器创建、编辑和删除存储卷的详细信息。

13.3.1. 存储卷概念

存储池被分成一个 存储卷。存储卷是物理分区的抽象、LVM 逻辑卷、基于文件的磁盘镜像,以及由 libvirt 处理的其他存储类型。无论底层硬件如何,存储卷都以本地存储设备的形式呈现给客户机虚拟机。
注意
下面的部分不包含 virsh 提供的所有可能命令和参数,用来管理存储卷>。如需更多信息,请参阅 第 20.30 节 “存储卷命令”
在主机机器上,存储卷的名称及其派生到的存储池的标识符。在 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
有关其他参数和参数,请参阅 第 20.34 节 “列出卷信息”

13.3.2. 创建存储卷

这部分介绍了使用 virshVirtual Machine Manager 从存储池创建存储卷的一般说明。创建存储卷后,您可以向 客户机添加存储设备
13.3.2.1. 使用 virsh 创建存储卷
执行以下操作之一:
  • 使用 XML 文件定义存储卷。
    a.创建包含新设备所需的存储卷信息的临时 XML 文件。
    XML 文件必须包含包括以下内容在内的具体字段:
    • Name - 存储卷的名称。
    • allocation - 存储卷的总存储分配。
    • capacity - 存储卷的逻辑容量。如果卷是稀疏的,则这个值可能与分配值 不同
    • Target - 主机系统中的存储卷的路径,以及它的权限和标签(可选)。
    下面显示了一个存储卷定义 XML 文件示例。在本例中,该文件被保存到 ~/guest_volume.xml
      <volume>
        <name>volume1</name>
        <allocation>0</allocation>
        <capacity>20G</capacity>
        <target>
          <path>/var/lib/virt/images/sparse.img</path>
        </target>
      </volume>
    
    b.使用 virsh vol-create 命令创建基于 XML 文件的存储卷。
    # virsh vol-create guest_images_dir ~/guest_volume.xml
      Vol volume1 created
    
    c.删除步骤中创建的 XML 文件。
  • 使用 virsh vol-create-as 命令创建存储卷。
    # virsh vol-create-as guest_images_dir volume1 20GB --allocation 0
  • 使用 virsh vol-clone 命令克隆现有的存储卷。virsh vol-clone 命令必须指定存储池,其中包含要克隆的存储卷以及新创建的存储卷的名称。
    # virsh vol-clone --pool guest_images_dir volume1 clone1
13.3.2.2. 使用虚拟机管理器创建存储卷

过程 13.11. 使用虚拟机管理器创建存储卷

  1. 打开存储设置

    1. Virtual Machine Manager 中,打开 Edit 菜单,然后选择 Connection Details
    2. Connection Details 窗口中的 Storage 选项卡。

      图 13.11. Storage 标签页

      Storage 标签页
      Connection Details 窗口左侧的窗格会显示一个存储池列表。
  2. 选择您要在其中创建存储卷的存储池

    在存储池列表中,点击您要在其中创建存储卷的存储池。
    在所选存储池上配置的任何存储卷都出现在窗口底部的 窗格中。
  3. 添加新存储卷

    点击 列表上方的 按钮。此时会出现 Add a Storage Volume 对话框。

    图 13.12. 创建存储卷

    创建存储卷
  4. 配置存储卷

    使用以下参数配置存储卷:
    • Name 字段中输入存储池的名称。
    • Format 列表中选择存储卷的格式。
    • Max Capacity 项中输入存储卷的最大大小。
  5. 完成创建过程

    FinishAdd a Storage Volume 对话框关闭,存储卷会出现在 列表中。

13.3.3. 查看存储卷

您可以从存储池创建多个存储卷。您还可以使用 virsh vol-list 命令列出存储池中的存储卷。在以下示例中,guest_images_disk 包含三个卷。
virsh vol-create-as guest_images_disk volume1 8G
Vol volume1 created

# virsh vol-create-as guest_images_disk volume2 8G
Vol volume2 created

# virsh vol-create-as guest_images_disk volume3 8G
Vol volume3 created

# virsh vol-list guest_images_disk
Name                 Path
-----------------------------------------
volume1              /home/VirtualMachines/guest_images_dir/volume1
volume2              /home/VirtualMachines/guest_images_dir/volume2
volume3              /home/VirtualMachines/guest_images_dir/volume3

13.3.4. 管理数据

本节提供有关管理存储卷上的数据的信息。
注意
某些类型的存储卷不支持所有数据管理命令。具体信息请查看以下部分。
13.3.4.1. 隐藏存储卷
为确保无法访问存储卷中的数据,可以使用 virsh vol-wipe 命令来擦除存储卷。
使用 virsh vol-wipe 命令来擦除存储卷:
# virsh vol-wipe new-vol vdisk
默认情况下,数据会被零覆盖。但是,可以指定许多不同的方法来唤醒存储卷。有关 virsh vol-wipe 命令的所有选项的详细信息,请参阅 第 20.32 节 “删除存储卷的内容”
13.3.4.2. 将数据上传到存储卷
您可以使用 virsh vol-upload 命令将数据从指定的本地文件上传到存储卷。
# virsh vol-upload --pool pool-or-uuid --offset bytes --length bytes vol-name-or-key-or-path local-file
以下是 virsh vol-upload 主选项:
  • --pool pool-or-uuid - 卷所处的存储池的名称或 UUID。
  • vol-name-or-key-path - 要上传的卷的名称或密钥或者路径。
  • --offset 字节 在存储卷开始写入数据的位置。
  • --length length - 要上传的数据量的上限。
    注意
    如果 local-file 大于指定的 --length,则会出现错误。

例 13.1. 将数据上传到存储卷

# virsh vol-upload sde1 /tmp/data500m.empty disk-pool
在本例中,sde1disk-pool 存储池中的一个卷。/tmp/data500m.empty 中的数据被复制到 sde1
13.3.4.3. 将数据下载到存储卷
您可以使用 virsh vol-download 命令从存储卷下载数据到指定的本地文件。
# vol-download --pool pool-or-uuid --offset bytes --length bytes vol-name-or-key-or-path local-file
以下是 virsh vol-download 的主要选项:
  • --pool pool-or-uuid - 卷所在的存储池的名称或 UUID。
  • vol-name-or-key-path - 要下载的卷的名称、密钥或路径。
  • --offset - 在存储卷中开始读取数据的位置。
  • --length length - 要下载的数据量的上限。

例 13.2. 从存储卷下载数据

# virsh vol-download sde1 /tmp/data-sde1.tmp disk-pool
在本例中,sde1disk-pool 存储池中的一个卷。sde1 中的数据已下载到 /tmp/data-sde1.tmp 中。
13.3.4.4. 调整存储卷大小
您可以使用 vol-resize 命令重新定义指定存储卷的容量。
# virsh vol-resize --pool pool-or-uuid vol-name-or-path pool-or-uuid capacity --allocate --delta --shrink
容量 以字节为单位表示。命令需要 --pool pool-or-uuid,这是卷所在存储池的名称或 UUID。此命令还需要 vol-name-or-key-or-path、名称、密钥或卷路径才能调整大小。
除非指定了 --allocate,否则新容量可能是稀疏的。通常,容量是新大小,但如果存在 --delta,则会将其添加到现有大小中。除非出现 --shrink,尝试缩小卷将失败。
请注意,除非提供了 --shrink 且不需要负数值,否则 容量 为负数。容量 是一个缩放整数,如果没有后缀,则默认为 字节。另外,请注意这个命令只能安全地供活跃客户端使用的存储卷。请参阅 第 20.13.3 节 “更改客户机虚拟机块设备的大小” 以获取实时大小。

例 13.3. 重新定义存储卷大小

例如,如果您创建了 50M 存储卷,您可以使用以下命令将其大小调整为 100M:
# virsh vol-resize --pool disk-pool sde1 100M

13.3.5. 删除存储卷

您可以使用 virsh虚拟机管理器删除存储卷
注意
为了避免对使用您要删除的存储卷的虚拟机虚拟机造成负面影响,建议您使用它释放任何资源。
13.3.5.1. 使用 virsh 删除存储卷
使用 virsh vol-delete 命令删除存储卷。该命令必须指定存储卷的名称或路径以及提取存储卷的存储池。
以下示例从 guest_images_dir 存储池中删除 volume_name 存储卷:
# virsh vol-delete volume_name --pool guest_images_dir
  vol volume_name deleted
13.3.5.2. 使用虚拟机管理器删除存储卷

过程 13.12. 使用虚拟机管理器删除存储卷

  1. 打开存储设置

    1. Virtual Machine Manager 中,打开 Edit 菜单,然后选择 Connection Details
    2. Connection Details 窗口中的 Storage 选项卡。

      图 13.13. Storage 标签页

      Storage 标签页
      Connection Details 窗口左侧的窗格会显示一个存储池列表。
  2. 选择您要删除的存储卷

    1. 在存储池列表中,点击提取存储卷的存储池。
      在所选存储池上配置的存储卷列表显示在窗口底部的 窗格中。
    2. 选择您要删除的存储卷。
  3. 删除存储卷

    1. 点击 按钮(移动 列表)。此时会出现确认对话框。
    2. 单击 "是"所选存储卷被删除。

13.3.6. 在客户机中添加存储设备

您可以使用 virshVirtual Machine Manager 在客户机虚拟机中添加存储设备。
13.3.6.1. 使用 virsh 在客户机中添加存储设备
要将存储设备添加到客户机虚拟机,请使用 attach-disk 命令。可以在 XML 文件或命令行中指定有关要添加的磁盘信息的参数。
以下是包含存储定义的 XML 文件示例。
<disk type='file' device='disk>'>
  <driver name='qemu' type='raw' cache='none'/>
  <source file='/var/lib/libvirt/images/FileName.img'/>
  <target dev='vdb' bus='virtio'/>
</disk>
以下命令使用名为 NewStorage.xml 的 XML 文件将磁盘附加到 Guest1
# virsh attach-disk --config Guest1 ~/NewStorage.xml
以下命令将磁盘附加到 Guest1,而不使用 xml 文件。
# virsh attach-disk --config Guest1 --source /var/lib/libvirt/images/FileName.img --target vdb
13.3.6.2. 使用虚拟机管理器在客户机中添加存储设备
您可以将存储卷添加到客户机虚拟机,或者创建或添加默认存储设备到客户机虚拟机。
13.3.6.2.1. 在客户机中添加存储卷
在客户机虚拟机中添加存储卷:
  1. 在虚拟机硬件详情窗口中打开虚拟机管理器

    以 root 用户身份执行 virt-manager 命令打开 virt-manager,或打开 ApplicationsSystem ToolsVirtual Machine Manager

    图 13.14. Virtual Machine Manager 窗口

    Virtual Machine Manager 窗口
    选择您要添加存储卷的客户机虚拟机。
    Open。此时会打开 Virtual Machine 窗口。
    。此时会出现硬件详细信息窗口。

    图 13.15. 硬件详情窗口

    硬件详情窗口
  2. 打开 Add New Virtual Hardware 窗口

    单击 Add Hardware。此时会出现 Add New Virtual Hardware 窗口。
    确定在硬件类型窗格中选择了 Storage

    图 13.16. Add New Virtual Hardware 窗口

    Add New Virtual Hardware 窗口
  3. 查看存储卷列表

    选择选择或创建自定义存储选项 按钮。
    单击 Manage。此时会出现 Choose Storage Volume 对话框。

    图 13.17. Select Storage Volume 窗口

    Select Storage Volume 窗口
  4. 选择存储卷

    从 Select Storage Volume 窗口左侧的列表中选择一个存储池。所选存储池中的存储卷列表会出现在 Volumes 列表中。
    注意
    您可以从 Select Storage Volume 窗口中创建存储池。如需更多信息,请参阅 第 13.2.2.2 节 “使用虚拟机管理器创建存储池”
    Volumes 列表中选择存储卷。
    注意
    您可以从 Select Storage Volume 窗口中创建存储卷。如需更多信息,请参阅 第 13.3.2.2 节 “使用虚拟机管理器创建存储卷”
    单击 Choose Volume。Select Storage Volume 窗口关闭。
  5. 配置存储卷

    从设备类型列表中选择 设备类型。可用的类型有:磁盘设备、Floppy 设备和 LUN 直通.
    Bus 类型 列表中选择总线类型。可用的总线类型取决于所选的设备类型。
    Cache 模式列表中选择缓存模式。可用的缓存模式有:Hypervisor default, none, writethrough, writeback, directsync, insecure
    Finish。Add New Virtual Hardware 窗口关闭。
13.3.6.2.2. 在客户机中添加默认存储
默认的存储池是 /var/lib/libvirt/images/ 目录中的基于文件的镜像。
在客户机虚拟机中添加默认存储:
  1. 在虚拟机硬件详情窗口中打开虚拟机管理器

    以 root 用户身份执行 virt-manager 命令打开 virt-manager,或打开 ApplicationsSystem ToolsVirtual Machine Manager

    图 13.18. Virtual Machine Manager 窗口

    Virtual Machine Manager 窗口
    选择您要添加存储卷的客户机虚拟机。
    Open。此时会打开 Virtual Machine 窗口。
    。此时会出现硬件详细信息窗口。

    图 13.19. 硬件详情窗口

    硬件详情窗口
  2. 打开 Add New Virtual Hardware 窗口

    单击 Add Hardware。此时会出现 Add New Virtual Hardware 窗口。
    确定在硬件类型窗格中选择了 Storage

    图 13.20. Add New Virtual Hardware 窗口

    Add New Virtual Hardware 窗口
  3. 为客户机创建一个磁盘

    确保为 虚拟机选项创建磁盘镜像
    在为虚拟机选项按钮创建磁盘镜像下面的文本框中输入要创建的磁盘大小
    Finish。Add New Virtual Hardware 窗口关闭。
13.3.6.3. 在客户机中添加基于 SCSI LUN 的存储
可以通过多种方式向客户机公开主机 SCSI LUN。将 SCSI LUN 公开给客户机提供了在客户机上直接向 LUN 执行 SCSI 命令的能力。这可很有用,作为在客户机间共享 LUN 的方法,并在主机之间共享光纤通道存储。
有关基于 SCSI LUN 的存储的详情,请参考使用 SCSI 设备 的基于 vHBA 的存储池
重要
可选的 sgio 属性控制是否为 device='lun' 磁盘过滤非特权 SCSI Generical I/O(SG_IO)命令。sgio 属性可以指定为 'filtered''unfiltered',但必须设置为 'unfiltered' 以允许 SG_IO ioctl 命令在持久预留中通过客户端传递命令。
除了设置 sgio='unfiltered' 外,必须将 <shareable> 元素设置为在客户机间共享 LUN。如果没有指定 sgio 属性,则默认为 'filtered'
<disk> XML 属性 device='lun' 可用于以下客户机磁盘配置:
  • type='block' for <source dev='/dev/disk/by-{path|id|uuid|label}'/>
    <disk type='block' device='lun' sgio='unfiltered'>
      <driver name='qemu' type='raw'/>
      <source dev='/dev/disk/by-path/pci-0000\:04\:00.1-fc-0x203400a0b85ad1d7-lun-0'/>
      <target dev='sda' bus='scsi'/>
      <shareable/>
    </disk>
    注意
    <source> 设备名称中的冒号前的反斜杠是必需的。
  • type='network' for <source protocol='iscsi'... />
    <disk type='network' device='lun' sgio='unfiltered'>
      <driver name='qemu' type='raw'/>
      <source protocol='iscsi' name='iqn.2013-07.com.example:iscsi-net-pool/1'>
        <host name='example.com' port='3260'/>
        <auth username='myuser'>
          <secret type='iscsi' usage='libvirtiscsi'/>
        </auth>
      </source>
      <target dev='sda' bus='scsi'/>
      <shareable/>
    </disk>
  • 当使用 iSCSI 或 NPIV/vHBA 源池作为 SCSI 源池时,type='volume'
    以下示例 XML 显示使用 iSCSI 源池(名为 iscsi-net-pool)作为 SCSI 源池的客户机:
    <disk type='volume' device='lun' sgio='unfiltered'>
      <driver name='qemu' type='raw'/>
      <source pool='iscsi-net-pool' volume='unit:0:0:1' mode='host'/>
      <target dev='sda' bus='scsi'/>
      <shareable/>
    </disk>
    注意
    <source> 标签中的 mode= 选项是可选的,但如果使用,则必须设置为 'host',而不是 'direct'。当设置为 "host" 时,libvirt 将找到本地主机上设备的路径。当设置为 "直接" 时,libvirt 将使用源池的来源主机数据生成到设备的路径。
    上面示例中的 iSCSI 池(iscsi-net-pool)将具有类似如下的配置:
    # virsh pool-dumpxml iscsi-net-pool
    <pool type='iscsi'>
      <name>iscsi-net-pool</name>
      <capacity unit='bytes'>11274289152</capacity>
      <allocation unit='bytes'>11274289152</allocation>
      <available unit='bytes'>0</available>
      <source>
        <host name='192.168.122.1' port='3260'/>
        <device path='iqn.2013-12.com.example:iscsi-chap-netpool'/>
        <auth type='chap' username='redhat'>
          <secret usage='libvirtiscsi'/>
        </auth>
      </source>
      <target>
        <path>/dev/disk/by-path</path>
        <permissions>
          <mode>0755</mode>
        </permissions>
      </target>
    </pool>
    要验证 iSCSI 源池中的可用 LUN 的详情,请输入以下命令:
    # virsh vol-list iscsi-net-pool
    Name                 Path
    ------------------------------------------------------------------------------
    unit:0:0:1           /dev/disk/by-path/ip-192.168.122.1:3260-iscsi-iqn.2013-12.com.example:iscsi-chap-netpool-lun-1
    unit:0:0:2           /dev/disk/by-path/ip-192.168.122.1:3260-iscsi-iqn.2013-12.com.example:iscsi-chap-netpool-lun-2
  • 当使用 NPIV/vHBA 源池作为 SCSI 源池时,type='volume'
    以下示例 XML 显示使用 NPIV/vHBA 源池(名为 vhbapool_host3)作为 SCSI 源池的客户机:
    <disk type='volume' device='lun' sgio='unfiltered'>
      <driver name='qemu' type='raw'/>
      <source pool='vhbapool_host3' volume='unit:0:1:0'/>
      <target dev='sda' bus='scsi'/>
      <shareable/>
    </disk>
    上例中的 NPIV/vHBA 池(vhbapool_host3)将具有类似的配置:
    # virsh pool-dumpxml vhbapool_host3
    <pool type='scsi'>
      <name>vhbapool_host3</name>
      <capacity unit='bytes'>0</capacity>
      <allocation unit='bytes'>0</allocation>
      <available unit='bytes'>0</available>
      <source>
        <adapter type='fc_host' parent='scsi_host3' managed='yes' wwnn='5001a4a93526d0a1' wwpn='5001a4ace3ee045d'/>
      </source>
      <target>
        <path>/dev/disk/by-path</path>
        <permissions>
          <mode>0700</mode>
          <owner>0</owner>
          <group>0</group>
        </permissions>
      </target>
    </pool>
    要验证 vHBA 上可用 LUN 的详情,请输入以下命令:
    # virsh vol-list vhbapool_host3
    Name                 Path
    ------------------------------------------------------------------------------
    unit:0:0:0           /dev/disk/by-path/pci-0000:10:00.0-fc-0x5006016044602198-lun-0
    unit:0:1:0           /dev/disk/by-path/pci-0000:10:00.0-fc-0x5006016844602198-lun-0
    有关在 SCSI 设备中使用 NPIV vHBA 的详情,请参考 第 13.2.3.8 节 “使用 SCSI 设备使用基于 vHBA 的存储池”
以下流程演示了在客户机中添加基于 SCSI LUN 的存储设备的示例。以上 <disk device='lun'> 客户机磁盘配置都可以使用这个方法附加。根据您的环境替换配置。

过程 13.13. 将基于 SCSI LUN 的存储附加到客户端

  1. 通过在新文件中写入 <disk> 元素来创建设备文件,并使用 XML 扩展(本例中为 sda.xml)保存此文件:
    # cat sda.xml
    <disk type='volume' device='lun' sgio='unfiltered'>
      <driver name='qemu' type='raw'/>
      <source pool='vhbapool_host3' volume='unit:0:1:0'/>
      <target dev='sda' bus='scsi'/>
      <shareable/>
    </disk>
  2. sda.xml 中创建的设备与您的虚拟客户机相关联(例如:
    # virsh attach-device --config Guest1 ~/sda.xml
    注意
    使用 --config 选项运行 virsh attach-device 命令,需要 guest reboot 将设备永久添加到客户端。或者,可以使用 --persistent 选项而不是 --config,它也可用于将设备热插到客户机中。
另外,可使用 virt-manager 在客户机中附加或配置基于 SCSI LUN 的存储。要使用 virt-manager 进行配置,请点击 Add Hardware 按钮并添加带有所需参数的虚拟磁盘,或者从此窗口中更改现有 SCSI LUN 设备的设置。在 Red Hat Enterprise Linux 7.2 及更高版本中,SGIO 值也可以在 virt-manager 中配置:

图 13.21. 使用 virt-manager 配置 SCSI LUN 存储

使用 virt-manager 配置 SCSI LUN 存储
硬件失败后重新连接到公开的 LUN
如果因为硬件失败(如主机总线适配器),与公开的光纤通道(FC)LUN 的连接会丢失,则客户机上公开的 LUN 也可能会继续显示为故障,即使硬件故障也是如此。要防止这种情况,请编辑 dev_loss_tmofast_io_fail_tmo 内核选项:
  • dev_loss_tmo 控制 SCSI 层在将 SCSI 设备标记为失败前等待的时间。要防止超时,建议将 选项设置为最大值,即 2147483647
  • fast_io_fail_tmo 控制 SCSI 层在失败的 SCSI 设备失败后等待多久,然后再返回 I/O。为确保内核不忽略 dev_loss_tmo,请将这个选项的值设置为小于 dev_loss_tmo 的值的任意数值。
要修改 dev_loss_tmofast_io_fail 的值,请执行以下操作之一:
  • 编辑 /etc/multipath.conf 文件,并在 defaults 部分中设置值:
    defaults {
    ...
    fast_io_fail_tmo     20
    dev_loss_tmo    infinity
    }
    
  • 在 FC 主机或远程端口级别设置 dev_loss_tmofast_io_fail,例如:
    # echo 20 > /sys/devices/pci0000:00/0000:00:06.0/0000:13:00.0/host1/rport-1:0-0/fc_remote_ports/rport-1:0-0/fast_io_fail_tmo
    # echo 2147483647 > /sys/devices/pci0000:00/0000:00:06.0/0000:13:00.0/host1/rport-1:0-0/fc_remote_ports/rport-1:0-0/dev_loss_tmo
要验证 dev_loss_tmofast_io_fail 的新值是否活跃,请使用以下命令:
# find /sys -name dev_loss_tmo -print -exec cat {} \;
如果正确设置了参数,输出将类似如下,使用适当的设备或设备而不是 pci0000:00/0000:00:06.0/0000:13:00.0/host1/rport-1:0-0/fc_remote_ports/rport-1:0-0:
# find /sys -name dev_loss_tmo -print -exec cat {} \;
...
/sys/devices/pci0000:00/0000:00:06.0/0000:13:00.0/host1/rport-1:0-0/fc_remote_ports/rport-1:0-0/dev_loss_tmo
2147483647
...
13.3.6.4. 在客户机虚拟机中管理存储控制器
与 virtio 磁盘不同,SCSI 设备需要在客户机虚拟机中存在控制器。本节详细介绍了创建虚拟 SCSI 控制器(也称为"主机总线适配器"或 HBA)以及向客户机虚拟机添加 SCSI 存储所需的步骤。

过程 13.14. 创建虚拟 SCSI 控制器

  1. 显示客户机虚拟机(Guest1)的配置,并查找已存在的 SCSI 控制器:
    virsh dumpxml Guest1 | grep controller.*scsi
    如果存在设备控制器,命令将输出一个或多个类似如下的行:
    <controller type='scsi' model='virtio-scsi' index='0'/>
    
  2. 如果上一步没有显示设备控制器,请在一个新文件中创建一个描述,并使用以下步骤将其添加到虚拟机中:
    1. 通过在新文件中写入 <controller> 元素来创建设备控制器,并使用 XML 扩展名保存此文件。virtio-scsi-controller.xml,例如:
      <controller type='scsi' model='virtio-scsi'/>
      
    2. 将您在 virtio-scsi-controller.xml 中创建的设备控制器与您的虚拟客户机(例如,Guest1)关联:
      virsh attach-device --config Guest1 ~/virtio-scsi-controller.xml
      在本例中,--config 选项的行为与磁盘的作用相同。如需更多信息,请参阅 第 13.3.6 节 “在客户机中添加存储设备”
  3. 添加新的 SCSI 磁盘或 CD-ROM。可使用 第 13.3.6 节 “在客户机中添加存储设备” 中的方法添加新磁盘。要创建 SCSI 磁盘,请指定以 sd 开头的目标设备名称。
    注意
    每个控制器的支持限制为 1024 virtio-scsi 磁盘,但该主机中的其他可用资源(如文件描述符)可能会用较少的磁盘耗尽。
    如需更多信息,请参阅以下 Red Hat Enterprise Linux 6 白皮书:红帽企业 Linux 内核虚拟机下一代存储接口:virtio-scsi.
    virsh attach-disk Guest1 /var/lib/libvirt/images/FileName.img sdb --cache none
    根据客户机虚拟机中的驱动程序版本,运行的客户机虚拟机可能不会立即检测到新磁盘。按照《 Red Hat Enterprise Linux 存储管理指南》 中的步骤操作。

13.3.7. 从客户机中删除存储设备

您可以使用 virshVirtual Machine Manager 从虚拟机中删除存储设备。
13.3.7.1. 使用 virsh 从虚拟机中删除存储
以下示例从 Guest1 虚拟机中删除 vdb 存储卷:
# virsh detach-disk Guest1 vdb
13.3.7.2. 使用虚拟机管理器从虚拟机中删除存储

过程 13.15. 使用虚拟机管理器从虚拟机中删除存储

使用虚拟机管理器从客户机虚拟机中删除存储:
  1. 在虚拟机硬件详情窗口中打开虚拟机管理器

    以 root 用户身份执行 virt-manager 命令打开 virt-manager,或打开 ApplicationsSystem ToolsVirtual Machine Manager
    选择您要从中删除存储设备的客户机虚拟机。
    Open。此时会打开 Virtual Machine 窗口。
    。此时会出现硬件详细信息窗口。
  2. 从客户机虚拟机中删除存储

    从硬件详细信息窗格左侧的硬件列表中选择存储设备。
    单击 Remove。此时会出现确认对话框。
    单击 "是"存储已从客户机虚拟机中删除。

第 14 章 使用 qemu-img

qemu-img 命令行工具用于格式化、修改和验证 KVM. qemu-img 选项和用法所使用的各种文件系统,后续部分将突出显示。
警告
不要使用 qemu-img 修改正在运行的虚拟机或任何其他进程所使用的镜像。这可能会销毁镜像。另外,请注意,查询被其他进程修改的镜像可能会遇到不一致的状态。

14.1. 检查磁盘镜像

要在磁盘镜像上执行一致性检查,其文件名为 imgname
# qemu-img check [-f format] imgname
注意
只有所选格式组支持一致性检查。其中包括 qcow2vdivhdxvmdkqed

14.2. 将更改提交至镜像

使用 qemu-img commit 命令,将指定镜像文件(imgname)中记录的任何更改提交到文件的基础镜像。(可选)指定文件格式类型(fmt)。
 # qemu-img commit [-f fmt] [-t cache] imgname

14.3. 镜像比较

将两个指定的镜像文件的内容(imgname1 和 img name2)qemu-img compare 命令进行比较。(可选)指定文件格式类型(fmt)。镜像可以有不同的格式和设置。
默认情况下,如果较大的镜像在另一个镜像后面只包含这个区域中的未分配或者零个扇区,则具有不同大小的镜像被视为相同。另外,如果一个镜像中没有分配任何扇区,且在另一个镜像中仅包含零字节,则会尽可能高。如果您指定了 -s 选项,如果镜像大小不同,或者某个扇区在一个镜像中被分配,则镜像不会被视为相同。
 # qemu-img compare [-f fmt] [-F fmt] [-p] [-s] [-q] imgname1 imgname2
qemu-img 比较 命令退出了以下退出代码之一:
  • 0 - 镜像是相同的
  • 1 - 镜像是不同的
  • 2 - 打开其中一个镜像时出错
  • 3 - 检查扇区分配时出错
  • 4 - 读取数据时出错

14.4. 映射镜像

使用 qemu-img map 命令,您可以转储指定镜像文件的元数据(imgname)及其后备文件链。转储显示(imgname)中每个扇区的分配状态,其最高的文件在后备文件链中分配。(可选)指定文件格式类型(fmt)。
 # qemu-img map [-f fmt] [--output=fmt] imgname
输出格式有两种,即 人类可读的格式json 格式:

14.4.1. 人类 格式

默认格式()只转储文件的非零分配部分。输出中标识了可从其中读取数据和文件中偏移的文件。每行都包括四个字段。下面是一个输出的示例:
Offset          Length          Mapped to       File
0               0x20000         0x50000         /tmp/overlay.qcow2
0x100000        0x10000         0x95380000      /tmp/backing.qcow2
第一行表示,从镜像偏移 0 开始从偏移 0 开始 0x20000 (131072)字节,位于 tmp/overlay.qcow2 (以原始格式打开)从偏移 0x50000 (327680)开始。如果指定 格式,则压缩、加密或不以原始格式提供的数据会导致错误。
注意
文件名可以包括换行符。因此,在脚本中无法以 人类可读格式 解析输出。

14.4.2. json 格式

如果指定了 json 选项,输出会以 JSON 格式返回数组字典。除了 人工 选项提供的信息外,输出还包括以下信息:
  • data - 显示扇区是否包含数据的布尔值字段
  • - 显示数据是否已知为零的布尔值字段
  • 深度 - 后备 文件名的深度
注意
当指定 json 选项时,偏移 字段是可选的。
有关 qemu-img map 命令和附加选项的详情,请查看相关的 man page。

14.5. 镜像(mending)

修正镜像文件相关镜像格式的选项。(可选)指定文件格式类型(fmt)。
# qemu-img amend [-p] [-f fmt] [-t cache] -o options filename
注意
此操作仅支持 qcow2 文件格式。

14.6. 将现有镜像转换为另一个格式

convert 选项用于将一个可识别的镜像格式转换为另一个镜像格式。有关接受格式列表,请参阅 第 14.12 节 “支持的 qemu-img 格式”
# qemu-img convert [-c] [-p] [-f fmt] [-t cache] [-O output_fmt] [-o options] [-S sparse_size] filename output_filename
p 参数显示命令的进度(可选,而不是每个命令)和 -S 标志允许创建 稀疏文件,该文件包含在磁盘镜像中。所有目的中的稀疏文件(即,标准文件)都类似标准文件,但物理块只能包含零(也就是说没有)。当操作系统看到此文件时,它会将其视为存在,它会占用实际的磁盘空间,即使实际并不会承担任何文件。这在为客户机虚拟机创建磁盘时特别有用,因为这表明磁盘占用的磁盘空间比它更多的磁盘空间要多。例如,如果您在磁盘镜像上设置 -S 设置为 50Gb,那么您的 10Gb 磁盘空间将显示 60Gb,即使实际使用了 10Gb。
使用格式 output_format 将磁盘镜像 文件名 转换为磁盘镜像 output_filename。磁盘镜像可以选择使用 -c 选项压缩,或通过设置 -o encryption 来使用 -o 选项加密。请注意,可用的选项有 -o 参数与所选格式有所不同。
只有 qcow2qcow2 格式支持加密或压缩。qcow2 加密使用带有安全 128 位键的 AES 格式。qcow2 压缩为只读,因此如果压缩的扇区从 qcow2 格式转换,它会将新格式写成未压缩数据。
使用可增大的格式(如 qcowcow )时,镜像转换也可用于获得较小的镜像。检测到空白扇区,并从目标镜像中抑制。

14.7. 创建并格式化新镜像或设备

创建 大小 的新磁盘镜像 文件名格式为
# qemu-img create [-f format] [-o options] filename [size]
如果使用 -o backing_file=filename 指定基础镜像,则该镜像将只记录自身和基础镜像之间的区别。除非使用 commit 命令,否则不会修改 后备文件。在这种情况下不需要指定任何大小。

14.8. 显示镜像信息

info 参数显示有关磁盘映像 文件名 的信息。info 选项的格式如下:
# qemu-img info [-f format] filename
此命令通常用于发现磁盘上保留的大小,这些大小可能与显示的大小不同。如果快照存储在磁盘镜像中,它们也会显示它们。例如,此命令将显示块设备中 qcow2 镜像所占用的空间量。这可以通过运行 qemu-img 来完成。您可以使用 qemu-img check 命令来检查所使用的镜像是否与 qemu-img info 命令的输出相匹配。
# qemu-img info /dev/vg-90.100-sluo/lv-90-100-sluo
image: /dev/vg-90.100-sluo/lv-90-100-sluo
file format: qcow2
virtual size: 20G (21474836480 bytes)
disk size: 0
cluster_size: 65536

14.9. 重新标记镜像的备份文件

qemu-img rebase 更改镜像的备份文件。
# qemu-img rebase [-f fmt] [-t cache] [-p] [-u] -b backing_file [-F backing_fmt] filename
后备文件被改为 backing_file,如果 文件名 格式支持该功能,支持的文件格式将更改为 backing_format
注意
只有 qcow2 格式支持更改后备文件(rebase)。
rebase 可操作的模式 有两种,即 安全和 不安全
默认使用 安全模式 并执行实际重基操作。新的后备文件可能与旧文件不同,qemu-img rebase 命令将注意,使客户机虚拟机可见 的文件名 内容保持不变。为了实现此目的,在对 后备_file 和旧备份文件更改前,任何不同的集群均将合并到 文件名 中。
请注意,安全模式 是昂贵的操作,与转换镜像相当。需要旧的备份文件才能成功完成。
如果 -u 选项传递给 qemu-img rebase,则使用 不安全 模式。在这个模式中,仅更改后备文件名和 文件名 格式,而无需对文件内容执行任何检查。确保正确指定新的后备文件,或者镜像的 guestvisible 内容将损坏。
此模式可用于重命名或移动后备文件。它可在不需要访问的旧备份文件的情况下使用。例如,它可用于修复已移动或重命名备份文件的镜像。

14.10. 重新大小磁盘镜像

更改磁盘镜像 文件名,就好像创建 大小为 一样。同一方向只能调整 raw 格式的镜像,而 qcow2 镜像则可增大,但不能增大,但无法缩小。
使用以下内容将磁盘镜像 文件名 的大小设置为 size 字节:
# qemu-img resize filename size
您还可以调整与磁盘镜像当前大小相关的大小。要指定相对于当前大小的大小,请为要增大的字节数添加前缀,或者 - 为磁盘镜像的大小减小到这个字节数。通过添加单元后缀,您可以使用 KB(K)、兆字节(M)、千兆字节(G)或 TB(T)设置镜像大小。
# qemu-img resize filename [+|-]size[K|M|G|T]
警告
在使用这个命令缩小磁盘镜像前,您必须在 虚拟机本身中使用文件系统和分区工具来减少分配的文件系统和分区大小。否则将导致数据丢失。
在使用这个命令增加磁盘镜像后,您必须使用虚拟机中的文件系统和分区工具来实际使用该设备中的新空间。

14.11. 列出、创建、应用和删除快照

使用与 qemu-img snapshot 命令不同的参数,您可以列出、应用、创建或删除指定映像的现有快照(快照)(文件名)。
# qemu-img snapshot [ -l | -a snapshot | -c snapshot | -d snapshot ] filename
接受的参数如下:
  • - L 列出与指定磁盘镜像关联的所有快照。
  • apply 选项 -a 将磁盘镜像(文件名)恢复到之前保存 的快照 的状态。
  • -c 创建映像的快照(快照)(文件名)。
  • -d 删除指定的快照。

14.12. 支持的 qemu-img 格式

当在任何 qemu-img 命令中指定格式时,可以使用以下格式类型:
  • Raw 磁盘镜像格式(默认)。这可以是基于文件的速度最快的格式。如果您的文件系统支持漏洞(例如 ext2 或 ext3 ),则只有写入的扇区会保留空间。使用 qemu-img info 获取镜像使用的实际大小或 ls -ls on Unix/Linux。虽然 Raw 镜像提供最佳性能,但只有 Raw 镜像只提供非常基本的功能。例如,没有快照可用。
  • qcow2 - QEMU 镜像格式,具有最佳功能集,最常用的格式。使用它具有可选的 AES 加密、基于 zlib 的压缩、支持多个虚拟机快照和较小的镜像,它们对不支持漏洞的文件系统 很有用。请注意,这种丰富的功能集的性能成本如下。
    虽然只有上述格式可以在客户机虚拟机或主机物理机器中运行,但 qemu-img 也会识别并支持下列格式,以便从 原始、或 qcow2 格式转换。通常会自动检测到镜像的格式。除了将这些格式转换为 rawqcow2 外,它们还可以从 rawqcow2 转换回原始格式。请注意,Red Hat Enterprise Linux 7 提供的 qcow2 版本为 1.1。与之前版本的 Red Hat Enterprise Linux 提供的格式为 0.10。您可以将镜像文件恢复到以前的 qcow2 版本。要了解您使用的版本,请运行 qemu-img info qcow2 [imagefilename.img] 命令。要更改 qcow 版本,请参阅 第 23.19.2 节 “设置目标元素”
  • Bochs - 磁盘映像格式.
  • cloop - Linux Compressed Loop 镜像,对于仅在 Knoppix CD-ROMs 中重复使用直接压缩 CD-ROM 镜像。
  • COW - User Mode Linux Copy On Write image format。cow 格式包含在与之前的版本兼容。
  • dmg - Mac 磁盘镜像格式。
  • nbd - 网络块设备。
  • Parallels - Parallels 虚拟化磁盘镜像格式。
  • QCOW - Old QEMU 镜像格式。仅用于与旧版本兼容。
  • qed - Old QEMU 镜像格式。仅用于与旧版本兼容。
  • VDI - Oracle VM VirtualBox 硬盘镜像格式。
  • VHD X - Microsoft Hyper-V 虚拟硬盘-X 磁盘映像格式.
  • VMDK - VMware 3 和 4 兼容镜像格式。
  • vvfat - 虚拟 VFAT 磁盘镜像格式。

第 15 章 KVM 迁移

本章论述了将客户机虚拟机从一个主机物理机器迁移到另一台主机。迁移 guest 可能会因为虚拟机在虚拟环境中运行,而不是直接在硬件上运行。

15.1. 迁移定义和优点

迁移工作是将客户机虚拟机内存和任何虚拟设备的状态发送到目标主机物理机器。建议使用共享、联网的存储来存储要迁移的客户机镜像。另外,还建议在迁移虚拟机时使用 libvirt 管理 的存储池 进行共享存储。
可通过 实时 (运行)和 非实时迁移 (下线)客户机执行迁移。
实时迁移 中,客户机虚拟机将继续在源主机上运行,而客户机的内存页面传输到目标主机计算机。在迁移过程中,KVM 会监控已传输页面中的任何更改,并在所有初始页面都已转移后开始转移这些更改。KVM 还估计迁移期间的传输速度,因此当剩余的数据传输量达到一定可配置的时间段(默认为 10ms),KVM 暂停原始客户机虚拟机,传输剩余的数据,并在目标主机物理机器上恢复相同的客户机虚拟机。
相反,非实时迁移 (离线迁移)会挂起客户机虚拟机,然后将客户机内存复制到目标主机。然后,客户机会在目标主机上恢复,并且释放了源主机机器中使用的客户机的内存。完成此类迁移所需的时间取决于网络带宽和延迟。如果网络遇到大量使用或低带宽,迁移将花费更长的时间。请注意,如果原始客户机虚拟机修改页的速度比 KVM 可以将其传送到目标主机物理机器更快,则必须使用离线迁移,因为实时迁移永远不会完成。
迁移可用于:
负载均衡
如果 guest 虚拟机能够被过度加载,或者另一台主机机器被过度使用,则可以将客户机虚拟机移动到使用较低的主机机器中。
硬件独立
当您需要升级、添加或删除主机物理机器上时,您可以安全地将客户机虚拟机重新定位到其他主机物理机器。这意味着客户机虚拟机在改进硬件时不会遇到任何停机时间。
节能
虚拟机可以重新分发到其他主机的物理计算机,因此可以关闭未卸载的主机系统,从而在低使用阶段节省能源并降低成本。
地理迁移
虚拟机可以移到另一个位置,以降低延迟或者因为其他原因需要。

15.2. 迁移要求和限制

在使用 KVM 迁移前,请确定您的系统满足迁移的要求,并了解其限制。

迁移要求

  • 使用下列协议之一在共享存储中安装客户机虚拟机:
    • 基于 Fibre Channel 的 LUN
    • iSCSI
    • NFS
    • GFS2
    • SCSI RDMA 协议(SCSI RCP):Infiniband 和 10GbE iWARP 适配器中使用的块导出协议
  • 确保 libvirtd 服务已启用并在运行。
    # systemctl enable libvirtd.service
    # systemctl restart libvirtd.service
  • 有效迁移的能力取决于 /etc/libvirt/libvirtd.conf 文件中的参数设置。要编辑此文件,请使用以下步骤:

    过程 15.1. 配置 libvirtd.conf

    1. 打开 libvirtd.conf 需要以 root 身份运行该命令:
      # vim /etc/libvirt/libvirtd.conf
    2. 根据需要更改参数并保存文件。
    3. 重启 libvirtd 服务:
      # systemctl restart libvirtd
  • 应该根据情况检查迁移平台和版本 表 15.1 “实时迁移兼容性”
  • 使用单独的系统导出共享存储介质。存储不应位于用于迁移的两个主机物理机器上。
  • 共享存储必须在源和目标系统上挂载在同一位置。挂载的目录名称必须相同。虽然可以使用不同路径保留镜像,但不推荐这样做。请注意,如果您打算使用 virt-manager 执行迁移,则路径名称必须相同。如果要使用 virsh 执行迁移,可以在 --xml 选项或 pre-hooks 中使用不同的网络配置和挂载目录 。有关 pre-hooks 的更多信息,请参阅 libvirt 上游文档,以及 XML 选项的详情,请参考 第 23 章 操作域 XML
  • 当在公共 bridge+tap 网络中的现有客户机虚拟机上尝试迁移时,源和目标主机必须位于同一网络中。否则,迁移后,客户机虚拟机网络将不会操作。

迁移限制

  • 在 Red Hat Enterprise Linux 中使用基于 KVM 的虚拟化技术时,客户机虚拟机迁移有以下限制:
    • 指向迁移 - 必须手动操作到指定来自原始虚拟机监控程序的目标管理程序
    • 没有验证或回滚可用
    • 只能手动确定目标
    • 无法在 Red Hat Enterprise Linux 7™ 上执行存储迁移,但您可以在客户机虚拟机关闭时迁移存储。在 Red Hat Virtualization™ 中提供了实时存储迁移。详情请致电您的服务代表。
注意
如果您要将带有 virtio 设备的客户机机器迁移到其中,请确保将任意平台上的 virtio 设备上的向量设置为 32 个或更少。详情请查看 第 23.17 节 “Devices”

15.3. 实时迁移和 Red Hat Enterprise Linux 版本兼容性

实时迁移在 表 15.1 “实时迁移兼容性” 所示被支持:
表 15.1. 实时迁移兼容性
迁移方法 发行类型 示例 实时迁移支持 备注
向前 主发行版本 6.5+ → 7.x 完全支持 应该报告任何问题
向后 主发行版本 7.x → 6.y 不支持
向前次发行版本7.x → 7.y (7.0 → 7.1)完全支持应该报告任何问题
向后次发行版本7.y → 7.x (7.1 → 7.0)完全支持应该报告任何问题

迁移故障排除

  • 迁移协议的问题 - 如果向后兼容以"未知部分错误"结尾,重复迁移过程可修复该问题,因为它可能是一个瞬态错误。如果不是,请报告问题。
  • 音频设备问题 - 从 Red Hat Enterprise Linux 6.x 迁移到 Red Hat Enterprise Linux 7.y 时,es1370 音频卡不再被支持。改为使用 ac97 音频卡。
  • 网卡的问题 - 当从 Red Hat Enterprise Linux 6.x 迁移到 Red Hat Enterprise Linux 7.y 时,不再支持 pcnet 和 ne2k_pci 网卡。改为使用 virtio-net 网络设备。

配置网络存储

配置共享存储并在共享存储上安装客户机虚拟机。

15.4. 共享存储示例:用于简单迁移的 NFS

重要
这个示例使用 NFS 与其他 KVM 主机物理机器共享客户机虚拟机镜像。虽然大型安装不实际,但介绍仅演示迁移技巧。请勿使用此示例来迁移或运行多个客户机虚拟机。另外,还需要启用 synch 参数。这是正确导出 NFS 存储所需要的。
对于大型部署来说,iSCSI 存储是更好的选择。有关配置详情请参考 第 13.2.3.5 节 “基于 iSCSI 的存储池”
有关配置 NFS、打开 IP 表和配置防火墙的详情,请参考 Red Hat Linux Storage Administration Guide
请确定 NFS 文件锁定没有被使用,因为在 KVM 中不支持它。
  1. 导出 libvirt 镜像目录

    迁移需要存储位于独立于迁移目标系统的系统中。在这个独立系统中,通过将默认镜像目录添加到 /etc/exports 文件中来导出存储:
    /var/lib/libvirt/images *.example.com(rw,no_root_squash,sync)
    根据您的环境要求更改 hostname 参数。
  2. 启动 NFS

    1. 如果 NFS 软件包尚未安装,则安装它们:
      # yum install nfs-utils
    2. 确保打开 iptables 中 NFS 的端口(例如 2049),并将 NFS 添加到 /etc/hosts.allow 文件中。
    3. 启动 NFS 服务:
      # systemctl start nfs-server
  3. 将共享存储挂载到源和目的地

    在迁移源和目标系统中挂载 /var/lib/libvirt/images 目录:
    # mount storage_host:/var/lib/libvirt/images /var/lib/libvirt/images
    警告
    为源主机物理机器选择哪个目录都必须与目标主机物理计算机上的目录完全相同。这适用于所有共享存储。该目录必须相同,或使用 virt-manager 迁移会失败。

15.5. 使用 virsh 进行实时 KVM 迁移

可以使用 virsh 命令将客户机虚拟机迁移到另一台主机物理计算机。migrate 命令接受以下格式的参数:
# virsh migrate --live GuestName DestinationURL
请注意,不需要实时迁移时可以消除 --live 选项。其它选项在 第 15.5.2 节 “virsh migrate 命令的附加选项” 中列出。
GuestName 参数表示您要迁移的客户机虚拟机的名称。
DestinationURL 参数是目标主机物理机器的连接 URL。目标系统必须运行相同的 Red Hat Enterprise Linux 版本,它们使用相同的管理程序,并且运行 libvirt
注意
常规迁移的 DestinationURL 参数和 peer2peer 迁移有不同的语义:
  • 正常迁移: DestinationURL 是目标主机物理机器的 URL,如源客户机虚拟机所示。
  • peer2peer 迁移:DestinationURL 是目标主机物理计算机的 URL,如源主机物理计算机所示。
输入命令后,系统将提示您输入目标系统的 root 密码。
重要
名称解析必须同时处理(源和目标),才能成功迁移。每个产品都必须能够找到其他内容。请确定您可以 ping 一边,以检查名称解析是否正常工作。

示例:使用 virsh 实时迁移

这个示例从 host1.example.com 迁移到 host2.example.com。更改您的环境的主机物理机器名称。本例迁移了一个名为 guest1-rhel6-64 的虚拟机。

这个示例假设您已经完全配置了共享存储,并满足所有先决条件(以下列出: 迁移要求)。
  1. 验证客户机虚拟机正在运行

    在源系统中 host1.example.com,验证 guest1-rhel6-64 正在运行:
    [root@host1 ~]# virsh list
    Id Name                 State
    ----------------------------------
     10 guest1-rhel6-64     running
    
  2. 迁移客户端虚拟机

    执行以下命令,将 guest 虚拟机实时迁移到目标 host2.example.com。在目标 URL 的末尾附加 /system 以便告知 libvirt 您需要完全访问。
    # virsh migrate --live guest1-rhel7-64 qemu+ssh://host2.example.com/system
    输入命令后,系统将提示您输入目标系统的 root 密码。
  3. Wait

    根据负载和客户机虚拟机大小,迁移可能需要一些时间。virsh 只报告错误。客户机虚拟机继续在源主机物理机器中运行,直到完全迁移为止。
  4. 验证客户机虚拟机已到达目标主机

    从目标系统 host2.example.com,验证 guest1-rhel7-64 正在运行:
    [root@host2 ~]# virsh list
    Id Name                 State
    ----------------------------------
     10 guest1-rhel7-64     running
    
实时迁移现已完成。
注意
libvirt 支持各种网络方法,包括 TLS/SSL、UNIX 套接字、SSH 和未加密 TCP。有关使用其它方法的详情请参考 第 18 章 客户机的远程管理
注意
使用以下命令可迁移非运行的客户机虚拟机:
# virsh migrate --offline --persistent 

15.5.1. 使用 virsh 迁移的附加提示

在单独的命令 shell 中运行每个迁移,可以执行多个并发实时迁移。但是,这应该非常谨慎,并应该涉及计算每个迁移实例每个端的 MAX_CLIENT(源和目标)。由于默认设置是 20,因此只需更改设置即可运行 10 个实例。如果您需要更改设置,请查看 过程 15.1, “配置 libvirtd.conf” 过程。
  1. 打开 libvirtd.conf 文件,如 过程 15.1, “配置 libvirtd.conf” 所述。
  2. 查找处理控制部分。
    #################################################################
    #
    # Processing controls
    #
    
    # The maximum number of concurrent client connections to allow
    # over all sockets combined.
    #max_clients = 5000
    
    # The maximum length of queue of connections waiting to be
    # accepted by the daemon. Note, that some protocols supporting
    # retransmission may obey this so that a later reattempt at
    # connection succeeds.
    #max_queued_clients = 1000
    
    # The minimum limit sets the number of workers to start up
    # initially. If the number of active clients exceeds this,
    # then more threads are spawned, upto max_workers limit.
    # Typically you'd want max_workers to equal maximum number
    # of clients allowed
    #min_workers = 5
    #max_workers = 20
    
    
    # The number of priority workers. If all workers from above
    # pool will stuck, some calls marked as high priority
    # (notably domainDestroy) can be executed in this pool.
    #prio_workers = 5
    
    # Total global limit on concurrent RPC calls. Should be
    # at least as large as max_workers. Beyond this, RPC requests
    # will be read into memory and queued. This directly impact
    # memory usage, currently each request requires 256 KB of
    # memory. So by default upto 5 MB of memory is used
    #
    # XXX this isn't actually enforced yet, only the per-client
    # limit is used so far
    #max_requests = 20
    
    # Limit on concurrent requests from a single client
    # connection. To avoid one client monopolizing the server
    # this should be a small fraction of the global max_requests
    # and max_workers parameter
    #max_client_requests = 5
    
    #################################################################
    
  3. 更改 max_clientsmax_workers 参数设置。建议两个参数中的数字都相同。max_clients 每次迁移过程中将使用 2 个客户端(每个迁移一个),max_workers 则在执行阶段,目标上的 1 个 worker 使用 1 个 worker,并在完成阶段在目标 1 个 worker 上使用 1 个 worker。
    重要
    max_clientsmax_workers 参数设置会受到连接到 libvirtd 服务的所有客户机虚拟机连接的影响。这意味着,任何正在使用同一客户机虚拟机并同时执行迁移的用户也会遵循 max_clientsmax_workers 参数设置的限制。这就是为什么在执行并发实时迁移之前,需要仔细考虑最大值的原因。
    重要
    max_clients 参数控制允许多少个客户端连接到 libvirt。当同时启动大量容器时,可轻松达到和超过这一限制。max_clients 参数的值可以增加以避免这种情况,但这样做会使系统更易受到攻击,从而防止系统遭到拒绝服务(DoS)攻击。要解决这个问题,Red Hat Enterprise Linux 7.0 中引入了一个新的 max_anonymous_clients 设置,用于指定接受但尚未通过身份验证的连接的限制。您可以实施 max_clientsmax_anonymous_clients 的组合来适合您的工作负载。
  4. 保存文件并重启该服务。
    注意
    有些情况下,迁移连接会下降,因为已启动但尚未通过身份验证的 ssh 会话太多。默认情况下,sshd 只允许 10 会话随时处于 "pre-authenticated state"。此设置由 sshd 配置文件中的 MaxStartups 参数(位于: /etc/ssh/sshd_config)来控制,可能需要进行一些调整。需要小心调整此参数,因为限制可以防止 DoS 攻击(一般情况下使用资源)。将此值设置为过高,将指示其用途。要更改这个参数,请编辑文件 /etc/ssh/sshd_config,从 MaxStartups 行的开头删除 #,并将 10 (默认值)改为更高数字。记住保存文件并重新启动 sshd 服务。如需更多信息,请参阅 sshd_config man page。

15.5.2. virsh migrate 命令的附加选项

除了 --live 之外,virsh 迁移还接受以下选项:
  • --direct - 用于直接迁移
  • --p2p - 用于 peer-to-peer 迁移
  • --tunneled - 用于隧道迁移
  • --offline - 在目标上不启动域定义而不在源主机上停止域。离线迁移可以与不活动域一起使用,且必须与 --persistent 选项一起使用。
  • --persistent - 在目标主机物理机器上保留域
  • --undefinesource - 取消定义源主机物理机器上的域
  • --suspend - 使域暂停在目标主机物理机器上
  • --change-protection - 强制执行不兼容的配置更改,在迁移过程中不会对域进行任何更改;在虚拟机监控程序支持时,该标志会隐式启用,但如果虚拟机监控程序缺少更改保护支持,则可以明确用于拒绝迁移。
  • --unsafe - 强制迁移进行,忽略所有安全程序。
  • --verbose - 在发生迁移时显示迁移的进度
  • --compressed - 激活在实时迁移过程中必须重复传输的内存页面压缩。
  • --abort-on-error - 如果在迁移过程中发生软错误(如 I/O 错误)取消迁移。
  • --domain [name] - 设置域名、id 或 uuid。
  • --desturi [URI] - 从客户端(常规迁移)或源(p2p 迁移)中看到的目标主机的连接 URI。
  • --migrateuri [URI] - 迁移 URI,通常可以省略。
  • --graphicsuri [URI] - 用于无缝图形迁移的图形 URI。
  • --listen-address [address] - 设置目标端管理程序应绑定到 的监听地址以进行传入迁移。
  • --timeout [seconds] - 当实时迁移计数器超过 N 秒时,强制客户机虚拟机挂起。它只能用于实时迁移。启动超时后,迁移将在暂停的客户机虚拟机上继续。
  • --dname [newname] - 用于在迁移期间重命名域,这通常也可省略
  • --XML [filename] - 指明的文件名可用于提供目标上使用的其他 XML 文件,以便为域 XML 的任何特定于主机的部分提供较大更改,如核算源和目的地之间的命名差异。通常省略这个选项。
  • --migrate-disks [disk_identifiers] - 这个选项可用于选择在迁移过程中复制哪些磁盘。这样,在复制某些磁盘时可以更有效地进行实时迁移,比如在目标上已存在或者它们不再有用时,或者它们不再有用。[ disk_identifiers] 应该由逗号分隔的磁盘列表替换,如在域 XML 文件的 <target dev= /> 行中找到的参数时。
另外,以下命令可能还会帮助:
  • virsh migrate-setmax downtime [domain ] [downtime] - 将为要实时迁移到其他主机的域设置最多可容忍的停机时间。指定停机时间以毫秒为单位。指定的域必须与正在迁移的域相同。
  • virsh migrate-compcache [domain] --size - 将设置或获得缓存的大小(以字节为单位),用于压缩实时迁移期间重复传输的内存页面。如果不使用 --size 时,命令会显示压缩缓存的当前大小。当使用 --size 时,且以字节为单位指定,管理程序会要求更改压缩以匹配指定的大小,如下为当前大小。在域被实时迁移为迁移进度时,应使用 --size 参数,并将压缩缓存数量从 domjobinfo 获取。
  • virsh migrate-setspeed [domain] [bandwidth] - 设置要迁移到其他主机的指定域的迁移带宽(以 Mib/sec 为单位)。
  • virsh migrate-getspeed [domain] - 获取可用于指定域的 Mib/sec 中的最大迁移带宽。
详情请查看 迁移限制 或者 virsh man page。

15.6. 使用 virt-manager 迁移

这部分论述了使用 virt-manager 将 KVM 客户机虚拟机从一台主机物理机器迁移到另一台主机。
  1. 连接到目标主机物理机器

    virt-manager 接口 中,通过选择" 文件 "菜单连接到目标主机物理机器,然后单击" 添加连接 "。
  2. 添加连接

    此时会出现 Add Connection 窗口。

    图 15.1. 向目标主机物理机器添加连接

    向目标主机物理机器添加连接
    输入以下详情:
    • 管理程序 :选择 QEMU/KVM
    • 方法 :选择连接方法。
    • 用户名 :输入远程主机物理机器的用户名。
    • 主机名 :输入远程主机物理机器的主机名。
    注意
    有关连接选项的详情请参考 第 19.5 节 “添加远程连接”
    连接。本例中使用了 SSH 连接,因此必须在下一步中输入指定的用户的密码。

    图 15.2. 输入密码

    输入密码
  3. 配置共享存储

    确保源和目标主机都是共享存储,例如使用 NFS
  4. 迁移客户端虚拟机

    在要迁移的 guest 中右键单击,然后单击 迁移
    New Host 字段中,使用下拉列表选择要将客户机虚拟机迁移到的主机物理计算机,然后单击 Migrate

    图 15.3. 选择目的地主机物理计算机并启动迁移过程

    选择目的地主机物理计算机并启动迁移过程
    此时会出现进度窗口。

    图 15.4. 进度窗口

    进度窗口
    如果迁移在没有问题的情况下完成,virt-manager 会显示在目标主机上运行的虚拟机。

    图 15.5. 在目标主机物理机器中运行的迁移的客户端虚拟机

    在目标主机物理机器中运行的迁移的客户端虚拟机

第 16 章 虚拟机设备配置

Red Hat Enterprise Linux 7 为客户机虚拟机支持三类设备:
  • 模拟设备 纯是模拟实际硬件的虚拟设备,允许未经修改的客户机操作系统使用其标准 in-box 驱动程序来与其配合使用。
  • VirtIO 设备 (也称为 半虚拟化)是纯粹的虚拟设备,设计为在虚拟机中最佳工作。VirtIO 设备与模拟设备类似,但默认情况下非 Linux 虚拟机不包含它们所需的驱动程序。虚拟化管理软件,如虚拟机管理器(virt-manager)和 Red Hat Virtualization Hypervisor,为支持的非 Linux 虚拟机操作系统自动安装这些驱动程序。Red Hat Enterprise Linux 7 支持 216 virtio 设备。如需更多信息,请参阅 第 5 章 KVM 半虚拟化(virtio)驱动程序
  • 分配的设备 是公开给虚拟机的物理设备。此方法也称为 passthrough。设备分配允许虚拟机独占访问 PCI 设备以实现一系列任务,并允许 PCI 设备看起来和行为,就像实际附加到客户端操作系统一样。Red Hat Enterprise Linux 7 每台虚拟机支持多达 32 个设备。
    PCIe 设备支持设备分配,包括 选择图形设备。并行 PCI 设备可能作为分配的设备支持,但由于安全性和系统配置冲突,它们存在严重的限制。
Red Hat Enterprise Linux 7 支持将 PCI 热插拔作为虚拟机单一功能插槽公开的。可以配置单一功能的主机设备以及多功能多主机设备的各个功能来启用此功能。仅建议非热插拔应用程序将设备作为多功能 PCI 插槽公开。
有关具体设备和相关限制的详情请参考 第 23.17 节 “Devices”
注意
对于中断重新映射的平台支持,需要将客户机与主机中分配的设备进行完全隔离。如果没有这样的支持,主机可能会被受到攻击,以中断恶意客户机的注入攻击。在客户受信任的环境中,管理员可能选择使用 allow_unsafe_interrupts 选项为 vfio_iommu_type1 模块来允许 PCI 设备分配。这可以通过在 /etc/modprobe.d 中添加 .conf 文件(如 local.conf)来永久完成:
options vfio_iommu_type1 allow_unsafe_interrupts=1
或者使用 sysfs 条目动态执行相同的操作:
# echo 1 > /sys/module/vfio_iommu_type1/parameters/allow_unsafe_interrupts

16.1. PCI 设备

PCI 设备分配只在支持 Intel VT-d 或 AMD IOMMU 的硬件平台中使用。在主机 BIOS 中必须启用这些 Intel VT-d 或 AMD IOMMU 规格,才能使 PCI 设备分配正常工作。

过程 16.1. 为 PCI 设备分配准备 Intel 系统

  1. 启用 Intel VT-d 规格

    Intel VT-d 规范提供对直接向虚拟机分配物理设备的硬件支持。在 Red Hat Enterprise Linux 中使用 PCI 设备分配需要这些规格。
    在 BIOS 中必须启用 Intel VT-d 规格。有些系统制造商默认禁用这些规格。查看这些规格的术语在制造商之间可能会不同;请咨询您的系统制造商文档,了解相关条款。
  2. 在内核中激活 Intel VT-d

    /etc/sysconfig/grub 文件内添加 intel_iommu=oniommu=pt 参数,在内核中激活 Intel VT-d。
    以下示例是启用了 Intel VT-d 的已修改 GRUB 文件。
    GRUB_CMDLINE_LINUX="rd.lvm.lv=vg_VolGroup00/LogVol01
    vconsole.font=latarcyrheb-sun16 rd.lvm.lv=vg_VolGroup_1/root
    vconsole.keymap=us $([ -x /usr/sbin/rhcrashkernel-param ] && /usr/sbin/
    rhcrashkernel-param || :) rhgb quiet intel_iommu=on iommu=pt"
  3. 重新生成配置文件

    运行以下命令来重新生成 /etc/grub2.cfg:
    grub2-mkconfig -o /etc/grub2.cfg
    请注意,如果您使用基于 UEFI 的主机,则目标文件应当是 /etc/grub2-efi.cfg
  4. 随时使用

    重启系统以启用更改。您的系统现在可以分配 PCI 设备。

过程 16.2. 为 PCI 设备分配准备 AMD 系统

  1. 启用 AMD IOMMU 规格

    在 Red Hat Enterprise Linux 中使用 PCI 设备分配需要 AMD IOMMU 规格。在 BIOS 中必须启用这些规格。有些系统制造商默认禁用这些规格。
  2. 启用 IOMMU 内核支持

    /etc/sysconfig/grub 中的引号内,将 iommu=pt 附加到 GRUB_CMDLINX_LINUX 行的末尾,以便在启动时启用 AMD IOMMU 规格。
  3. 重新生成配置文件

    运行以下命令来重新生成 /etc/grub2.cfg:
    grub2-mkconfig -o /etc/grub2.cfg
    请注意,如果您使用基于 UEFI 的主机,则目标文件应当是 /etc/grub2-efi.cfg
  4. 随时使用

    重启系统以启用更改。您的系统现在可以分配 PCI 设备。
注意
有关 IOMMU 的详情,请参考 附录 E, 使用 IOMMU 组

16.1.1. 使用 virsh 分配 PCI 设备

这些步骤涵盖了将 PCI 设备分配给 KVM 管理程序上的虚拟机。
本例使用 PCIe 网络控制器和 PCI 标识符代码 pci_0000_01_00_0,以及一个名为 guest1-rhel7-64 的完全虚拟化客户端机器。

过程 16.3. 使用 virsh 为客户机虚拟机分配 PCI 设备

  1. 确定设备

    首先,识别为分配给虚拟机的设备分配的 PCI 设备。使用 lspci 命令列出可用的 PCI 设备。您可以使用 grep 重新定义 lspci 的输出。
    本例使用在以下输出中突出显示的以太网控制器:
    # lspci | grep Ethernet
    00:19.0 Ethernet controller: Intel Corporation 82567LM-2 Gigabit Network Connection
    01:00.0 Ethernet controller: Intel Corporation 82576 Gigabit Network Connection (rev 01)
    01:00.1 Ethernet controller: Intel Corporation 82576 Gigabit Network Connection (rev 01)
    此时会显示这个以太网控制器,其简短标识符 00:19.0。我们需要找到 virsh 使用的完整标识符,以将此 PCI 设备分配给虚拟机。
    为此,请使用 virsh nodedev-list 命令列出附加到主机机器的特定类型(pci)的所有设备。然后查看映射到您要使用的设备的简短标识符的字符串的输出。
    本例显示了使用简短标识符 00:19.0 映射到以太网控制器的字符串。请注意,:. 字符在完整的标识符中被替换为下划线。
    # virsh nodedev-list --cap pci
    pci_0000_00_00_0
    pci_0000_00_01_0
    pci_0000_00_03_0
    pci_0000_00_07_0
    pci_0000_00_10_0
    pci_0000_00_10_1
    pci_0000_00_14_0
    pci_0000_00_14_1
    pci_0000_00_14_2
    pci_0000_00_14_3
    pci_0000_00_19_0
    pci_0000_00_1a_0
    pci_0000_00_1a_1
    pci_0000_00_1a_2
    pci_0000_00_1a_7
    pci_0000_00_1b_0
    pci_0000_00_1c_0
    pci_0000_00_1c_1
    pci_0000_00_1c_4
    pci_0000_00_1d_0
    pci_0000_00_1d_1
    pci_0000_00_1d_2
    pci_0000_00_1d_7
    pci_0000_00_1e_0
    pci_0000_00_1f_0
    pci_0000_00_1f_2
    pci_0000_00_1f_3
    pci_0000_01_00_0
    pci_0000_01_00_1
    pci_0000_02_00_0
    pci_0000_02_00_1
    pci_0000_06_00_0
    pci_0000_07_02_0
    pci_0000_07_03_0
    记录映射到您要使用的设备的 PCI 设备号;其他步骤中这是必需的。
  2. 查看设备信息

    有关域、总线和功能的信息可从 virsh nodedev-dumpxml 命令的输出中获得:

    图 16.1. 转储内容

    
    # virsh nodedev-dumpxml pci_0000_00_19_0
    <device>
      <name>pci_0000_00_19_0</name>
      <parent>computer</parent>
      <driver>
        <name>e1000e</name>
      </driver>
      <capability type='pci'>
        <domain>0</domain>
        <bus>0</bus>
        <slot>25</slot>
        <function>0</function>
        <product id='0x1502'>82579LM Gigabit Network Connection</product>
        <vendor id='0x8086'>Intel Corporation</vendor>
        <iommuGroup number='7'>
          <address domain='0x0000' bus='0x00' slot='0x19' function='0x0'/>
        </iommuGroup>
      </capability>
    </device>
    
    
    注意
    IOMMU 组根据 IOMMU 的视角的可见性和隔离来确定。每个 IOMMU 组可以包含一个或多个设备。当存在多个设备时,必须声明 IOMMU 组内的所有端点,以便将该组中的所有设备分配给客户机。这也可以通过为客户机分配额外的端点,也可以使用 virsh nodedev-detach 从主机驱动程序中分离它们。单个组中包含的设备可能不在多个客户机间分割,或者在主机和客户机间分割。PCIe 根端口、交换机端口和网桥等非端点设备不应与主机驱动程序分离,而不会干扰分配端点。
    IOMMU 组中的设备可以使用 virsh nodedev-dumpxml 输出的 iommuGroup 部分确定。组的每个成员都在单独的 "address" 字段中提供。这些信息也可以在 sysfs 中使用以下内容:
    $ ls /sys/bus/pci/devices/0000:01:00.0/iommu_group/devices/
    输出示例如下:
    0000:01:00.0  0000:01:00.1
    要只为客户机分配 0000.01.00.0,在启动客户机前应该从主机分离未使用的端点:
    $ virsh nodedev-detach pci_0000_01_00_1
  3. 确定所需的配置详情

    如需配置文件所需的值,请参见 virsh nodedev-dumpxml pci_0000_00_19_0 命令的输出。
    示例设备具有以下值: bus = 0, 插槽 = 25, function = 0。十进制配置使用这三个值:
    bus='0'
    slot='25'
    function='0'
  4. 添加配置详情

    运行 virsh edit,指定虚拟机名称,并在 <devices> 部分添加一个设备条目,将 PCI 设备分配给客户机虚拟机。例如:
    # virsh edit guest1-rhel7-64

    图 16.2. 添加 PCI 设备

    
    <devices>
    	[...]
     <hostdev mode='subsystem' type='pci' managed='yes'>
       <source>
          <address domain='0' bus='0' slot='25' function='0'/>
       </source>
     </hostdev>
     [...]
    </devices>
    
    或者,运行 virsh attach-device,指定虚拟机名称和客户机 XML 文件:
    virsh attach-device guest1-rhel7-64 file.xml
    注意
    PCI 设备可以包括 可选的只读内存(ROM)模块 (也称为 ROM扩展 ROM ), 用于提供设备固件或预启动驱动程序(如 PXE)。通常,在使用 PCI 设备分配时,这些选项 ROM 也可在虚拟环境中工作,将物理 PCI 设备附加到虚拟机。
    但是,在某些情况下,选项 ROM 可能是不必要的。这可能会导致虚拟机引导速度变慢,或者该设备提供的预引导驱动程序与虚拟化不兼容,这可能会导致客户端操作系统引导失败。在这种情况下,红帽建议从虚拟机屏蔽选项 ROM。要做到这一点:
    1. 在主机上,验证要分配的设备是否具有扩展 ROM 基本地址寄存器(BAR)。要做到这一点,将 lspci -v 命令用于该设备,并检查包含以下内容的行:
      Expansion ROM at
    2. <rom bar='off'/> 元素作为客户机 XML 配置中的 <hostdev> 元素的子项添加:
      <hostdev mode='subsystem' type='pci' managed='yes'>
        <source>
           <address domain='0' bus='0' slot='25' function='0'/>
        </source>
        <rom bar='off'/>
      </hostdev>
      
  5. 启动虚拟机

    # virsh start guest1-rhel7-64
PCI 设备现在应该能够成功分配给虚拟机,并可供客户端操作系统访问。

16.1.2. 使用 virt-manager 分配 PCI 设备

PCI 设备可以使用图形 virt-manager 工具添加到客户机虚拟机中。以下流程将千兆位以太网控制器添加到客户机虚拟机中。

过程 16.4. 使用 virt-manager 为客户机虚拟机分配 PCI 设备

  1. 打开硬件设置

    打开 guest 虚拟机,然后单击添加硬件 按钮向虚拟机添加新设备。

    图 16.3. 虚拟机硬件信息窗口

    顶部任务栏上选择的信息按钮以及左侧菜单窗格中选择 Overview 的虚拟机硬件窗口。
  2. 选择 PCI 设备

    从左侧 的硬件 列表中选择 PCI 主机设备
    选择未使用的 PCI 设备。请注意,选择存在于其他客户机中的 PCI 设备 会导致错误。本例中使用了备用的音频控制器。单击 Finish 以完成设置。

    图 16.4. Add new virtual hardware 向导

    在左侧菜单窗格中选中了 PCI 主机设备的新虚拟硬件向导,在右菜单窗格中显示用于选择的主机设备列表。
  3. 添加新设备

    设置已完成,guest 虚拟机现在可以直接访问 PCI 设备。

    图 16.5. 虚拟机硬件信息窗口

    在左侧菜单窗格上选择信息按钮和"概述"按钮的虚拟机硬件窗口,在左侧菜单窗格中选择的虚拟机设备列表中显示新添加的 PCI 设备。
注意
如果设备分配失败,则同一 IOMMU 组中可能存在其他端点仍然附加到主机。无法使用 virt-manager 检索组信息,但 virsh 命令可用于分析 IOMMU 组的绑定,以及所需的 sequester 设备。
有关 IOMMU 组以及如何分离端点设备的更多信息,请参阅 注意 中的 第 16.1.1 节 “使用 virsh 分配 PCI 设备”

16.1.3. 使用 virt-install 的 PCI 设备分配

在使用 virt-install 命令安装客户机时,可以分配 PCI 设备。为此,请使用 --host-device 参数。

过程 16.5. 使用 virt-install 为虚拟机分配 PCI 设备

  1. 确定设备

    识别为分配给客户机虚拟机的设备分配的 PCI 设备。
    # lspci | grep Ethernet
    00:19.0 Ethernet controller: Intel Corporation 82567LM-2 Gigabit Network Connection
    01:00.0 Ethernet controller: Intel Corporation 82576 Gigabit Network Connection (rev 01)
    01:00.1 Ethernet controller: Intel Corporation 82576 Gigabit Network Connection (rev 01)
    virsh nodedev-list 命令列出与系统连接的所有设备,并使用字符串来识别每个 PCI 设备。要只把输出限制为 PCI 设备,请输入以下命令:
    # virsh nodedev-list --cap pci
    pci_0000_00_00_0
    pci_0000_00_01_0
    pci_0000_00_03_0
    pci_0000_00_07_0
    pci_0000_00_10_0
    pci_0000_00_10_1
    pci_0000_00_14_0
    pci_0000_00_14_1
    pci_0000_00_14_2
    pci_0000_00_14_3
    pci_0000_00_19_0
    pci_0000_00_1a_0
    pci_0000_00_1a_1
    pci_0000_00_1a_2
    pci_0000_00_1a_7
    pci_0000_00_1b_0
    pci_0000_00_1c_0
    pci_0000_00_1c_1
    pci_0000_00_1c_4
    pci_0000_00_1d_0
    pci_0000_00_1d_1
    pci_0000_00_1d_2
    pci_0000_00_1d_7
    pci_0000_00_1e_0
    pci_0000_00_1f_0
    pci_0000_00_1f_2
    pci_0000_00_1f_3
    pci_0000_01_00_0
    pci_0000_01_00_1
    pci_0000_02_00_0
    pci_0000_02_00_1
    pci_0000_06_00_0
    pci_0000_07_02_0
    pci_0000_07_03_0
    记录 PCI 设备编号;其他步骤中需要数字。
    有关域、总线和功能的信息可从 virsh nodedev-dumpxml 命令的输出中获得:
    # virsh nodedev-dumpxml pci_0000_01_00_0

    图 16.6. PCI 设备文件内容

    
    <device>
      <name>pci_0000_01_00_0</name>
      <parent>pci_0000_00_01_0</parent>
      <driver>
        <name>igb</name>
      </driver>
      <capability type='pci'>
        <domain>0</domain>
        <bus>1</bus>
        <slot>0</slot>
        <function>0</function>
        <product id='0x10c9'>82576 Gigabit Network Connection</product>
        <vendor id='0x8086'>Intel Corporation</vendor>
        <iommuGroup number='7'>
          <address domain='0x0000' bus='0x00' slot='0x19' function='0x0'/>
        </iommuGroup>
      </capability>
    </device>
    
    注意
    如果在 IOMMU 组中有多个端点,且并非所有端点都分配给客户端,则需要在启动客户端前运行以下命令从主机中手动分离其他端点:
    $ virsh nodedev-detach pci_0000_00_19_1
    有关 IOMMU 组的更多信息,请参阅 注意 中的 第 16.1.1 节 “使用 virsh 分配 PCI 设备”
  2. 添加设备

    使用 virsh nodedev 命令的 PCI 标识符输出作为 --host-device 参数的值。
    virt-install \
    --name=guest1-rhel7-64 \
    --disk path=/var/lib/libvirt/images/guest1-rhel7-64.img,size=8 \
    --vcpus=2 --ram=2048 \
    --location=http://example1.com/installation_tree/RHEL7.0-Server-x86_64/os \
    --nonetworks \
    --os-type=linux \
    --os-variant=rhel7
    --host-device=pci_0000_01_00_0
  3. 完成安装

    完成客户机安装。PCI 设备应连接到客户机。

16.1.4. 分离分配的 PCI 设备

当主机 PCI 设备分配给客户机机器时,主机将不再使用该设备。如果 PCI 设备处于 受管 模式(使用 域 XML 文件中的 managed='yes 参数进行配置),它会连接到客户端机器并从客户端机器分离,并根据需要重新连接到主机机器。如果 PCI 设备没有处于 受管 模式,您可以将 PCI 设备从虚拟客户机中分离,并使用 virshvirt-manager 重新连接。

过程 16.6. 使用 virsh 从客户机中分离 PCI 设备

  1. 分离设备

    使用以下命令,在客户机的 XML 文件中删除 PCI 设备来从客户机中分离 PCI 设备:
    # virsh detach-device name_of_guest file.xml
  2. 重新将设备附加到主机(可选)

    如果设备处于 受管 模式,则跳过此步骤。该设备将自动返回到主机。
    如果设备没有使用 受管 模式,使用以下命令将 PCI 设备重新关联到主机机器:
    # virsh nodedev-reattach device
    例如,要将 pci_0000_01_00_0 设备重新关联到主机:
    # virsh nodedev-reattach pci_0000_01_00_0
    该设备现在可供主机使用。

过程 16.7. 使用 virt-manager 从客户机中分离 PCI 设备

  1. 打开虚拟硬件详情屏幕

    virt-manager 中,双击包含该设备的虚拟机。选择 Show virtual hardware details 按钮,以显示虚拟硬件列表。

    图 16.7. 虚拟硬件详情按钮

    显示虚拟硬件详细信息按钮。
  2. 选择并删除该设备

    从左侧面板中的虚拟设备列表选择要分离的 PCI 设备。

    图 16.8. 选择要分离的 PCI 设备

    PCI 设备详情和删除按钮。
    单击删除按钮 确认。该设备现在可供主机使用。

16.1.5. PCI Bridges

外围设备组件互联(PCI)网桥用于附加到网卡、模式和声卡等设备。就像其物理对应设备一样,虚拟设备也可以附加到 PCI 网桥。过去,任何客户机虚拟机只能添加 31 个 PCI 设备。现在,当添加 31st PCI 设备时,PCI 网桥会自动放置在 31st 插槽中,将额外 PCI 设备移到 PCI 网桥。每个 PCI 网桥都有 31 个插槽用于 31 个设备,它们都可以是网桥的。这样,客户机虚拟机可以使用超过 900 个设备。
有关 PCI 网桥的 XML 配置示例,请参阅 PCI Bridge 的 Domain XML 示例。请注意,此配置是自动设置的,我们不推荐手动调整。

16.1.6. PCI 设备分配限制

PCI 设备分配(将 PCI 设备附加到虚拟机)需要主机系统具有 AMD IOMMU 或 Intel VT-d 支持,以启用 PCIe 设备的设备分配。
Red Hat Enterprise Linux 7 通过客户机设备驱动程序访问有限的 PCI 配置空间。这个限制可能会导致扩展 PCI 配置空间中取决于设备功能或功能的驱动程序失败。
每个 Red Hat Enterprise Linux 7 虚拟机有总计 32 个设备。这转换为 32 个 PCI 功能,无论虚拟机中存在 PCI 网桥的数量,或者如何合并这些功能来创建多功能插槽。
对于中断重新映射的平台支持,需要将客户机与主机中分配的设备进行完全隔离。如果没有这样的支持,主机可能会被受到攻击,以中断恶意客户机的注入攻击。在客户机受信任的环境中,管理员可能选择是否允许 PCI 设备分配使用 vfio_iommu_type1 模块的 allow_unsafe_interrupts 选项。这可以通过在 /etc/modprobe.d 中添加 .conf 文件(如 local.conf)来永久完成:
options vfio_iommu_type1 allow_unsafe_interrupts=1
或者使用 sysfs 条目动态执行相同的操作:
# echo 1 > /sys/module/vfio_iommu_type1/parameters/allow_unsafe_interrupts

16.2. 使用 SR-IOV 设备的 PCI 设备分配

PCI 网络设备(在域 XML 中由 <源> 元素指定)可以使用直接设备分配(有时称为 passthrough)直接连接到客户机。 由于标准单一以太网卡驱动程序设计的限制,只能为客户机分配 单根 I/O 虚拟化 (SR-IOV) 虚拟功能(VF )设备;若要为客户机分配标准单端口 PCI 或 PCIe 以太网卡,请使用传统的 <hostdev> 设备定义。

图 16.9. PCI 设备分配的 XML 示例


     <devices>
    <interface type='hostdev'>
      <driver name='vfio'/>
      <source>
        <address type='pci' domain='0x0000' bus='0x00' slot='0x07' function='0x0'/>
      </source>
      <mac address='52:54:00:6d:90:02'>
      <virtualport type='802.1Qbh'>
        <parameters profileid='finance'/>
      </virtualport>
    </interface>
  </devices>
由 PCI-SIG(PCI Special Interest Group)开发,单一根 I/O 虚拟化(SR-IOV)规格是一种标准的 PCI 设备分配,可以将单个设备共享给多个虚拟机。SR-IOV 提高虚拟机的设备性能。

图 16.10. SR-IOV 的工作原理

SR-IOV 的工作原理
SR-IOV 支持单根功能(例如,单个以太网端口)来显示为多个、独立的物理设备。可以将具有 SR-IOV 功能的物理设备配置为作为多种功能出现在 PCI 配置空间中。每个设备都有其自身的配置空间完成 Base Address Registers(BAR)。
SR-IOV 使用两个 PCI 功能:
  • 物理功能(PF)是包含 SR-IOV 功能的完整 PCIe 设备。发现、托管和配置为普通 PCI 设备的物理功能。物理功能通过分配虚拟功能配置和管理 SR-IOV 功能。
  • 虚拟功能(VF)是简单的 PCIe 功能,仅处理 I/O。每个虚拟功能都源自物理功能。设备可能拥有的虚拟功能数量受设备硬件的限制。单个以太网设备(物理设备)可映射到可共享虚拟机的许多虚拟功能。
管理程序可向虚拟机分配一个或多个虚拟功能。虚拟功能的配置空间将分配给提供给 guest 的配置空间。
每个虚拟功能每次只能分配给一个客户机,因为虚拟功能需要实际硬件资源。虚拟机可以有多个虚拟功能。虚拟功能显示为网卡的方式,其方式与常规网卡出现在操作系统中一样。
SR-IOV 驱动程序在内核中实现。核心实施包含在 PCI 子系统中,但还必须对物理功能(PF)和虚拟功能(VF)设备提供驱动程序支持。具有 SR-IOV 功能的设备可以从 PF 分配 VF。VF 显示为 PCI 设备,它们根据队列和注册集等资源在物理 PCI 设备上支持。

16.2.1. SR-IOV 的优点

SR-IOV 设备可以与多个虚拟机共享单个物理端口。
当为虚拟机分配了 SR-IOV VF 时,可以将其配置为(与虚拟机完全转换为虚拟机)会将所有网络流量都离开于特定的 VLAN。虚拟机无法检测到其流量是否已标记为 VLAN,且无法更改或消除此标记。
虚拟功能具有接近原生的性能,比半虚拟化驱动程序和仿真访问提供更好的性能。虚拟功能提供与数据在同一物理服务器上虚拟机之间的数据保护,由硬件控制。
这些功能允许在数据中心中的主机上增加虚拟机密度。
SR-IOV 更好地利用多个客户机的设备带宽。

16.2.2. 使用 SR-IOV

本节介绍了使用 PCI 透传将支持 SR-IOV 的虚拟功能(multiport 网卡)为虚拟机为虚拟机分配为网络设备。
通过添加带有 virsh editvirsh attach-device 命令的 <hostdev> 中的设备条目,可将 SR-IOV 虚拟功能(VF)分配给虚拟机。但是,这个问题可能会有问题,因为与常规网络设备不同,SR-IOV VF 网络设备没有永久唯一的 MAC 地址,每次主机重启时都会分配一个新的 MAC 地址。因此,即使客户端重启后分配了相同的 VF,当主机重启时,客户机确定其网络适配器具有新的 MAC 地址。因此,客户机在每次都连接了新硬件,通常需要对客户机的网络设置进行重新配置。
libvirt 包含 <interface type='hostdev'> 接口设备。通过使用此接口设备,libvirt 将首先执行指示的任何网络特定硬件/交换机初始化(如设置 MAC 地址、VLAN 标签或 802.1Qbh 虚拟端口参数),然后对客户机执行 PCI 设备分配。
使用 <interface type='hostdev'> 接口设备需要:
  • 支持 SR-IOV 的网卡,
  • 支持 Intel VT-d 或 AMD IOMMU 扩展的主机硬件
  • 要分配的 VF 的 PCI 地址。
重要
将 SR-IOV 设备分配给虚拟机需要主机硬件支持 Intel VT-d 或 AMD IOMMU 规格。
要在 Intel 或 AMD 系统中附加 SR-IOV 网络设备,请按照以下步骤执行:

过程 16.8. 在 Intel 或 AMD 系统中附加 SR-IOV 网络设备

  1. 在 BIOS 和内核中启用 Intel VT-d 或者 AMD IOMMU 规格

    在 Intel 系统中,在 BIOS 中启用 Intel VT-d(如果尚未启用)。请参阅 过程 16.1, “为 PCI 设备分配准备 Intel 系统” 在 BIOS 和内核中启用 Intel VT-d 中的程序帮助。
    如果 Intel VT-d 已经启用并正常工作,请跳过这一步。
    在 AMD 系统中,在 BIOS 中启用 AMD IOMMU 规格(如果尚未启用)。请参阅 过程 16.2, “为 PCI 设备分配准备 AMD 系统” 有关在 BIOS 中启用 IOMMU 的过程帮助。
  2. 验证支持

    验证是否检测到具有 SR-IOV 功能的 PCI 设备。这个示例列出了支持 SR-IOV 的 Intel 82576 网络接口卡。使用 lspci 命令验证该设备是否已检测到。
    # lspci
    03:00.0 Ethernet controller: Intel Corporation 82576 Gigabit Network Connection (rev 01)
    03:00.1 Ethernet controller: Intel Corporation 82576 Gigabit Network Connection (rev 01)
    请注意,输出已被修改来删除所有其它设备。
  3. 激活虚拟功能

    运行以下命令:
    # echo ${num_vfs} > /sys/class/net/enp14s0f0/device/sriov_numvfs
  4. 使虚拟功能持久

    要使虚拟功能在重新引导时持久保留,请使用您选择的编辑器创建类似如下的 udev 规则,其中指定 VF 的预期数量(本例中为 2),最多使用网络接口卡支持的限制。在以下示例中,将 enp14s0f0 替换为 PF 网络设备名称,并调整 ENV{ID_NET_DRIVER} 值以匹配正在使用的驱动程序:
    # vim /etc/udev/rules.d/enp14s0f0.rules
    ACTION=="add", SUBSYSTEM=="net", ENV{ID_NET_DRIVER}=="ixgbe",
    ATTR{device/sriov_numvfs}="2"
    
    这将确保在引导时启用该功能。
  5. 检查新的虚拟功能

    使用 lspci 命令,列出附加到 Intel 82576 网络设备的新增虚拟功能。(此外,使用 grep 搜索 虚拟功能,以搜索支持虚拟功能的设备。)
    # lspci | grep 82576
    0b:00.0 Ethernet controller: Intel Corporation 82576 Gigabit Network Connection (rev 01)
    0b:00.1 Ethernet controller: Intel Corporation 82576 Gigabit Network Connection (rev 01)
    0b:10.0 Ethernet controller: Intel Corporation 82576 Virtual Function (rev 01)
    0b:10.1 Ethernet controller: Intel Corporation 82576 Virtual Function (rev 01)
    0b:10.2 Ethernet controller: Intel Corporation 82576 Virtual Function (rev 01)
    0b:10.3 Ethernet controller: Intel Corporation 82576 Virtual Function (rev 01)
    0b:10.4 Ethernet controller: Intel Corporation 82576 Virtual Function (rev 01)
    0b:10.5 Ethernet controller: Intel Corporation 82576 Virtual Function (rev 01)
    0b:10.6 Ethernet controller: Intel Corporation 82576 Virtual Function (rev 01)
    0b:10.7 Ethernet controller: Intel Corporation 82576 Virtual Function (rev 01)
    0b:11.0 Ethernet controller: Intel Corporation 82576 Virtual Function (rev 01)
    0b:11.1 Ethernet controller: Intel Corporation 82576 Virtual Function (rev 01)
    0b:11.2 Ethernet controller: Intel Corporation 82576 Virtual Function (rev 01)
    0b:11.3 Ethernet controller: Intel Corporation 82576 Virtual Function (rev 01)
    0b:11.4 Ethernet controller: Intel Corporation 82576 Virtual Function (rev 01)
    0b:11.5 Ethernet controller: Intel Corporation 82576 Virtual Function (rev 01)
    PCI 设备标识符通过 lspci 命令的 -n 参数找到。物理功能与 0b:00.00b:00.1 对应。所有虚拟功能在描述中包含 虚拟功能
  6. 使用 virsh 验证设备是否存在

    libvirt 服务必须在向虚拟机中添加设备前识别该设备。libvirt 使用与 lspci 输出类似的标记。lspci 输出的所有标点字符 :. 均更改为下划线(_)。
    使用 virsh nodedev-list 命令和 grep 命令从可用主机设备列表中过滤 Intel 82576 网络设备。0b 是本例中 Intel 82576 网络设备的过滤器。这可能会因您的系统而异,并可能导致额外的设备。
    # virsh nodedev-list | grep 0b
    pci_0000_0b_00_0
    pci_0000_0b_00_1
    pci_0000_0b_10_0
    pci_0000_0b_10_1
    pci_0000_0b_10_2
    pci_0000_0b_10_3
    pci_0000_0b_10_4
    pci_0000_0b_10_5
    pci_0000_0b_10_6
    pci_0000_0b_11_7
    pci_0000_0b_11_1
    pci_0000_0b_11_2
    pci_0000_0b_11_3
    pci_0000_0b_11_4
    pci_0000_0b_11_5
    虚拟功能和物理功能的 PCI 地址应该位于列表中。
  7. 使用 virsh 获取设备详情

    pci_0000_0b_00_0 是物理功能之一,pci_0000_0b_10_0 是物理功能第一个对应的虚拟功能。使用 virsh nodedev-dumpxml 命令获取这两个设备的详情。
    # virsh nodedev-dumpxml pci_0000_03_00_0
    <device>
      <name>pci_0000_03_00_0</name>
      <path>/sys/devices/pci0000:00/0000:00:01.0/0000:03:00.0</path>
      <parent>pci_0000_00_01_0</parent>
      <driver>
        <name>igb</name>
      </driver>
      <capability type='pci'>
        <domain>0</domain>
        <bus>3</bus>
        <slot>0</slot>
        <function>0</function>
        <product id='0x10c9'>82576 Gigabit Network Connection</product>
        <vendor id='0x8086'>Intel Corporation</vendor>
        <capability type='virt_functions'>
          <address domain='0x0000' bus='0x03' slot='0x10' function='0x0'/>
          <address domain='0x0000' bus='0x03' slot='0x10' function='0x2'/>
          <address domain='0x0000' bus='0x03' slot='0x10' function='0x4'/>
          <address domain='0x0000' bus='0x03' slot='0x10' function='0x6'/>
          <address domain='0x0000' bus='0x03' slot='0x11' function='0x0'/>
          <address domain='0x0000' bus='0x03' slot='0x11' function='0x2'/>
          <address domain='0x0000' bus='0x03' slot='0x11' function='0x4'/>
        </capability>
        <iommuGroup number='14'>
          <address domain='0x0000' bus='0x03' slot='0x00' function='0x0'/>
          <address domain='0x0000' bus='0x03' slot='0x00' function='0x1'/>
        </iommuGroup>
      </capability>
    </device>
    # virsh nodedev-dumpxml pci_0000_03_11_5
    <device>
      <name>pci_0000_03_11_5</name>
      <path>/sys/devices/pci0000:00/0000:00:01.0/0000:03:11.5</path>
      <parent>pci_0000_00_01_0</parent>
      <driver>
        <name>igbvf</name>
      </driver>
      <capability type='pci'>
        <domain>0</domain>
        <bus>3</bus>
        <slot>17</slot>
        <function>5</function>
        <product id='0x10ca'>82576 Virtual Function</product>
        <vendor id='0x8086'>Intel Corporation</vendor>
        <capability type='phys_function'>
          <address domain='0x0000' bus='0x03' slot='0x00' function='0x1'/>
        </capability>
        <iommuGroup number='35'>
          <address domain='0x0000' bus='0x03' slot='0x11' function='0x5'/>
        </iommuGroup>
      </capability>
    </device>
    本例将虚拟功能 pci_0000_03_10_2 添加到第 8 步的虚拟机。请注意虚拟功能的 bus插槽 和功能参数:这些是添加该设备所必需的。
    将这些参数复制到临时 XML 文件中,例如 /tmp/new-interface.xml
       <interface type='hostdev' managed='yes'>
         <source>
           <address type='pci' domain='0x0000' bus='0x03' slot='0x10' function='0x2'/>
         </source>
       </interface>
    注意
    当虚拟机启动时,它应该会看到物理适配器提供的类型的网络设备,并配置了 MAC 地址。此 MAC 地址将在主机间保持不变,并且 guest 重新启动。
    以下 <interface> 示例显示可选 <mac address><virtualport><vlan> 元素的语法。在实践中,使用 <vlan><virtualport> 元素,不能同时使用这两个元素,如示例所示:
    ...
     <devices>
       ...
       <interface type='hostdev' managed='yes'>
         <source>
           <address type='pci' domain='0' bus='11' slot='16' function='0'/>
         </source>
         <mac address='52:54:00:6d:90:02'>
         <vlan>
            <tag id='42'/>
         </vlan>
         <virtualport type='802.1Qbh'>
           <parameters profileid='finance'/>
         </virtualport>
       </interface>
       ...
     </devices>
    如果您没有指定 MAC 地址,则会自动生成一个地址。<virtualport> 元素仅在连接到 802.11Qbh 硬件交换机时使用。<vlan> 元素将透明地将客户机的设备放在标记 42 的 VLAN 上。
  8. 将虚拟功能添加到虚拟机

    通过以下命令,将虚拟功能添加到虚拟机,以及上一步中创建的临时文件。这会立即附加新设备,并保存它以便在以后的客户机重启。
    virsh attach-device MyGuest /tmp/new-interface.xml --live --config
    
    使用 virsh attach-device 指定 --live 选项,将新设备附加到运行的客户机中。使用 --config 选项可确保新设备在以后的客户机重启后可用。
    注意
    只有在客户机运行时接受 --live 选项。如果在非运行的客户机中使用 --live 选项,则 virsh 将返回错误。
虚拟机检测到一个新的网卡。这个新卡是 SR-IOV 设备的虚拟功能。

16.2.3. 使用 SR-IOV 设备配置 PCI 分配

SR-IOV 网卡提供多个 VF,各自可使用 PCI 设备分配的客户机虚拟机单独分配给客户机虚拟机。分配后,每个操作都作为完整的物理网络设备运行。这允许很多客户机虚拟机获得直接 PCI 设备分配的性能优势,而仅在主机物理计算机上使用一个插槽。
这些 VF 可使用 <hostdev> 元素以传统方式分配给客户机虚拟机。但是,SR-IOV VF 网络设备没有永久唯一的 MAC 地址,这会导致在每次主机物理机器重启时客户机虚拟机的网络设置需要重新配置的问题。要解决这个问题,您需要在在每次引导客户机虚拟机后将 VF 分配给主机物理机器前设置 MAC 地址。要分配这个 MAC 地址以及其它选项,请参阅以下步骤:

过程 16.9. 配置 MAC 地址、vLAN 和虚拟端口,以在 SR-IOV 上分配 PCI 设备

<hostdev> 元素不能用于特定于函数的项目,如 MAC 地址分配、vLAN 标签 ID 分配或虚拟端口分配,因为 <mac><vlan><virtualport> 元素都不是 <hostdev> 的有效子项。相反,这些元素可以和 hostdev 接口类型一起使用: <interface type='hostdev'>。这个设备类型作为 <接口和> <hostdev> 的混合方式运行。因此,在将 PCI 设备分配给客户机虚拟机之前,libvirt 将初始化指定网络特定硬件/交换机(如设置 MAC 地址、设置 vLAN 标签)或与客户机虚拟机 XML 配置文件中的 802.1Qbh 开关关联。有关设置 vLAN 标签的详情,请参考 第 17.16 节 “设置 vLAN 标签”
  1. 收集信息

    要使用 <接口类型='hostdev'>,您必须具有支持 SR-IOV 的网卡,托管支持 Intel VT-d 或 AMD IOMMU 扩展的主机物理硬件,且必须知道您要分配的 VF 的 PCI 地址。
  2. 关闭客户端虚拟机

    使用 virsh shutdown 命令,关闭 guest 虚拟机 (这里名为 guestVM)。
    # virsh shutdown guestVM
  3. 打开 XML 文件进行编辑

    # virsh edit guestVM.xml
    可选 :对于由 virsh save 命令创建的 XML 配置文件,请运行:
    # virsh save-image-edit guestVM.xml --running 
    此示例中的 guestVM.xml 配置文件在默认编辑器中打开。如需更多信息,请参阅 第 20.7.5 节 “编辑客户机虚拟机配置”
  4. 编辑 XML 文件

    更新配置文件(guestVM.xml),使其具有类似如下的 <设备> 条目:

    图 16.11. hostdev 接口类型的域 XML 示例

    
     <devices>
       ...
       <interface type='hostdev' managed='yes'>
         <source>
           <address type='pci' domain='0x0' bus='0x00' slot='0x07' function='0x0'/> <!--these values can be decimal as well-->
         </source>
         <mac address='52:54:00:6d:90:02'/>                                         <!--sets the mac address-->
         <virtualport type='802.1Qbh'>                                              <!--sets the virtual port for the 802.1Qbh switch-->
           <parameters profileid='finance'/>
         </virtualport>
         <vlan>                                                                     <!--sets the vlan tag-->
          <tag id='42'/>
         </vlan>
       </interface>
       ...
     </devices>
    
    
    注意
    如果没有提供 MAC 地址,系统将自动生成,就像其他类型的接口设备一样。另外,只有当您连接到 802.11Qgh 硬件交换机时,才会使用 <virtualport> 元素。不支持 802.11Qbg(也称为 "VEPA")交换机。
  5. 重启客户机虚拟机

    运行 virsh start 命令,以重新启动您在第 2 步中关闭的 guest 虚拟机。如需更多信息,请参阅 第 20.6 节 “启动、恢复和恢复虚拟机”
     # virsh start guestVM 
    当客户机虚拟机启动时,它会看到由物理主机机器适配器提供的网络设备,且配置了 MAC 地址。此 MAC 地址在客户机虚拟机之间保持不变,主机物理机重新引导。

16.2.4. 从 SR-IOV 虚拟功能池设置 PCI 设备分配

将特定虚拟功能(VF)的 PCI 地址硬编码到客户机配置中有两个严重的限制:
  • 任何虚拟机启动后,指定的 VF 都必须可用。因此,管理员必须将每个 VF 永久分配给一个客户机虚拟机(或者修改每个客户机虚拟机的配置文件,以便在每次启动客户机虚拟机时都指定目前未使用的 VF 的 PCI 地址)。
  • 如果 guest 虚拟机移动到另一台主机物理计算机,则该主机物理计算机必须在 PCI 总线上的同一位置拥有完全相同的硬件(或者启动之前必须修改客户机虚拟机配置)。
通过在包含 SR-IOV 设备的所有 VF 的设备池创建一个 libvirt 网络,从而避免这两个问题。完成后,配置 guest 虚拟机以引用此网络。每次启动客户机时,都会从池中分配单个 VF,并分配给客户机虚拟机。当客户机虚拟机停止后,VF 将返回到池,供其他客户机虚拟机使用。

过程 16.10. 创建设备池

  1. 关闭客户端虚拟机

    使用 virsh shutdown 命令,关闭名为 guestVM 的客户机虚拟机
    # virsh shutdown guestVM
  2. 创建配置文件

    使用首选的编辑器,在 /tmp 目录中创建一个 XML 文件(名为 passthrough.xml )。确保将 pf dev='eth3' 替换为您自己的 SR-IOV 设备物理功能(PF)的 netdev 名称。
    以下是一个示例网络定义,该定义将在主机物理机器上使用 PF(在主机物理机器上使用 PF)提供 SR-IOV 适配器的所有 VF 池:

    图 16.12. 网络定义域 XML 示例

          
    <network>
       <name>passthrough</name> <!-- This is the name of the file you created -->
       <forward mode='hostdev' managed='yes'>
         <pf dev='myNetDevName'/>  <!-- Use the netdev name of your SR-IOV devices PF here -->
       </forward>
    </network>
          
    
    
  3. 加载新 XML 文件

    输入以下命令,将 /tmp/passthrough.xml 替换为您在上一步中创建的 XML 文件的名称和位置:
    # virsh net-define /tmp/passthrough.xml
  4. 重启客户端

    运行以下命令,将 passthrough.xml 替换为您在上一步中创建的 XML 文件的名称:
     # virsh net-autostart passthrough # virsh net-start passthrough 
  5. 重新启动 guest 虚拟机

    运行 virsh start 命令以在第一步中重启您关闭的客户机虚拟机(例如,使用 guestVM 作为客户机虚拟机的域名)。如需更多信息,请参阅 第 20.6 节 “启动、恢复和恢复虚拟机”
     # virsh start guestVM 
  6. 启动设备的透传

    虽然只会显示单一设备,但在客户机虚拟机首次启动时,libvirt 将自动获得与该 PF 关联的所有 VF 列表,如下所示:

    图 16.13. 接口网络定义的域 XML 示例

             
    <interface type='network'>
       <source network='passthrough'>
    </interface>
          
    
    
  7. 验证

    在启动使用网络的第一个客户机后,您可以运行 virsh net-dumpxml passthrough 命令进行验证 ; 您可能会得到类似如下的输出:

    图 16.14. XML 转储文件 透传 内容

          
    <network connections='1'>
       <name>passthrough</name>
       <uuid>a6b49429-d353-d7ad-3185-4451cc786437</uuid>
       <forward mode='hostdev' managed='yes'>
         <pf dev='eth3'/>
         <address type='pci' domain='0x0000' bus='0x02' slot='0x10' function='0x1'/>
         <address type='pci' domain='0x0000' bus='0x02' slot='0x10' function='0x3'/>
         <address type='pci' domain='0x0000' bus='0x02' slot='0x10' function='0x5'/>
         <address type='pci' domain='0x0000' bus='0x02' slot='0x10' function='0x7'/>
         <address type='pci' domain='0x0000' bus='0x02' slot='0x11' function='0x1'/>
         <address type='pci' domain='0x0000' bus='0x02' slot='0x11' function='0x3'/>
         <address type='pci' domain='0x0000' bus='0x02' slot='0x11' function='0x5'/>
       </forward>
    </network>
          
    
    

16.2.5. SR-IOV 限制

SR-IOV 只使用以下设备进行了彻底测试:
  • Intel® 82576NS Gigabit Ethernet Controller(igb 驱动程序)
  • Intel® 82576EB Gigabit Ethernet Controller(igb 驱动程序)
  • Intel® 82599ES 10 Gigabit Ethernet Controller(ixgbe 驱动程序)
  • Intel® 82599EB 10 Gigabit Ethernet Controller(ixgbe 驱动程序)
其他 SR-IOV 设备可能可以正常工作,但没有在发布时测试

16.3. USB 设备

本节提供了处理 USB 设备所需的命令。

16.3.1. 为客户机虚拟机分配 USB 设备

Web 相机、卡读取器、磁盘驱动器、键盘等大多数设备都使用 USB 端口和电缆连接到计算机。有两种方法可将这些设备传递给客户端虚拟机:
  • 使用 USB 透传 - 这需要将设备物理连接到托管客户机虚拟机的主机物理计算机。在这种情况下不需要 SPICE。主机上的 USB 设备可以在命令行或 virt-manager 中传递到 guest。有关 virt Manager 方向, 请参阅 第 19.3.2 节 “将 USB 设备附加到虚拟机”。请注意,virt-manager 指令不适合热插拔或热拔设备。如果要热插拔/或热拔 USB 设备,请参阅 过程 20.4, “热插拔 USB 设备供客户机虚拟机使用”
  • 使用 USB 重定向 - USB 在数据中心中运行的主机物理计算机时最好使用 USB 重定向。用户从本地机器或瘦客户端连接到其/及客户机虚拟机。此本地机器上有 SPICE 客户端。用户可以将任何 USB 设备附加到瘦客户端,SPICE 客户端会将设备重定向到数据中心中的主机物理机器,以便供瘦客户端上运行的客户机虚拟机使用。有关通过 virt-manager 的说明,请参阅 第 19.3.3 节 “USB 重定向”

16.3.2. 在 USB 设备重定向中设置限制

要从重定向过滤出某些设备,请将 filter 属性传递给 -device usb-redir。filter 属性使用一个由过滤规则组成的字符串,规则的格式是:
<class>:<vendor>:<product>:<version>:<allow>
使用 -1 值指定它接受特定字段的任何值。您可以使用 | 作为分隔符,在同一命令行中使用多个规则。请注意,如果设备不匹配通过规则,则不允许重定向该设备!

例 16.1. 使用客户机虚拟机限制重定向的示例

  1. 准备客户机虚拟机。
  2. 在客户机虚拟机的域 XML 文件中添加以下代码摘录:
        <redirdev bus='usb' type='spicevmc'>
          <alias name='redir0'/>
          <address type='usb' bus='0' port='3'/>
        </redirdev>
        <redirfilter>
          <usbdev class='0x08' vendor='0x1234' product='0xBEEF' version='2.0' allow='yes'/>
          <usbdev class='-1' vendor='-1' product='-1' version='-1' allow='no'/>
        </redirfilter>
    
  3. 启动客户机虚拟机并通过运行以下命令确认设置更改:
    #ps -ef | grep $guest_name
    -device usb-redir,chardev=charredir0,id=redir0,/
    filter=0x08:0x1234:0xBEEF:0x0200:1|-1:-1:-1:-1:0,bus=usb.0,port=3
  4. 将 USB 设备插入到主机物理计算机中,并使用 virt-manager 连接到客户机虚拟机。
  5. 在菜单中点击 USB 设备选择,这将生成以下信息:"主机策略会阻止某些 USB 设备"。单击确定以确认 并继续。
    过滤器生效。
  6. 为确保过滤器捕获正确检查 USB 设备供应商和产品,然后在主机物理计算机的域 XML 中进行以下更改以允许 USB 重定向。
       <redirfilter>
          <usbdev class='0x08' vendor='0x0951' product='0x1625' version='2.0' allow='yes'/>
          <usbdev allow='no'/>
        </redirfilter>
    
  7. 重新启动 guest 虚拟机,然后使用 virt-viewer 连接到客户机虚拟机。USB 设备现在会将流量重定向到客户机虚拟机。

16.4. 配置设备控制器

根据客户机虚拟机架构,一些设备总线可能多次出现,有一组绑定到虚拟控制器的虚拟设备。通常,libvirt 可以自动推断这样的控制器,无需显式 XML 标记,但在某些情况下最好显式设置虚拟控制器元素。

图 16.15. 虚拟控制器的域 XML 示例


  ...
  <devices>
    <controller type='ide' index='0'/>
    <controller type='virtio-serial' index='0' ports='16' vectors='4'/>
    <controller type='virtio-serial' index='1'>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x0a' function='0x0'/>
    </controller>
    ...
  </devices>
  ...
每个控制器都有一个强制属性 <控制器类型>,它必须是以下之一:
  • IDE
  • fdc
  • scsi
  • SATA
  • usb
  • ccid
  • virtio-serial
  • pci
<controller> 元素有一个强制属性 <控制器索引>,它是一个十进制整数,用于描述总线控制器被遇到的顺序(用于 <地址> 元素的控制器属性)。当控制器 <type ='virtio-serial'> 时,有两个额外可选属性( 指定端口向量),它们控制可以通过控制器连接的设备数量。
<当控制器 type ='scsi'> 时,有一个可选属性 模型,它可采用以下值:
  • auto
  • buslogic
  • ibmvscsi
  • lsilogic
  • lsisas1068
  • lsisas1078
  • virtio-scsi
  • vmpvscsi
<控制器类型 ='usb'> 时,有一个可选属性 模型,它可采用以下值:
  • piix3-uhci
  • piix4-uhci
  • ehci
  • ich9-ehci1
  • ich9-uhci1
  • ich9-uhci2
  • ich9-uhci3
  • vt82c686b-uhci
  • pci-ohci
  • nec-xhci
请注意,如果需要为客户机虚拟机明确禁用 USB 总线,可以使用 <model='none'>
对于作为 PCI 或 USB 总线中的设备本身的控制器,可选的子元素 <地址> 可以指定控制器到其主总线的确切关系,使用 第 16.5 节 “为设备设置地址” 所示的语义。
可选的 sub-element <驱动程序> 可以指定特定于驱动程序的选项。目前,它只支持属性队列,它指定控制器的队列数。为了获得最佳性能,建议指定一个与 vCPU 数量匹配的值。
USB 配套控制器有一个可选的子元素 <master>,以指定与其主控制器相配的确切关系。配套控制器位于与其 master 的同一总线上,因此相应的 索引 值应该相等。
可以使用的 XML 示例:

图 16.16. USB 控制器的域 XML 示例

   
     ...
  <devices>
    <controller type='usb' index='0' model='ich9-ehci1'>
      <address type='pci' domain='0' bus='0' slot='4' function='7'/>
    </controller>
    <controller type='usb' index='0' model='ich9-uhci1'>
      <master startport='0'/>
      <address type='pci' domain='0' bus='0' slot='4' function='0' multifunction='on'/>
    </controller>
    ...
  </devices>
  ...
   

PCI 控制器具有具有以下可能值的可选 模型 属性:
  • pci-root
  • pcie-root
  • pci-bridge
  • dmi-to-pci-bridge
对于提供隐式 PCI 总线的机器类型,pci-root 控制器使用 index='0' 是自动添加的,且需要使用 PCI 设备。pci-root 没有地址。如果对由 model='pci-root' 或指定大于零的 PCI 总线,则存在太多的设备适合一个总线上,则会自动添加 PCI 网桥。也可以手动指定 PCI 网桥,但其地址应该只看到已经指定的 PCI 控制器提供的 PCI 总线。在 PCI 控制器索引中造成空白可能会导致无效的配置。以下 XML 示例可添加到 <devices> 部分:

图 16.17. PCI 网桥的域 XML 示例


  ...
  <devices>
    <controller type='pci' index='0' model='pci-root'/>
    <controller type='pci' index='1' model='pci-bridge'>
      <address type='pci' domain='0' bus='0' slot='5' function='0' multifunction='off'/>
    </controller>
  </devices>
  ...
对于提供隐式 PCI Express 总线(例如,基于 Q35 芯片组的机器类型),带有 index='0' 的 pcie-root 控制器已自动添加到域的配置。pcie-root 也没有地址,但提供 31 插槽(数字为 1-31),且只能附加到 PCIe 设备。要在具有 pcie-root 控制器的系统中连接标准 PCI 设备,会自动添加带有 model='dmi-to-pci-bridge 的 pci 控制器。dmi-to-pci-bridge 控制器插件到一个 PCIe 插槽(由 pcie-root 提供),并且自己提供 31 标准 PCI 插槽(这不是热插拔的)。为了在客户机系统中具有热插拔 PCI 插槽,则也会自动创建 pci-bridge 控制器,并连接到自动创建的 dmi-to-pci-bridge 控制器中的一个插槽;所有具有 PCI 地址的客户机设备均会被放置到此 pci-bridge 设备上。

图 16.18. PCIe 的域 XML 示例(PCI express)

   
     ...
  <devices>
    <controller type='pci' index='0' model='pcie-root'/>
    <controller type='pci' index='1' model='dmi-to-pci-bridge'>
      <address type='pci' domain='0' bus='0' slot='0xe' function='0'/>
    </controller>
    <controller type='pci' index='2' model='pci-bridge'>
      <address type='pci' domain='0' bus='1' slot='1' function='0'/>
    </controller>
  </devices>
  ...
   

以下 XML 配置用于 USB 3.0 / xHCI 模拟:

图 16.19. USB3/xHCI 设备的域 XML 示例

   
     ...
  <devices>
    <controller type='usb' index='3' model='nec-xhci'>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x0f' function='0x0'/>
    </controller>
  </devices>
    ...

16.5. 为设备设置地址

许多设备具有可选 <的地址> 子元素,用于描述将设备放置在虚拟客户机的虚拟总线中的位置。如果在输入中省略了地址(或地址中的任何可选属性),libvirt 将生成适当的地址;但是,如果需要更多地控制布局,则需要明确的地址。有关包含 <地址> 元素的域 XML 设备示例,请参考 图 16.9 “PCI 设备分配的 XML 示例”
每个地址都有一个强制属性 类型,用于描述该设备所在的总线。选择为给定设备使用的地址将在设备和客户机虚拟机的架构中限制。例如,<磁盘设备> 使用 type='drive',而 <控制台> 设备在 i686 或 x86_64 客户机虚拟机架构上使用 type='pci'。每个地址类型都有进一步可选的属性,这些属性控制该设备在总线中的位置,如表中所述:
表 16.1. 支持的设备类型
地址类型 描述
type='pci' PCI 地址有以下额外属性:
  • 域(2 字节十六进制整数,目前不供 qemu 使用)
  • 总线(包含 0 到 0xff 的十六进制值)
  • 插槽(包含 0x0 到 0x1f 的十六进制值)
  • 功能(包含 0 到 7 之间的值)
  • 在 PCI 控制中,对于 PCI 控制寄存器的特定插槽/功能,多功能控制打开了多功能,默认情况下,它被设置为 'off',但应设置为 'on',用于使用多个功能的插槽 0。
type='drive' 驱动器地址有以下额外属性:
  • 控制器(2 位控制器数)
  • 总线(一个 2 位总线号
  • 目标(2 位总线号)
  • 单元(总线中的 2 位单元号)
type='virtio-serial' 每个 virtio-serial 地址有以下额外属性:
  • 控制器(2 位控制器数)
  • 总线(2 位总线号)
  • 插槽(总线中的 2 位插槽)
type='ccid' 用于 smart-cards 的 CCID 地址有以下额外属性:
  • 总线(2 位总线号)
  • 插槽属性(总线中的 2 位插槽)
type='usb' USB 地址有以下额外属性:
  • 总线(包含 0 到 0xfff 的十六进制值)
  • 端口(最多四个八位字节表示法,如 1.2 或 2.1.3.1)
type='isa' ISA 地址有以下额外属性:
  • iobase
  • IRQ

16.6. 随机数字生成器设备

随机数生成器对于操作系统安全性非常重要。为了保护虚拟操作系统,红帽企业 Linux 7 包含 virtio-rng,这是一个虚拟硬件随机数生成器设备,可根据需要为 guest 提供全新的熵。
在主机物理计算机上,硬件 RNG 接口在 /dev/hwrng 处创建一个 chardev,它可以打开,然后从主机物理机器读取提取熵。在与 rngd 守护进程的合作中,主机物理计算机中的熵可以路由到客户机虚拟机的 /dev/random,这是随机性的主要来源。
当键盘、鼠标和其他输入等设备在客户机虚拟机上生成足够的熵时,使用随机数生成器特别有用。虚拟随机数生成器设备允许主机物理计算机将熵传递到客户端虚拟机操作系统。 此过程可以通过命令行或 virt-manager 接口执行。具体步骤请查看以下操作。有关 virtio-rng 的详情请参考 Red Hat Enterprise Linux 虚拟机:访问随机数字 Made Easy

过程 16.11. 使用虚拟机管理器实施 virtio-rng

  1. 关闭客户机虚拟机。
  2. 选择 guest 虚拟机并从 编辑 菜单中选择 Virtual Machine Details,以打开指定 guest 虚拟机的 Details 窗口。
  3. 添加硬件 按钮。
  4. Add New Virtual Hardware 窗口中,选择 RNG 打开 Random Number Generator 窗口。

    图 16.20. 随机数字生成器窗口

    随机数字生成器窗口
    输入预期参数,然后在完成时点击 Finish。参数在 virtio-rng 元素 中进行说明。

过程 16.12. 使用命令行工具实施 virtio-rng

  1. 关闭客户机虚拟机。
  2. 使用 virsh edit domain-name 命令,为所需的 guest 虚拟机打开 XML 文件。
  3. 编辑 <devices> 元素以包括以下内容:

    图 16.21. 随机数生成器设备

    
      ...
      <devices>
        <rng model='virtio'>
          <rate period='2000' bytes='1234'/>
          <backend model='random'>/dev/random</backend>
          <!-- OR -->
          <backend model='egd' type='udp'>
            <source mode='bind' service='1234'/>
            <source mode='connect' host='1.2.3.4' service='1234'/>
          </backend>
        </rng>
      </devices>
      ...
    随机数字生成器设备允许以下 XML 属性和元素:

    virtio-rng 元素

    • <model> - 必需的 model 属性指定提供 RNG 设备的类型。
    • <后端模型> - <后端> 元素指定用于客户机的熵源。源模型使用 model 属性进行配置。支持的源模型包括 'random''egd'
      • < <backend> model='random'> - 此后端类型需要一个非阻塞字符设备作为输入。此类设备的示例为 /dev/random/dev/urandom。文件名被指定为 <backend> 元素的内容。如果没有指定文件名,则使用虚拟机监控程序默认。
      • <backend model='egd'> - 这个后端使用 EGD 协议连接到源。源指定为字符设备。如需更多信息,请参阅字符设备主机物理机器接口。

16.7. 分配 GPU 设备

要将 GPU 分配给客户端,请使用以下方法之 一 :
  • GPU PCI 设备分配 - 使用此方法,可以从主机中删除 GPU 设备并将其分配给单个客户端。
  • NVIDIA vGPU 分配 - 这个方法可以从物理 GPU 创建多个介质设备,并将这些设备分配为多个客户端。这只在所选 NVIDIA GPU 上被支持,且只能将一个介质设备分配给单个客户端。

16.7.1. GPU PCI 设备分配

Red Hat Enterprise Linux 7 支持将以下基于 PCIe 的 GPU 设备分配为非VGA 图形设备:
  • NVIDIA Quadro K-Series、M-Series、P-Series 以及更新的构架(型号为 2000 系列或更高版本)
  • NVIDIA Tesla K-Series、M-Series 和更高的架构
注意
可附加到虚拟机的 GPU 数量受分配的最大 PCI 设备数的限制,在 RHEL 7 中,当前为 32。但是,将多个 GPU 附加到虚拟机可能会导致客户端上内存映射 I/O(MMIO)出现问题,这可能会导致 GPU 不可用。
要临时解决这个问题,请设置较大的 64 位 MMIO 空间并配置 vCPU 物理地址位,以使扩展 64 位 MMIO 空间可以寻址。
要将 GPU 分配给客户机虚拟机,您必须在主机中启用 I/O 内存管理单元(IOMMU),使用 lspci 命令确定 GPU 设备,将设备从主机分离,将其附加到客户端,并在客户端 - 如以下步骤中所述:

过程 16.13. 在主机机器内核中启用 IOMMU 支持

  1. 编辑内核命令行

    对于 Intel VT-d 系统,IOMMU 通过在内核命令行中添加 intel_iommu=oniommu=pt 参数来激活。对于 AMD-Vi 系统,所需的选项仅为 iommu=pt。要启用这个选项,请编辑或将 GRUB_CMDLINX_LINUX 行添加到 /etc/sysconfig/grub 配置文件,如下所示:
    GRUB_CMDLINE_LINUX="rd.lvm.lv=vg_VolGroup00/LogVol01
    vconsole.font=latarcyrheb-sun16 rd.lvm.lv=vg_VolGroup_1/root
    vconsole.keymap=us $([ -x /usr/sbin/rhcrashkernel-param ]  &&
    /usr/sbin/rhcrashkernel-param || :) rhgb quiet intel_iommu=on iommu=pt"
    
    注意
    有关 IOMMU 的详情,请参考 附录 E, 使用 IOMMU 组
  2. 重新生成引导装载程序配置

    要应用内核命令行的更改,请使用 grub2-mkconfig 命令重新生成引导装载程序配置:
    # grub2-mkconfig -o /etc/grub2.cfg
    请注意,如果您使用基于 UEFI 的主机,则目标文件应当是 /etc/grub2-efi.cfg
  3. 重启主机

    要使更改生效,请重启主机机器:
    # reboot

过程 16.14. 将 GPU 设备绑定到主机物理机器驱动程序中排除

对于 GPU 分配,建议将设备从绑定到主机驱动程序中排除,因为这些驱动程序通常不支持动态未绑定设备。
  1. 识别 PCI 总线地址

    要识别设备的 PCI 总线地址和 ID,请运行以下 lspci 命令。在本例中,使用的是 VGA 控制器,如 NVIDIA Quadro 或 GRID 卡:
    # lspci -Dnn | grep VGA
    0000:02:00.0 VGA compatible controller [0300]: NVIDIA Corporation GK106GL [Quadro K4000] [10de:11fa] (rev a1)
    
    生成的搜索显示,这个设备的 PCI 总线地址为 0000:02:00.0,该设备的 PCI ID 为 10de:11fa。
  2. 防止原生主机机器驱动程序使用 GPU 设备

    要防止原生主机机器驱动程序使用 GPU 设备,您可以使用带有 pci-stub 驱动程序的 PCI ID。要做到这一点,将 pci-stub.ids 选项及其值附加到位于 /etc/sysconfig/grub 配置文件中的 GRUB_CMDLINX_LINUX 行,例如:
    GRUB_CMDLINE_LINUX="rd.lvm.lv=vg_VolGroup00/LogVol01
    vconsole.font=latarcyrheb-sun16 rd.lvm.lv=vg_VolGroup_1/root
    vconsole.keymap=us $([ -x /usr/sbin/rhcrashkernel-param ]  &&
    /usr/sbin/rhcrashkernel-param || :) rhgb quiet intel_iommu=on iommu=pt pci-stub.ids=10de:11fa"
    
    要为 pci-stub 添加额外的 PCI ID,使用逗号分隔它们。
  3. 重新生成引导装载程序配置

    使用 grub2-mkconfig 来重新生成引导装载程序配置,使其包含这个选项:
    # grub2-mkconfig -o /etc/grub2.cfg
    请注意,如果您使用基于 UEFI 的主机,则目标文件应当是 /etc/grub2-efi.cfg
  4. 重启主机机器

    要使更改生效,重启主机机器:
    # reboot

过程 16.15. 可选:编辑 GPU IOMMU 配置

在附加 GPU 设备前,可能需要编辑其 IOMMU 配置以便 GPU 在客户机上正常工作。
  1. 显示 GPU 的 XML 信息

    要以 XML 格式显示 GPU 的设置,您首先需要将其 PCI 总线地址转换为兼容 libvirt 的格式,方法是附加 pci_ 和将分隔符转换为下划线。在本例中,通过 0000:02:00.0 总线地址标识的 GPU PCI 设备( 如上一步中获取)将变为 pci_0000_02_00_0。使用 virsh nodedev-dumpxml 的设备 libvirt 地址显示其 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>
         <!-- pay attention to the following lines -->
      <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>
    
    注意 XML 的 <iommuGroup> 元素。iommuGroup 表示一组由于 IOMMU 功能和 PCI 总线拓扑考虑了与其他设备隔离的设备。iommuGroup 内的所有端点设备(认为不是 PCIe 根端口、网桥或交换机端口的设备)都需要从原生主机驱动程序中绑定,才能分配到客户机。在上面的示例中,组由 GPU 设备(0000:02:00.0)和 companion 音频设备(0000:02:00.1)组成。如需更多信息,请参阅 附录 E, 使用 IOMMU 组
  2. 调整 IOMMU 设置

    在本例中,不支持分配 NVIDIA 音频功能,因为存在旧中断支持的硬件问题。另外,在没有 GPU 本身的情况下,G GPU 音频功能通常不有用。因此,为了将 GPU 分配给客户机,必须首先将音频功能与原生主机驱动程序分离。这可使用以下方法之一完成:

过程 16.16. 附加 GPU

GPU 可使用以下任一方法附加到客户端:
  1. 使用 虚拟机管理器 接口.详情请查看 第 16.1.2 节 “使用 virt-manager 分配 PCI 设备”
  2. 为 GPU 创建 XML 配置片段并使用 virsh attach-device 附加它:
    1. 为该设备创建 XML,如下所示:
      
      <hostdev mode='subsystem' type='pci' managed='yes'>
       <driver name='vfio'/>
       <source>
        <address domain='0x0000' bus='0x02' slot='0x00' function='0x0'/>
       </source>
      </hostdev>
      
    2. 将它保存到文件中,并运行 virsh attach-device [domain] [file] --persistent,以在客户机配置中包含 XML。请注意,除了客户机机器中现有仿真图形设备外,还添加了分配的 GPU。分配的 GPU 作为虚拟机中的辅助图形设备进行处理。不支持作为主图形设备分配,不应删除 guest XML 中的模拟图形设备。
  3. 使用 virsh edit 命令编辑客户机 XML 配置并手动添加相应的 XML 段。

过程 16.17. containerruntimeodify 在客户机上的 Xorg 配置

客户机上的 GPU PCI 总线地址将与主机上的不同。要启用主机正确使用 GPU,将 guest 的 Xorg 显示服务器配置为使用分配的 GPU 地址:
  1. 在客户机中,使用 lspci 命令确定 GPU 的 PCI 总线适配器:
    # lspci | grep VGA
    00:02.0 VGA compatible controller: Device 1234:111
    00:09.0 VGA compatible controller: NVIDIA Corporation GK106GL [Quadro K4000] (rev a1)
    
    在本例中,总线地址为 00:09.0。
  2. 在客户机上的 /etc/X11/xorg.conf 文件中,在检测到的地址添加一个 BusID 选项,如下所示:
    		Section "Device"
    		    Identifier     "Device0"
    		    Driver         "nvidia"
    		    VendorName     "NVIDIA Corporation"
    		    BusID          "PCI:0:9:0"
    		EndSection
    
    重要
    如果第 1 步中检测到的总线地址是十六进制的,您需要将分隔符之间的值转换为十进制系统。例如,00:0a.0 应转换为 PCI:0:10:0。
注意
当在客户机中使用分配的 NVIDIA GPU 时,只支持 NVIDIA 驱动程序。其他驱动程序可能无法正常工作,并可能会生成错误。对于 Red Hat Enterprise Linux 7 客户机,可以在安装期间在内核命令行中使用 modprobe.blacklist=nouveau 选项将 nouveau 驱动程序列入黑名单。 有关其他客户虚拟机的详情,请查看操作系统的特定文档。
根据载入 NVIDIA 驱动程序的客户机操作系统,客户机可能会同时使用仿真图形和分配的图形支持,也可以禁用模拟图形。请注意,对分配的图形帧缓冲的访问不是由 virt-manager 等应用程序提供的。如果分配的 GPU 未连接到物理显示,则可能需要基于 guest 的删除解决方案来访问 GPU 桌面。与所有 PCI 设备分配一样,不支持迁移带有分配 GPU 的客户机,每个 GPU 都由单个虚拟机所有。根据客户端操作系统,可能会对 GPU 的热插拔支持可用。

16.7.2. NVIDIA vGPU 分配

NVIDIA vGPU 功能可以将物理 GPU 设备划分为多个虚拟设备(称为 介质设备 )。然后可将这些 mediated devices 分配给多个客户机,作为虚拟 GPU。因此,这些客户机共享单个物理 GPU 的性能。
重要
这个功能仅适用于有限的 NVIDIA GPU。有关这些设备的最新列表,请参阅 NVIDIA GPU 软件文档
16.7.2.1. NVIDIA vGPU 设置
要设置 vGPU 功能,您首先需要为 GPU 设备获取 NVIDIA vGPU 驱动程序,然后创建介质设备,并将其分配给预期的客户端机器:
  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
    如果您需要使用带有介质设备支持的内核版本,请为所有安装的内核版本重新生成初始 ramdisk:
    # dracut --regenerate-all --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 写入 /sys/class/mdev_bus/pci_dev/mdev_supported_types/type-id/create,其中 pci_dev 是主机 GPU 的 PCI 地址,type-id 是主机 GPU 类型的 ID。
    以下示例演示了如何在 NVIDIA Tesla P4 卡上创建 nvidia-63 vGPU 类型的介质设备:
    # uuidgen
    30820a6f-b1a5-4503-91ca-0c10ba58692a
    # echo "30820a6f-b1a5-4503-91ca-0c10ba58692a" > /sys/class/mdev_bus/0000:01:00.0/mdev_supported_types/nvidia-63/create
    有关特定设备的 type-id 值,请参阅 section 1.3.1。虚拟 GPU 类型Virtual GPU 软件文档中。请注意,只有 Q series NVIDIA vGPUs(如 GRID P4-2Q )作为 Linux 客户机上的介质设备 GPU 类型被支持。
  6. 在您要共享 vGPU 资源的 XML 配置中的 <devices/> 部分中添加以下行。使用上一步中 uuidgen 命令生成的 UUID 值。每个 UUID 每次只能分配给一个 guest。
    
    <hostdev mode='subsystem' type='mdev' managed='no' model='vfio-pci'>
      <source>
        <address uuid='30820a6f-b1a5-4503-91ca-0c10ba58692a'/>
      </source>
    </hostdev>
    
    
    重要
    要让 vGPU 介质设备在分配的客户机中正常工作,需要为客户机设置 NVIDIA vGPU 客户机软件许可。如需更多信息和说明,请参阅 NVIDIA 虚拟 GPU 软件文档
16.7.2.2. 通过 NVIDIA vGPU 设置并使用 VNC 控制台进行视频流
作为技术预览,虚拟网络计算(VNC)控制台可与基于 GPU 的介质设备一起使用,包括在 Red Hat Enterprise Linux 7.7 及之后的版本中。因此,您可以使用 VNC 显示 NVIDIA vGPU 设备提供的加速图形输出。
警告
这个功能目前仅作为技术预览提供,且不受红帽支持。因此,不建议在生产环境中使用以下过程。
要在虚拟机上的 VNC 控制台中配置 vGPU 输出渲染,请执行以下操作:
  1. 在您的系统中安装 NVIDIA vGPU 驱动程序并配置 NVIDIA vGPU,如 第 16.7.2.1 节 “NVIDIA vGPU 设置” 所述。确保介质设备的 XML 配置包含 display='on' 参数。例如:
    			
    <hostdev mode='subsystem' type='mdev' managed='no' model='vfio-pci' display='on'>
       <source>
          <address uuid='ba26a3e2-8e1e-4f39-9de7-b26bd210268a'/>
       </source>
    </hostdev>
    
    
  2. (可选)将虚拟机的视频模型类型设置为 none。例如:
    			
    <video>
       <model type='none'/>
    </video>
    
    
    如果没有指定,您会收到两个不同的显示输出 - 一个来自于模拟的 Cirrus 或 QXL 卡,并从 NVIDIA vGPU 中获得。另请注意,使用 模型 type='none' 目前无法看到引导图形输出,直到驱动程序初始化为止。因此,显示的第一个图形输出是登录屏幕。
  3. 确定虚拟机图形类型的 XML 配置是 vnc
    例如:
    			
    <graphics type='vnc' port='-1' autoport='yes'>
    	 <listen type='address'/>
    </graphics>
    
    
  4. 启动虚拟机。
  5. 使用 VNC viewer 远程桌面客户端连接到虚拟机。
    注意
    如果虚拟机设置了模拟 VGA 作为主视频设备,且 vGPU 作为二级设备,请使用 ctrl+alt+2 键盘快捷键切换到 vGPU 显示。
16.7.2.3. 删除 NVIDIA vGPU 设备
要删除 mediated vGPU 设备,请在设备不活跃时运行以下命令,并将 uuid 替换为设备的 UUID,例如 30820a6f-b1a5-4503-91ca-0c10ba58692a
# echo 1 > /sys/bus/mdev/devices/uuid/remove
请注意,尝试删除当前供客户端使用的 vGPU 设备会触发以下错误:
echo: write error: Device or resource busy
16.7.2.4. 查询 NVIDIA vGPU 功能
要获得有关系统中介质设备的其他信息,如可以创建给定类型中的介质设备数量,请使用 virsh nodedev-list --cap mdev_typesvirsh nodedev-dumpxml 命令。例如,以下在 Tesla P4 卡中显示可用的 vGPU 类型:

$ virsh nodedev-list --cap mdev_types
pci_0000_01_00_0
$ virsh nodedev-dumpxml pci_0000_01_00_0
<...>
  <capability type='mdev_types'>
    <type id='nvidia-70'>
      <name>GRID P4-8A</name>
      <deviceAPI>vfio-pci</deviceAPI>
      <availableInstances>1</availableInstances>
    </type>
    <type id='nvidia-69'>
      <name>GRID P4-4A</name>
      <deviceAPI>vfio-pci</deviceAPI>
      <availableInstances>2</availableInstances>
    </type>
    <type id='nvidia-67'>
      <name>GRID P4-1A</name>
      <deviceAPI>vfio-pci</deviceAPI>
      <availableInstances>8</availableInstances>
    </type>
    <type id='nvidia-65'>
      <name>GRID P4-4Q</name>
      <deviceAPI>vfio-pci</deviceAPI>
      <availableInstances>2</availableInstances>
    </type>
    <type id='nvidia-63'>
      <name>GRID P4-1Q</name>
      <deviceAPI>vfio-pci</deviceAPI>
      <availableInstances>8</availableInstances>
    </type>
    <type id='nvidia-71'>
      <name>GRID P4-1B</name>
      <deviceAPI>vfio-pci</deviceAPI>
      <availableInstances>8</availableInstances>
    </type>
    <type id='nvidia-68'>
      <name>GRID P4-2A</name>
      <deviceAPI>vfio-pci</deviceAPI>
      <availableInstances>4</availableInstances>
    </type>
    <type id='nvidia-66'>
      <name>GRID P4-8Q</name>
      <deviceAPI>vfio-pci</deviceAPI>
      <availableInstances>1</availableInstances>
    </type>
    <type id='nvidia-64'>
      <name>GRID P4-2Q</name>
      <deviceAPI>vfio-pci</deviceAPI>
      <availableInstances>4</availableInstances>
    </type>
  </capability>
</...>

16.7.2.5. 用于 NVIDIA vGPU 的远程桌面流服务
以下远程桌面流服务已被成功测试,以便与 Red Hat Enterprise Linux 7 上的 NVIDIA vGPU 功能一起使用:
  • HP-RGS
  • Mechdyne TGX - 目前无法将 Mechdyne TGX 与 Windows Server 2016 guest 搭配使用。
  • NICE DCV - 当使用此流服务时,红帽建议使用固定解析设置,因为在一些情况下使用动态解析会导致一个黑屏。
16.7.2.6. 使用 NVIDIA vGPU 为视频流设置 VNC 控制台
简介
作为技术预览,虚拟网络计算(VNC)控制台可用于基于 GPU 的介质设备,包括 NVIDIA vGPU(包括在 Red Hat Enterprise Linux 8 中)。因此,您可以使用 VNC 显示 NVIDIA vGPU 设备提供的加速图形输出。
重要
由于是技术预览,红帽不支持此功能。因此,不建议在生产环境中使用以下过程。
Configuration
要在虚拟机上的 VNC 控制台中配置 vGPU 输出渲染,请执行以下操作:
  1. 在您的主机上安装 NVIDIA vGPU 驱动程序并配置 NVIDIA vGPU,如 第 16.7.2 节 “NVIDIA vGPU 分配” 所述。确保介质设备的 XML 配置包含 display='on' 参数。例如:
    <hostdev mode='subsystem' type='mdev' managed='no' model='vfio-pci' display='on'>
     <source>
        <address uuid='ba26a3e2-8e1e-4f39-9de7-b26bd210268a'/>
     </source>
    </hostdev>
    
  2. (可选)将虚拟机的视频模型类型设置为 none。例如:
    <video>
     <model type='none'/>
    </video>
    
  3. 确定虚拟机图形类型的 XML 配置是 spicevnc
    spice 的一个示例:
    <graphics type='spice' autoport='yes'>
     <listen type='address'/>
     <image compression='off'/>
    </graphics>
    
    vnc 的示例:
    <graphics type='vnc' port='-1' autoport='yes'>
     <listen type='address'/>
    </graphics>
    
  4. 启动虚拟机。
  5. 使用适合您在前面步骤中配置的图形协议的客户端连接到虚拟机。
    • 对于 VNC,使用 VNC viewer 远程桌面客户端。如果虚拟机设置了模拟 VGA 作为主视频设备,且 vGPU 作为辅助,请使用 ctrl+alt+2 键盘快捷键切换到 vGPU 显示。
    • 对于 SPICE,请使用 virt-viewer 应用程序。

第 17 章 虚拟网络

本章介绍了使用 libvirt 创建、启动、停止、删除和修改虚拟网络所需的概念。
更多信息,请参阅 libvirt 参考章节

17.1. 虚拟网络切换

libvirt 虚拟网络使用 虚拟网络交换机 的概念。虚拟网络交换机是在主机物理计算机服务器上运行的软件构造,虚拟机(虚拟机)连接。客户机的网络流量通过这个交换机定向:

图 17.1. 带两个客户机的虚拟网络交换机

带两个客户机的虚拟网络交换机
Linux 主机物理计算机服务器表示一个虚拟网络交换机作为网络接口。当首先安装和启动libvirtd守护进程时,代表虚拟网络交换机的默认网络接口为 virbr0
这种 virbr0 接口可以像任何其他接口一样通过 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

17.2. 网桥模式

在使用 桥接模式 时,所有客户机虚拟机都与主机物理机器位于同一个子网中。同一物理网络中的所有其他物理机器都了解虚拟机,并可访问该虚拟机。桥接在 OSI 网络模型的第 2 层上运行。

图 17.2. 网桥模式的虚拟网络交换机

网桥模式的虚拟网络交换机
通过将它们与 绑定 一起加入,可以在虚拟机监控程序上使用多个物理接口。然后,这个绑定被添加到网桥中,客户端虚拟机也会添加到网桥中。但是,绑定驱动程序有多种操作模式,只有几个模式可以与使用虚拟客户机的桥接一起工作。
警告
在使用桥接模式时,与客户机虚拟机一起使用的唯一绑定模式为模式 1、模式 2 和模式 4。使用模式 0、3、4、5 或 6 可能会导致连接失败。另请注意,Media-Independent Interface(MII)监控应该用来监控绑定模式,因为地址解析协议(ARP)监控无法正常工作。
有关绑定模式的更多信息,请参阅 相关知识库文章Red Hat Enterprise Linux 7 网络指南
有关 bridge_opts 参数(用于配置桥接网络模式)的详情,请查看 Red Hat Virtualization 管理指南

17.3. 网络地址转换

默认情况下,虚拟网络交换机在 NAT 模式下运行。它们使用 IP 伪装而不是 Source-NAT(SNAT)或 Destination-NAT(DNAT)。IP 伪装可让连接的客户机使用主机物理计算机 IP 地址与任何外部网络通信。默认情况下,当虚拟网络交换机在 NAT 模式运行时,外部放置到主机物理机器的计算机无法与客户机通信,如下图所示:

图 17.3. 使用两个客户机的 NAT 的虚拟网络交换机

使用两个客户机的 NAT 的虚拟网络交换机
警告
虚拟网络交换机使用 iptables 规则配置的 NAT。不建议在交换机运行时编辑这些规则,因为不正确的规则可能无法通信。
如果交换机没有运行,您可以为转发模式 NAT 设置公共 IP 范围,以便通过运行以下命令创建端口伪装范围:
# iptables -j SNAT --to-source [start]-[end]

17.4. DNS 和 DHCP

IP 信息可以通过 DHCP 分配给客户机。为此,可以将地址池分配到虚拟网络交换机。libvirt 使用 dnsmasq 程序。libvirt 会自动配置并启动需要它的每个虚拟网络交换机的 dnsmasq 实例。

图 17.4. 运行 dnsmasq 的虚拟网络交换机

运行 dnsmasq 的虚拟网络交换机

17.5. 路由模式

当使用 Routed 模式 时,虚拟交换机会连接到连接到主机物理机器的物理 LAN,并在不使用 NAT 的情况下传输流量。虚拟交换机可以检查所有流量,并使用网络数据包中包含的信息来做出路由决策。使用此模式时,所有虚拟机都位于自己的子网中,通过虚拟交换机进行路由。这种情形并非始终理想选择,因为物理网络中的其他主机物理机器不知道虚拟机,无需手动物理路由器配置,也无法访问虚拟机。路由模式在 OSI 网络模型的第 3 层运行。

图 17.5. 使用路由模式的虚拟网络切换

使用路由模式的虚拟网络切换

17.6. 隔离模式

在使用 隔离模式 时,连接到虚拟交换机的客户机可以相互通信,并与主机物理机器通信,但其流量不会在主机物理机器外传递,而且它们无法从主机物理计算机外接收流量。在这个模式中使用 dnsmasq 是基本功能(如 DHCP)所必需的。但是,即使此网络与任何物理网络隔离,DNS 名称仍会解析。因此,当 DNS 名称解析但 ICMP 回显请求(ping)命令时可能会出现情况。

图 17.6. 处于隔离模式的虚拟网络交换机

处于隔离模式的虚拟网络交换机

17.7. 默认配置

当首先安装libvirtd守护进程时,它会在 NAT 模式中包含初始虚拟网络交换机配置。使用此配置以便已安装的客户机可以通过主机物理计算机与外部网络通信。下图展示了 libvirtd 的以下默认配置:

图 17.7. 默认 libvirt 网络配置

默认 libvirt 网络配置
注意
虚拟网络可以限制为特定的物理接口。这对具有多个接口的物理系统很有用(如 eth 0、eth1eth2)。这仅适用于路由和 NAT 模式,可以在 dev=<interface> 选项中定义,或者在创建新虚拟网络时在 virt-manager 中定义。

17.8. Common Scenarios 示例

本节演示了不同的虚拟网络模式,并提供一些示例方案。

17.8.1. 网桥模式

网桥模式在 OSI 模型的第 2 层上运行。在使用时,所有 guest 虚拟机都将与主机物理机器位于同一子网中。使用桥接模式的最常见用例包括:
  • 在现有网络中部署客户机虚拟机以及主机物理计算机对最终用户而言,虚拟机与物理机器之间的差别是透明的。
  • 在不更改现有物理网络配置设置的情况下部署客户机虚拟机。
  • 部署客户端虚拟机,这些虚拟机必须可以被现有物理网络轻松访问。将客户机虚拟机放置到物理网络中,以便它们必须在现有广播域中访问服务,如 DHCP。
  • 将客户机虚拟机连接到使用 VLAN 的网络.

17.8.2. 路由模式

DMZ

考虑一个网络,因为安全原因,将一个或多个节点放置在受控的子网络中。特殊的子网络部署,如这一个常见做法,而子网络则称为 DMZ。有关这个布局的详情,请参见以下图:

图 17.8. DMZ 配置示例

DMZ 配置示例
DMZ 中的主机物理机器通常向 WAN(外部)主机物理机器以及 LAN(内部)主机物理机器提供服务。因此,这需要它们能从多个位置访问,并考虑这些位置可根据其安全性和信任级别的不同方式进行控制和操作,路由模式是此环境的最佳配置。

虚拟服务器托管

考虑一台含有多台主机物理计算机的虚拟服务器托管公司,每个机器都有两个物理网络连接。一个接口用于管理和核算,另一个用于虚拟机进行连接。每个 guest 都有自己的公共 IP 地址,但主机物理计算机使用私有 IP 地址作为 guest 管理,只有内部管理员才能执行。参阅下图以了解这种情况:

图 17.9. 托管配置示例的虚拟服务器

托管配置示例的虚拟服务器

17.8.3. NAT 模式

NAT(网络地址转换)模式是默认模式。当不需要直接查看网络时,可以使用它进行测试。

17.8.4. 隔离模式

隔离模式允许虚拟机相互通信。它们无法与物理网络交互。

17.9. 管理虚拟网络

在您的系统中配置虚拟网络:
  1. Edit 菜单中,选择 Connection Details
  2. 这将打开 Connection Details 菜单。单击 Virtual Networks 选项卡。

    图 17.10. 虚拟网络配置

    虚拟网络配置
  3. 菜单左侧列出了所有可用的虚拟网络。您可编辑虚拟网络的配置,方法是从此框中选择它,并在您看到合适的时进行编辑。

17.10. 创建虚拟网络

使用虚拟机管理器(virt-manager)在系统上创建虚拟网络:
  1. 从" 连接详细信息 "菜单内打开 虚拟网络 选项卡。单击添加网络 按钮,由加号(+)图标标识。如需更多信息,请参阅 第 17.9 节 “管理虚拟网络”

    图 17.11. 虚拟网络配置

    虚拟网络配置
    这将打开 Create a new virtual network 窗口。点 Forward 继续。

    图 17.12. 命名您的新虚拟网络

    命名您的新虚拟网络
  2. 为您的虚拟网络输入适当的名称,然后单击" 下一步"。

    图 17.13. 选择 IPv4 地址空间

    选择 IPv4 地址空间
  3. 选中启用 IPv4 网络地址空间定义 复选框。
    Network 字段中输入您的虚拟网络的 IPv4 地址空间。
    选中 Enable DHCPv4 复选框。
    通过指定起始和