虚拟化部署和管理指南
在 RHEL 物理机器上安装、配置和管理虚拟机
摘要
部分 I. Deployment
第 1 章 系统要求
1.1. 主机系统要求
最低主机系统要求
- 6 GB 空闲磁盘空间。
- 2 GB RAM。
推荐的系统要求
- 每个虚拟化 CPU 和主机各有一个核或线程。
- 2 GB RAM,外加虚拟机的额外 RAM。
- 主机有 6 GB 的磁盘空间,外加虚拟机所需的磁盘空间。大多数客户机操作系统需要至少 6 GB 的磁盘空间。每个客户机的额外存储空间,这取决于它们的工作负载。
交换空间
当物理内存(RAM)已满时,将使用 Linux 中的交换空间。如果系统需要更多的内存资源并且 RAM 已满,内存中的不活动页面将移到交换空间。虽然交换空间可以帮助具有少量 RAM 的计算机,但不应将其视为更多 RAM 的替代品。交换空间位于硬盘驱动器上,其访问时间比物理内存要慢。交换分区的大小可以通过主机的物理 RAM 计算。红帽客户门户网站包含有关安全、有效地确定交换分区大小的文章:https://access.redhat.com/site/solutions/15244.- 当使用原始镜像文件时,所需磁盘空间总量等于或大于镜像文件所需的空间、主机操作系统所需的 6 GB 空间以及客户机的交换空间的总和。
公式 1.1. 计算使用原始镜像的客户机虚拟机所需的空间
total for raw format = images + hostspace + swap对于 qcow 镜像,您也必须计算客户机期望的最大存储要求(qcow 格式的总量)
,因为 qcow 和 qcow2 镜像可以根据需要增加。要允许此扩展,首先将客户机期望的最大存储要求(期望的最大客户机存储)
乘以 1.01 ,再加上主机(host)
和必要的交换空间(swap)
所需的空间。公式 1.2. 计算使用 qcow 镜像的客户机虚拟机所需的空间
total for qcow format = (expected maximum guest storage * 1.01) + host + swap
1.2. KVM Hypervisor 要求
- 一个具有适用于基于 x86 系统的 Intel VT-x 和 Intel 64 虚拟化扩展的 Intel 处理器;或者
- 一个具有 AMD-V 和 AMD64 虚拟化扩展的 AMD 处理器。
过程 1.1. 验证虚拟化扩展
验证 CPU 虚拟化扩展是否可用
输入以下命令来验证 CPU 虚拟化扩展是否可用:$ grep -E 'svm|vmx' /proc/cpuinfo
分析输出
- 以下示例输出包含了一个
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 配置工具中启用扩展的说明。确定 KVM 内核模块是否已加载
另外,还可以使用以下命令验证kvm
模块是否已被加载到内核中:# lsmod | grep kvm
如果输出包括kvm_intel
或kvm_amd
,则kvm
硬件虚拟化模块已加载。
# virsh capabilities
1.3. KVM 客户机虚拟机兼容性
- 对于 KVM hypervisor:https://access.redhat.com/articles/rhel-kvm-limits
1.4. 支持的客户机 CPU 型号
1.4.1. 列出客户机 CPU 型号
$ 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_map.xml
文件中,位于 /usr/share/libvirt/
中:
# cat /usr/share/libvirt/cpu_map.xml
<cpu>
部分进行更改。如需更多信息,请参阅 第 23.12 节 “CPU 型号和拓扑”。
第 2 章 安装虚拟化软件包
kvm
内核模块的 Red Hat Enterprise Linux 内核。
2.1. 在 Red Hat Enterprise Linux 安装过程中安装虚拟化软件包
过程 2.1. 安装虚拟化软件包
选择软件
按照安装流程操作,直到 安装概述 屏幕出现。图 2.1. 安装概述屏幕
在 安装概述 屏幕中,点击 软件选择。此时会打开 软件选择 屏幕。选择服务器类型和软件包组
您只能安装带有基本虚拟化软件包或带有允许通过图形用户界面管理客户机的软件包的 Red Hat Enterprise Linux 7。执行以下操作之一:- 安装最小虚拟化主机在 Base Environment 窗格中选择 Virtualization Host 单选按钮,在Add-Ons for Selected Environment 窗格中选择 Virtualization Platform 复选框。这会安装一个基本的虚拟化环境,可以使用 virsh 或通过网络远程运行它。
图 2.2. 软件选择屏幕中选择的虚拟化主机
- 使用图形用户界面安装虚拟化主机在 Base Environment 窗格中选择 Server with GUI 单选按钮,在 Add-Ons for Selected Environment窗格中选择 Virtualization Client、Virtualization Hypervisor 和 Virtualization Tools 复选框。这会安装一个虚拟化环境,以及用于安装和管理客户机虚拟机的图形工具。
图 2.3. 在软件选择屏幕中选择带有 GUI 的服务器
完成安装
点击并继续安装。
2.1.1. 使用 Kickstart 文件安装 KVM 软件包
%packages
部分中追加以下软件包组:
@virtualization-hypervisor @virtualization-client @virtualization-platform @virtualization-tools
2.2. 在现有 Red Hat Enterprise Linux 系统上安装虚拟化软件包
2.2.1. 手动安装虚拟化软件包
- 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. 安装虚拟化软件包组
软件包组 | 描述 | 强制的软件包 | 可选的软件包 |
---|---|---|---|
虚拟化 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 |
Virtualization Tools
软件包组,请运行:
# yum group install "Virtualization Tools" --setopt=group_package_types=mandatory,default,optional
第 3 章 创建虚拟机
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 创建客户机
--name
- 虚拟机的名称。
--memory
- 分配给客户机的内存量(RAM),以 MiB 为单位。
- 客户机存储
- 使用以下客户机存储选项之一:
--disk
虚拟机的存储配置详情。如果您使用--disk none
选项,则创建的虚拟机没有磁盘空间。--filesystem
虚拟客户机的文件系统的路径。
- 安装方法
- 使用以下安装方法之一:
--location
安装介质的位置。--cdrom
用作虚拟 CD-ROM 设备的文件或设备。它可以是 ISO 镜像的路径,也可以是要从中获取或访问最小引导 ISO 镜像的 URL。但是,它不能是 物理主机的 CD-ROM 或 DVD-ROM 设备。--pxe
使用 PXE 引导协议来加载初始 ramdisk 和内核以启动客户机安装过程。--import
跳过操作系统安装过程,并围绕现有磁盘镜像构建客户机。用于引导的设备是disk
或filesystem
选项指定的第一个设备。--boot
安装后虚拟机的引导配置。这个选项允许指定引导设备的顺序,使用可选的内核参数永久引导内核和 initrd,并启用 BIOS 引导菜单。
# virt-install --help
# virt install --option=?
3.2.1. 从 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 安装虚拟机
--network
选项和 --pxe
选项必须指定。
# virt-install \ --name guest1-rhel7 \ --memory 2048 \ --vcpus 2 \ --disk size=8 \ --network=bridge:br0 \ --pxe \ --os-variant rhel7
3.2.5. 使用 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-inject
和 extra-args
选项指定将要使用 Kickstarter 文件来安装虚拟机。
3.2.6. 在客户机创建过程中配置客户机虚拟机网络
带有 NAT 的默认网络
libvirtd
的网络地址转换(NAT)虚拟网络交换机。有关 NAT 的更多信息,请参阅 第 6.1 节 “使用 libvirt 进行网络地址转换(NAT)”。
--network default
network
选项,将使用带有 NAT 的默认网络配置客户机虚拟机。
带有 DHCP 的桥接网络
--network br0
带有静态 IP 地址的桥接网络
--network br0 \ --extra-args "ip=192.168.1.2::192.168.1.1:255.255.255.0:test.example.com:eth0:none"
无网络
--network=none
3.3. 使用 virt-manager 创建客户机
3.3.1. virt-manager 安装概述
- 选择 hypervisor 和安装类型
- 定位和配置安装介质
- 配置内存和 CPU 选项
- 配置虚拟机的存储
- 配置虚拟机名称、网络、架构和其他硬件设置
3.3.2. 使用 virt-manager 创建 Red Hat Enterprise Linux 7 客户机
过程 3.1. 使用本地安装介质通过 virt-manager 创建 Red Hat Enterprise Linux 7 客户机虚拟机
可选:准备
为虚拟机准备存储环境。有关准备存储的详情请参考 第 13 章 为虚拟机管理存储。重要各种存储类型可用于存储客户机虚拟机。但是,要使虚拟机能够使用迁移功能,虚拟机必须在网络存储上创建。Red Hat Enterprise Linux 7 至少需要 1 GB 存储空间。但是,红帽建议为 Red Hat Enterprise Linux 7 安装以及本指南中的步骤推荐至少 5 GB 存储空间。打开 virt-manager 并启动向导
以 root 用户身份执行 virt-manager 命令打开 virt-manager,或打开 Applications → System Tools → Virtual Machine Manager。图 3.1. Virtual Machine Manager 窗口
(可选)通过选择管理程序并单击按钮打开远程管理程序。点击 启动新的虚拟化客户机向导。此时会打开 New VM 窗口。指定安装类型
选择安装类型:- 本地安装介质(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. 虚拟机安装方法
点继续。选择安装源
- 如果选择了 Local 安装介质(ISO 镜像或 CDROM), 请指定您预期的本地安装介质。
图 3.3. 本地 ISO 镜像安装
警告虽然 GUI 中目前存在 选项,但无法从主机上的物理 CD-ROM 或者 DVD 设备安装。因此,选择 Use CDROM 或 DVD 选项会导致虚拟机安装失败。详情请查看 Red Hat 知识库。要从 ISO 镜像安装,请选择 Use ISO image 并点 按钮以打开 Locate 介质卷 窗口。选择要使用的安装镜像,然后单击。如果在 Locate 介质卷 窗口中没有显示镜像,点 按钮浏览包含安装磁盘的安装镜像或 DVD 驱动器的主机机器。选择包含安装磁盘的安装镜像或者 DVD 驱动器并点击 ; 选择了卷供使用,并返回到 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。 - 如果选择了
Network Install
,输入安装源的 URL 以及所需的内核选项(若有)。URL 必须指向安装树的根目录,它必须能够通过 HTTP、FTP 或 NFS 访问。要执行 kickstart 安装,请在内核选项中指定 kickstart 文件的 URL,从ks=
开始。图 3.4. 网络 kickstart 安装
注意有关内核选项的完整列表,请参阅 Red Hat Enterprise Linux 7 安装指南。
接下来,安装介质复选框选择 Automatically detect operating system。。确保为虚拟机选择适当的操作系统类型。这可以手动指定,或者根据点继续。配置内存(RAM)和虚拟 CPU
指定要分配给虚拟机的 CPU 和内存量。向导显示您可以分配的 CPU 数和内存量;这些值会影响主机和客户机的性能。虚拟机需要足够的物理内存(RAM)来高效地运行。红帽为虚拟机支持至少 512MB 的 RAM。红帽建议为每个逻辑内核至少 1024MB RAM。为虚拟机分配足够虚拟 CPU。如果虚拟机运行多线程应用程序,请分配客户机虚拟机需要运行的虚拟 CPU 数量。您不能分配超过主机系统中可用的物理处理器(或超线程)的虚拟 CPU。可用的虚拟 CPU 数量在 Up to X available 字段中记录。图 3.5. 配置内存和 CPU
配置内存和 CPU 设置后,单击"以继续。注意内存和虚拟 CPU 可以过量使用。有关过量使用的详情请参考 第 7 章 使用 KVM 进行过量使用。配置存储
为您的虚拟机启用并分配足够的空间,以及它所需的任何应用程序。对于最低安装,至少为桌面安装分配 5 GB 或至少 1 GB。图 3.6. 配置虚拟存储
注意实时迁移和离线迁移需要在共享网络存储上安装虚拟机。有关为虚拟机设置共享存储的详情,请参考 第 15.4 节 “共享存储示例:用于简单迁移的 NFS”。使用默认本地存储
选择 计算机硬盘驱动器单选按钮上创建磁盘映像,以便在默认存储池中创建基于文件的镜像,即/var/lib/libvirt/images/
目录。输入要创建的磁盘镜像的大小。如果选择了 Allocate entire disk 复选框,则将立即创建指定大小的磁盘镜像。如果没有,磁盘镜像会在填充时增大。注意虽然存储池是一个虚拟容器,它受到两个因素的限制: 虽然它的最大大小由 qemu-kvm 和主机物理机器上的磁盘大小进行调整。存储池可能没有超过主机物理机器上磁盘的大小。最大大小如下:- virtio-blk = 2^63 字节或 8 Exabytes(使用原始文件或磁盘)
- Ext4 = ~ 16 TB(使用 4 KB 的块大小)
- XFS = ~8 Exabytes
- 在尝试非常大的镜像大小时,应评估/调整其 metadata 和主机文件系统,保持自己的元数据和可扩展性。使用原始磁盘意味着会影响可扩展性或最大大小的层数。
点击 Select managed 或其他现有存储,然后选择 Browse 来配置受管存储。在本地硬盘中创建磁盘镜像。或者,选择使用存储池
如果您选择 Select managed 或 other existing storage 来使用存储池,请点击 Browse 打开 Locate 或 create storage volume 窗口。图 3.7. Choose Storage Volume 窗口
- 从 Storage Pools 列表中选择存储池。
- 可选:点击 创建新存储卷。此时会出现 Add a Storage Volume 屏幕。输入新存储卷的名称。从 Format 下拉菜单中选择 Format 选项。格式选项包括 raw、qcow2、和 qed。根据需要调整其他字段。请注意,这里使用的 qcow2 版本为版本 3。要更改 qcow 版本,请参阅 第 23.19.2 节 “设置目标元素”
图 3.8. Add a Storage Volume 窗口
选择新卷,再单击 New VM 向导。点 继续。。接下来,单击 以返回到名称和最终配置
将虚拟机命名为。虚拟机名称可以包含字母、数字和以下字符:下划线(_
)、句点(-
)。虚拟机名称对于迁移来说必须是唯一的,且不能仅包含数字。默认情况下,将使用名为"default"的网络的网络地址转换(NAT)创建虚拟机。要更改网络选择,请点击网络选择
并选择主机设备和源模式。验证虚拟机的设置,并在您满意时单击;这将创建具有指定网络设置、虚拟化类型和架构的虚拟机。图 3.9. 验证配置
或者,要进一步配置虚拟机的硬件,,以更改客户机的存储或网络设备,以使用半虚拟化(virtio)驱动程序或添加额外的设备。这会打开另一个向导,供您添加、删除和配置虚拟机的硬件设置。注意Red Hat Enterprise Linux 4 或 Red Hat Enterprise Linux 5 虚拟机无法使用图形模式安装。因此,您必须选择"Cirrus"而不是"QXL"作为显卡。配置虚拟机硬件后,请单击" virt-manager 将根据指定的硬件设置创建虚拟机。"。 继续进入 Red Hat Enterprise Linux 安装序列。有关安装 Red Hat Enterprise Linux 7 的详情,请参考警告从远程介质安装 Red Hat Enterprise Linux 7 客户机虚拟机时,但没有配置的 TCP/IP 连接时,安装会失败。但是,在这样的情况下,当安装 Red Hat Enterprise Linux 5 或 6 的客户机虚拟机时,安装程序会打开"配置 TCP/IP"接口。有关这一差异的更多信息,请参阅 相关知识库文章。
3.4. virt-install 和 virt-manager 安装选项的比较
--name
、--memory
、guest 存储(--disk
、--filesystem
或 --disk none
),以及一个安装方法(--location
、--cdrom
、--pxe
、-import
或 boot
)。这些选项可以通过参数进一步指定;要查看命令选项和相关参数的完整列表,请输入以下命令:
# virt-install --help
虚拟机上的配置 | 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 密钥。
- 应用程序级别 信息和配置包括在虚拟机上安装的应用程序所配置的所有内容。示例包括激活代码和注册信息。注意本章不包括有关删除应用级别的信息,因为信息和方法特定于每个应用。
4.1. 为 Cloning 准备虚拟机
过程 4.1. 准备虚拟机进行克隆
设置虚拟机
- 构建要用于克隆或模板的虚拟机。
- 在克隆上安装所需的任何软件。
- 为操作系统配置任何非唯一设置。
- 配置任何非唯一应用设置。
删除网络配置
- 使用以下命令删除所有持久性 udev 规则:
# rm -f /etc/udev/rules.d/70-persistent-net.rules
注意如果没有删除 udev 规则,第一个 NIC 的名称可以是 eth1 而不是 eth0。 - 通过编辑
/etc/sysconfig/network-scripts/ifcfg-eth[x]
来删除 ifcfg 脚本中的唯一网络详情:- 删除 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.
- 确保 DHCP 配置仍不包含 HWADDR 或任何唯一信息。
DEVICE=eth[x] BOOTPROTO=dhcp ONBOOT=yes
- 确保该文件包含以下行:
DEVICE=eth[x] ONBOOT=yes
- 如果有以下文件,请确保它们包含相同的内容:
/etc/sysconfig/networking/devices/ifcfg-eth[x]
/etc/sysconfig/networking/profiles/default/ifcfg-eth[x]
注意如果虚拟机使用了 NetworkManager 或任何特殊设置,请确保从 ifcfg 脚本中删除任何其他唯一信息。
删除注册详情
- 使用以下命令之一删除注册详情:
- 对于 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 注册,请执行以下操作:- 获取您的客户身份代码:
# subscription-manager identity subscription-manager identity: 71rd64fx-6216-4409-bf3a-e4b7c7bd8ac9
- 使用获取的 ID 代码注册虚拟机:
# subscription-manager register --consumerid=71rd64fx-6216-4409-bf3a-e4b7c7bd8ac9
删除其他唯一详情
- 使用以下命令删除任何 sshd 公钥/私钥对:
# rm -rf /etc/ssh/ssh_host_*
注意删除 ssh 密钥可防止 ssh 客户端不信任这些主机的问题。 - 删除任何其他特定于应用的标识符或配置,这可能在多台计算机上运行时造成冲突。
将虚拟机配置为在下一次启动时运行配置向导
- 将虚拟机配置为在下一次引导时运行相关的配置向导,方法是执行以下操作之一:
- 对于 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. 克隆虚拟机
4.2.1. 使用 virt-clone 克隆虚拟机
--original
。要查看选项的完整列表,请输入以下命令:
# virt-clone --help
例 4.1. 使用 virt-clone 克隆客户端
# virt-clone --original demo --auto-clone
例 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 克隆客户机
过程 4.2. 使用 virt-manager 克隆虚拟机
open virt-manager
启动 virt-manager。从 和 子菜单 应用程序。或者,以 root 身份运行 virt-manager 命令。从 Virtual Machine Manager 中的客户机虚拟机列表中选择您要克隆的客户机虚拟机。在您要克隆的 guest 虚拟机上单击鼠标右键,然后选择。此时会打开 Clone Virtual Machine 窗口。图 4.1. 克隆虚拟机窗口
配置克隆
- 要更改克隆的名称,请为克隆输入新名称。
- 要更改网络配置,请点击 Details。为克隆输入新的 MAC 地址。点确定。
图 4.2. 更改 MAC 地址窗口
- 对于克隆的客户机虚拟机中的每个磁盘,请选择以下选项之一:
克隆此磁盘
- 将克隆为克隆的客户机虚拟机的磁盘与 guest 虚拟机名称共享磁盘 - 磁盘将由将被克隆及其克隆的客户端虚拟机共享
Details
- 打开更改存储路径窗口,该窗口为磁盘启用新路径图 4.3. 更改
存储路径
窗口
克隆客户机虚拟机
单击 Clone。
第 5 章 KVM 半虚拟化(virtio)驱动程序
virtio
软件包中。virtio 软件包支持块(存储)设备和网络接口控制器。
5.1. 为现有存储设备使用 KVM virtio 驱动程序
virtio
驱动程序,而不是虚拟化 IDE 驱动程序。本节中显示的示例编辑 libvirt 配置文件。请注意,不需要关闭客户端虚拟机来执行这些步骤,但更改不会应用,直到 guest 完全关闭并重新引导为止。
过程 5.1. 为现有设备使用 KVM virtio 驱动程序
- 在继续执行此流程前,请确保
您已安装了
适当的驱动程序( viostor )。 - 以 root 身份运行 virsh edit guestname 命令,编辑设备的 XML 配置文件。例如: virsh edit guest1。配置文件位于
/etc/libvirt/qemu/
目录中。 - 以下是使用虚拟化 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>
- 通过将 bus= 条目修改为 virtio,将条目更改为使用 virtio 设备。请注意,如果磁盘之前是 IDE,它有一个类似于
hda
、hdb
或hdc
的目标。当更改为 bus=virtio 时,目标需要相应地更改为vda
、vdb
或vdc
。<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>
- 删除 磁盘标签 中的 地址 标签。此过程必须完成。libvirt 将在虚拟机下次启动时正确重新生成地址 标签。
5.2. 为新存储设备使用 KVM virtio 驱动程序
过程 5.2. 使用 virtio 存储驱动程序添加存储设备
- 通过双击 virt-manager 中的 guest 名称,打开 guest 虚拟机。
- 点击 打开 Show Virtual hardware details 选项卡。
- 在 显示虚拟硬件详细信息 选项卡中,单击 添加硬件 按钮。
选择硬件类型
选择 Storage 作为 硬件类型。图 5.1. Add new virtual hardware 向导
选择存储设备和驱动程序
创建新磁盘镜像或选择存储池卷。将 设备类型设置为 磁盘设备,并将 Bus type 设为 VirtIO 以使用 virtio 驱动程序。图 5.2. Add New Virtual Hardware 向导
点 Finish 以完成此流程。
过程 5.3. 使用 virtio 网络驱动程序添加网络设备
- 通过双击 virt-manager 中的 guest 名称,打开 guest 虚拟机。
- 点击 打开 Show Virtual hardware details 选项卡。
- 在 显示虚拟硬件详细信息 选项卡中,单击 添加硬件 按钮。
选择硬件类型
选择 Network 作为 硬件类型。图 5.3. Add new virtual hardware 向导
选择网络设备和驱动程序
将 设备模型 设置为 virtio 以使用 virtio 驱动程序。选择所需的 主机设备。图 5.4. Add new virtual hardware 向导
点 Finish 以完成此流程。
5.3. 为网络接口设备使用 KVM virtio 驱动程序
- 或者,在 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 章 网络配置
- 使用网络地址转换(NAT)的虚拟网络.
- 使用 PCI 设备分配直接分配的物理设备
- 使用 PCIe SR-IOV 直接分配的虚拟功能
- 网桥网络
6.1. 使用 libvirt 进行网络地址转换(NAT)
主机配置
每个标准 libvirt
安装都提供虚拟机的基于 NAT 的连接作为默认虚拟网络。使用 virsh net-list --all 命令验证它可用。
# virsh net-list --all
Name State Autostart
-----------------------------------------
default active yes
# 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
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>
<interface type='network'> <source network='default'/> <mac address='00:16:3e:1a:b3:4a'/> </interface>
6.2. 禁用 vhost-net
vhost-net
驱动程序))。vhost-net 驱动程序只可用于 virtio 网络接口。如果载入 vhost-net 内核模块,则默认为所有 virtio 接口启用它,但如果特定的工作负载在使用中时,可以在接口配置中禁用它。
<interface>
子元素,并按如下所示定义网络:
<interface type="network"> ... <model type="virtio"/> <driver name="qemu"/> ... </interface>
qemu
会强制数据包处理到 QEMU 用户空间,从而有效地为该接口禁用 vhost-net。
6.3. 启用 vhost-net 零复制
/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
0
6.4. 网桥网络
6.4.1. 在 Red Hat Enterprise Linux 7 主机上配置桥接网络
6.4.2. 使用虚拟机管理器桥接网络
过程 6.1. 使用 virt-manager 创建桥接
- 在 virt-manager 打开 Connection Details 窗口。
- 点选项卡。
- 单击窗口底部的,以配置新的网络接口。
- 在下拉菜单中,选择 ,然后单击 以继续。
图 6.1. 添加桥接
- 在字段中输入网桥名称,如 br0。
- 从下拉菜单中选择。从以下之一中选择:
- none - 取消激活网桥
- ONBOOT - 在下一个客户机虚拟机重新引导时激活桥接
- 热插拔 - 即使客户机虚拟机正在运行,也会激活桥接
- 选中复选框以立即激活该网桥。
- 要配置或网桥 ,请单击相应的 按钮。将打开一个单独的窗口,以指定所需的设置。进行必要的更改,完成后单击 。
- 选择要连接到您的虚拟机的物理接口。 如果接口当前被另一个虚拟客户机使用,您将收到一条警告消息。
- 点和向导关闭,把您返回到 菜单。
图 6.2. 添加桥接
6.4.3. 使用 libvirt 进行桥接网络
<bridge>
元素的 macTableManager
属性设置为 'libvirt'
:
<bridge name='br0' macTableManager='libvirt'/>这将在所有网桥端口上关闭学习(flood)模式,libvirt 将根据需要添加或删除条目。除了删除学习 MAC 地址正确转发端口的开销外,这也允许内核禁用将网桥连接到网络的物理设备上的混杂模式,从而进一步减少开销。
第 7 章 使用 KVM 进行过量使用
7.1. 简介
7.2. 过量使用内存
7.3. 过量使用虚拟化 CPU
第 8 章 KVM 客户机计时管理
- 中断无法始终同时交付到所有客户机虚拟机。这是因为虚拟机中的中断不是真正的中断。相反,它们会被主机注入到客户机虚拟机中。
- 主机可以运行另一个虚拟客户机或不同的进程。因此,中断通常需要的精确时间可能并不总是可行。
ntpd
服务实施。如需更多信息,请参阅 Red Hat Enterprise 6 部署指南。
ntpd
或 chronyd
服务提供。请注意,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
constant_tsc
位。如果未指定输出,请遵循以下步骤。
在没有 Constant 时间戳计数器的情况下配置主机
没有恒定的 TSC 频率的系统无法使用 TSC 作为虚拟机的时钟源,需要额外的配置。电源管理功能会干扰准确的时间保留,必须禁用 guest 虚拟机才能准确使用 KVM 保持时间。
constant_tsc
位,则禁用所有电源管理功能 。每个系统都使用多个计时器来保留时间。主机上 TSC 不稳定,有时是由 cpufreq 更改、深度 C 状态导致的,或者迁移到具有更快 TSC 的主机。C 深度睡眠状态可以停止 TSC。 为防止内核使用深度 C 状态,可将 processor.max_cstate=1 附加到内核启动中。要使这一更改持久,请在 /etc/default/grub
文件中编辑 GRUB_CMDLINE_LINUX 键的值。例如,如果要为每个引导启用紧急模式,请按如下方式编辑该条目:
GRUB_CMDLINE_LINUX="emergency"
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
- 将
ptp_kvm
模块设置为在重启后载入。# echo ptp_kvm > /etc/modules-load.d/ptp_kvm.conf
- 将
/dev/ptp0
时钟添加为 chrony 配置的引用:# echo "refclock PHC /dev/ptp0 poll 2" >> /etc/chrony.conf
- 重启 chrony 守护进程:
# systemctl restart chronyd
- 要验证 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 客户机所需的时间管理参数
/etc/grub2.cfg
文件中的 /kernel
行的末尾。
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
/proc/stat
的 CPU 时间字段中报告。它由 top 和 vmstat 等实用程序自动报告。它显示为 "%st",或者在"st"列中显示。请注意,它无法关闭。
第 9 章 使用 libvirt 进行网络引导
9.1. 准备引导服务器
- PXE 服务器(DHCP 和 TFTP)- 可以是 libvirt 内部服务器、手动配置 dhcpd 和 tftpd、dnsmasq、一个由 Cobbler 配置的服务器或其他服务器。
- 引导镜像 - 例如,PXELINUX 手动配置或 Cobbler。
9.1.1. 在私有 libvirt 网络中设置 PXE 引导服务器
过程 9.1. 配置 PXE 引导服务器
- 将 PXE 引导镜像和配置放在
/var/lib/tftpboot
中。 - 使用以下命令:
# virsh net-destroy default # virsh net-edit default
- 编辑默认 网络的配置文件中的
<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>
- 运行:
# virsh net-start default
- 使用 PXE 引导客户端(请参考 第 9.2 节 “使用 PXE 启动客户机”)。
9.2. 使用 PXE 启动客户机
9.2.1. 使用桥接网络
过程 9.2. 使用 PXE 和桥接网络引导客户端
- 确保启用桥接功能,以便网络可使用 PXE 引导服务器。
- 引导启用了 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 网络
- 在 libvirt 上配置 PXE 引导,如 第 9.1.1 节 “在私有 libvirt 网络中设置 PXE 引导服务器” 所示。
- 使用 libvirt 引导客户机虚拟机,并启用 PXE 引导。您可以使用 virt-install 命令使用 PXE 创建/安装新虚拟机:
virt-install --pxe --network network=default --prompt
<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 和虚拟机
- 特定于虚拟系统的订阅可以随时可用,并可应用于所有关联的虚拟机虚拟机。
- 所有可从管理程序继承的订阅优势均可随时可用,并可应用于所有相关的客户机虚拟机。
10.1. 在主机物理机器上安装 virt-who
注册 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
安装 virt-who 软件包
在主机物理机器上运行以下命令来安装 virt-who 软件包:# yum install virt-who
创建 virt-who 配置文件
对于每个管理程序,在/etc/virt-who.d/
目录中添加一个配置文件。文件必须至少包含以下片断:[libvirt] type=libvirt
有关配置 virt-who 的详情请参考 第 10.1.1 节 “配置 virt-who”。启动 virt-who 服务
在主机物理机器上运行以下命令启动 virt-who 服务:# systemctl start virt-who.service # systemctl enable virt-who.service
确认 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. 在客户门户网站中管理订阅
订阅虚拟机监控程序
由于虚拟机将获得与虚拟机监控程序相同的订阅好处,因此管理程序具有有效的订阅,且订阅可供虚拟机使用。订阅客户机虚拟机 - 首次使用
此步骤适用于拥有新订阅且之前从未订阅客户机虚拟机的用户。如果您要添加虚拟机,请跳过此步骤。要在运行 virt-who 服务的机器上使用分配给管理程序配置文件的订阅,请通过在客户机虚拟机上的终端运行以下命令自动订阅。[root@virt-who ~]# subscription-manager attach --auto
订阅额外的客户机虚拟机
如果您首次订阅了虚拟机,请跳过此步骤。如果您要添加额外的虚拟机,请注意,运行此命令不一定会在客户机虚拟机中重新附加相同的订阅。这是因为,删除所有订阅后允许自动附加来解决给定客户机虚拟机需要什么操作,可能会导致与之前使用的不同订阅。这对您的系统可能没有任何影响,但应该了解它。如果您使用手动附加程序附加虚拟机(如下所述),则需要手动附加这些虚拟机,因为自动附加将无法正常工作。使用以下命令首先删除旧客户机的订阅,然后使用自动附加订阅将订阅附加到所有客户机。在客户机虚拟机中运行这些命令。[root@virt-who ~]# subscription-manager remove --all [root@virt-who ~]# subscription-manager attach --auto
确认订阅已附加
通过在客户机虚拟机中运行以下命令来确认订阅已附加到管理程序中:[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 节 “我有订阅状态错误,我有什么作用?”.
注册其他客户端
当您在 hypervisor 中安装新客户机虚拟机时,您必须注册新虚拟机并使用附加到虚拟机监控程序的订阅,方法是在客户机虚拟机中运行以下命令:# subscription-manager register # subscription-manager attach --auto # subscription-manager list --consumed
10.1.1. 配置 virt-who
/etc/virt-who.conf
- 包含常规配置信息,包括检查连接的虚拟机监控程序的间隔。/etc/virt-who.d/hypervisor_name.conf
- 包含特定管理程序的配置信息。
virt-who.conf
所需的代码片段。要运行向导,请浏览客户门户上的 Red Hat Virtualization Agent(virt-who)Configuration Helper。
订阅资产管理器
libvirt
10.2. 注册新客户机虚拟机
[root@virt-server ~]# subscription-manager register --username=admin --password=secret --auto-attach
10.3. 删除客户机虚拟机条目
[root@virt-guest ~]# subscription-manager unregister
登录到 Subscription Manager
订阅管理器位于 红帽客户门户网站 中。点击屏幕顶部的登录图标,使用您的用户名和密码登录到客户门户网站。点订阅标签页
点 Subscriptions 选项卡。点系统链接
向下滚动页面,再单击 Systems 链接。删除系统
要删除系统配置文件,请在表中找到指定系统的配置文件,选中其名称旁边的复选框,然后单击。
10.4. 手动安装 virt-who
过程 10.2. 如何手动附加订阅
列出订阅信息并查找池 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。使用池 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. 为什么管理程序状态红色?
10.5.2. 我有订阅状态错误,我有什么作用?
- 系统没有正确订阅
- Status unknown
- 通过 virt-who(主机/虚拟机映射)将客户机绑定到管理程序.
rhsm.log
的 virt-who 日志文件,该文件位于 /var/log/rhsm/
目录中。
第 11 章 使用 QEMU 客户机代理和 SPICE 代理增强虚拟化
11.1. QEMU 客户机代理
11.1.1. 设置 QEMU 客户机代理和主机之间的通信
11.1.1.1. 在 Linux 客户机上配置 QEMU 客户机代理
过程 11.1. 在关闭 Linux 客户机中使用 virsh 设置客户机代理与主机之间的通信
关闭虚拟机
在配置 QEMU 客户机代理前,请确定虚拟机(本例中为 rhel 7)被关闭:# virsh shutdown rhel7
在客户机 XML 配置中添加 QEMU 客户机代理频道
编辑客户机的 XML 文件以添加 QEMU 客户机代理详情:# virsh edit rhel7
在客户机的 XML 文件中添加以下内容并保存更改:<channel type='unix'> <target type='virtio' name='org.qemu.guest_agent.0'/> </channel>
启动虚拟机
# virsh start rhel7
在客户端中安装 QEMU 客户机代理
安装 QEMU 客户机代理(如果尚未在客户机虚拟机中安装):# yum install qemu-guest-agent
在客户机中启动 QEMU 客户机代理
在客户机中启动 QEMU 客户机代理服务:# systemctl start qemu-guest-agent
过程 11.2. 在正在运行的 Linux 客户机中设置客户机代理和主机之间的通信
为 QEMU 客户机代理创建 XML 文件
# cat agent.xml <channel type='unix'> <target type='virtio' name='org.qemu.guest_agent.0'/> </channel>
将 QEMU 客户机代理附加到虚拟机
使用以下命令,将 QEMU 客户机代理附加到正在运行的虚拟机(本例中为 rhel7 ):# virsh attach-device rhel7 agent.xml
在客户端中安装 QEMU 客户机代理
安装 QEMU 客户机代理(如果尚未在客户机虚拟机中安装):# yum install qemu-guest-agent
在客户机中启动 QEMU 客户机代理
在客户机中启动 QEMU 客户机代理服务:# systemctl start qemu-guest-agent
过程 11.3. 使用 virt-manager在 QEMU 客户机代理和主机间设置通信
关闭虚拟机
在配置 QEMU 客户机代理前,确保虚拟机已关闭。要关闭虚拟机,请从 Virtual Machine Manager 中的虚拟机列表中选择,然后单击菜单栏中的 light 开关图标。将 QEMU 客户机代理频道添加到客户端
单击 guest 窗口顶部的 lightbulb 图标,打开虚拟机的硬件详细信息。点击 Add New Virtual Hardware 窗口,然后选择 Channel。按钮,打开从 Name 下拉列表中选择 QEMU 客户机代理并点 :图 11.1. 选择 QEMU 客户机代理频道设备
启动虚拟机
要启动虚拟机,请从 Virtual Machine Manager 中的虚拟机列表中选择,然后点击 。在客户端中安装 QEMU 客户机代理
使用 virt-manager 打开客户端,如果尚未在客户机虚拟机中安装 QEMU 客户机代理:# yum install qemu-guest-agent
在客户机中启动 QEMU 客户机代理
在客户机中启动 QEMU 客户机代理服务:# systemctl start qemu-guest-agent
11.2. 使用带有 libvirt 的 QEMU 客户机代理
- virsh shutdown --mode=agent - 此关机方法比 virsh shutdown --mode=acpi 可靠,因为 QEMU 客户机代理使用的 virsh shutdown 可以保证以干净状态关闭合作虚拟机。如果代理不存在,libvirt 必须依赖于注入 ACPI 关闭事件,但有些客户机会忽略该事件,因此不会关闭。可与 virsh reboot 相同的语法一起使用。
- virsh snapshot-create --quiesce - 允许客户机在创建快照之前将其 I/O 清空到稳定状态,这允许使用快照而无需执行 fsck 或丢失部分数据库事务。通过提供客户机合作,客户机代理可以实现高级别的磁盘内容稳定性。
- virsh domfsfreeze 和 virsh 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. 创建客户机磁盘备份
- 文件系统应用/数据库将工作缓冲区清空到虚拟磁盘,并停止接受客户端连接
- 应用程序将其数据文件变为一致的状态
- 主 hook 脚本返回
- qemu-guest-agent 冻结文件系统,管理堆栈会拍摄快照
- 已确认快照
- 文件系统功能恢复
/etc/qemu-ga/fsfreeze-hook.d/
的表行中列出的 restorecon -FvvR 命令后。表 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/ | 带有示例脚本的目录(例如,仅用于使用)。此处包含的脚本不会执行。 |
/etc/qemu-ga/fsfreeze-hook
可记录自己的消息,以及特定于应用程序的标准输出和错误消息: /var/log/qemu-ga/fsfreeze-hook.log
。如需更多信息,请参阅 libvirt 上游网站。
11.3. SPICE 代理
11.3.1. 设置 SPICE 代理和主机之间的通信
过程 11.4. 在 Linux 客户机中使用 virsh 设置客户机代理与主机之间的通信
关闭虚拟机
在配置 SPICE 代理前,请确定虚拟机(本例中为 rhel 7)被关闭:# virsh shutdown rhel7
在客户机 XML 配置中添加 SPICE 代理频道
编辑客户端的 XML 文件以添加 SPICE 代理详情:# virsh edit rhel7
在客户机的 XML 文件中添加以下内容并保存更改:<channel type='spicevmc'> <target type='virtio' name='com.redhat.spice.0'/> </channel>
启动虚拟机
# virsh start rhel7
在客户端中安装 SPICE 代理
如果尚未在客户机虚拟机中安装 SPICE 代理:# yum install spice-vdagent
在客户机中启动 SPICE 代理
在客户机中启动 SPICE 代理服务:# systemctl start spice-vdagent
过程 11.5. 在正在运行的 Linux 客户机中设置 SPICE 代理与主机之间的通信
为 SPICE 代理创建 XML 文件
# cat agent.xml <channel type='spicevmc'> <target type='virtio' name='com.redhat.spice.0'/> </channel>
将 SPICE 代理附加到虚拟机
用这个命令将 SPICE 代理附加到正在运行的虚拟机(本例中为 rhel7 ):# virsh attach-device rhel7 agent.xml
在客户端中安装 SPICE 代理
如果尚未在客户机虚拟机中安装 SPICE 代理:# yum install spice-vdagent
在客户机中启动 SPICE 代理
在客户机中启动 SPICE 代理服务:# systemctl start spice-vdagent
过程 11.6. 使用 virt-manager在 SPICE 代理和主机间设置通信
关闭虚拟机
在配置 SPICE 代理前,确保虚拟机已关闭。要关闭虚拟机,请从 Virtual Machine Manager 中的虚拟机列表中选择,然后单击菜单栏中的 light 开关图标。将 SPICE 代理频道添加到客户端
单击 guest 窗口顶部的 lightbulb 图标,打开虚拟机的硬件详细信息。点击 Add New Virtual Hardware 窗口,然后选择 Channel。按钮,打开从 名称 下拉列表中选择 SPICE 代理,编辑频道地址,然后点 :图 11.2. 选择 SPICE 代理频道设备
启动虚拟机
要启动虚拟机,请从 Virtual Machine Manager 中的虚拟机列表中选择,然后点击 。在客户端中安装 SPICE 代理
使用 virt-manager 打开客户机,并在客户机虚拟机上尚未安装 SPICE 代理:# yum install spice-vdagent
在客户机中启动 SPICE 代理
在客户机中启动 SPICE 代理服务:# systemctl start spice-vdagent
第 12 章 嵌套虚拟化
12.1. 概述
12.2. 设置
- 启用 :此功能默认为禁用。要启用它,请在 L0 主机物理机上使用以下步骤。对于 Intel:
- 检查主机系统中是否有嵌套虚拟化可用。
$ cat /sys/module/kvm_intel/parameters/nested
如果这个命令返回Y
或1
,则代表启用了该功能。如果命令返回0
或N
,请使用 ii 和 iii 的步骤。 - 卸载
kvm_intel
模块:# modprobe -r kvm_intel
- 激活嵌套功能:
# modprobe kvm_intel nested=1
- 现在,嵌套功能只有在下一次重启 L0 主机时才会启用。要永久启用它,请在
/etc/modprobe.d/kvm.conf
文件中添加以下行:options kvm_intel nested=1
AMD:- 检查系统中是否有嵌套虚拟化可用:
$ cat /sys/module/kvm_amd/parameters/nested
如果这个命令返回Y
或1
,则代表启用了该功能。如果命令返回0
或N
,请使用 ii 和 iii 的步骤。 - 卸载
kvm_amd
模块# modprobe -r kvm_amd
- 激活嵌套功能
# modprobe kvm_amd nested=1
- 现在,嵌套功能只有在下一次重启 L0 主机时才会启用。要永久启用它,请在
/etc/modprobe.d/kvm.conf
文件中添加以下行:options kvm_amd nested=1
- 使用以下方法之一为嵌套虚拟化配置 L1 虚拟机:
- virt-manager
- 打开所需 guest 的 GUI 并单击 Show Virtual Hardware Details 图标。
- 选择 Processor 菜单,并在 Configuration 部分中键入
host-passthrough
in the Model 字段(不要使用下拉菜单),然后单击" 应用 "。
[D]
- 域 XML
- 在客户机的域 XML 文件中添加以下行:
<cpu mode='host-passthrough'/>
如果客户机的 XML 配置文件已经包含<cpu>
元素,重写它。
- 要开始使用 嵌套虚拟化,请在 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. 管理
qemu-img
、virt-manager
和 virsh
工具管理的设备和客户机虚拟机管理的说明。
第 13 章 为虚拟机管理存储
13.1. 存储概念
过程 13.1. 创建并分配存储
创建存储池
从可用存储介质创建一个或多个存储池。如需更多信息,请参阅 第 13.2 节 “使用存储池”。创建存储卷
从可用存储池创建一个或多个存储卷。如需更多信息,请参阅 第 13.3 节 “使用存储卷”。为虚拟机分配存储设备。
将从存储卷中提取的一个或多个存储设备分配给客户机虚拟机。如需更多信息,请参阅 第 13.3.6 节 “在客户机中添加存储设备”。
13.2. 使用存储池
13.2.1. 存储池概念
- 本地存储池
- 本地存储池直接附加到主机服务器。它们包括本地设备中的本地目录、直接附加磁盘、物理分区以及逻辑卷管理(LVM)卷组。本地存储池对不需要迁移或大量虚拟机的部署非常有用。本地存储池可能不适用于许多生产环境,因为它们无法用于实时迁移。
- 联网的(共享)存储池
- 联网的存储池包括使用标准协议通过网络共享的存储设备。当使用 virt-manager 在主机间迁移虚拟机时,需要联网的存储,但在迁移 virsh 时是可选的。有关迁移虚拟机的更多信息,请参阅 第 15 章 KVM 迁移。
- 基于目录的存储池
- 基于磁盘的存储池
- 基于分区的存储池
- glusterfs 存储池
- 基于 iSCSI 的存储池
- 基于 LVM 的存储池
- 基于 NFS 的存储池
- 使用 SCSI 设备的基于 vHBA 的存储池
- 基于多路径的存储池
- 基于 RBD 的存储池
- 基于 Sheepdog 的存储池
- 基于 Vstorage 的存储池
- 基于 ZFS 的存储池
13.2.2. 创建存储池
13.2.2.1. 使用 virsh 创建存储池
过程 13.2. 使用 virsh 创建存储池
阅读建议并确保满足所有先决条件
对于某些存储池,本指南建议您使用某些实践。另外,某些类型的存储池有一些先决条件。要查看建议和先决条件,如果有,请参阅 第 13.2.3 节 “存储池特定”。定义存储池
存储池可以是持久性或临时的。主机系统重启后,持久性存储池会保留下来。临时存储池仅在主机重启前存在。执行以下操作之一:- 使用 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 接口时,命令中的选项名称是可选的。如果没有使用选项名称,请将横线用于不需要指定的字段。
验证是否已创建池
使用 virsh pool-list --all 列出所有现有存储池。# virsh pool-list --all Name State Autostart ----------------------------------------- default active yes guest_images_fs inactive no
定义存储池目标路径
使用 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 检测到源存储设备的数据格式与所选存储池类型的不同,构建将失败,除非指定了覆盖
选项。启动存储池
使用 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 命令只适用于持久性存储池。临时存储池创建时会自动启动。启用自动启动(可选)
默认情况下,使用 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
启动时都会自动启动存储池。验证存储池
验证存储池是否已正确创建,报告的大小与预期相同,状态报告为 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. 使用虚拟机管理器创建存储池
准备创建存储池的中
这将因不同类型的存储池而异。详情请查看 第 13.2.3 节 “存储池特定”。在本例中,您可能需要使用 GUID 分区表 重新标记磁盘。打开存储设置
- 在 Virtual Machine Manager 中,选择您要配置的主机连接。打开 Edit 菜单,再选择 Connection Details。
- 点 Connection Details 窗口中的 Storage 选项卡。
图 13.1. Storage 标签页
创建新存储池
注意使用 虚拟机管理器,您只能创建持久性存储池。临时存储池只能使用 virsh 创建。添加新存储池(第 1 部分)
点击窗口底部的 按钮。此时会出现 Add a New Storage Pool 向导。输入存储池的。这个示例使用名称 guest_images_fs。从 fs:预先填充块设备。下拉列表中,选择要创建的存储池类型。这个示例使用图 13.2. 存储池名称和类型
单击"按钮继续。添加新池(第 2 部分)
图 13.3. 存储池路径
使用相关参数配置存储池。有关每种存储池的参数的详情,请参考 第 13.2.3 节 “存储池特定”。对于某些类型的存储池,对话框中会出现一个 Build Pool 复选框。如果要从存储构建存储池,请选中 Build Pool 复选框。验证详细信息,然后单击按钮以创建存储池。
13.2.3. 存储池特定
13.2.3.1. 基于目录的存储池
参数
描述 | XML | pool-define-as | 虚拟机管理器 |
---|---|---|---|
存储池的类型 | <pool type='dir'> | [type] 目录 | dir:文件系统目录 |
存储池的名称 | <name>name</name> | [name] name | Name |
指定目标的路径。这将是用于存储池的路径。 |
<target> | 目标 path_to_pool | 目标路径 |
示例
/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
/guest_images
目录的存储池:
图 13.4. 添加新基于目录的存储池示例
13.2.3.2. 基于磁盘的存储池
建议
- 根据所使用的 libvirt 版本,将磁盘专用于存储池,可以重新格式化并擦除当前存储在磁盘设备上的所有数据。强烈建议您在创建存储池前备份存储设备中的数据。
- 不应向 guest 授予对整个磁盘或块设备(例如
/dev/sdb
)的写入权限。使用分区(例如/dev/sdb1)
或 LVM 卷。如果您将整个块设备传递给客户端,客户机可能会对它进行分区,或者创建自己的 LVM 组。这可能导致主机物理机器检测到这些分区或 LVM 组并导致错误。
先决条件
# 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 | pool-define-as | 虚拟机管理器 |
---|---|---|---|
存储池的类型 | <pool type='disk'> | [type] 磁盘 | 磁盘:物理磁盘设备 |
存储池的名称 | <name>name</name> | [name] name | Name |
指定存储设备的路径。例如: /dev/sdb |
<source> | source-dev path_to_disk | 源路径 |
指定目标的路径。这将是用于存储池的路径。 |
<target> | 目标 path_to_pool | 目标路径 |
示例
<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
图 13.5. 添加新的基于磁盘的存储池示例
13.2.3.3. 基于文件系统的存储池
建议
/dev/sdb
)。不应为 guest 授予对整个磁盘或块设备的写入权限。这个方法只应该被用来将分区(例如 /dev/sdb1)
分配给存储池。
先决条件
# mkfs.ext4 /dev/sdc1
参数
描述 | XML | pool-define-as | 虚拟机管理器 |
---|---|---|---|
存储池的类型 | <pool type='fs'> | [type] fs | fs:预先填充块设备 |
存储池的名称 | <name>name</name> | [name] name | Name |
指定分区的路径。例如: /dev/sdc1 |
<source> | [source] path_to_partition | 源路径 |
文件系统类型,例如 ext4 |
<format type='fs_type' /> | [source 格式] FS-format | 不适用 |
指定目标的路径。这将是用于存储池的路径。 |
<target> | [target] path_to_pool | 目标路径 |
示例
<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
图 13.6. 添加一个基于文件系统的存储池示例
13.2.3.4. 基于 glusterfs 的存储池
建议
先决条件
过程 13.4. 准备 Gluster 服务器
- 使用以下命令列出 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
- 如果没有安装,请安装 glusterfs-fuse 软件包。
- 如果没有启用,请启用 virt_use_fusefs 布尔值。检查是否已启用。
# setsebool virt_use_fusefs on # getsebool virt_use_fusefs virt_use_fusefs --> on
参数
描述 | XML | pool-define-as | 虚拟机管理器 |
---|---|---|---|
存储池的类型 | <pool type='gluster'> | [type] gluster | Gluster:Gluster Filesystem |
存储池的名称 | <name>name</name> | [name] name | Name |
Gluster 服务器的主机名或 IP 地址 |
<source> | source-host hostname | 主机名 |
Gluster 服务器的名称 | <name='Gluster-name' /> | source-name Gluster-name | 源名称 |
用于存储池的 Gluster 服务器上的路径 |
<dir path='Gluster-path' /> | source-path Gluster-path | 源路径 |
示例
<pool type='gluster'> <name>Gluster_pool</name> <source> <host name='111.222.111.222'/> <dir path='/'/> <name>gluster-vol1</name> </source> </pool>
# pool-define-as --name Gluster_pool --type gluster --source-host 111.222.111.222 --source-name gluster-vol1 --source-path /
Pool Gluster_pool defined
图 13.7. 添加新的基于 GlusterFS 的存储池示例
13.2.3.5. 基于 iSCSI 的存储池
建议
先决条件
过程 13.5. 创建 iSCSI 目标
安装 targetcli 软件包
# yum install targetcli
启动 targetcli 命令集
# targetcli
创建存储对象
使用存储池创建三个存储对象。- 创建块存储对象
- 导航到
/backstores/block
目录。 - 运行 create 命令。
# create [block-name][filepath]
例如:# create block1 dev=/dev/sdb1
- 创建 fileio 对象
- 进入
/fileio
目录。 - 运行 create 命令。
# create [fileio-name][image-name] [image-size]
例如:# create fileio1 /foo.img 50M
- 创建 ramdisk 对象
- 导航到
/ramdisk
目录。 - 运行 create 命令。
# create [ramdisk-name] [ramdisk-size]
例如:# create ramdisk1 1M
- 记录这一步中创建的磁盘名称。稍后将使用它们。
创建 iSCSI 目标
- 导航到
/iscsi
目录。 - 以两种方式之一创建目标:
- 运行 create 命令(不带参数)。iSCSI 限定名称( IQN)会自动生成。
- 运行 create 命令并指定 IQN 和服务器。例如:
# create iqn.2010-05.com.example.server1:iscsirhel7guest
定义门户 IP 地址
要通过 iSCSI 导出块存储,必须先配置门户、LUN 和 访问控制列表 ACL。该门户包括目标监控器的 IP 地址和 TCP,以及它连接到的启动器。iSCSI 使用端口 3260。默认配置了这个端口。连接到端口 3260:- 进入
/tpg
目录。 - 运行以下命令:
# portals/ create
此命令提供侦听端口 3260 的所有可用 IP 地址。如果只使用单个 IP 地址侦听端口 3260,请将 IP 地址添加到 命令的末尾。例如:# portals/ create 143.22.16.33
配置 LUN,并将存储对象分配到光纤
此步骤使用创建存储对象 中创建的 存储对象。- 导航到 定义门户 IP 地址 中创建的 TPG
的 lun
目录。例如:# iscsi>iqn.iqn.2010-05.com.example.server1:iscsirhel7guest
- 将第一个 LUN 分配给 ramdisk。例如:
# create /backstores/ramdisk/ramdisk1
- 将第二个 LUN 分配给块磁盘。例如:
# create /backstores/block/block1
- 将第三个 LUN 分配给 fileio 磁盘。例如:
# create /backstores/fileio/fileio1
- 列出生成的 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]
为每个启动器创建 ACL
在启动器连接时启用身份验证。您还可以将指定的 LUN 重新变为指定的非联网器。目标和启动器具有唯一名称。iSCSI 启动器使用 IQN。- 使用启动器名称查找 iSCSI initiator 的 IQN。例如:
# cat /etc/iscsi/initiator2.iscsi InitiatorName=create iqn.2010-05.com.example.server1:iscsirhel7guest
此 IQN 用于创建 ACL。 - 进入
acls
目录。 - 通过执行以下操作之一创建 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
完成此步骤后,通过 保护存储池来继续。保存配置
通过覆盖之前的引导设置使配置持久。# saveconfig
启用服务
要在下一次启动时应用保存的设置,请启用该服务。# systemctl enable target.service
可选流程
过程 13.6. 在 RAID 阵列中配置逻辑卷
创建 RAID5 阵列
有关创建 RAID5 阵列的详情,请参考 Red Hat Enterprise Linux 7 存储管理指南。在 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. 测试设备附加
附加新的 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.
分离设备
# 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
创建 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>
定义 secret
# virsh secret-define secret.xml
验证 UUID
# virsh secret-list UUID Usage -------------------------------------------------------------------------------- 2d7891af-20be-4e5e-af83-190e8a922360 iscsi iscsirhel7secret
为 UID 分配 secret
使用以下命令,将密码分配给上一步输出中的 UUID。这样可保证 CHAP 用户名和密码位于由 libvirt 控制的 secret 列表中。# MYSECRET=`printf %s "password123" | base64` # virsh secret-set-value 2d7891af-20be-4e5e-af83-190e8a922360 $MYSECRET
在存储池中添加身份验证条目
使用 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>
激活更改
必须启动存储池才能激活这些更改。- 如果存储池尚未启动,请按照使用 virsh 创建存储池中的步骤来定义和启动 存储池。
- 如果池已启动,输入以下命令停止并重启存储池:
# virsh pool-destroy iscsirhel7pool # virsh pool-start iscsirhel7pool
参数
描述 | XML | pool-define-as | 虚拟机管理器 |
---|---|---|---|
存储池的类型 | <pool type='iscsi'> | [type] iscsi | iSCSI:iSCSI 目标 |
存储池的名称 | <name>name</name> | [name] name | Name |
主机的名称。 |
<source> | source-host hostname | 主机名 |
iSCSI IQN。 |
device path="iSCSI_IQN" /> | source-dev iSCSI_IQN | 源 IQN |
指定目标的路径。这将是用于存储池的路径。 |
<target> | 目标 path_to_pool | 目标路径 |
(可选)iSCSI initiator 的 IQN。只有 ACL 将 LUN 限制为特定发起方时才需要。 |
<initiator> | 请参见以下注释。 | 启动器 IQN |
示例
<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>
# 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
图 13.8. 添加新的基于 iSCSI 的存储池示例
13.2.3.6. 基于 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 命令。
参数
描述 | XML | pool-define-as | 虚拟机管理器 |
---|---|---|---|
存储池的类型 | <pool type='logical'> | [type] logical | 逻辑:LVM 卷组 |
存储池的名称 | <name>name</name> | [name] name | Name |
存储池设备的路径 |
<source> | source-dev device_path | 源路径 |
卷组名称 | <name='VG-name' /> | source-name VG-name | 源路径 |
虚拟组格式 |
<format type='lvm2' /> | source-format lvm2 | 不适用 |
目标路径 |
<target> | target target-path | 目标路径 |
<source> <device path='/dev/sda1'/> <device path='/dev/sdb3'/> <device path='/dev/sdc2'/> ... </source>
示例
<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>
# 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
图 13.9. 添加一个基于 LVM 的新存储池示例
13.2.3.7. 基于 NFS 的存储池
先决条件
参数
描述 | XML | pool-define-as | 虚拟机管理器 |
---|---|---|---|
存储池的类型 | <pool type='netfs'> | [type] netfs | NETFS:网络导出的目录 |
存储池的名称 | <name>name</name> | [name] name | Name |
挂载点所在的 NFS 服务器的主机名称。这可以是主机名或 IP 地址。 |
<source> | source-host host_name | 主机名 |
NFS 服务器中使用的目录 |
<dir path='source_path' /> | source-path source_path | 源路径 |
指定目标的路径。这将是用于存储池的路径。 |
<target> | target target_path | 目标路径 |
示例
<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>
# virsh pool-define-as nfspool netfs --source-host localhost --source-path /home/net_mount --target /var/lib/libvirt/images/nfspool
Pool nfspool defined
图 13.10. 添加新的基于 NFS 的存储池示例
13.2.3.8. 使用 SCSI 设备使用基于 vHBA 的存储池
建议
scsi_host#
或 WWN/WWPN 对。
scsi_host#
,且硬件添加到主机计算机,scsi_host#分配可能会改变。因此,建议您使用 WWNN/WWPN 对定义父 HBA。
- libvirt 代码可使用 virsh 命令输出轻松查找 LUN 路径。
- 虚拟机迁移只需要在目标机器上定义和启动具有相同 vHBA 名称的存储池。要做到这一点,在虚拟机 XML 配置中必须指定 vHBA LUN、libvirt 存储池和卷名称。例如,请参阅 第 13.2.3.8 节 “使用 SCSI 设备使用基于 vHBA 的存储池”。
'scsi'
存储池 XML 文件。当创建一个使用同一物理 HBA 中的存储池的 vHBA 时,建议为 <path>
值使用一个稳定的位置,比如系统中的 /dev/disk/by-{path|id|uuid|label}
位置之一。
<path>
字段的值只能是 /dev/
,否则存储池卷只对其中一个 vHBA 可见,主机中的设备无法通过 NPIV 配置公开给多个客户机。
先决条件
过程 13.10. 创建 vHBA
在主机系统中找到 HBA
要在主机系统中找到 HBA,请使用 virsh nodedev-list --cap vports 命令。以下示例显示了支持 vHBA 的两个 HBA 的主机:# virsh nodedev-list --cap vports scsi_host3 scsi_host4
检查 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 后更新。创建 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 上游页面。在 vHBA 主机设备中创建新 vHBA
要基于 vhba_host3 创建 vHBA,请使用 virsh nodedev-create 命令:# virsh nodedev-create vhba_host3.xml Node device scsi_host5 created from vhba_host3.xml
验证 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>
参数
描述 | XML | pool-define-as |
---|---|---|
存储池的类型 | <pool type='scsi'> | scsi |
存储池的名称 | <name>name</name> | --adapter-name name |
vHBA 的标识符。父 属性为可选。 |
<source> |
[--adapter-parent parent] |
指定目标的路径。这将是用于存储池的路径。 |
<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_hostN
与 vports
和 max_vports
属性相结合,以完成父项识别。parent
、parent_wwnn
、parent_wwpn
或 parent_fabric_wwn
属性提供在主机重启后使用相同的 HBA 的不同保证程度。
- 如果没有指定
parent
,libvirt 将使用支持 NPIV 的第一个scsi_hostN
适配器。 - 如果只指定
parent
,则在配置中添加额外的 SCSI 主机适配器时会出现问题。 - 如果指定了
parent_wwnn
或parent_wwpn
,则在主机重启后使用相同的 HBA。 - 如果使用
parent_fabric_wwn
,在主机重启同一光纤中的 HBA 后,无论使用的scsi_hostN
是什么,都会选择同一光纤中的 HBA。
示例
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>
# 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
parent_wwnn
、parent_wwpn
或 parent_fabric_wwn
属性的方法。
配置虚拟机以使用 vHBA LUN
- 在虚拟机 XML 的虚拟机中创建一个磁盘卷。
- 在
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>
13.2.4. 删除存储池
13.2.4.1. 删除存储池的先决条件
13.2.4.2. 使用 virsh 删除存储池
- 列出定义的存储池:
# virsh pool-list --all Name State Autostart ----------------------------------------- default active yes guest_images_pool active yes
- 停止您要删除的存储池。
# virsh pool-destroy guest_images_disk
- (可选) 对于某些类型的存储池,您可以选择删除存储池所在的目录:
# virsh pool-delete guest_images_disk
- 删除存储池的定义。
# virsh pool-undefine guest_images_disk
- 确认池未定义:
# virsh pool-list --all Name State Autostart ----------------------------------------- default active yes
13.2.4.3. 使用虚拟机管理器删除存储池
- 在 Connection Details 窗口的 Storage 选项卡中,选择您要删除的存储池列表。
- 点 Storage 窗口底部的 。这会停止存储池,并释放其正在使用的任何资源。
- 点 。注意只有在存储池停止时才会启用 图标。存储池已删除。
13.3. 使用存储卷
13.3.1. 存储卷概念
--pool
storage_pool volume_name。
# virsh vol-info --pool guest_images firstimage
Name: firstimage
Type: block
Capacity: 20.00 GB
Allocation: 20.00 GB
13.3.2. 创建存储卷
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. 使用虚拟机管理器创建存储卷
打开存储设置
- 在 Virtual Machine Manager 中,打开 Edit 菜单,然后选择 Connection Details。
- 点 Connection Details 窗口中的 Storage 选项卡。
图 13.11. Storage 标签页
Connection Details 窗口左侧的窗格会显示一个存储池列表。
选择您要在其中创建存储卷的存储池
在存储池列表中,点击您要在其中创建存储卷的存储池。在所选存储池上配置的任何存储卷都出现在窗口底部的 卷 窗格中。添加新存储卷
点击 卷 列表上方的 按钮。此时会出现 Add a Storage Volume 对话框。图 13.12. 创建存储卷
配置存储卷
使用以下参数配置存储卷:- 在 Name 字段中输入存储池的名称。
- 从 Format 列表中选择存储卷的格式。
- 在 Max Capacity 项中输入存储卷的最大大小。
完成创建过程
点 Add a Storage Volume 对话框关闭,存储卷会出现在 卷 列表中。。
13.3.3. 查看存储卷
# 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 new-vol vdisk
13.3.4.2. 将数据上传到存储卷
# virsh vol-upload --pool pool-or-uuid --offset bytes --length bytes
vol-name-or-key-or-path local-file
--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
sde1
是 disk-pool
存储池中的一个卷。/tmp/data500m.empty
中的数据被复制到 sde1
。
13.3.4.3. 将数据下载到存储卷
# vol-download --pool pool-or-uuid --offset bytes --length bytes
vol-name-or-key-or-path local-file
--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
sde1
是 disk-pool
存储池中的一个卷。sde1
中的数据已下载到 /tmp/data-sde1.tmp
中。
13.3.4.4. 调整存储卷大小
# 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. 重新定义存储卷大小
# virsh vol-resize --pool disk-pool sde1 100M
13.3.5. 删除存储卷
13.3.5.1. 使用 virsh 删除存储卷
# virsh vol-delete volume_name --pool guest_images_dir
vol volume_name deleted
13.3.5.2. 使用虚拟机管理器删除存储卷
过程 13.12. 使用虚拟机管理器删除存储卷
打开存储设置
- 在 Virtual Machine Manager 中,打开 Edit 菜单,然后选择 Connection Details。
- 点 Connection Details 窗口中的 Storage 选项卡。
图 13.13. Storage 标签页
Connection Details 窗口左侧的窗格会显示一个存储池列表。
选择您要删除的存储卷
- 在存储池列表中,点击提取存储卷的存储池。在所选存储池上配置的存储卷列表显示在窗口底部的 卷 窗格中。
- 选择您要删除的存储卷。
删除存储卷
- 点击 按钮(移动 卷 列表)。此时会出现确认对话框。
- 单击所选存储卷被删除。
13.3.6. 在客户机中添加存储设备
13.3.6.1. 使用 virsh 在客户机中添加存储设备
<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
# virsh attach-disk --config Guest1 --source /var/lib/libvirt/images/FileName.img --target vdb
13.3.6.2. 使用虚拟机管理器在客户机中添加存储设备
13.3.6.2.1. 在客户机中添加存储卷
在虚拟机硬件详情窗口中打开虚拟机管理器
以 root 用户身份执行 virt-manager 命令打开 virt-manager,或打开 Applications → System Tools → Virtual Machine Manager。图 13.14. Virtual Machine Manager 窗口
选择您要添加存储卷的客户机虚拟机。点。此时会打开 Virtual Machine 窗口。点 。此时会出现硬件详细信息窗口。图 13.15. 硬件详情窗口
打开 Add New Virtual Hardware 窗口
单击。此时会出现 Add New Virtual Hardware 窗口。确定在硬件类型窗格中选择了 Storage。图 13.16. Add New Virtual Hardware 窗口
查看存储卷列表
选择选择或创建自定义存储选项 按钮。单击。此时会出现 Choose Storage Volume 对话框。图 13.17. Select Storage Volume 窗口
选择存储卷
从 Select Storage Volume 窗口左侧的列表中选择一个存储池。所选存储池中的存储卷列表会出现在 Volumes 列表中。注意您可以从 Select Storage Volume 窗口中创建存储池。如需更多信息,请参阅 第 13.2.2.2 节 “使用虚拟机管理器创建存储池”。从 Volumes 列表中选择存储卷。注意您可以从 Select Storage Volume 窗口中创建存储卷。如需更多信息,请参阅 第 13.3.2.2 节 “使用虚拟机管理器创建存储卷”。单击。Select Storage Volume 窗口关闭。配置存储卷
从设备类型列表中选择 设备类型。可用的类型有:磁盘设备、Floppy 设备和 LUN 直通.从 Bus 类型 列表中选择总线类型。可用的总线类型取决于所选的设备类型。从 Cache 模式列表中选择缓存模式。可用的缓存模式有:Hypervisor default, none, writethrough, writeback, directsync, insecure点。Add New Virtual Hardware 窗口关闭。
13.3.6.2.2. 在客户机中添加默认存储
/var/lib/libvirt/images/
目录中的基于文件的镜像。
在虚拟机硬件详情窗口中打开虚拟机管理器
以 root 用户身份执行 virt-manager 命令打开 virt-manager,或打开 Applications → System Tools → Virtual Machine Manager。图 13.18. Virtual Machine Manager 窗口
选择您要添加存储卷的客户机虚拟机。点。此时会打开 Virtual Machine 窗口。点 。此时会出现硬件详细信息窗口。图 13.19. 硬件详情窗口
打开 Add New Virtual Hardware 窗口
单击。此时会出现 Add New Virtual Hardware 窗口。确定在硬件类型窗格中选择了 Storage。图 13.20. Add New Virtual Hardware 窗口
为客户机创建一个磁盘
确保为 虚拟机选项创建磁盘镜像。在为虚拟机选项按钮创建磁盘镜像下面的文本框中输入要创建的磁盘大小。点。Add New Virtual Hardware 窗口关闭。
13.3.6.3. 在客户机中添加基于 SCSI LUN 的存储
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 的存储池”。
<disk device='lun'>
客户机磁盘配置都可以使用这个方法附加。根据您的环境替换配置。
过程 13.13. 将基于 SCSI LUN 的存储附加到客户端
- 通过在新文件中写入 <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>
- 将 sda.xml 中创建的设备与您的虚拟客户机相关联(例如:
# virsh attach-device --config Guest1 ~/sda.xml
注意使用--config
选项运行 virsh attach-device 命令,需要 guest reboot 将设备永久添加到客户端。或者,可以使用--persistent
选项而不是--config
,它也可用于将设备热插到客户机中。
图 13.21. 使用 virt-manager 配置 SCSI LUN 存储
硬件失败后重新连接到公开的 LUN
dev_loss_tmo
和 fast_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_tmo
和 fast_io_fail
的值,请执行以下操作之一:
- 编辑
/etc/multipath.conf
文件,并在defaults
部分中设置值:defaults { ... fast_io_fail_tmo 20 dev_loss_tmo infinity }
- 在 FC 主机或远程端口级别设置
dev_loss_tmo
和fast_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_tmo
和 fast_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. 在客户机虚拟机中管理存储控制器
过程 13.14. 创建虚拟 SCSI 控制器
- 显示客户机虚拟机(
Guest1
)的配置,并查找已存在的 SCSI 控制器:# virsh dumpxml Guest1 | grep controller.*scsi
如果存在设备控制器,命令将输出一个或多个类似如下的行:<controller type='scsi' model='virtio-scsi' index='0'/>
- 如果上一步没有显示设备控制器,请在一个新文件中创建一个描述,并使用以下步骤将其添加到虚拟机中:
- 通过在新文件中写入
<controller>
元素来创建设备控制器,并使用 XML 扩展名保存此文件。virtio-scsi-controller.xml
,例如:<controller type='scsi' model='virtio-scsi'/>
- 将您在
virtio-scsi-controller.xml
中创建的设备控制器与您的虚拟客户机(例如,Guest1)关联:# virsh attach-device --config Guest1 ~/virtio-scsi-controller.xml
在本例中,--config
选项的行为与磁盘的作用相同。如需更多信息,请参阅 第 13.3.6 节 “在客户机中添加存储设备”。
- 添加新的 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. 从客户机中删除存储设备
13.3.7.1. 使用 virsh 从虚拟机中删除存储
# virsh detach-disk Guest1 vdb
13.3.7.2. 使用虚拟机管理器从虚拟机中删除存储
过程 13.15. 使用虚拟机管理器从虚拟机中删除存储
在虚拟机硬件详情窗口中打开虚拟机管理器
以 root 用户身份执行 virt-manager 命令打开 virt-manager,或打开 Applications → System Tools → Virtual Machine Manager。选择您要从中删除存储设备的客户机虚拟机。点。此时会打开 Virtual Machine 窗口。点 。此时会出现硬件详细信息窗口。从客户机虚拟机中删除存储
从硬件详细信息窗格左侧的硬件列表中选择存储设备。单击。此时会出现确认对话框。单击存储已从客户机虚拟机中删除。
第 14 章 使用 qemu-img
14.1. 检查磁盘镜像
# qemu-img check [-f format
] imgname
14.2. 将更改提交至镜像
# qemu-img commit [-f fmt] [-t cache] imgname
14.3. 镜像比较
-s
选项,如果镜像大小不同,或者某个扇区在一个镜像中被分配,则镜像不会被视为相同。
# qemu-img compare [-f fmt] [-F fmt] [-p] [-s] [-q] imgname1 imgname2
0
- 镜像是相同的1
- 镜像是不同的2
- 打开其中一个镜像时出错3
- 检查扇区分配时出错4
- 读取数据时出错
14.4. 映射镜像
# 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
0x20000
(131072)字节,位于 tmp/overlay.qcow2
(以原始格式打开)从偏移 0x50000
(327680)开始。如果指定 人
格式,则压缩、加密或不以原始格式提供的数据会导致错误。
人类可读格式
解析输出。
14.4.2. json
格式
json
选项,输出会以 JSON 格式返回数组字典。除了 人工
选项提供的信息外,输出还包括以下信息:
data
- 显示扇区是否包含数据的布尔值字段零
- 显示数据是否已知为零的布尔值字段深度
- 后备文件名
的深度
json
选项时,偏移
字段是可选的。
14.5. 镜像(mending)
# qemu-img amend [-p] [-f fmt] [-t cache] -o options filename
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
参数与所选格式有所不同。
qcow2
和 qcow2 格式支持加密或压缩。qcow2
加密使用带有安全 128 位键的 AES 格式。qcow2
压缩为只读,因此如果压缩的扇区从 qcow2
格式转换,它会将新格式写成未压缩数据。
14.7. 创建并格式化新镜像或设备
大小
的新磁盘镜像 文件名,格式为
。
# qemu-img create [-f format
] [-o options] filename [size
]
-o backing_file=filename
指定基础镜像,则该镜像将只记录自身和基础镜像之间的区别。除非使用 commit 命令,否则不会修改 后备文件。在这种情况下不需要指定任何大小。
14.8. 显示镜像信息
# qemu-img info [-f format] filename
# 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 [-f fmt] [-t cache] [-p] [-u] -b backing_file [-F backing_fmt] filename
安全和
不安全
。
安全模式
并执行实际重基操作。新的后备文件可能与旧文件不同,qemu-img rebase 命令将注意,使客户机虚拟机可见 的文件名 内容保持不变。为了实现此目的,在对 后备_file 和旧备份文件更改前,任何不同的集群均将合并到 文件名 中。
安全模式
是昂贵的操作,与转换镜像相当。需要旧的备份文件才能成功完成。
不安全
模式。在这个模式中,仅更改后备文件名和 文件名 格式,而无需对文件内容执行任何检查。确保正确指定新的后备文件,或者镜像的 guestvisible 内容将损坏。
14.10. 重新大小磁盘镜像
# 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 [ -l | -a snapshot | -c snapshot | -d snapshot ] filename
- - L 列出与指定磁盘镜像关联的所有快照。
- apply 选项 -a 将磁盘镜像(文件名)恢复到之前保存 的快照 的状态。
- -c 创建映像的快照(快照)(文件名)。
- -d 删除指定的快照。
14.12. 支持的 qemu-img 格式
- Raw 磁盘镜像格式(默认)。这可以是基于文件的速度最快的格式。如果您的文件系统支持漏洞(例如 ext2 或 ext3 ),则只有写入的扇区会保留空间。使用 qemu-img info 获取镜像使用的实际大小或 ls -ls on Unix/Linux。虽然 Raw 镜像提供最佳性能,但只有 Raw 镜像只提供非常基本的功能。例如,没有快照可用。
- qcow2 - QEMU 镜像格式,具有最佳功能集,最常用的格式。使用它具有可选的 AES 加密、基于 zlib 的压缩、支持多个虚拟机快照和较小的镜像,它们对不支持漏洞的文件系统 很有用。请注意,这种丰富的功能集的性能成本如下。虽然只有上述格式可以在客户机虚拟机或主机物理机器中运行,但 qemu-img 也会识别并支持下列格式,以便从 原始、或 qcow2 格式转换。通常会自动检测到镜像的格式。除了将这些格式转换为 raw 或 qcow2 外,它们还可以从 raw 或 qcow2 转换回原始格式。请注意,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 迁移
15.1. 迁移定义和优点
- 负载均衡
- 如果 guest 虚拟机能够被过度加载,或者另一台主机机器被过度使用,则可以将客户机虚拟机移动到使用较低的主机机器中。
- 硬件独立
- 当您需要升级、添加或删除主机物理机器上时,您可以安全地将客户机虚拟机重新定位到其他主机物理机器。这意味着客户机虚拟机在改进硬件时不会遇到任何停机时间。
- 节能
- 虚拟机可以重新分发到其他主机的物理计算机,因此可以关闭未卸载的主机系统,从而在低使用阶段节省能源并降低成本。
- 地理迁移
- 虚拟机可以移到另一个位置,以降低延迟或者因为其他原因需要。
15.2. 迁移要求和限制
迁移要求
- 使用下列协议之一在共享存储中安装客户机虚拟机:
- 基于 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
- 打开
libvirtd.conf
需要以 root 身份运行该命令:# vim /etc/libvirt/libvirtd.conf
- 根据需要更改参数并保存文件。
- 重启
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™ 中提供了实时存储迁移。详情请致电您的服务代表。
15.3. 实时迁移和 Red Hat Enterprise Linux 版本兼容性
迁移方法 | 发行类型 | 示例 | 实时迁移支持 | 备注 |
---|---|---|---|---|
向前 | 主发行版本 | 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.5. 使用 virsh 进行实时 KVM 迁移
# virsh migrate --live GuestName DestinationURL
GuestName
参数表示您要迁移的客户机虚拟机的名称。
DestinationURL
参数是目标主机物理机器的连接 URL。目标系统必须运行相同的 Red Hat Enterprise Linux 版本,它们使用相同的管理程序,并且运行 libvirt。
DestinationURL
参数和 peer2peer 迁移有不同的语义:
- 正常迁移:
DestinationURL
是目标主机物理机器的 URL,如源客户机虚拟机所示。 - peer2peer 迁移:
DestinationURL
是目标主机物理计算机的 URL,如源主机物理计算机所示。
示例:使用 virsh 实时迁移
这个示例从 host1.example.com
迁移到 host2.example.com
。更改您的环境的主机物理机器名称。本例迁移了一个名为 guest1-rhel6-64
的虚拟机。
验证客户机虚拟机正在运行
在源系统中host1.example.com
,验证guest1-rhel6-64
正在运行:[root@host1 ~]# virsh list Id Name State ---------------------------------- 10 guest1-rhel6-64 running
迁移客户端虚拟机
执行以下命令,将 guest 虚拟机实时迁移到目标host2.example.com
。在目标 URL 的末尾附加/system
以便告知 libvirt 您需要完全访问。# virsh migrate --live
guest1-rhel7-64 qemu+ssh://host2.example.com/system
输入命令后,系统将提示您输入目标系统的 root 密码。Wait
根据负载和客户机虚拟机大小,迁移可能需要一些时间。virsh 只报告错误。客户机虚拟机继续在源主机物理机器中运行,直到完全迁移为止。验证客户机虚拟机已到达目标主机
从目标系统host2.example.com
,验证guest1-rhel7-64
正在运行:[root@host2 ~]# virsh list Id Name State ---------------------------------- 10 guest1-rhel7-64 running
# virsh migrate --offline --persistent
15.5.1. 使用 virsh 迁移的附加提示
- 打开 libvirtd.conf 文件,如 过程 15.1, “配置 libvirtd.conf” 所述。
- 查找处理控制部分。
################################################################# # # 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 #################################################################
- 更改
max_clients
和max_workers
参数设置。建议两个参数中的数字都相同。max_clients
每次迁移过程中将使用 2 个客户端(每个迁移一个),max_workers
则在执行阶段,目标上的 1 个 worker 使用 1 个 worker,并在完成阶段在目标 1 个 worker 上使用 1 个 worker。重要max_clients
和max_workers
参数设置会受到连接到 libvirtd 服务的所有客户机虚拟机连接的影响。这意味着,任何正在使用同一客户机虚拟机并同时执行迁移的用户也会遵循max_clients
和max_workers
参数设置的限制。这就是为什么在执行并发实时迁移之前,需要仔细考虑最大值的原因。重要max_clients
参数控制允许多少个客户端连接到 libvirt。当同时启动大量容器时,可轻松达到和超过这一限制。max_clients
参数的值可以增加以避免这种情况,但这样做会使系统更易受到攻击,从而防止系统遭到拒绝服务(DoS)攻击。要解决这个问题,Red Hat Enterprise Linux 7.0 中引入了一个新的max_anonymous_clients
设置,用于指定接受但尚未通过身份验证的连接的限制。您可以实施max_clients
和max_anonymous_clients
的组合来适合您的工作负载。 - 保存文件并重启该服务。注意有些情况下,迁移连接会下降,因为已启动但尚未通过身份验证的 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 命令的附加选项
- --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 中的最大迁移带宽。
15.6. 使用 virt-manager 迁移
连接到目标主机物理机器
在 virt-manager 接口 中,通过选择" "菜单连接到目标主机物理机器,然后单击" "。添加连接
此时会出现 Add Connection 窗口。图 15.1. 向目标主机物理机器添加连接
输入以下详情:- 管理程序 :选择 。
- 方法 :选择连接方法。
- 用户名 :输入远程主机物理机器的用户名。
- 主机名 :输入远程主机物理机器的主机名。
注意有关连接选项的详情请参考 第 19.5 节 “添加远程连接”。点。本例中使用了 SSH 连接,因此必须在下一步中输入指定的用户的密码。图 15.2. 输入密码
配置共享存储
确保源和目标主机都是共享存储,例如使用 NFS。迁移客户端虚拟机
在要迁移的 guest 中右键单击,然后单击。在字段中,使用下拉列表选择要将客户机虚拟机迁移到的主机物理计算机,然后单击 。图 15.3. 选择目的地主机物理计算机并启动迁移过程
此时会出现进度窗口。图 15.4. 进度窗口
如果迁移在没有问题的情况下完成,virt-manager 会显示在目标主机上运行的虚拟机。图 15.5. 在目标主机物理机器中运行的迁移的客户端虚拟机
第 16 章 虚拟机设备配置
- 模拟设备 纯是模拟实际硬件的虚拟设备,允许未经修改的客户机操作系统使用其标准 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 设备可能作为分配的设备支持,但由于安全性和系统配置冲突,它们存在严重的限制。
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 设备
过程 16.1. 为 PCI 设备分配准备 Intel 系统
启用 Intel VT-d 规格
Intel VT-d 规范提供对直接向虚拟机分配物理设备的硬件支持。在 Red Hat Enterprise Linux 中使用 PCI 设备分配需要这些规格。在 BIOS 中必须启用 Intel VT-d 规格。有些系统制造商默认禁用这些规格。查看这些规格的术语在制造商之间可能会不同;请咨询您的系统制造商文档,了解相关条款。在内核中激活 Intel VT-d
在/etc/sysconfig/grub
文件内添加intel_iommu=on
和iommu=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"
重新生成配置文件
运行以下命令来重新生成 /etc/grub2.cfg:grub2-mkconfig -o /etc/grub2.cfg
请注意,如果您使用基于 UEFI 的主机,则目标文件应当是/etc/grub2-efi.cfg
。随时使用
重启系统以启用更改。您的系统现在可以分配 PCI 设备。
过程 16.2. 为 PCI 设备分配准备 AMD 系统
启用 AMD IOMMU 规格
在 Red Hat Enterprise Linux 中使用 PCI 设备分配需要 AMD IOMMU 规格。在 BIOS 中必须启用这些规格。有些系统制造商默认禁用这些规格。启用 IOMMU 内核支持
在/etc/sysconfig/grub
中的引号内,将iommu=pt
附加到 GRUB_CMDLINX_LINUX 行的末尾,以便在启动时启用 AMD IOMMU 规格。重新生成配置文件
运行以下命令来重新生成 /etc/grub2.cfg:grub2-mkconfig -o /etc/grub2.cfg
请注意,如果您使用基于 UEFI 的主机,则目标文件应当是/etc/grub2-efi.cfg
。随时使用
重启系统以启用更改。您的系统现在可以分配 PCI 设备。
16.1.1. 使用 virsh 分配 PCI 设备
pci_0000_01_00_0
,以及一个名为 guest1-rhel7-64 的完全虚拟化客户端机器。
过程 16.3. 使用 virsh 为客户机虚拟机分配 PCI 设备
确定设备
首先,识别为分配给虚拟机的设备分配的 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 设备号;其他步骤中这是必需的。查看设备信息
有关域、总线和功能的信息可从 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
确定所需的配置详情
如需配置文件所需的值,请参见 virsh nodedev-dumpxml pci_0000_00_19_0 命令的输出。示例设备具有以下值: bus = 0, 插槽 = 25, function = 0。十进制配置使用这三个值:bus='0' slot='25' function='0'
添加配置详情
运行 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。要做到这一点:- 在主机上,验证要分配的设备是否具有扩展 ROM 基本地址寄存器(BAR)。要做到这一点,将 lspci -v 命令用于该设备,并检查包含以下内容的行:
Expansion ROM at
- 将 <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>
启动虚拟机
# virsh start guest1-rhel7-64
16.1.2. 使用 virt-manager 分配 PCI 设备
过程 16.4. 使用 virt-manager 为客户机虚拟机分配 PCI 设备
打开硬件设置
打开 guest 虚拟机,按钮向虚拟机添加新设备。图 16.3. 虚拟机硬件信息窗口
选择 PCI 设备
从左侧 的硬件 列表中选择 PCI 主机设备。选择未使用的 PCI 设备。请注意,选择存在于其他客户机中的 PCI 设备 会导致错误。本例中使用了备用的音频控制器。单击 Finish 以完成设置。图 16.4. Add new virtual hardware 向导
添加新设备
设置已完成,guest 虚拟机现在可以直接访问 PCI 设备。图 16.5. 虚拟机硬件信息窗口
16.1.3. 使用 virt-install 的 PCI 设备分配
--host-device
参数。
过程 16.5. 使用 virt-install 为虚拟机分配 PCI 设备
确定设备
识别为分配给客户机虚拟机的设备分配的 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 设备”。添加设备
使用 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
完成安装
完成客户机安装。PCI 设备应连接到客户机。
16.1.4. 分离分配的 PCI 设备
受管
模式(使用 域 XML 文件中的 managed='yes
参数进行配置),它会连接到客户端机器并从客户端机器分离,并根据需要重新连接到主机机器。如果 PCI 设备没有处于 受管
模式,您可以将 PCI 设备从虚拟客户机中分离,并使用 virsh 或 virt-manager 重新连接。
过程 16.6. 使用 virsh 从客户机中分离 PCI 设备
分离设备
使用以下命令,在客户机的 XML 文件中删除 PCI 设备来从客户机中分离 PCI 设备:# virsh detach-device name_of_guest file.xml
重新将设备附加到主机(可选)
如果设备处于受管
模式,则跳过此步骤。该设备将自动返回到主机。如果设备没有使用受管
模式,使用以下命令将 PCI 设备重新关联到主机机器:# virsh nodedev-reattach device
例如,要将pci_0000_01_00_0
设备重新关联到主机:# virsh nodedev-reattach pci_0000_01_00_0
该设备现在可供主机使用。
过程 16.7. 使用 virt-manager 从客户机中分离 PCI 设备
打开虚拟硬件详情屏幕
在 virt-manager 中,双击包含该设备的虚拟机。选择 Show virtual hardware details 按钮,以显示虚拟硬件列表。图 16.7. 虚拟硬件详情按钮
选择并删除该设备
从左侧面板中的虚拟设备列表选择要分离的 PCI 设备。图 16.8. 选择要分离的 PCI 设备
16.1.5. PCI Bridges
16.1.6. 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 设备分配
<源>
元素指定)可以使用直接设备分配(有时称为 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>
图 16.10. SR-IOV 的工作原理
- 物理功能(PF)是包含 SR-IOV 功能的完整 PCIe 设备。发现、托管和配置为普通 PCI 设备的物理功能。物理功能通过分配虚拟功能配置和管理 SR-IOV 功能。
- 虚拟功能(VF)是简单的 PCIe 功能,仅处理 I/O。每个虚拟功能都源自物理功能。设备可能拥有的虚拟功能数量受设备硬件的限制。单个以太网设备(物理设备)可映射到可共享虚拟机的许多虚拟功能。
16.2.1. SR-IOV 的优点
16.2.2. 使用 SR-IOV
<hostdev>
中的设备条目,可将 SR-IOV 虚拟功能(VF)分配给虚拟机。但是,这个问题可能会有问题,因为与常规网络设备不同,SR-IOV VF 网络设备没有永久唯一的 MAC 地址,每次主机重启时都会分配一个新的 MAC 地址。因此,即使客户端重启后分配了相同的 VF,当主机重启时,客户机确定其网络适配器具有新的 MAC 地址。因此,客户机在每次都连接了新硬件,通常需要对客户机的网络设置进行重新配置。
<interface type='hostdev'>
接口设备。通过使用此接口设备,libvirt 将首先执行指示的任何网络特定硬件/交换机初始化(如设置 MAC 地址、VLAN 标签或 802.1Qbh 虚拟端口参数),然后对客户机执行 PCI 设备分配。
<interface type='hostdev'>
接口设备需要:
- 支持 SR-IOV 的网卡,
- 支持 Intel VT-d 或 AMD IOMMU 扩展的主机硬件
- 要分配的 VF 的 PCI 地址。
过程 16.8. 在 Intel 或 AMD 系统中附加 SR-IOV 网络设备
在 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 的过程帮助。验证支持
验证是否检测到具有 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)
请注意,输出已被修改来删除所有其它设备。激活虚拟功能
运行以下命令:# echo ${num_vfs} > /sys/class/net/enp14s0f0/device/sriov_numvfs
使虚拟功能持久
要使虚拟功能在重新引导时持久保留,请使用您选择的编辑器创建类似如下的 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"
这将确保在引导时启用该功能。检查新的虚拟功能
使用 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.0
和0b:00.1
对应。所有虚拟功能在描述中包含虚拟功能
。使用 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 地址应该位于列表中。使用 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 上。将虚拟功能添加到虚拟机
通过以下命令,将虚拟功能添加到虚拟机,以及上一步中创建的临时文件。这会立即附加新设备,并保存它以便在以后的客户机重启。virsh attach-device MyGuest
/tmp/new-interface.xml
--live --config使用 virsh attach-device 指定--live
选项,将新设备附加到运行的客户机中。使用--config
选项可确保新设备在以后的客户机重启后可用。注意只有在客户机运行时接受--live
选项。如果在非运行的客户机中使用--live
选项,则 virsh 将返回错误。
16.2.3. 使用 SR-IOV 设备配置 PCI 分配
<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 标签”。
收集信息
要使用<接口类型='hostdev'>
,您必须具有支持 SR-IOV 的网卡,托管支持 Intel VT-d 或 AMD IOMMU 扩展的主机物理硬件,且必须知道您要分配的 VF 的 PCI 地址。关闭客户端虚拟机
使用 virsh shutdown 命令,关闭 guest 虚拟机 (这里名为 guestVM)。# virsh shutdown guestVM
打开 XML 文件进行编辑
# virsh edit guestVM.xml
可选 :对于由 virsh save 命令创建的 XML 配置文件,请运行:# virsh save-image-edit guestVM.xml
--running
此示例中的 guestVM.xml 配置文件在默认编辑器中打开。如需更多信息,请参阅 第 20.7.5 节 “编辑客户机虚拟机配置”。编辑 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")交换机。重启客户机虚拟机
运行 virsh start 命令,以重新启动您在第 2 步中关闭的 guest 虚拟机。如需更多信息,请参阅 第 20.6 节 “启动、恢复和恢复虚拟机”。# virsh start guestVM
当客户机虚拟机启动时,它会看到由物理主机机器适配器提供的网络设备,且配置了 MAC 地址。此 MAC 地址在客户机虚拟机之间保持不变,主机物理机重新引导。
16.2.4. 从 SR-IOV 虚拟功能池设置 PCI 设备分配
- 任何虚拟机启动后,指定的 VF 都必须可用。因此,管理员必须将每个 VF 永久分配给一个客户机虚拟机(或者修改每个客户机虚拟机的配置文件,以便在每次启动客户机虚拟机时都指定目前未使用的 VF 的 PCI 地址)。
- 如果 guest 虚拟机移动到另一台主机物理计算机,则该主机物理计算机必须在 PCI 总线上的同一位置拥有完全相同的硬件(或者启动之前必须修改客户机虚拟机配置)。
过程 16.10. 创建设备池
关闭客户端虚拟机
使用 virsh shutdown 命令,关闭名为 guestVM 的客户机虚拟机。# virsh shutdown guestVM
创建配置文件
使用首选的编辑器,在/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>
加载新 XML 文件
输入以下命令,将 /tmp/passthrough.xml 替换为您在上一步中创建的 XML 文件的名称和位置:# virsh net-define /tmp/passthrough.xml
重启客户端
运行以下命令,将 passthrough.xml 替换为您在上一步中创建的 XML 文件的名称:# virsh net-autostart passthrough # virsh net-start passthrough
重新启动 guest 虚拟机
运行 virsh start 命令以在第一步中重启您关闭的客户机虚拟机(例如,使用 guestVM 作为客户机虚拟机的域名)。如需更多信息,请参阅 第 20.6 节 “启动、恢复和恢复虚拟机”。# virsh start guestVM
启动设备的透传
虽然只会显示单一设备,但在客户机虚拟机首次启动时,libvirt 将自动获得与该 PF 关联的所有 VF 列表,如下所示:图 16.13. 接口网络定义的域 XML 示例
<interface type='network'> <source network='passthrough'> </interface>
验证
在启动使用网络的第一个客户机后,您可以运行 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 限制
- 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 驱动程序)
16.3. USB 设备
16.3.1. 为客户机虚拟机分配 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 设备重定向中设置限制
-device usb-redir
。filter 属性使用一个由过滤规则组成的字符串,规则的格式是:
<class>:<vendor>:<product>:<version>:<allow>
-1
值指定它接受特定字段的任何值。您可以使用 | 作为分隔符,在同一命令行中使用多个规则。请注意,如果设备不匹配通过规则,则不允许重定向该设备!
例 16.1. 使用客户机虚拟机限制重定向的示例
- 准备客户机虚拟机。
- 在客户机虚拟机的域 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>
- 启动客户机虚拟机并通过运行以下命令确认设置更改:
#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
- 将 USB 设备插入到主机物理计算机中,并使用 virt-manager 连接到客户机虚拟机。
- 在菜单中点击,这将生成以下信息:"主机策略会阻止某些 USB 设备"。 并继续。过滤器生效。
- 为确保过滤器捕获正确检查 USB 设备供应商和产品,然后在主机物理计算机的域 XML 中进行以下更改以允许 USB 重定向。
<redirfilter> <usbdev class='0x08' vendor='0x0951' product='0x1625' version='2.0' allow='yes'/> <usbdev allow='no'/> </redirfilter>
- 重新启动 guest 虚拟机,然后使用 virt-viewer 连接到客户机虚拟机。USB 设备现在会将流量重定向到客户机虚拟机。
16.4. 配置设备控制器
图 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
<model='none'>
。
<地址>
可以指定控制器到其主总线的确切关系,使用 第 16.5 节 “为设备设置地址” 所示的语义。
<驱动程序>
可以指定特定于驱动程序的选项。目前,它只支持属性队列,它指定控制器的队列数。为了获得最佳性能,建议指定一个与 vCPU 数量匹配的值。
<master>
,以指定与其主控制器相配的确切关系。配套控制器位于与其 master 的同一总线上,因此相应的 索引
值应该相等。
图 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-root
- pcie-root
- pci-bridge
- dmi-to-pci-bridge
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> ...
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> ...
图 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'
。每个地址类型都有进一步可选的属性,这些属性控制该设备在总线中的位置,如表中所述:
地址类型 | 描述 |
---|---|
type='pci' | PCI 地址有以下额外属性:
|
type='drive' | 驱动器地址有以下额外属性:
|
type='virtio-serial' | 每个 virtio-serial 地址有以下额外属性:
|
type='ccid' | 用于 smart-cards 的 CCID 地址有以下额外属性:
|
type='usb' | USB 地址有以下额外属性:
|
type='isa' | ISA 地址有以下额外属性:
|
16.6. 随机数字生成器设备
virtio-rng
,这是一个虚拟硬件随机数生成器设备,可根据需要为 guest 提供全新的熵。
/dev/hwrng
处创建一个 chardev,它可以打开,然后从主机物理机器读取提取熵。在与 rngd
守护进程的合作中,主机物理计算机中的熵可以路由到客户机虚拟机的 /dev/random
,这是随机性的主要来源。
virtio-rng
的详情请参考 Red Hat Enterprise Linux 虚拟机:访问随机数字 Made Easy。
过程 16.11. 使用虚拟机管理器实施 virtio-rng
- 关闭客户机虚拟机。
- 选择 guest 虚拟机并从菜单中选择 ,以打开指定 guest 虚拟机的 Details 窗口。
- 点按钮。
- 在窗口中,选择 打开 窗口。
图 16.20. 随机数字生成器窗口
输入预期参数,然后在完成时点击 virtio-rng 元素 中进行说明。。参数在
过程 16.12. 使用命令行工具实施 virtio-rng
- 关闭客户机虚拟机。
- 使用 virsh edit domain-name 命令,为所需的 guest 虚拟机打开 XML 文件。
- 编辑
<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 PCI 设备分配 - 使用此方法,可以从主机中删除 GPU 设备并将其分配给单个客户端。
- NVIDIA vGPU 分配 - 这个方法可以从物理 GPU 创建多个介质设备,并将这些设备分配为多个客户端。这只在所选 NVIDIA GPU 上被支持,且只能将一个介质设备分配给单个客户端。
16.7.1. GPU PCI 设备分配
- NVIDIA Quadro K-Series、M-Series、P-Series 以及更新的构架(型号为 2000 系列或更高版本)
- NVIDIA Tesla K-Series、M-Series 和更高的架构
过程 16.13. 在主机机器内核中启用 IOMMU 支持
编辑内核命令行
对于 Intel VT-d 系统,IOMMU 通过在内核命令行中添加intel_iommu=on
和iommu=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 组。重新生成引导装载程序配置
要应用内核命令行的更改,请使用grub2-mkconfig
命令重新生成引导装载程序配置:# grub2-mkconfig -o /etc/grub2.cfg
请注意,如果您使用基于 UEFI 的主机,则目标文件应当是/etc/grub2-efi.cfg
。重启主机
要使更改生效,请重启主机机器:# reboot
过程 16.14. 将 GPU 设备绑定到主机物理机器驱动程序中排除
识别 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。防止原生主机机器驱动程序使用 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,使用逗号分隔它们。重新生成引导装载程序配置
使用grub2-mkconfig
来重新生成引导装载程序配置,使其包含这个选项:# grub2-mkconfig -o /etc/grub2.cfg
请注意,如果您使用基于 UEFI 的主机,则目标文件应当是/etc/grub2-efi.cfg
。重启主机机器
要使更改生效,重启主机机器:# reboot
过程 16.15. 可选:编辑 GPU IOMMU 配置
显示 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 组。调整 IOMMU 设置
在本例中,不支持分配 NVIDIA 音频功能,因为存在旧中断支持的硬件问题。另外,在没有 GPU 本身的情况下,G GPU 音频功能通常不有用。因此,为了将 GPU 分配给客户机,必须首先将音频功能与原生主机驱动程序分离。这可使用以下方法之一完成:- 检测设备的 PCI ID,并将其附加到
/etc/sysconfig/grub
文件中的pci-stub.ids
选项中,具体如 过程 16.14, “将 GPU 设备绑定到主机物理机器驱动程序中排除” - 使用 virsh nodedev-detach 命令,如下所示:
# virsh nodedev-detach pci_0000_02_00_1 Device pci_0000_02_00_1 detached
过程 16.16. 附加 GPU
- 使用 虚拟机管理器 接口.详情请查看 第 16.1.2 节 “使用 virt-manager 分配 PCI 设备”。
- 为 GPU 创建 XML 配置片段并使用 virsh attach-device 附加它:
- 为该设备创建 XML,如下所示:
<hostdev mode='subsystem' type='pci' managed='yes'> <driver name='vfio'/> <source> <address domain='0x0000' bus='0x02' slot='0x00' function='0x0'/> </source> </hostdev>
- 将它保存到文件中,并运行 virsh attach-device [domain] [file] --persistent,以在客户机配置中包含 XML。请注意,除了客户机机器中现有仿真图形设备外,还添加了分配的 GPU。分配的 GPU 作为虚拟机中的辅助图形设备进行处理。不支持作为主图形设备分配,不应删除 guest XML 中的模拟图形设备。
- 使用 virsh edit 命令编辑客户机 XML 配置并手动添加相应的 XML 段。
过程 16.17. containerruntimeodify 在客户机上的 Xorg 配置
- 在客户机中,使用 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。 - 在客户机上的
/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。
16.7.2. NVIDIA vGPU 分配
16.7.2.1. NVIDIA vGPU 设置
- 获取 NVIDIA vGPU 驱动程序并在您的系统中安装它们。具体步骤请查看 NVIDIA 文档。
- 如果 NVIDIA 软件安装程序没有创建
/etc/modprobe.d/nvidia-installer-disable-nouveau.conf
文件,请在/etc/modprobe.d/
目录中创建.conf
文件(名称)。在文件中添加以下行:blacklist nouveau options nouveau modeset=0
- 为当前内核重新生成初始 ramdisk,然后重启:
# dracut --force # reboot
如果您需要使用带有介质设备支持的内核版本,请为所有安装的内核版本重新生成初始 ramdisk:# dracut --regenerate-all --force # reboot
- 检查
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) [...]
- 将设备 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 类型被支持。 - 在您要共享 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 控制台进行视频流
- 在您的系统中安装 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>
- (可选)将虚拟机的视频模型类型设置为 none。例如:
<video> <model type='none'/> </video>
如果没有指定,您会收到两个不同的显示输出 - 一个来自于模拟的 Cirrus 或 QXL 卡,并从 NVIDIA vGPU 中获得。另请注意,使用 模型 type='none' 目前无法看到引导图形输出,直到驱动程序初始化为止。因此,显示的第一个图形输出是登录屏幕。 - 确定虚拟机图形类型的 XML 配置是 vnc。例如:
<graphics type='vnc' port='-1' autoport='yes'> <listen type='address'/> </graphics>
- 启动虚拟机。
- 使用 VNC viewer 远程桌面客户端连接到虚拟机。注意如果虚拟机设置了模拟 VGA 作为主视频设备,且 vGPU 作为二级设备,请使用 ctrl+alt+2 键盘快捷键切换到 vGPU 显示。
16.7.2.3. 删除 NVIDIA vGPU 设备
30820a6f-b1a5-4503-91ca-0c10ba58692a
。
# echo 1 > /sys/bus/mdev/devices/uuid/remove
echo: write error: Device or resource busy
16.7.2.4. 查询 NVIDIA 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 的远程桌面流服务
- HP-RGS
- Mechdyne TGX - 目前无法将 Mechdyne TGX 与 Windows Server 2016 guest 搭配使用。
- NICE DCV - 当使用此流服务时,红帽建议使用固定解析设置,因为在一些情况下使用动态解析会导致一个黑屏。
16.7.2.6. 使用 NVIDIA vGPU 为视频流设置 VNC 控制台
简介
Configuration
- 在您的主机上安装 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>
- (可选)将虚拟机的视频模型类型设置为 none。例如:
<video> <model type='none'/> </video>
- 确定虚拟机图形类型的 XML 配置是 spice 或 vnc。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>
- 启动虚拟机。
- 使用适合您在前面步骤中配置的图形协议的客户端连接到虚拟机。
- 对于 VNC,使用 VNC viewer 远程桌面客户端。如果虚拟机设置了模拟 VGA 作为主视频设备,且 vGPU 作为辅助,请使用 ctrl+alt+2 键盘快捷键切换到 vGPU 显示。
- 对于 SPICE,请使用 virt-viewer 应用程序。
第 17 章 虚拟网络
17.1. 虚拟网络切换
图 17.1. 带两个客户机的虚拟网络交换机
$ 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. 网桥模式
图 17.2. 网桥模式的虚拟网络交换机
17.3. 网络地址转换
图 17.3. 使用两个客户机的 NAT 的虚拟网络交换机
# iptables -j SNAT --to-source [start]-[end]
17.4. DNS 和 DHCP
图 17.4. 运行 dnsmasq 的虚拟网络交换机
17.5. 路由模式
图 17.5. 使用路由模式的虚拟网络切换
17.6. 隔离模式
图 17.6. 处于隔离模式的虚拟网络交换机
17.7. 默认配置
libvirtd
的以下默认配置:
图 17.7. 默认 libvirt 网络配置
eth
0、eth1
和 eth2)。
这仅适用于路由和 NAT 模式,可以在 dev=<interface> 选项中定义,或者在创建新虚拟网络时在 virt-manager 中定义。
17.8. Common Scenarios 示例
17.8.1. 网桥模式
- 在现有网络中部署客户机虚拟机以及主机物理计算机对最终用户而言,虚拟机与物理机器之间的差别是透明的。
- 在不更改现有物理网络配置设置的情况下部署客户机虚拟机。
- 部署客户端虚拟机,这些虚拟机必须可以被现有物理网络轻松访问。将客户机虚拟机放置到物理网络中,以便它们必须在现有广播域中访问服务,如 DHCP。
- 将客户机虚拟机连接到使用 VLAN 的网络.
17.8.2. 路由模式
DMZ
考虑一个网络,因为安全原因,将一个或多个节点放置在受控的子网络中。特殊的子网络部署,如这一个常见做法,而子网络则称为 DMZ。有关这个布局的详情,请参见以下图:
图 17.8. DMZ 配置示例
虚拟服务器托管
考虑一台含有多台主机物理计算机的虚拟服务器托管公司,每个机器都有两个物理网络连接。一个接口用于管理和核算,另一个用于虚拟机进行连接。每个 guest 都有自己的公共 IP 地址,但主机物理计算机使用私有 IP 地址作为 guest 管理,只有内部管理员才能执行。参阅下图以了解这种情况:
图 17.9. 托管配置示例的虚拟服务器
17.8.3. NAT 模式
17.8.4. 隔离模式
17.9. 管理虚拟网络
- 在 Edit 菜单中,选择 Connection Details。
- 这将打开 Virtual Networks 选项卡。菜单。单击
图 17.10. 虚拟网络配置
- 菜单左侧列出了所有可用的虚拟网络。您可编辑虚拟网络的配置,方法是从此框中选择它,并在您看到合适的时进行编辑。
17.10. 创建虚拟网络
图 17.11. 虚拟网络配置
这将打开窗口。点 继续。图 17.12. 命名您的新虚拟网络
- 为您的虚拟网络输入适当的名称,然后单击"
图 17.13. 选择 IPv4 地址空间
- 选中启用 IPv4 网络地址空间定义 复选框。在 Network 字段中输入您的虚拟网络的 IPv4 地址空间。选中 Enable DHCPv4 复选框。通过指定起始和 结束 IP 地址范围来定义您的虚拟网络的 DHCP 范围。
图 17.14. 选择 IPv4 地址空间
点继续。 - 如果要启用 IPv6,请检查 启用 IPv6 网络地址空间定义。
图 17.15. 启用 IPv6
其他字段会出现在 Create a new virtual network 窗口中。