Red Hat Training
A Red Hat training course is available for Red Hat Enterprise Linux
虚拟化部署和管理指南
在 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 的服务器
完成安装
点击 Done 并继续安装。
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. 安装虚拟化软件包组
表 2.1. 虚拟化软件包组
软件包组 | 描述 | 强制的软件包 | 可选的软件包 |
---|---|---|---|
虚拟化 Hypervisor | 最小的虚拟化主机安装 | libvirt、qemu-kvm、qemu-img | qemu-kvm-tools |
虚拟化客户端 | 用于安装和管理虚拟化实例的客户端 | gnome-boxes, virt-install, virt-manager, virt-viewer, qemu-img | virt-top, libguestfs-tools, libguestfs-tools-c |
虚拟化平台 | 提供用于访问和控制虚拟机和容器的接口 | libvirt、libvirt-client、virt-who、qemu-img | fence-virtd-libvirt, fence-virtd-multicast, fence-virtd-serial, libvirt-cim, libvirt-java, libvirt-snmp, perl-Sys-Virt |
虚拟化工具 | 用于离线虚拟镜像管理的工具 | libguestfs, qemu-img | libguestfs-java, libguestfs-tools, libguestfs-tools-c |
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. 虚拟机安装方法
点 Forward 继续。选择安装源
- 如果选择了 Local 安装介质(ISO 镜像或 CDROM), 请指定您预期的本地安装介质。
图 3.3. 本地 ISO 镜像安装
警告虽然 GUI 中目前存在 选项,但无法从主机上的物理 CD-ROM 或者 DVD 设备安装。因此,选择 Use CDROM 或 DVD 选项会导致虚拟机安装失败。详情请查看 Red Hat 知识库。要从 ISO 镜像安装,请选择 Use ISO image 并点 Browse... 按钮以打开 Locate 介质卷 窗口。选择要使用的安装镜像,然后单击 Choose Volume。如果在 Locate 介质卷 窗口中没有显示镜像,点 Browse Local 按钮浏览包含安装磁盘的安装镜像或 DVD 驱动器的主机机器。选择包含安装磁盘的安装镜像或者 DVD 驱动器并点击 Open; 选择了卷供使用,并返回到 Create a new virtual machine 向导。重要对于 ISO 镜像文件和客户机存储镜像,建议使用的位置是/var/lib/libvirt/images/
。任何其他位置可能需要 SELinux 的额外配置。有关配置 SELinux 的详情,请查看 Red Hat Enterprise Linux Virtualization 安全指南 或 Red Hat Enterprise Linux SELinux User's Guide。 - 如果选择了
Network Install
,输入安装源的 URL 以及所需的内核选项(若有)。URL 必须指向安装树的根目录,它必须能够通过 HTTP、FTP 或 NFS 访问。要执行 kickstart 安装,请在内核选项中指定 kickstart 文件的 URL,从ks=
开始。图 3.4. 网络 kickstart 安装
注意有关内核选项的完整列表,请参阅 Red Hat Enterprise Linux 7 安装指南。
接下来,配置安装的操作系统 类型和 版本。确保为虚拟机选择适当的操作系统类型。这可以手动指定,或者根据 安装介质复选框选择 Automatically detect operating system。点 Forward 继续。配置内存(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 和主机文件系统,保持自己的元数据和可扩展性。使用原始磁盘意味着会影响可扩展性或最大大小的层数。
点击 Forward 在本地硬盘中创建磁盘镜像。或者,选择 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 窗口
选择新卷,再单击 Choose volume。接下来,单击 Finish 以返回到 New VM 向导。点 Forward 继续。名称和最终配置
将虚拟机命名为。虚拟机名称可以包含字母、数字和以下字符:下划线(_
)、句点(-
)。虚拟机名称对于迁移来说必须是唯一的,且不能仅包含数字。默认情况下,将使用名为"default"的网络的网络地址转换(NAT)创建虚拟机。要更改网络选择,请点击网络选择
并选择主机设备和源模式。验证虚拟机的设置,并在您满意时单击 "完成" ;这将创建具有指定网络设置、虚拟化类型和架构的虚拟机。图 3.9. 验证配置
或者,要进一步配置虚拟机的硬件,请在安装前选中 Customize configuration,以更改客户机的存储或网络设备,以使用半虚拟化(virtio)驱动程序或添加额外的设备。这会打开另一个向导,供您添加、删除和配置虚拟机的硬件设置。注意Red Hat Enterprise Linux 4 或 Red Hat Enterprise Linux 5 虚拟机无法使用图形模式安装。因此,您必须选择"Cirrus"而不是"QXL"作为显卡。配置虚拟机硬件后,请单击" 应用 "。virt-manager 将根据指定的硬件设置创建虚拟机。警告从远程介质安装 Red Hat Enterprise Linux 7 客户机虚拟机时,但没有配置的 TCP/IP 连接时,安装会失败。但是,在这样的情况下,当安装 Red Hat Enterprise Linux 5 或 6 的客户机虚拟机时,安装程序会打开"配置 TCP/IP"接口。有关这一差异的更多信息,请参阅 相关知识库文章。点 Finish 继续进入 Red Hat Enterprise Linux 安装序列。有关安装 Red Hat Enterprise Linux 7 的详情,请参考 Red Hat Enterprise Linux 7 安装指南。
3.4. virt-install 和 virt-manager 安装选项的比较
--name
、--memory
、guest 存储(--disk
、--filesystem
或 --disk none
),以及一个安装方法(--location
、--cdrom
、--pxe
、-import
或 boot
)。这些选项可以通过参数进一步指定;要查看命令选项和相关参数的完整列表,请输入以下命令:
# virt-install --help
表 3.1. guest 安装的 virt-install 和 virt-manager 配置比较
虚拟机上的配置 | virt-install 选项 | virt-manager 安装向导标签和步骤号 |
---|---|---|
虚拟机名称 | --name, -n | 名称(步骤 5) |
分配的 RAM(MiB) | --ram, -r | 内存(RAM)(第 3 步) |
Storage - 指定存储介质 | --disk | 为此虚拟机启用存储 → 在计算机的硬盘驱动器中创建磁盘镜像,或者选择托管或其他现有存储(第 4 步) |
Storage - 将主机目录导出到客户端 | --filesystem | 为此虚拟机启用存储 → Select managed 或其它现有存储(第 4 步) |
Storage - 在客户机中配置本地磁盘存储 | --nodisks | 取消选择此虚拟机的启用存储复选框(第 4 步) |
安装介质位置(本地安装) | --file | 本地安装介质 → Locate your安装介质(第 1-2 步) |
使用分发树(网络安装)进行安装. | --location | 网络 install → URL(步骤 1-2) |
使用 PXE 安装客户端 | --pxe | 网络引导(第 1 步) |
vCPU 数量 | --vcpus | CPU(第 3 步) |
主机网络 | --network | 高级选项下拉菜单(第 5 步) |
操作系统变体/版本 | --os-variant | 版本(第 2 步) |
图形显示方法 | --graphics, --nographics | * virt-manager 只提供 GUI 安装 |
第 4 章 克隆虚拟机
- 克隆 是指单个虚拟机的实例。克隆可用于设置相同虚拟机的网络,也可以将它们分发到其他目的地。
- 模板是虚拟机的 实例,设计为用作克隆的源。您可以从模板创建多个克隆,并对每个克隆进行小的修改。这对于查看系统中这些更改的影响非常有用。
- 平台级别 信息和配置包括虚拟化解决方案分配给虚拟机的任何内容。示例包括网络接口卡(NIC)及其 MAC 地址的数量。
- 客户机操作系统级别 信息和配置包括虚拟机中配置的任何内容。示例包括 SSH 密钥。
- 应用程序级别 信息和配置包括在虚拟机上安装的应用程序所配置的所有内容。示例包括激活代码和注册信息。注意本章不包括有关删除应用级别的信息,因为信息和方法特定于每个应用。
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。此时会打开 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 主菜单中,点击 Edit zfcp Connection Details 打开 Connection Details 窗口。
- 点 Network Interfaces 选项卡。
- 单击窗口底部的 +,以配置新的网络接口。
- 在 Interface 类型 下拉菜单中,选择 Bridge,然后单击 Forward 以继续。
图 6.1. 添加桥接
- 在 Name 字段中输入网桥名称,如 br0。
- 从下拉菜单中选择 Start 模式。从以下之一中选择:
- none - 取消激活网桥
- ONBOOT - 在下一个客户机虚拟机重新引导时激活桥接
- 热插拔 - 即使客户机虚拟机正在运行,也会激活桥接
- 选中 激活现在 复选框以立即激活该网桥。
- 要配置 IP 设置 或网桥 设置,请单击相应的 配置 按钮。将打开一个单独的窗口,以指定所需的设置。进行必要的更改,完成后单击 确定。
- 选择要连接到您的虚拟机的物理接口。 如果接口当前被另一个虚拟客户机使用,您将收到一条警告消息。
- 点 Finish 和向导关闭,把您返回到 Connections 菜单。
图 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
行的末尾。
表 8.1. 内核参数要求
Red Hat Enterprise Linux 版本 | 其他客户端内核参数 |
---|---|
使用 kvm-clock 的 AMD64 和 Intel 64 系统中 7.0 及更新的版本 | 不需要额外的参数 |
6.1 及更新的版本在带有 kvm-clock 的 AMD64 和 Intel 64 系统中 | 不需要额外的参数 |
带有 kvm-clock 的 AMD64 和 Intel 64 系统上的 6.0 | 不需要额外的参数 |
AMD64 和 Intel 64 系统上的 6.0,没有 kvm-clock | notsc lpj=n |
lpj
参数需要一个数字值,等于客户机虚拟机运行的特定 CPU 的每个 jiffy 值的循环。如果您不知道这个值,请不要设置 lpj
参数。
8.3. steal Time Accounting
/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。
- 您的 virt-who 报告在哪里?
订阅资产管理器
- 管理程序类型:
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 链接。删除系统
要删除系统配置文件,请在表中找到指定系统的配置文件,选中其名称旁边的复选框,然后单击 Delete。
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 Hardware 按钮,打开 Add New Virtual Hardware 窗口,然后选择 Channel。从 Name 下拉列表中选择 QEMU 客户机代理并点 Finish:图 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 客户机代理软件包内容”
表 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 Hardware 按钮,打开 Add New Virtual Hardware 窗口,然后选择 Channel。从 名称 下拉列表中选择 SPICE 代理,编辑频道地址,然后点 Finish:图 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 向导。输入存储池的 Name。这个示例使用名称 guest_images_fs。从 Type 下拉列表中,选择要创建的存储池类型。这个示例使用 fs:预先填充块设备。图 13.2. 存储池名称和类型
单击 "转发 "按钮继续。添加新池(第 2 部分)
图 13.3. 存储池路径
使用相关参数配置存储池。有关每种存储池的参数的详情,请参考 第 13.2.3 节 “存储池特定”。对于某些类型的存储池,对话框中会出现一个 Build Pool 复选框。如果要从存储构建存储池,请选中 Build Pool 复选框。验证详细信息,然后单击 Finish 按钮以创建存储池。
13.2.3. 存储池特定
13.2.3.1. 基于目录的存储池
参数
表 13.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.
#
参数
表 13.2. 基于磁盘的存储池参数
描述 | 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
参数
表 13.3. 基于文件系统的存储池参数
描述 | 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
参数
表 13.4. glusterfs 基于存储池参数
描述 | 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
参数
表 13.5. 基于 iSCSI 的存储池参数
描述 | 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 命令。
参数
表 13.6. 基于 LVM 的存储池参数
描述 | 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 的存储池
先决条件
参数
表 13.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>
参数
表 13.8. 基于 vHBA 的存储池参数
描述 | 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 项中输入存储卷的最大大小。
完成创建过程
点 Finish。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 窗口
选择您要添加存储卷的客户机虚拟机。点 Open。此时会打开 Virtual Machine 窗口。点 。此时会出现硬件详细信息窗口。图 13.15. 硬件详情窗口
打开 Add New Virtual Hardware 窗口
单击 Add Hardware。此时会出现 Add New Virtual Hardware 窗口。确定在硬件类型窗格中选择了 Storage。图 13.16. Add New Virtual Hardware 窗口
查看存储卷列表
选择选择或创建自定义存储选项 按钮。单击 Manage。此时会出现 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 节 “使用虚拟机管理器创建存储卷”。单击 Choose Volume。Select Storage Volume 窗口关闭。配置存储卷
从设备类型列表中选择 设备类型。可用的类型有:磁盘设备、Floppy 设备和 LUN 直通.从 Bus 类型 列表中选择总线类型。可用的总线类型取决于所选的设备类型。从 Cache 模式列表中选择缓存模式。可用的缓存模式有:Hypervisor default, none, writethrough, writeback, directsync, insecure点 Finish。Add New Virtual Hardware 窗口关闭。
13.3.6.2.2. 在客户机中添加默认存储
/var/lib/libvirt/images/
目录中的基于文件的镜像。
在虚拟机硬件详情窗口中打开虚拟机管理器
以 root 用户身份执行 virt-manager 命令打开 virt-manager,或打开 Applications → System Tools → Virtual Machine Manager。图 13.18. Virtual Machine Manager 窗口
选择您要添加存储卷的客户机虚拟机。点 Open。此时会打开 Virtual Machine 窗口。点 。此时会出现硬件详细信息窗口。图 13.19. 硬件详情窗口
打开 Add New Virtual Hardware 窗口
单击 Add Hardware。此时会出现 Add New Virtual Hardware 窗口。确定在硬件类型窗格中选择了 Storage。图 13.20. Add New Virtual Hardware 窗口
为客户机创建一个磁盘
确保为 虚拟机选项创建磁盘镜像。在为虚拟机选项按钮创建磁盘镜像下面的文本框中输入要创建的磁盘大小。点 Finish。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。选择您要从中删除存储设备的客户机虚拟机。点 Open。此时会打开 Virtual Machine 窗口。点 。此时会出现硬件详细信息窗口。从客户机虚拟机中删除存储
从硬件详细信息窗格左侧的硬件列表中选择存储设备。单击 Remove。此时会出现确认对话框。单击 "是"存储已从客户机虚拟机中删除。
第 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 版本兼容性
表 15.1. 实时迁移兼容性
迁移方法 | 发行类型 | 示例 | 实时迁移支持 | 备注 |
---|---|---|---|---|
向前 | 主发行版本 | 6.5+ → 7.x | 完全支持 | 应该报告任何问题 |
向后 | 主发行版本 | 7.x → 6.y | 不支持 | |
向前 | 次发行版本 | 7.x → 7.y (7.0 → 7.1) | 完全支持 | 应该报告任何问题 |
向后 | 次发行版本 | 7.y → 7.x (7.1 → 7.0) | 完全支持 | 应该报告任何问题 |
迁移故障排除
- 迁移协议的问题 - 如果向后兼容以"未知部分错误"结尾,重复迁移过程可修复该问题,因为它可能是一个瞬态错误。如果不是,请报告问题。
- 音频设备问题 - 从 Red Hat Enterprise Linux 6.x 迁移到 Red Hat Enterprise Linux 7.y 时,es1370 音频卡不再被支持。改为使用 ac97 音频卡。
- 网卡的问题 - 当从 Red Hat Enterprise Linux 6.x 迁移到 Red Hat Enterprise Linux 7.y 时,不再支持 pcnet 和 ne2k_pci 网卡。改为使用 virtio-net 网络设备。
配置网络存储
配置共享存储并在共享存储上安装客户机虚拟机。
15.4. 共享存储示例:用于简单迁移的 NFS
synch
参数。这是正确导出 NFS 存储所需要的。
导出 libvirt 镜像目录
迁移需要存储位于独立于迁移目标系统的系统中。在这个独立系统中,通过将默认镜像目录添加到/etc/exports
文件中来导出存储:/var/lib/libvirt/images
*.example.com
(rw,no_root_squash,sync)根据您的环境要求更改hostname
参数。启动 NFS
- 如果 NFS 软件包尚未安装,则安装它们:
# yum install nfs-utils
- 确保打开 iptables 中 NFS 的端口(例如 2049),并将 NFS 添加到
/etc/hosts.allow
文件中。 - 启动 NFS 服务:
# systemctl start nfs-server
将共享存储挂载到源和目的地
在迁移源和目标系统中挂载/var/lib/libvirt/images
目录:# mount
storage_host
:/var/lib/libvirt/images /var/lib/libvirt/images警告为源主机物理机器选择哪个目录都必须与目标主机物理计算机上的目录完全相同。这适用于所有共享存储。该目录必须相同,或使用 virt-manager 迁移会失败。
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 迁移
连接到目标主机物理机器
添加连接
此时会出现 Add Connection 窗口。图 15.1. 向目标主机物理机器添加连接
输入以下详情:- 管理程序 :选择 QEMU/KVM。
- 方法 :选择连接方法。
- 用户名 :输入远程主机物理机器的用户名。
- 主机名 :输入远程主机物理机器的主机名。
注意有关连接选项的详情请参考 第 19.5 节 “添加远程连接”。点 连接。本例中使用了 SSH 连接,因此必须在下一步中输入指定的用户的密码。图 15.2. 输入密码
配置共享存储
确保源和目标主机都是共享存储,例如使用 NFS。迁移客户端虚拟机
在要迁移的 guest 中右键单击,然后单击 迁移。在 New Host 字段中,使用下拉列表选择要将客户机虚拟机迁移到的主机物理计算机,然后单击 Migrate。图 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 设备"。单击确定以确认 并继续。过滤器生效。
- 为确保过滤器捕获正确检查 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'
。每个地址类型都有进一步可选的属性,这些属性控制该设备在总线中的位置,如表中所述:
表 16.1. 支持的设备类型
地址类型 | 描述 |
---|---|
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 虚拟机并从 编辑 菜单中选择 Virtual Machine Details,以打开指定 guest 虚拟机的 Details 窗口。
- 点 添加硬件 按钮。
- 在 Add New Virtual Hardware 窗口中,选择 RNG 打开 Random Number Generator 窗口。
图 16.20. 随机数字生成器窗口
输入预期参数,然后在完成时点击 Finish。参数在 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。
- 这将打开 Connection Details 菜单。单击 Virtual Networks 选项卡。
图 17.10. 虚拟网络配置
- 菜单左侧列出了所有可用的虚拟网络。您可编辑虚拟网络的配置,方法是从此框中选择它,并在您看到合适的时进行编辑。
17.10. 创建虚拟网络
图 17.11. 虚拟网络配置
这将打开 Create a new virtual network 窗口。点 Forward 继续。图 17.12. 命名您的新虚拟网络
- 为您的虚拟网络输入适当的名称,然后单击" 下一步"。
图 17.13. 选择 IPv4 地址空间
- 选中启用 IPv4 网络地址空间定义 复选框。在 Network 字段中输入您的虚拟网络的 IPv4 地址空间。选中 Enable DHCPv4 复选框。通过指定起始和 结束 IP 地址范围来定义您的虚拟网络的 DHCP 范围。
图 17.14. 选择 IPv4 地址空间
点 Forward 继续。 - 如果要启用 IPv6,请检查 启用 IPv6 网络地址空间定义。
图 17.15. 启用 IPv6
其他字段会出现在 Create a new virtual network 窗口中。图 17.16. 配置 IPv6
在 Network 字段中输入 IPv6 地址。 - 如果要启用 DHCPv6,请选中 Enable DHCPv6 复选框。其他字段会出现在 Create a new virtual network 窗口中。
图 17.17. 配置 DHCPv6
(可选)编辑 DHCPv6 范围的开头和结尾。 - 如果要启用静态路由定义,请选中 Enable Static Route Definition 复选框。其他字段会出现在 Create a new virtual network 窗口中。
图 17.18. 定义静态路由
在相应字段中输入网络地址和网关,该网关将用于该网络的路由。点 Forward。 - 选择虚拟网络应如何连接到物理网络。
图 17.19. 连接到物理网络
如果您希望隔离虚拟网络,请确保选择了 Isolated 虚拟网络 单选按钮。如果您希望虚拟网络连接到物理网络,请选择"转发到物理网络" , 并选择" 目标 "应为 任何物理设备 还是特定物理设备。另外,选择 Mode 应为 NAT 还是 Routed。如果要在虚拟网络中启用 IPv6 路由,请选中 Enable IPv6 内部路由/ 网络复选框。输入虚拟网络的 DNS 域名。单击 Finish 以创建该虚拟网络。 - 新的虚拟网络现在包括在 Connection Details 窗口的 Virtual Networks 选项卡中。
17.11. 将虚拟网络附加到客户机
- 在 Virtual Machine Manager 窗口中,突出显示分配了该网络的客户机。
图 17.20. 选择要显示的虚拟机
- 在 Virtual Machine Manager Edit 菜单中,选择 Virtual Machine Details。
- 点击 Virtual Machine Details 窗口中的 Add Hardware 按钮。
- 在 Add new virtual hardware 窗口中,从左侧窗格中选择 Network,然后从网络 源 菜单中选择您的网络名称(本例中为network1 )。修改 MAC 地址(如有必要),然后选择 设备模型。点 Finish。
图 17.21. 从 Add new virtual hardware 窗口选择您的网络
- 新网络现在显示为一个虚拟网络接口,它将在启动时提供给 guest。
图 17.22. 在客户端硬件列表中显示的新网络
17.12. 直接将虚拟 NIC 附加到物理接口
物理接口交付模式
- VEPA
- 在虚拟以太网端口聚合器(VEPA)模式中,所有来自客户机的数据包都发送到外部交换机。这可让用户通过交换机强制客户机流量。要使 VEPA 模式正常工作,外部交换机还必须支持 hairpin 模式,这样可确保其目的地为同一主机计算机上的虚拟客户机的数据包由外部交换机发回到主机。
图 17.23. VEPA 模式
- bridge
- 其目的地位于与其源客户机相同的主机中,直接传送到目标 macvtap 设备。源设备和目标设备都需要处于网桥模式,才能成功发送。如果其中任何一个设备处于 VEPA 模式,则需要支持 hairpin 的外部交换机。
图 17.24. 网桥模式
- 私有
- 所有数据包都发送到外部交换机,并且仅发送到同一主机计算机上的目标 guest(如果通过外部路由器或网关发送它们),并将这些数据包发回到主机。私有模式可用于防止单一主机上的各个客户机相互通信。如果源或者目标设备处于私有模式,则会显示这个过程。
图 17.25. 私有模式
- passthrough
- 此功能直接向客户机附加物理接口设备或 SR-IOV 虚拟功能(VF),而不会丢失迁移功能。所有数据包都直接发送到指定的网络设备。请注意,单个网络设备只能传递给单个虚拟机,因为无法在以 passthrough 模式的客户机间共享网络设备。
图 17.26. Passthrough 模式
17.12.1. 使用域 XML 配置 macvtap
<devices>
元素:
<devices> ... <interface type='direct'> <source dev='eth0' mode='vepa'/> </interface> </devices>
虚拟工作站接口类型
- managerid
- VSI Manager ID 标识包含 VSI 类型和实例定义的数据库。这是一个整数值,值 0 为保留。
- typeid
- VSI 类型 ID 标识了 VSI 类型字符化网络访问。VSI 类型通常由网络管理员管理。这是一个整数值。
- typeidversion
- VSI Type Version 允许多个 VSI 类型版本。这是一个整数值。
- InstanceID
- 当创建 VSI 实例(虚拟机的虚拟接口)时,将生成 VSI 实例 ID。这是一个全局唯一标识符。
- profileid
- 配置集 ID 包含要应用到此接口的端口配置文件的名称。此名称由 port profile 数据库解析为网络参数,这些网络参数将应用到这个接口。
<devices> ... <interface type='direct'> <source dev='eth0.2' mode='vepa'/> <virtualport type="802.1Qbg"> <parameters managerid="11" typeid="1193047" typeidversion="2" instanceid="09b11c53-8b5c-4eeb-8f00-d84eaa0aaa4f"/> </virtualport> </interface> </devices>
<devices> ... <interface type='direct'> <source dev='eth0' mode='private'/> <virtualport type='802.1Qbh'> <parameters profileid='finance'/> </virtualport> </interface> </devices> ...
17.12.2. 使用 virt-manager 配置 macvtap
图 17.27. 在 virt-manager 中配置 macvtap
17.13. 动态更改附加到虚拟 NIC 的主机物理机器或网络桥接
- 使用类似如下的配置准备客户端虚拟机:
<interface type='bridge'> <mac address='52:54:00:4a:c9:5e'/> <source bridge='virbr0'/> <model type='virtio'/> </interface>
- 为接口更新准备 XML 文件:
# cat br1.xml
<interface type='bridge'> <mac address='52:54:00:4a:c9:5e'/> <source bridge='virbr1'/> <model type='virtio'/> </interface>
- 启动 guest 虚拟机,确认 guest 虚拟机的网络功能,并检查 guest 虚拟机的 vnetX 是否已连接到您指定的网桥。
# brctl show bridge name bridge id STP enabled interfaces virbr0 8000.5254007da9f2 yes virbr0-nic vnet0 virbr1 8000.525400682996 yes virbr1-nic
- 使用以下命令使用新接口参数更新客户机虚拟机的网络:
# virsh update-device test1 br1.xml Device updated successfully
- 在 guest 虚拟机上,运行 服务网络重新启动。客户机虚拟机获取 virbr1 的新 IP 地址。检查 guest 虚拟机的 vnet0 是否已连接到新网桥(virbr1)
# brctl show bridge name bridge id STP enabled interfaces virbr0 8000.5254007da9f2 yes virbr0-nic virbr1 8000.525400682996 yes virbr1-nic vnet0
17.14. 应用网络过滤
17.14.1. 简介
- network
- Ethernet -- 必须在桥接模式中使用
- bridge
例 17.1. 网络过滤示例
<devices> <interface type='bridge'> <mac address='00:16:3e:5d:c7:9e'/> <filterref filter='clean-traffic'/> </interface> </devices>
例 17.2. 描述扩展
<devices> <interface type='bridge'> <mac address='00:16:3e:5d:c7:9e'/> <filterref filter='clean-traffic'> <parameter name='IP' value='10.0.0.1'/> </filterref> </interface> </devices>
17.14.2. 过滤链
- root
- mac
- STP(跨树协议)
- VLAN
- ARP 和 rarp
- ipv4
- ipv6
例 17.3. ARP 流量过滤
<filter name='no-arp-spoofing' chain='arp' priority='-500'> <uuid>f88f1932-debf-4aa1-9fbe-f10d3aa4bc95</uuid> <rule action='drop' direction='out' priority='300'> <mac match='no' srcmacaddr='$MAC'/> </rule> <rule action='drop' direction='out' priority='350'> <arp match='no' arpsrcmacaddr='$MAC'/> </rule> <rule action='drop' direction='out' priority='400'> <arp match='no' arpsrcipaddr='$IP'/> </rule> <rule action='drop' direction='in' priority='450'> <arp opcode='Reply'/> <arp match='no' arpdstmacaddr='$MAC'/> </rule> <rule action='drop' direction='in' priority='500'> <arp match='no' arpdstipaddr='$IP'/> </rule> <rule action='accept' direction='inout' priority='600'> <arp opcode='Request'/> </rule> <rule action='accept' direction='inout' priority='650'> <arp opcode='Reply'/> </rule> <rule action='drop' direction='inout' priority='1000'/> </filter>
17.14.3. 过滤链优先级
表 17.1. 过滤链默认优先级值
链(前缀) | 默认优先级 |
---|---|
stp | -810 |
mac | -800 |
VLAN | -750 |
ipv4 | -700 |
ipv6 | -600 |
arp | -500 |
rarp | -400 |
17.14.4. 在过滤器中使用变量
MAC
指定为网络接口的 MAC 地址。引用此变量的过滤规则将自动替换为接口的 MAC 地址。无需明确提供 MAC 参数,即可执行此操作。尽管可以指定与上述 IP 参数类似的 MAC 参数,但最好不要这样做,因为 libvirt 知道要使用的接口 MAC 地址。
IP
表示虚拟机内操作系统应该在给定接口上使用的 IP 地址。IP 参数在目前是特殊的,因为 libvirt 守护进程将尝试确定在接口上使用的 IP 地址(以及 IP 参数的值),如果未明确提供但引用该参数。对于 IP 地址检测的当前限制,请参阅有关如何使用此功能的限制 第 17.14.12 节 “限制” 以及使用功能的内容。第 17.14.2 节 “过滤链” 中显示的 XML 文件包含过滤器 no-arp-spoofing
,这是使用网络过滤器 XML 引用 MAC 和 IP 变量的示例。
$
前缀。变量的值的格式必须是 XML 中标识的 filter 属性预期的类型。在上例中,IP
参数必须采用标准格式保存法律 IP 地址。如果未提供正确的结构,则会导致过滤器变量没有被一个值替换,并阻止虚拟机启动,或者在使用热插拔时阻止接口附加。每个 XML 属性预期的一些类型显示在示例 例 17.4 “变量类型示例” 中。
例 17.4. 变量类型示例
<devices> <interface type='bridge'> <mac address='00:16:3e:5d:c7:9e'/> <filterref filter='clean-traffic'> <parameter name='IP' value='10.0.0.1'/> <parameter name='IP' value='10.0.0.2'/> <parameter name='IP' value='10.0.0.3'/> </filterref> </interface> </devices>
<rule action='accept' direction='in' priority='500'> <tcp srpipaddr='$IP'/> </rule>
<rule action='accept' direction='in' priority='500'> <udp dstportstart='$DSTPORTS[1]'/> </rule>
例 17.5. 使用各种变量
<rule action='accept' direction='in' priority='500'> <ip srcipaddr='$SRCIPADDRESSES[@1]' dstportstart='$DSTPORTS[@2]'/> </rule>
SRCIPADDRESSES = [ 10.0.0.1, 11.1.2.3 ] DSTPORTS = [ 80, 8080 ]
- 10.0.0.1, 80
- 10.0.0.1, 8080
- 11.1.2.3, 80
- 11.1.2.3, 8080
- 10.0.0.1, 80
- 11.1.2.3, 8080
17.14.5. 自动 IP 地址检测和 DHCP 侦听
17.14.5.1. 简介
CTRL_IP_LEARNING
可用于指定要使用的 IP 地址学习方法。有效值包括: 任何 、 dhcp 或 none。
CTRL_IP_LEARNING
的默认设置。这个方法将仅检测每个接口的单个 IP 地址。检测到客户机虚拟机的 IP 地址后,其 IP 网络流量将被锁定至该地址(例如,其过滤器会阻止 IP 地址 spoofing)。在这种情况下,虚拟机的用户将无法更改客户机虚拟机中的接口的 IP 地址,这将被视为 IP 地址 spoofing。将客户机虚拟机迁移到另一台主机物理计算机或在暂停操作后恢复时,客户机虚拟机发送的第一个数据包将再次确定 guest 虚拟机在特定接口上可以使用的 IP 地址。
17.14.5.2. DHCP 侦听
DHCPSERVER
设置为有效 DHCP 服务器的 IP 地址,并提供使用此变量过滤传入的 DHCP 响应的过滤器。
例 17.6. 激活 DHCP 侦听的 IP
<interface type='bridge'> <source bridge='virbr0'/> <filterref filter='clean-traffic'> <parameter name='CTRL_IP_LEARNING' value='dhcp'/> </filterref> </interface>
17.14.6. 保留变量
表 17.2. 保留变量
变量名称 | 定义 |
---|---|
MAC | 接口的 MAC 地址 |
IP | 接口使用的 IP 地址列表 |
IPV6 | 当前未实施:接口正在使用的 IPV6 地址列表 |
DHCPSERVER | 可信 DHCP 服务器的 IP 地址列表 |
DHCPSERVERV6 | 当前还未实施:可信 DHCP 服务器的 IPv6 地址列表 |
CTRL_IP_LEARNING | IP 地址检测模式的选择 |
17.14.7. 元素和属性概述
<过滤器>
:name
属性提供给定过滤器的唯一名称。chain
属性是可选的,但允许某些过滤器更好地组织,以便更加有效地由底层主机物理计算机的防火墙子系统处理。目前,系统只支持以下链: root
、ipv4
、ipv6
、arp 和 rarp
。
17.14.8. 其他过滤器的引用
例 17.7. 清理流量过滤器的示例
<filter name='clean-traffic'> <uuid>6ef53069-ba34-94a0-d33d-17751b9b8cb1</uuid> <filterref filter='no-mac-spoofing'/> <filterref filter='no-ip-spoofing'/> <filterref filter='allow-incoming-ipv4'/> <filterref filter='no-arp-spoofing'/> <filterref filter='no-other-l2-traffic'/> <filterref filter='qemu-announce-self'/> </filter>
<过滤器节点中提供 XML 节点过滤器ref>
。此节点必须具有属性过滤器,其值必须包含要引用的过滤器的名称。
17.14.9. 过滤规则
例 17.8. 网络流量过滤示例
<filter name='no-ip-spoofing' chain='ipv4'> <uuid>fce8ae33-e69e-83bf-262e-30786c1f8072</uuid> <rule action='drop' direction='out' priority='500'> <ip match='no' srcipaddr='$IP'/> </rule> </filter>
- 操作是必须的:
- drop(匹配规则会静默地丢弃数据包而不进行进一步分析)
- reject(匹配规则会生成 ICMP 拒绝消息,而不进行进一步分析)
- 接受(匹配规则接受不进一步分析的数据包)
- 返回(匹配规则通过此过滤器,但返回到调用过滤器以便进一步分析)
- 继续(匹配规则进入下一规则以便进一步分析)
- 方向是强制值:
- 中用于传入流量
- 出站流量
- 传入和传出流量
- 优先级是可选的。规则的优先级控制规则相对于其他规则的实例化顺序。具有较低值的规则将在具有更高值的规则前实例化。有效值在 -1000 到 1000 范围内。如果未提供此属性,则默认分配优先级 500。请注意,根据优先级,在 root 链中过滤规则按其优先级对连接到 root 链的过滤器进行排序。这允许交集过滤规则,并可访问 来过滤链。如需更多信息,请参阅 第 17.14.3 节 “过滤链优先级”。
- statematch 是可选的。可能的值有 '0' 或 'false',用于关闭底层连接状态。默认设置为 'true' 或 1
17.14.10. 支持的协议
srcipaddr
。以下小节展示了哪些属性有效,以及它们期望的数据类型。可用的数据类型如下:
- UINT8:8 位整数;范围 0-255
- UINT16:16 位整数;范围 0-65535
- MAC_ADDR:以点十进制格式的 MAC 地址,如 00:11:22:33:44:55
- MAC_MASK:MAC 地址格式的 MAC 地址掩码,如 FF:FF:FF:FC:00:00
- IP_ADDR:以带点十进制格式的 IP 地址,如 10.1.2.3
- IP_MASK:IP 地址掩码使用点十进制格式(255.255.248.0)或 CIDR 掩码(0-32)
- IPV6_ADDR:以数字格式的 IPv6 地址,如 FFFF::1
- IPV6_MASK:以数字格式的 IPv6 掩码(FFFF:FFFF:FC00::)或 CIDR 掩码(0-128)
- 字符串:一个字符串
- BOOLEAN: 'true', 'yes', '1' or 'false', 'no', '0'
- IPSETFLAGS:最多 6 个 'src' 或 'dst' 元素的 ipset 的源和目的地标志选择来自数据包标头的源或目标部分的功能,例如: src,src,dst。这里提供的 'selectors' 数量取决于引用的 ipset 类型
IP_MASK
或 IPV6_MASK
之外的每个属性外,可以使用值 no 的 match 属性来求反。多个指定属性可以分组在一起。以下 XML 片段显示使用抽象属性的示例。
[...] <rule action='drop' direction='in'> <protocol match='no' attribute1='value1' attribute2='value2'/> <protocol attribute3='value3'/> </rule> [...]
attribute1
不匹配 value1
和 protocol 属性属性2 不匹配 value 2
且协议属性
属性3 与 value3
匹配时,才会丢弃传入流量。
17.14.10.1. MAC(Ethernet)
表 17.3. MAC 协议类型
属性名称 | datatype | 定义 |
---|---|---|
srcmacaddr | MAC_ADDR | 发件人的 MAC 地址 |
srcmacmask | MAC_MASK | 应用到发送者的 MAC 地址的掩码 |
dstmacaddr | MAC_ADDR | 目的地的 MAC 地址 |
dstmacmask | MAC_MASK | 应用到目的地的 MAC 地址的掩码 |
protocolid | UINT16(0x600-0x selfLink), STRING | 第 3 层协议 ID。有效字符串包括 [arp, rarp, ipv4, ipv6] |
注释 | 字符串 | 最多 256 个字符的文本字符串 |
[...] <mac match='no' srcmacaddr='$MAC'/> [...]
17.14.10.2. VLAN (802.1Q)
表 17.4. VLAN 协议类型
属性名称 | datatype | 定义 |
---|---|---|
srcmacaddr | MAC_ADDR | 发件人的 MAC 地址 |
srcmacmask | MAC_MASK | 应用到发送者的 MAC 地址的掩码 |
dstmacaddr | MAC_ADDR | 目的地的 MAC 地址 |
dstmacmask | MAC_MASK | 应用到目的地的 MAC 地址的掩码 |
vlan-id | UINT16 (0x0-0xfff, 0 - 4095) | VLAN ID |
encap-protocol | UINT16(0x03c-0xfff), String | 封装的第 3 协议 ID, 有效字符串是 arp, ipv4, ipv6 |
注释 | 字符串 | 最多 256 个字符的文本字符串 |
17.14.10.3. STP(Spanning Tree 协议)
表 17.5. STP 协议类型
属性名称 | datatype | 定义 |
---|---|---|
srcmacaddr | MAC_ADDR | 发件人的 MAC 地址 |
srcmacmask | MAC_MASK | 应用到发送者的 MAC 地址的掩码 |
type | UINT8 | 网桥协议数据单元(BPDU)类型 |
flags | UINT8 | BPDU 标志dstmacmask |
root-priority | UINT16 | 根优先级范围开始 |
root-priority-hi | UINT16 (0x0-0xfff, 0 - 4095) | 根优先级范围末尾 |
root-address | MAC _ADDRESS | 根 MAC 地址 |
root-address-mask | MAC _MASK | 根 MAC 地址掩码 |
roor-cost | UINT32 | 根路径成本(范围开始) |
root-cost-hi | UINT32 | 根路径成本范围结束 |
sender-priority-hi | UINT16 | 发件人优先级范围结束 |
sender-address | MAC_ADDRESS | BPDU 发件人 MAC 地址 |
sender-address-mask | MAC_MASK | BPDU 发件人 MAC 地址掩码 |
端口 | UINT16 | 端口标识符(范围启动) |
port_hi | UINT16 | 端口标识符范围结束 |
msg-age | UINT16 | Message age timer(范围开始) |
msg-age-hi | UINT16 | 消息年龄计时器范围结束 |
max-age-hi | UINT16 | 最长年龄时间范围结束 |
hello-time | UINT16 | hello 时间计时器(范围开始) |
hello-time-hi | UINT16 | hello 时间计时器范围结束 |
forward-delay | UINT16 | 转发延迟(范围开始) |
forward-delay-hi | UINT16 | 转发延迟范围结束 |
注释 | 字符串 | 最多 256 个字符的文本字符串 |
17.14.10.4. ARP/RARP
表 17.6. ARP 和 RARP 协议类型
属性名称 | datatype | 定义 |
---|---|---|
srcmacaddr | MAC_ADDR | 发件人的 MAC 地址 |
srcmacmask | MAC_MASK | 应用到发送者的 MAC 地址的掩码 |
dstmacaddr | MAC_ADDR | 目的地的 MAC 地址 |
dstmacmask | MAC_MASK | 应用到目的地的 MAC 地址的掩码 |
hwtype | UINT16 | 硬件类型 |
protocoltype | UINT16 | 协议类型 |
opcode | UINT16, 字符串 | opcode 有效字符串有:请求, Reply, Request_Reverse, Reply_Reverse, DRARP_Request, DRARP_Reply, DRARP_Error, InARP_Request, ARP_NAK |
arpsrcmacaddr | MAC_ADDR | ARP/RARP 数据包中的源 MAC 地址 |
arpdstmacaddr | MAC _ADDR | ARP/RARP 数据包中的目的地 MAC 地址 |
arpsrcipaddr | IP_ADDR | ARP/RARP 数据包中的源 IP 地址 |
arpdstipaddr | IP_ADDR | ARP/RARP 数据包中的目的地 IP 地址 |
gratuitous | 布尔值 | 布尔值指明是否检查一个 gratuitus ARP 数据包 |
注释 | 字符串 | 最多 256 个字符的文本字符串 |
17.14.10.5. IPv4
表 17.7. IPv4 协议类型
属性名称 | datatype | 定义 |
---|---|---|
srcmacaddr | MAC_ADDR | 发件人的 MAC 地址 |
srcmacmask | MAC_MASK | 应用到发送者的 MAC 地址的掩码 |
dstmacaddr | MAC_ADDR | 目的地的 MAC 地址 |
dstmacmask | MAC_MASK | 应用到目的地的 MAC 地址的掩码 |
srcipaddr | IP_ADDR | 源 IP 地址 |
srcipmask | IP_MASK | 应用到源 IP 地址的掩码 |
dstipaddr | IP_ADDR | 目标 IP 地址 |
dstipmask | IP_MASK | 应用到目标 IP 地址的掩码 |
协议 | UINT8, 字符串 | 第 4 层协议标识符。协议的有效字符串有:tcp、udp、udplite、esp、ah、icmp、igmp、sctp |
srcportstart | UINT16 | 有效源端口的范围开始;需要协议 |
srcportend | UINT16 | 有效源端口范围结束 ; 需要协议 |
dstportstart | UNIT16 | 有效目的端口的范围开始;需要协议 |
dstportend | UNIT16 | 有效目的端口范围结束 ; 需要协议 |
注释 | 字符串 | 最多 256 个字符的文本字符串 |
17.14.10.6. IPv6
表 17.8. IPv6 协议类型
属性名称 | datatype | 定义 |
---|---|---|
srcmacaddr | MAC_ADDR | 发件人的 MAC 地址 |
srcmacmask | MAC_MASK | 应用到发送者的 MAC 地址的掩码 |
dstmacaddr | MAC_ADDR | 目的地的 MAC 地址 |
dstmacmask | MAC_MASK | 应用到目的地的 MAC 地址的掩码 |
srcipaddr | IP_ADDR | 源 IP 地址 |
srcipmask | IP_MASK | 应用到源 IP 地址的掩码 |
dstipaddr | IP_ADDR | 目标 IP 地址 |
dstipmask | IP_MASK | 应用到目标 IP 地址的掩码 |
协议 | UINT8, 字符串 | 第 4 层协议标识符。协议的有效字符串有:tcp、udp、udplite、esp、ah、icmpv6、sctp |
scrportstart | UNIT16 | 有效源端口的范围开始;需要协议 |
srcportend | UINT16 | 有效源端口范围结束 ; 需要协议 |
dstportstart | UNIT16 | 有效目的端口的范围开始;需要协议 |
dstportend | UNIT16 | 有效目的端口范围结束 ; 需要协议 |
注释 | 字符串 | 最多 256 个字符的文本字符串 |
17.14.10.7. TCP/UDP/SCTP
表 17.9. TCP/UDP/SCTP 协议类型
属性名称 | datatype | 定义 |
---|---|---|
srcmacaddr | MAC_ADDR | 发件人的 MAC 地址 |
srcipaddr | IP_ADDR | 源 IP 地址 |
srcipmask | IP_MASK | 应用到源 IP 地址的掩码 |
dstipaddr | IP_ADDR | 目标 IP 地址 |
dstipmask | IP_MASK | 应用到目标 IP 地址的掩码 |
scripto | IP_ADDR | 源 IP 地址的范围开始 |
srcipfrom | IP_ADDR | 源 IP 地址的范围结束 |
dstipfrom | IP_ADDR | 目标 IP 地址的范围开始 |
dstipto | IP_ADDR | 目标 IP 地址的范围结束 |
scrportstart | UNIT16 | 有效源端口的范围开始;需要协议 |
srcportend | UINT16 | 有效源端口范围结束 ; 需要协议 |
dstportstart | UNIT16 | 有效目的端口的范围开始;需要协议 |
dstportend | UNIT16 | 有效目的端口范围结束 ; 需要协议 |
注释 | 字符串 | 最多 256 个字符的文本字符串 |
状态 | 字符串 | 以逗号分隔的 NEW、ESTABLISHED、RELATED、INVALID 或 NONE 的列表 |
flags | 字符串 | 仅限 TCP-only:带有掩码和标记的掩码/标记格式,各自是以逗号分开的 SYN、ACK、URG、PSH、FIN、RST 或 NONE 或 ALL 的列表 |
ipset | 字符串 | 在 libvirt 之外管理的 IPSet 的名称 |
ipsetflags | IPSETFLAGS | IPSet 的标记;需要 ipset 属性 |
17.14.10.8. ICMP
表 17.10. ICMP 协议类型
属性名称 | datatype | 定义 |
---|---|---|
srcmacaddr | MAC_ADDR | 发件人的 MAC 地址 |
srcmacmask | MAC_MASK | 掩码应用到发件人的 MAC 地址 |
dstmacaddr | MAD_ADDR | 目的地的 MAC 地址 |
dstmacmask | MAC_MASK | 应用到目的地的 MAC 地址的掩码 |
srcipaddr | IP_ADDR | 源 IP 地址 |
srcipmask | IP_MASK | 应用到源 IP 地址的掩码 |
dstipaddr | IP_ADDR | 目标 IP 地址 |
dstipmask | IP_MASK | 应用到目标 IP 地址的掩码 |
srcipfrom | IP_ADDR | 源 IP 地址的范围开始 |
scripto | IP_ADDR | 源 IP 地址的范围结束 |
dstipfrom | IP_ADDR | 目标 IP 地址的范围开始 |
dstipto | IP_ADDR | 目标 IP 地址的范围结束 |
type | UNIT16 | ICMP 类型 |
代码 | UNIT16 | ICMP 代码 |
注释 | 字符串 | 最多 256 个字符的文本字符串 |
状态 | 字符串 | 以逗号分隔的 NEW、ESTABLISHED、RELATED、INVALID 或 NONE 的列表 |
ipset | 字符串 | 在 libvirt 之外管理的 IPSet 的名称 |
ipsetflags | IPSETFLAGS | IPSet 的标记;需要 ipset 属性 |
17.14.10.9. IGMP, ESP, AH, UDPLITE, 'ALL'
表 17.11. IGMP, ESP, AH, UDPLITE, 'ALL'
属性名称 | datatype | 定义 |
---|---|---|
srcmacaddr | MAC_ADDR | 发件人的 MAC 地址 |
srcmacmask | MAC_MASK | 掩码应用到发件人的 MAC 地址 |
dstmacaddr | MAD_ADDR | 目的地的 MAC 地址 |
dstmacmask | MAC_MASK | 应用到目的地的 MAC 地址的掩码 |
srcipaddr | IP_ADDR | 源 IP 地址 |
srcipmask | IP_MASK | 应用到源 IP 地址的掩码 |
dstipaddr | IP_ADDR | 目标 IP 地址 |
dstipmask | IP_MASK | 应用到目标 IP 地址的掩码 |
srcipfrom | IP_ADDR | 源 IP 地址的范围开始 |
scripto | IP_ADDR | 源 IP 地址的范围结束 |
dstipfrom | IP_ADDR | 目标 IP 地址的范围开始 |
dstipto | IP_ADDR | 目标 IP 地址的范围结束 |
注释 | 字符串 | 最多 256 个字符的文本字符串 |
状态 | 字符串 | 以逗号分隔的 NEW、ESTABLISHED、RELATED、INVALID 或 NONE 的列表 |
ipset | 字符串 | 在 libvirt 之外管理的 IPSet 的名称 |
ipsetflags | IPSETFLAGS | IPSet 的标记;需要 ipset 属性 |
17.14.10.10. TCP/UDP/SCTP over IPV6
表 17.12. TCP、UDP、SCTP over IPv6 协议类型
属性名称 | datatype | 定义 |
---|---|---|
srcmacaddr | MAC_ADDR | 发件人的 MAC 地址 |
srcipaddr | IP_ADDR | 源 IP 地址 |
srcipmask | IP_MASK | 应用到源 IP 地址的掩码 |
dstipaddr | IP_ADDR | 目标 IP 地址 |
dstipmask | IP_MASK | 应用到目标 IP 地址的掩码 |
srcipfrom | IP_ADDR | 源 IP 地址的范围开始 |
scripto | IP_ADDR | 源 IP 地址的范围结束 |
dstipfrom | IP_ADDR | 目标 IP 地址的范围开始 |
dstipto | IP_ADDR | 目标 IP 地址的范围结束 |
srcportstart | UINT16 | 有效源端口的范围 |
srcportend | UINT16 | 有效源端口的范围结束 |
dstportstart | UINT16 | 有效目的端口的范围开始 |
dstportend | UINT16 | 有效目标端口的范围结束 |
注释 | 字符串 | 最多 256 个字符的文本字符串 |
状态 | 字符串 | 以逗号分隔的 NEW、ESTABLISHED、RELATED、INVALID 或 NONE 的列表 |
ipset | 字符串 | 在 libvirt 之外管理的 IPSet 的名称 |
ipsetflags | IPSETFLAGS | IPSet 的标记;需要 ipset 属性 |
17.14.10.11. ICMPv6
表 17.13. ICMPv6 协议类型
属性名称 | datatype | 定义 |
---|---|---|
srcmacaddr | MAC_ADDR | 发件人的 MAC 地址 |
srcipaddr | IP_ADDR | 源 IP 地址 |
srcipmask | IP_MASK | 应用到源 IP 地址的掩码 |
dstipaddr | IP_ADDR | 目标 IP 地址 |
dstipmask | IP_MASK | 应用到目标 IP 地址的掩码 |
srcipfrom | IP_ADDR | 源 IP 地址的范围开始 |
scripto | IP_ADDR | 源 IP 地址的范围结束 |
dstipfrom | IP_ADDR | 目标 IP 地址的范围开始 |
dstipto | IP_ADDR | 目标 IP 地址的范围结束 |
type | UINT16 | ICMPv6 类型 |
代码 | UINT16 | ICMPv6 代码 |
注释 | 字符串 | 最多 256 个字符的文本字符串 |
状态 | 字符串 | 以逗号分隔的 NEW、ESTABLISHED、RELATED、INVALID 或 NONE 的列表 |
ipset | 字符串 | 在 libvirt 之外管理的 IPSet 的名称 |
ipsetflags | IPSETFLAGS | IPSet 的标记;需要 ipset 属性 |
17.14.10.12. IGMP, ESP, AH, UDPLITE, 'ALL' over IPv6
表 17.14. IGMP, ESP, AH, UDPLITE, 'ALL' over IPv6 协议类型
属性名称 | datatype | 定义 |
---|---|---|
srcmacaddr | MAC_ADDR | 发件人的 MAC 地址 |
srcipaddr | IP_ADDR | 源 IP 地址 |
srcipmask | IP_MASK | 应用到源 IP 地址的掩码 |
dstipaddr | IP_ADDR | 目标 IP 地址 |
dstipmask | IP_MASK | 应用到目标 IP 地址的掩码 |
srcipfrom | IP_ADDR | 源 IP 地址的范围开始 |
scripto | IP_ADDR | 源 IP 地址的范围结束 |
dstipfrom | IP_ADDR | 目标 IP 地址的范围开始 |
dstipto | IP_ADDR | 目标 IP 地址的范围结束 |
注释 | 字符串 | 最多 256 个字符的文本字符串 |
状态 | 字符串 | 以逗号分隔的 NEW、ESTABLISHED、RELATED、INVALID 或 NONE 的列表 |
ipset | 字符串 | 在 libvirt 之外管理的 IPSet 的名称 |
ipsetflags | IPSETFLAGS | IPSet 的标记;需要 ipset 属性 |
17.14.11. 高级过滤器配置主题
17.14.11.1. 连接跟踪
例 17.9. 关闭到 TCP 端口的 XML 示例
[...] <rule direction='in' action='accept' statematch='false'> <cp dstportstart='12345'/> </rule> [...]
17.14.11.2. 限制连接数量
例 17.10. 设定到连接的 XML 示例文件
[...] <rule action='drop' direction='in' priority='400'> <tcp connlimit-above='1'/> </rule> <rule action='accept' direction='in' priority='500'> <tcp dstportstart='22'/> </rule> <rule action='drop' direction='out' priority='400'> <icmp connlimit-above='1'/> </rule> <rule action='accept' direction='out' priority='500'> <icmp/> </rule> <rule action='accept' direction='out' priority='500'> <udp dstportstart='53'/> </rule> <rule action='drop' direction='inout' priority='1000'> <all/> </rule> [...]
sysfs
中的超时:# echo 3 > /proc/sys/net/netfilter/nf_conntrack_icmp_timeout。此命令将 ICMP 连接跟踪超时设置为 3 秒。这样做的效果是,一旦 ping 被终止,另一个 ping 在 3 秒后可以启动。
17.14.11.3. 命令行工具
nwfilter
开头。可用的命令如下:
- nwfilter-list :列出所有网络过滤器的 UUID 和名称
- nwfilter-define :定义一个新的网络过滤器或更新现有网络(必须提供名称)
- nwfilter-undefine :删除指定的网络过滤器(必须提供名称)。不要删除当前正在使用的网络过滤器。
- nwfilter-dumpxml :显示指定的网络过滤器(必须提供名称)
- nwfilter-edit :编辑指定的网络过滤器(必须提供名称)
17.14.11.4. 预先存在的网络过滤器
表 17.15. ICMPv6 协议类型
协议名称 | 描述 |
---|---|
allow-arp | 可接受到客户机虚拟机的所有传入和出站地址解析协议(ARP)流量。 |
no-arp-spoofing ,no-arp-mac-spoofing , 和 no-arp-ip-spoofing | 这些过滤器可防止客户机虚拟机欺骗 ARP 流量。另外,它们仅允许 ARP 请求和回复消息,并强制这些数据包包含:
|
low-dhcp | 允许客户机虚拟机通过 DHCP 请求 IP 地址(来自任何 DHCP 服务器)。 |
low-dhcp-server | 允许客户机虚拟机从指定的 DHCP 服务器请求 IP 地址。DHCP 服务器的十进制 IP 地址必须在对此过滤器的引用中提供。变量的名称必须是 DHCPSERVER。 |
low-ipv4 | 接受虚拟机的所有传入和传出 IPv4 流量。 |
low-incoming-ipv4 | 仅接受虚拟机的传入 IPv4 流量。此过滤器是 clean-traffic 过滤器的一部分。 |
no-ip-spoofing | 防止客户机虚拟机发送源 IP 地址与数据包内不同的 IP 地址的 IP 数据包。此过滤器是 clean-traffic 过滤器的一部分。 |
no-ip-multicast | 防止客户机虚拟机发送 IP 多播数据包。 |
no-mac-broadcast | 防止将 IPv4 传出流量到指定的 MAC 地址。此过滤器是 clean-traffic 过滤器的一部分。 |
no-other-l2-traffic | 防止除由网络使用的其他过滤器指定的流量之外的所有第 2 层网络流量。此过滤器是 clean-traffic 过滤器的一部分。 |
no-other-rarp-traffic ,qemu-announce-self ,qemu-announce-self-rarp | 这些过滤器允许 QEMU 自助式地址解析协议(RARP)数据包,但阻止所有其他 RARP 流量。它们也包含在 clean-traffic 过滤器中。 |
clean-traffic | 防止 MAC、IP 和 ARP 欺骗。此过滤器将其他几个过滤器作为构建块引用。 |
17.14.11.5. 编写您自己的过滤器
- mac
- STP(跨树协议)
- vlan (802.1Q)
- ARP, rarp
- ipv4
- ipv6
例 17.11. 创建自定义过滤器
- 防止虚拟机的接口来自 MAC、IP 和 ARP 欺骗
- 仅打开虚拟机接口的 TCP 端口 22 和 80
- 允许虚拟机从接口发送 ping 流量,但不允许虚拟机在接口上 ping
- 允许虚拟机进行 DNS 查找(UDP 为端口 53)
清理流量网络过滤器实现
,因此要执行此操作的方式是从自定义过滤器引用它。
test
,并且要将我们过滤器与 的接口名为 eth0
,系统将创建一个名为 test-eth0
的过滤器。
<filter name='test-eth0'> <!- - This rule references the clean traffic filter to prevent MAC, IP and ARP spoofing. By not providing an IP address parameter, libvirt will detect the IP address the guest virtual machine is using. - -> <filterref filter='clean-traffic'/> <!- - This rule enables TCP ports 22 (ssh) and 80 (http) to be reachable - -> <rule action='accept' direction='in'> <tcp dstportstart='22'/> </rule> <rule action='accept' direction='in'> <tcp dstportstart='80'/> </rule> <!- - This rule enables general ICMP traffic to be initiated by the guest virtual machine including ping traffic - -> <rule action='accept' direction='out'> <icmp/> </rule>> <!- - This rule enables outgoing DNS lookups using UDP - -> <rule action='accept' direction='out'> <udp dstportstart='53'/> </rule> <!- - This rule drops all other traffic - -> <rule action='drop' direction='inout'> <all/> </rule> </filter>
17.14.11.6. 自定义过滤器示例
例 17.12. 网络接口描述的 XML 示例
[...] <interface type='bridge'> <source bridge='mybridge'/> <filterref filter='test-eth0'/> </interface> [...]
<!- - enable outgoing ICMP echo requests- -> <rule action='accept' direction='out'> <icmp type='8'/> </rule>
<!- - enable incoming ICMP echo replies- -> <rule action='accept' direction='in'> <icmp type='0'/> </rule>
例 17.13. 第二个自定义过滤器示例
- 防止客户机虚拟机的接口来自 MAC、IP 和 ARP 欺骗
- 在客户机虚拟机接口中仅打开 TCP 端口 22 和 80
- 允许客户机虚拟机从接口发送 ping 流量,但不允许客户机虚拟机在接口上 ping
- 允许客户机虚拟机执行 DNS 查找(UDP 至端口 53)
- 启用 FTP 服务器(在活动模式中),以便它可以在客户机虚拟机中运行
<filter name='test-eth0'>
<!- - This filter (eth0) references the clean traffic
filter to prevent MAC, IP, and ARP spoofing. By not providing an IP address parameter, libvirt will detect the IP address the guest virtual machine is using. - ->
<filterref filter='clean-traffic'/>
<!- - This rule enables TCP port 21 (FTP-control) to be reachable - ->
<rule action='accept' direction='in'>
<tcp dstportstart='21'/>
</rule>
<!- - This rule enables TCP port 20 for guest virtual machine-initiated FTP data connection related to an existing FTP control connection - ->
<rule action='accept' direction='out'>
<tcp srcportstart='20' state='RELATED,ESTABLISHED'/>
</rule>
<!- - This rule accepts all packets from a client on the FTP data connection - ->
<rule action='accept' direction='in'>
<tcp dstportstart='20' state='ESTABLISHED'/>
</rule>
<!- - This rule enables TCP port 22 (SSH) to be reachable - ->
<rule action='accept' direction='in'>
<tcp dstportstart='22'/>
</rule>
<!- -This rule enables TCP port 80 (HTTP) to be reachable - ->
<rule action='accept' direction='in'>
<tcp dstportstart='80'/>
</rule>
<!- - This rule enables general ICMP traffic to be initiated by the guest virtual machine, including ping traffic - ->
<rule action='accept' direction='out'>
<icmp/>
</rule>
<!- - This rule enables outgoing DNS lookups using UDP - ->
<rule action='accept' direction='out'>
<udp dstportstart='53'/>
</rule>
<!- - This rule drops all other traffic - ->
<rule action='drop' direction='inout'>
<all/>
</rule>
</filter>
- modprobe nf_conntrack_ftp - 其中可用 OR
- modprobe ip_conntrack_ftp 如果上述版本不可用
<filter name='test-eth0'>
<!- - This filter references the clean traffic
filter to prevent MAC, IP and ARP spoofing. By not providing and IP address parameter, libvirt will detect the IP address the VM is using. - ->
<filterref filter='clean-traffic'/>
<!- - This rule allows the packets of all previously accepted connections to reach the guest virtual machine - ->
<rule action='accept' direction='in'>
<all state='ESTABLISHED'/>
</rule>
<!- - This rule allows the packets of all previously accepted and related connections be sent from the guest virtual machine - ->
<rule action='accept' direction='out'>
<all state='ESTABLISHED,RELATED'/>
</rule>
<!- - This rule enables traffic towards port 21 (FTP) and port 22 (SSH)- ->
<rule action='accept' direction='in'>
<tcp dstportstart='21' dstportend='22' state='NEW'/>
</rule>
<!- - This rule enables traffic towards port 80 (HTTP) - ->
<rule action='accept' direction='in'>
<tcp dstportstart='80' state='NEW'/>
</rule>
<!- - This rule enables general ICMP traffic to be initiated by the guest virtual machine, including ping traffic - ->
<rule action='accept' direction='out'>
<icmp state='NEW'/>
</rule>
<!- - This rule enables outgoing DNS lookups using UDP - ->
<rule action='accept' direction='out'>
<udp dstportstart='53' state='NEW'/>
</rule>
<!- - This rule drops all other traffic - ->
<rule action='drop' direction='inout'>
<all/>
</rule>
</filter>
17.14.12. 限制
- 只有在目标主机物理机器上也提供了 guest 虚拟机顶级过滤器引用的整个过滤器树时,才支持虚拟机迁移。示例的网络过滤器
清理流量
应该在所有 libvirt 安装中可用,从而启用在引用此过滤器的客户机虚拟机迁移。为了确保版本兼容性不是一个问题,请确定您通过定期更新软件包来使用 libvirt 的最新版本。 - 迁移必须在 0.8.1 或更高版本的 libvirt 之间发生,以防止丢失与接口关联的网络流量过滤器。
- VLAN(802.1Q)数据包如果由客户机虚拟机发送,则无法使用协议 ID、rarp、ipv4 和 ipv6 的规则过滤。它们只能使用协议 ID、MAC 和 VLAN 进行过滤。因此,过滤器清理流量 例 17.1 “网络过滤示例” 无法正常工作。
17.15. 创建 Tunnels
17.15.1. 创建多播 Tunnels
<devices>
元素中:
图 17.28. 多播隧道域 XMl 示例
... <devices> <interface type='mcast'> <mac address='52:54:00:6d:90:01'> <source address='230.0.0.1' port='5558'/> </interface> </devices> ...
17.15.2. 创建 TCP Tunnels
<devices>
元素中:
图 17.29. TCP 隧道域 XMl 示例
... <devices> <interface type='server'> <mac address='52:54:00:22:c9:42'> <source address='192.168.0.1' port='5558'/> </interface> ... <interface type='client'> <mac address='52:54:00:8b:c9:51'> <source address='192.168.0.1' port='5558'/> </interface> </devices> ...
17.16. 设置 vLAN 标签
图 17.30. vSetting VLAN 标签(仅支持网络类型)
<network> <name>ovs-net</name> <forward mode='bridge'/> <bridge name='ovsbr0'/> <virtualport type='openvswitch'> <parameters interfaceid='09b11c53-8b5c-4eeb-8f00-d84eaa0aaa4f'/> </virtualport> <vlan trunk='yes'> <tag id='42' nativeMode='untagged'/> <tag id='47'/> </vlan> <portgroup name='dontpanic'> <vlan> <tag id='42'/> </vlan> </portgroup> </network>
<vlan>
元素可以指定一个或多个 vlan 标签,以应用于使用此网络的所有虚拟客户机的流量。(openvswitch 和 type='hostdev 的 SR-IOV 网络支持透明的 VLAN 标记,则包括标准 Linux 网桥和 libvirt 自身的虚拟网络等内容。802.1Qbh(vn-link)和 802.1Qbg(VEPA)交换机提供自己的方法(在 libvirt 外),以标记到特定 vlans 的客户机流量。) 如预期一样,tag 属性指定要使用的 vlan 标签。如果网络定义了多个 <vlan>
元素,则假定用户希望利用所有指定标签进行 VLAN 中继。如果需要使用单一标签的 vlan 中继,可选属性 trunk='yes' 可以添加到 vlan 元素。
<tag>
元素中使用可选的 nativeMode 属性: nativeMode 可以被设置为 'tagged' 或 'untagged'。元素的 id 属性设置原生 vlan。
<端口>
组元素中指定,也可直接在域的 <interface>
元素中指定。<>
如果在多个位置上指定了 vlan 标签,<接口>
中的设置将具有优先权,后跟接口配置选择的 <portgroup>
中的设置。只有在 <端口>
组或 <接口>
中未给定任何时,才会选择 <vlan>
in <network>
。
17.17. 将 QoS 应用到您的虚拟网络
第 18 章 客户机的远程管理
18.1. 传输模式
传输层安全性(TLS)
传输层安全性 TLS 1.0(SSL 3.1)经过验证和加密 TCP/IP 套接字,通常在公共端口号上侦听。要使用此功能,您需要生成客户端和服务器证书。标准端口为 16514。具体步骤请查看 第 18.3 节 “通过 TLS 和 SSL 进行远程管理”。
SSH
通过安全 Shell 协议(SSH)连接进行传输。libvirt 守护进程(libvirtd)必须在远程计算机上运行。端口 22 必须处于打开状态才能进行 SSH 访问。您应该使用某种类型的 SSH 密钥管理(例如,ssh-agent 实用程序),或者会提示您输入密码。具体步骤请查看 第 18.2 节 “使用 SSH 进行远程管理”。
Unix 套接字
UNIX 域套接字只能在本地机器上访问。套接字未加密,使用 UNIX 权限或 SELinux 进行身份验证。标准套接字名称是 /var/run/libvirt/libvirt-sock
和 /var/run/libvirt/libvirt-sock-ro
(用于只读连接)。
ext
ext
参数用于任何可以在 libvirt 范围外面连接到远程机器的外部程序。不支持此参数。
TCP
未加密的 TCP/IP 套接字.不建议在生产环境中使用,这通常是禁用的,但管理员可以使它进行测试或在可信网络中使用。默认端口为 16509。
远程 URI
virsh 和 libvirt 使用统一资源标识符(URI)来连接远程主机。URI 也可搭配 --connect 参数用于 virsh 命令,以便在远程主机上执行单个命令或迁移。通过采用普通本地 URI 和添加主机名或传输名称来形成远程 URI。作为特殊情况,使用 URI 方案 'remote' 将指示远程 libvirtd 服务器探测到最佳管理程序驱动程序。这等同于为本地连接传递 NULL URI
driver[+transport]://[username@][hostname][:port]/path[?extraparameters]
- qemu://hostname/
远程管理参数示例
- 使用 SSH 传输和 SSH 用户名
virtuser
连接到名为host2
的远程 KVM 主机。每个连接的 connect 命令都是 connect [URI] [--readonly]。有关 virsh connect 命令的详情请参考 第 20.4 节 “使用 virsh Connect 连接到管理程序”qemu+ssh://virtuser@host2/
- 使用 TLS 连接到名为
host2
的主机上的远程 KVM 管理程序。qemu://host2/
测试示例
- 使用非标准 UNIX 套接字连接到本地 KVM 管理程序。本例中明确提供了 UNIX 套接字的完整路径。
qemu+unix:///system?socket=/opt/libvirt/run/libvirt/libvirt-sock
- 使用非加密 TCP/IP 连接到服务器,在端口 5000 上使用 IP 地址 10.1.1.10 连接到 libvirt 守护进程。这会使用带有默认设置的测试驱动程序。
test+tcp://10.1.1.10:5000/default
额外的 URI 参数
可以将额外参数附加到远程 URI。下表介绍了可识别的参数。所有其他参数将被忽略。请注意,参数值必须是 URI 转义(即问号(?)),在参数和特殊字符转换为 URI 格式之前。
表 18.1. 额外 URI 参数
Name | 传输模式 | 描述 | 用法示例 |
---|---|---|---|
名称 | 所有模式 | 传递给远程 virConnectOpen 功能的名称。名称通常通过从远程 URI 中删除 传输 、主机名 、端口号 、用户名 和额外参数而形成,但是在某些非常复杂的情况下,最好地提供名称。 | name=qemu:///system |
命令 | SSH 和 ext | external 命令.对于 ext 传输来说,这是必需的。对于 ssh,默认为 ssh。为该命令搜索 PATH。 | command=/opt/openssh/bin/ssh |
socket | UNIX 和 ssh | UNIX 域套接字的路径,它将覆盖默认值。对于 ssh 传输,这会被传递给远程 netcat 命令(请参见 netcat)。 | socket=/opt/libvirt/run/libvirt/libvirt-sock |
no_verify | tls | 如果设置为非零值,这会禁用客户端检查服务器证书。请注意,要禁用客户端的证书或 IP 地址的服务器检查,您必须更改 libvirtd 配置。 | no_verify=1 |
no_tty | ssh | 如果设置为非零值,这会停止 ssh。如果无法登录远程机器,则停止 ssh。当您无法访问终端 时,使用它。 | no_tty=1 |
18.2. 使用 SSH 进行远程管理
ssh
软件包提供了一个加密的网络协议,可安全地将管理功能发送到远程虚拟化服务器。下面描述的方法使用 libvirt 管理连接(通过 SSH 连接安全地隧道)来管理远程机器。所有身份验证均使用由本地 SSH 代理收集的 SSH 公钥加密和密码或密码短语来完成。另外,每个 guest 的 VNC 控制台通过 SSH 隧道。
- 您需要 root 登录对远程机器以管理虚拟机的访问权限。
- 初始连接设置过程可能很慢。
- 没有在所有主机或客户机上撤销用户密钥的标准或简单的方法。
- SSH 无法通过更多远程机器进行很好的扩展。
- openssh
- openssh-askpass
- openssh-clients
- openssh-server
为 virt-manager配置无密码或密码管理的 SSH 访问
下列说明假设您从头开始,并且尚未设置 SSH 密钥。如果您将 SSH 密钥设置并复制到其他系统,您可以跳过这个过程。
可选:更改用户
根据需要更改用户。这个示例使用本地 root 用户来远程管理其他主机和本地主机。$ su -
生成 SSH 密钥对
在使用 virt-manager 的机器上生成一个公钥对。这个示例在~/.ssh/
目录中使用默认密钥位置。# ssh-keygen -t rsa
将密钥复制到远程主机
不使用密码或密码短语进行远程登录,要求将 SSH 密钥分发到受管理的系统。使用 ssh-copy-id 命令,在提供的系统地址(示例中为root@host2.example.com
)将密钥复制到 root 用户。# ssh-copy-id -i ~/.ssh/id_rsa.pub root@host2.example.com root@host2.example.com's password:
之后,尝试登录到机器,并检查.ssh/authorized_keys
文件,以确保还没有添加意外的密钥:ssh root@host2.example.com
根据需要为其他系统重复此操作。可选:将密码短语添加到 ssh-agent
如果需要,将 SSH 密钥的 pass-phrase 添加到 ssh-agent。在本地主机中,使用以下命令添加 pass-phrase(如果有)以启用无密码登录。# ssh-add ~/.ssh/id_rsa
如果 ssh-agent 未在运行,这个命令将无法运行。为避免错误或冲突,请确保您的 SSH 参数设置正确。如需更多信息,请参阅 Red Hat Enterprise System Administration Guide。
libvirt 守护进程 (libvirtd
)
libvirt
守护进程提供了管理虚拟机的接口。您必须已在您要以这种方式管理的每个远程主机上安装并运行 libvirtd
守护进程。
$ ssh root@somehost # systemctl enable libvirtd.service # systemctl start libvirtd.service
libvirtd
和 SSH 后,您应该能够远程访问和管理虚拟机。此时,也应该能够通过 VNC
访问您的 guest。
使用 virt-manager 访问远程主机
可以使用 virt-manager GUI 工具管理远程主机。SSH 密钥必须属于执行 virt-manager 的用户,以便免密码登录正常工作。
- 启动 virt-manager。
- 打开 File zfcp Add Connection 菜单。
图 18.1. 添加连接菜单
- 使用下拉菜单选择虚拟机监控程序类型,然后单击 Connect to remote host 复选框以打开连接方法(本例中为 Remote tunnel over SSH),输入 User name 和 Hostname,然后单击 Connect。
18.3. 通过 TLS 和 SSL 进行远程管理
过程 18.1. 为 TLS 管理创建证书颁发机构(CA)密钥
- 开始之前,确认已安装了 gnutls-utils。如果没有安装,请安装它:
# yum install gnutls-utils
- 使用以下命令生成私钥:
# certtool --generate-privkey > cakey.pem
- 生成密钥后,创建签名文件,以便密钥可以自签名。要做到这一点,创建一个带有签名详情的文件,并将其命名为
ca.info
。此文件应包含以下内容:cn = Name of your organization ca cert_signing_key
- 使用以下命令生成自签名证书:
# certtool --generate-self-signed --load-privkey cakey.pem --template ca.info --outfile cacert.pem
生成文件后,可以使用 rm 命令删除ca.info
文件。生成进程的结果的文件名为cacert.pem
。此文件是公钥(certificate)。加载的文件cakey.pem
是私钥。为了安全起见,该文件应保持私有,而不能驻留在共享空间中。 - 在
/etc/pki/CA/
CA 证书文件,以便他们知道您的 CA 发布的证书可以信任。要查看此文件的内容,请运行:cacert.pem
目录中的所有客户端和服务器上安装 cacert.pem# certtool -i --infile cacert.pem
这是设置您的 CA 所需要的。保持 CA 的私钥安全,因为您需要它才能为客户端和服务器签发证书。
过程 18.2. 发出服务器证书
qemu://mycommonname/system
连接到服务器,因此 CN 字段应当相同,例如"mycommoname"。
- 为服务器创建私钥。
# certtool --generate-privkey > serverkey.pem
- 首先创建名为
server.info
的模板文件,为 CA 的私钥生成签名。确保将 CN 设置为与服务器的主机名相同:organization = Name of your organization cn = mycommonname tls_www_server encryption_key signing_key
- 创建证书:
# certtool --generate-certificate --load-privkey serverkey.pem --load-ca-certificate cacert.pem --load-ca-privkey cakey.pem \ --template server.info --outfile servercert.pem
这会导致生成两个文件:- ServerKey.pem - 服务器的私钥
- servercert.pem - 服务器的公钥
- 确保保留私钥 secret 的位置。要查看文件的内容,请使用以下命令:
# certtool -i --infile servercert.pem
打开此文件时,CN=
参数应当与之前设置的 CN 相同。例如,mycommonname
。 - 在以下位置安装两个文件:
ServerKey.pem
- 服务器的私钥。将这个文件放在以下位置:/etc/pki/libvirt/private/serverkey.pem
servercert.pem
- 服务器的证书。将它安装到服务器上的以下位置:/etc/pki/libvirt/servercert.pem
过程 18.3. 发出客户端证书
- 对于每个客户端(例如,与 libvirt 链接的任何程序(如 virt-manager),您需要向证书发出 X.509 区分名称(DN)字段,设置为合适的名称。这需要在企业层面上决定。例如,会使用以下信息:
C=USA,ST=North Carolina,L=Raleigh,O=Red Hat,CN=name_of_client
- 创建一个私钥:
# certtool --generate-privkey > clientkey.pem
- 首先创建名为
client.info
的模板文件,为 CA 的私钥生成签名。文件应当包含以下内容(字段应自定义来反映您的地区/位置):country = USA state = North Carolina locality = Raleigh organization = Red Hat cn = client1 tls_www_client encryption_key signing_key
- 使用以下命令签署证书:
# certtool --generate-certificate --load-privkey clientkey.pem --load-ca-certificate cacert.pem \ --load-ca-privkey cakey.pem --template client.info --outfile clientcert.pem
- 在客户端机器上安装证书:
# cp clientkey.pem /etc/pki/libvirt/private/clientkey.pem # cp clientcert.pem /etc/pki/libvirt/clientcert.pem
18.4. 配置 VNC 服务器
devices
元素中的图形类型。有关详情请参考 第 23.17.11 节 “图形帧缓冲”。
18.5. 使用 NSS 增强虚拟机远程管理
# yum install libvirt-nss
/etc/nsswitch.conf
文件的 hosts
行中添加 libvirt_guest
来启用模块,例如:
passwd: compat shadow: compat group: compat hosts: files libvirt_guest dns ...
hosts
行中列出的模块的顺序决定了这些模块被查询的顺序来查找指定的远程客户端。因此,libvirt 的 NSS 模块被添加到将主机名转换为 IP 地址的模块中。这个示例启用在 NAT 模式中连接到远程客户端,而不设置静态 IP 地址,且只使用客户机的名称:
# ssh root@guestname
root@guestname's password:
Last login: Thu Aug 10 09:12:31 2017 from 192.168.122.1
[root@guestname ~]#
第 19 章 使用虚拟机管理器(virt-manager)管理客户机.
- 定义和创建客户机,
- 分配内存,
- 分配虚拟 CPU、
- 监控运营性能,
- 保存和恢复、暂停和恢复,以及关闭和启动客户机,
- 文本和图形控制台链接,以及
- 实时和离线迁移。
19.1. 启动 virt-manager
图 19.1. 启动 virt-manager
# ssh -X host's address [remotehost]# virt-manager
19.2. Virtual Machine Manager Main 窗口
图 19.2. 虚拟机管理器主窗口
19.3. Virtual Hardware Details 窗口
图 19.3. 虚拟硬件详情图标
图 19.4. 虚拟硬件详情窗口
19.3.1. 将引导选项应用到客户机虚拟机
过程 19.1. 配置引导选项
- 在 Virtual Machine Manager Edit 菜单中,选择 Virtual Machine Details。
- 在侧边面板中,选择 Boot Options,然后完成以下可选步骤:
- 若要指明此 guest 虚拟机应在每次主机物理计算机启动时启动,请选择 Autostart 复选框。
- 要指明应启动 guest 虚拟机的顺序,请单击 Enable boot 菜单 复选框。选中此项后,您可以检查要从引导的设备,并使用箭头键更改客户机虚拟机在引导时将使用的顺序。
- 如果要直接从 Linux 内核引导,展开 Direct 内核 引导菜单。填写您要使用的 内核路径、Initrd 路径 和 内核参数。
- 点应用。
图 19.5. 配置引导选项
19.3.2. 将 USB 设备附加到虚拟机
过程 19.2. 使用 Virt-Manager 附加 USB 设备
- 打开 guest 虚拟机的 Virtual Machine Details 屏幕。
- 点 Add Hardware
- 在 Add New Virtual Hardware popup 中,选择 USB Host Device,从列表中选择您要附加的设备,然后单击 Finish。
图 19.6. 添加 USB 设备
- 要在客户机虚拟机中使用 USB 设备,请启动 guest 虚拟机。
19.3.3. USB 重定向
过程 19.3. 重定向 USB 设备
- 打开 guest 虚拟机的 Virtual Machine Details 屏幕。
- 点 Add Hardware
- 在 Add New Virtual Hardware 弹出窗口中,选择 USB 重定向。确保从" 类型 "下拉菜单中选择 Spice 频道,并单击" 完成"。
图 19.7. 添加新虚拟硬件窗口
- 打开 Virtual Machine 菜单并选择 Redirect USB 设备。此时会打开一个带有 USB 设备列表的弹出窗口。
图 19.8. 选择 USB 设备
- 选中其复选框并单击确定,为重定向选择 USB 设备。
19.4. 虚拟机图形控制台
图 19.9. 图形控制台窗口
127.0.0.1
)。这样可保证主机上具有 shell 特权的那些可以通过 VNC 访问 virt-manager 和虚拟机。虽然 virt-manager 配置为监听其他公共网络接口和其它方法,但不建议这样做。
19.5. 添加远程连接
- 若要创建新连接,可打开 File 菜单,再选择 Add Connection 菜单项。
- 此时会出现 Add Connection 向导。选择系统管理程序。对于 Red Hat Enterprise Linux 7,系统选择 QEMU/KVM。为本地系统选择 Local,或者其中一个的远程连接选项并点 Connect。这个示例使用通过 SSH 进行远程隧道,用于默认安装。有关配置远程连接的详情,请参考 第 18 章 客户机的远程管理
图 19.10. 添加连接
- 出现提示时,输入所选主机的 root 密码。
图 19.11. 主 virt-manager 窗口中的远程主机
19.6. 显示客户机详情
- 在 Virtual Machine Manager 主窗口中,突出显示您要查看的虚拟机。
图 19.12. 选择要显示的虚拟机
- 在 Virtual Machine Manager Edit 菜单中,选择 Virtual Machine Details。当 Virtual Machine details 窗口打开时,可能会显示控制台。如果发生这种情况,请单击 View,然后选择 Details。Overview 窗口默认打开。要返回此窗口,请从左侧的导航窗格中选择 Overview。Overview 视图显示客户机的配置详情概述。
图 19.13. 显示客户机详情概述
- 从左侧的导航窗格中选择 CPU。CPU 视图允许您查看或更改当前的处理器分配。也可以在虚拟机运行时增加虚拟 CPU(vCPU)的数量,这被称为 热插拔。重要Red Hat Enterprise Linux 7 不支持 热拔 vCPU。
图 19.14. 处理器分配面板
- 从左侧的导航窗格中,选择 Memory。Memory 视图允许您查看或更改当前的内存分配。
图 19.15. 显示内存分配
- 从左侧的导航窗格中,选择"引导选项"。通过 Boot Options 视图,您可以查看或更改引导选项,包括虚拟机是否在主机引导时启动,以及虚拟机的引导设备顺序。
图 19.16. 显示引导选项
- 在导航窗格中显示附加到虚拟机的每个虚拟磁盘。点击虚拟磁盘来修改或删除它。
图 19.17. 显示磁盘配置
- 在导航窗格中显示附加到虚拟机的每个虚拟网络接口。点击虚拟网络接口修改或删除它。
图 19.18. 显示网络配置
19.7. 管理快照
--diskspec vda,snapshot=external
选项。如需更多信息,请参阅 第 A.13 节 “使用 libvirt 创建外部快照的临时解决方案”。
- 要在 virt-manager 中管理快照,请点击客户端控制台中的 打开快照管理界面。
- 要创建新快照,请点击快照列表下的 。在快照创建界面中,输入快照的名称,以及可选的描述,然后单击" 完成"。
- 要将客户机恢复到快照的配置,请选择快照并单击
- 要删除所选快照,点
第 20 章 使用 virsh 管理客户机虚拟机
20.1. 虚拟机状态和类型
- 瞬态 - 临时客户机无法重新引导.
- persistent - 持久的 guest 虚拟机会重新引导,并在删除前最后。
- undefined - 这是尚未定义或创建的客户机虚拟机。因此,libvirt 不了解此状态内的任何 guest,不会报告此状态下的客户机虚拟机。
- 关闭 - 这是一个已定义但未在运行的客户机虚拟机。只有持久的客户机可以考虑关闭。因此,当临时的 guest 虚拟机进入这个状态时,它就会存在。
- Running - 此状态下的客户机虚拟机已定义并且正在工作。此状态可用于持久和临时的客户机虚拟机。
- paused - 已暂停系统管理程序上的 guest 虚拟机执行,或者其状态已暂时存储,直到恢复为止。处于此状态的 guest 虚拟机不知道它们已被暂停,请注意在恢复后不会发现经过的时间。
- saved - 此状态与暂停状态类似,但客户机虚拟机的配置被保存到持久性存储。任何处于这个状态的客户机虚拟机都不知道它已被暂停,且不会注意到恢复后经过的时间。
20.2. 显示 virsh 版本
$ virsh version
Compiled against library: libvirt 1.2.8
Using library: libvirt 1.2.8
Using API: QEMU 1.2.8
Running hypervisor: QEMU 1.5.3
--daemon
可以用来获取有关 libvirtd
版本和软件包信息的信息,包括有关主机上运行的 libvirt 守护进程的信息。
$ virsh version --daemon
Compiled against library: libvirt 1.2.8
Using library: libvirt 1.2.8
Using API: QEMU 1.2.8
Running hypervisor: QEMU 1.5.3
Running against daemon: 1.2.8
20.3. 使用 echo 发送命令
[-shell][--xml] 参数命令以指定格式显示 指定的参数
。您可以使用的格式是 --shell
和 --xml
。查询的每个参数都以空格分开。--shell
选项生成输出(如果需要使用单引号),因此它适合将其作为命令复制和粘贴至 bash 模式。如果使用 --xml
参数,则会在 XML 文件中格式化输出以供使用,然后保存或用于客户机配置。
20.4. 使用 virsh Connect 连接到管理程序
[hostname-or-URI] [--readonly]
命令开始使用 virsh 的本地管理程序会话。第一次运行此命令后,每次 virsh shell 运行时将自动运行该命令。虚拟机监控程序连接 URI 指定如何连接到管理程序。最常用的 URI 是:
- QEMU:///system - 作为 root 用户在本地连接到 KVM 管理程序上客户机虚拟机的守护进程。
- QEMU:///session - 以用户本地方式连接到使用 KVM 管理程序的用户本地机器的集合。
- lxc:/// - 连接到本地 Linux 容器。
$ virsh uri
qemu:///session
$ virsh connect qemu:///session
20.5. 显示客户机虚拟机和虚拟机监控程序的信息
例 20.1. 如何列出所有本地连接的虚拟机
# virsh list --all
Id Name State
------------------------------------------------
8 guest1 running
22 guest2 paused
35 guest3 shut off
38 guest4 shut off
例 20.2. 如何列出不活跃的虚拟机
# virsh list --inactive
Id Name State
------------------------------------------------
35 guest3 shut off
38 guest4 shut off
- # virsh hostname - 显示 hypervisor 的主机名,例如:
# virsh hostname dhcp-2-157.eus.myhost.com
- # virsh sysinfo - 显示 hypervisor 系统信息的 XML 表示,例如:
# virsh sysinfo <sysinfo type='smbios'> <bios> <entry name='vendor'>LENOVO</entry> <entry name='version'>GJET71WW (2.21 )</entry> [...]
20.6. 启动、恢复和恢复虚拟机
20.6.1. 启动客户机虚拟机
--console
- 将运行 virsh 的终端连接到域的控制台设备。这是运行级别 3。--paused
- 如果驱动程序支持,它将以暂停状态启动客户机虚拟机--autodestroy
- 在 virsh 断开连接时自动销毁客户机虚拟机--bypass-cache
- 如果客户机虚拟机处于managedsave
,则使用--force-boot
- 丢弃任何受管保存
选项,并导致新启动发生
例 20.3. 如何启动虚拟机
# virsh start guest1 --console
Domain guest1 started
Connected to domain guest1
Escape character is ^]
20.6.2. 将虚拟机配置为在引导时自动启动
[--disable]
domain 命令将自动启动 guest 虚拟机。在这个命令中添加 --disable
参数可禁用 autostart。在这种情况下,主机物理机引导时不会自动启动 guest。
例 20.4. 主机物理机启动时,如何自动启动虚拟机
# virsh autostart guest1
20.6.3. 重新引导客户机虚拟机
mode
参数可以指定以逗号分隔的列表,其中包括 acpi
和 agent
。驱动将尝试每个模式的顺序是未定义的,并且与 virsh 中指定的顺序无关。若要严格控制排序,请一次使用单一模式并重复该命令。
例 20.5. 如何重新引导客户机虚拟机
initctl
方法,但您可以选择任何适合您的需要的模式。
# virsh reboot guest1 --mode initctl
20.6.4. 恢复客户机虚拟机
--bypass-cache
- 导致恢复以避免文件系统缓存,但请注意,使用这个标记可能会减慢恢复操作的速度。--
XML - 这个参数必须与 XML 文件名一起使用。虽然通常省略这个参数,但它可以提供备用的 XML 文件,以便在恢复的客户机虚拟机中使用,且仅在域 XML 中更改主机特定部分。例如,由于保存客户机后执行的磁盘快照,它可用于考虑底层存储中的文件命名差异。--running
- 覆盖在保存镜像中记录的状态,以便启动客户机虚拟机正在运行。--paused
- 覆盖在保存镜像中记录的状态,以便启动客户机虚拟机暂停。
例 20.6. 如何恢复客户机虚拟机
# virsh restore guest1-config.xml --running
20.6.5. 恢复客户机虚拟机
例 20.7. 如何恢复已暂停的客户机虚拟机
# virsh resume guest1
20.7. 管理虚拟机配置
20.7.1. 保存客户机虚拟机的配置
qemu
进程运行及其内存映像驻留在主机系统中。如果主机系统重启,这个内存镜像将会丢失。
qemu
进程。这可让从保存的状态重启域。
--bypass-cache
- 导致恢复以避免文件系统缓存,但请注意,使用这个标记可能会减慢恢复操作的速度。--
XML - 这个参数必须与 XML 文件名一起使用。虽然通常省略这个参数,但它可以提供备用的 XML 文件,以便在恢复的客户机虚拟机中使用,且仅在域 XML 中更改主机特定部分。例如,由于保存客户机后执行的磁盘快照,它可用于考虑底层存储中的文件命名差异。--running
- 覆盖在保存镜像中记录的状态,以便启动客户机虚拟机正在运行。--paused
- 覆盖在保存镜像中记录的状态,以便启动客户机虚拟机暂停。--verbose
- 显示保存的进度。
例 20.8. 如何保存运行配置的客户机虚拟机
guest1-config.xml
文件中:
# virsh save guest1 guest1-config.xml --running
20.7.2. 使用 XML 文件定义客户机虚拟机
例 20.9. 如何从 XML 文件创建客户机虚拟机
# virsh define guest1-config.xml
20.7.3. 更新用于恢复客户机虚拟机的 XML 文件
--running
或 --paused
会指示要使用的状态。
例 20.10. 如何保存客户机虚拟机的运行配置
# virsh save-image-define guest1-config.xml --running
20.7.4. 提取客户机虚拟机 XML 文件
--security-info
命令将提取在保存的状态文件(在 virsh save 命令中使用)时生效的客户机虚拟机 XML 文件。使用 --security-info
参数会在文件中包含安全敏感信息。
例 20.11. 如何从最后保存拉取 XML 配置
# virsh save-image-dumpxml guest1-config.xml
20.7.5. 编辑客户机虚拟机配置
[--running]
[--paused]
命令编辑由 virsh save 命令创建的 XML 配置文件。有关 virsh save 命令的详情请参考 第 20.7.1 节 “保存客户机虚拟机的配置”。
--running
或 --paused
状态。如果在 save-image-edit 命令中不使用这些参数,则状态由镜像文件本身决定。通过选择 --running
(选择 running 状态)或 --paused
(选择暂停状态),您可以覆盖 virsh restore 应使用的状态。
例 20.12. 如何编辑客户机虚拟机的配置并将虚拟机恢复到运行状态
# virsh save-image-edit guest1-config.xml --running
20.8. 关闭、关闭、重新启动和关闭客户机虚拟机的关闭
20.8.1. 关闭客户机虚拟机
on_shutdown
参数来控制客户机虚拟机如何重启的行为。对 on_shutdown
参数的任何更改都将在域关闭并重新启动后生效。
--mode
选择关闭模式。这可以是acpi
、agent
、initctl
、信号()
或泛虚拟化。
例 20.13. 如何关闭客户机虚拟机
acpi
模式关闭 guest1 虚拟机:
# virsh shutdown guest1 --mode acpi
Domain guest1 is being shutdown
20.8.2. 挂起客户机虚拟机
例 20.14. 如何挂起客户机虚拟机
# virsh suspend guest1
20.8.3. 重置虚拟机
例 20.15. 如何重置客户机虚拟机
# virsh reset guest1
20.8.4. 在 Order 中停止正在运行的客户机虚拟机以重启它
--bypass-cache
--running | --paused | --verbose
命令保存并销毁(停止)正在运行的客户端虚拟机,以便稍后从同一状态重启它。与 virsh start 命令一起使用时,它将从此保存点自动启动。如果与 --bypass-cache
参数一起使用,则保存将避免文件系统缓存。请注意,这个选项可能会减慢保存进程速度,并使用 --verbose
选项显示转储进程的进度。在正常情况下,受管保存将决定在使用正在运行或暂停状态,具体由客户机虚拟机在保存完成时的状态决定。但是,可以使用 --running
选项覆盖它,以指示它必须保留为 running 状态,或使用 --paused
选项将其保留为暂停状态。要删除受管保存状态,请使用 virsh managedsave-remove 命令,该命令强制客户端虚拟机在下次启动时进行完全引导。请注意,整个管理的保存过程可以通过 domjobinfo 命令监控,也可使用 domjobabort 命令取消。
例 20.16. 如何停止正在运行的虚拟客户机并保存其配置
# virsh managedsave guest1 --running
20.9. 删除和删除虚拟机
20.9.1. 取消定义虚拟机
--managed-save
- 此参数可确保同时清理任何受管保存镜像。如果不使用这个参数,尝试取消定义具有受管保存的客户机虚拟机将失败。--snapshots-metadata
- 此参数保证在未保护不活跃的虚拟机虚拟机时,也能够清理任何快照(如带有 snapshot-list所示)。请注意,任何尝试不使用快照元数据取消定义不活跃的客户机虚拟机都将会失败。如果使用这个参数且 guest 虚拟机处于活跃状态,则忽略它。--storage
- 使用这个参数要求将卷目标名称或源路径的逗号分隔列表与未定义域一起删除。此操作将在删除存储卷前取消定义它。请注意,这只能通过不活动的虚拟机完成,并且这只能使用由 libvirt 管理的存储卷。--remove-all-storage
- 除了取消保护客户机虚拟机外,还会删除所有关联的存储卷。如果您要删除虚拟机,只有在没有其他虚拟机使用相同的相关存储时才选择这个选项。另一种方法是 virsh vol-delete。如需更多信息,请参阅 第 20.31 节 “删除存储卷”。--wipe-storage
- 除了删除存储卷外,内容也会擦除。
例 20.17. 如何删除客户机虚拟机并删除其存储卷
# virsh undefine guest1 --remove-all-storage
20.9.2. 强制客户机虚拟机停止
--graceful
选项的 virsh destroy 命令尝试在关闭虚拟机前清除磁盘镜像文件的缓存。
例 20.18. 如何使用硬关闭来立即关闭客户机虚拟机
# virsh destroy guest1
20.10. 连接客户机虚拟机的 Serial Console
[--devname devicename]
[--force]
[--safe]
命令连接客户机虚拟机的虚拟串行控制台。例如,对于不提供 VNC 或 SPICE 协议的虚拟机(因此不提供 GUI 工具 的视频显示),并且没有网络连接(因此无法使用 SSH 进行交互),这非常有用。
--devname
参数指的是为客户机虚拟机配置的备用控制台、串行或并行设备的设备别名。如果省略此参数,则打开主控制台。如果指定了 --safe
选项,则只有在驱动程序支持安全控制台处理时才尝试连接。此选项指定服务器必须确保对控制台设备的独占访问权限。(可选)可以指定 force
选项,它可请求断开任何现有会话,例如在连接断开的情况下。
例 20.19. 如何在控制台模式中启动客户机虚拟机
# virsh console guest1 --safe
20.11. 注入不可屏蔽的中断
例 20.20. 如何将 NMI 注入到客户机虚拟机
# virsh inject-nmi guest1
20.12. 检索有关您的虚拟机的信息
20.12.1. 显示设备块统计信息
--human
参数。
例 20.21. 如何显示客户机虚拟机的块统计信息
# virsh domblklist guest1 Target Source ------------------------------------------------ vda /VirtualMachines/guest1.img hdc - # virsh domblkstat guest1 vda --human Device: vda number of read operations: 174670 number of bytes read: 3219440128 number of write operations: 23897 number of bytes written: 164849664 number of flush operations: 11577 total duration of reads (ns): 1005410244506 total duration of writes (ns): 1085306686457 total duration of flushes (ns): 340645193294
20.12.2. 检索网络接口统计信息
例 20.22. 如何显示客户机虚拟机的网络统计信息
# virsh domiflist guest1 Interface Type Source Model MAC ------------------------------------------------------- macvtap0 direct em1 rtl8139 12:34:00:0f:8a:4a # virsh domifstat guest1 macvtap0 macvtap0 rx_bytes 51120 macvtap0 rx_packets 440 macvtap0 rx_errs 0 macvtap0 rx_drop 0 macvtap0 tx_bytes 231666 macvtap0 tx_packets 520 macvtap0 tx_errs 0 macvtap0 tx_drop 0
20.12.3. 修改客户机虚拟机虚拟接口的链路状态
up
或 down
。要确定为域定义了哪些接口设备,请使用 virsh domiflist 命令,并使用 Interface
或 MAC
列作为接口设备选项。默认情况下,virsh domif-setlink 更改正在运行的域的链接状态。若要修改域的永久配置,请使用 --config
参数。
例 20.23. 如何启用客户机虚拟机接口
# virsh domiflist rhel7 Interface Type Source Model MAC ------------------------------------------------------- vnet0 network default virtio 52:54:00:01:1d:d0 # virsh domif-setlink rhel7 vnet0 down Device updated successfully # virsh domif-setlink rhel7 52:54:00:01:1d:d0 up Device updated successfully
20.12.4. 列出客户机虚拟机虚拟接口的链接状态
Interface
或 MAC
列作为接口设备选项。默认情况下,virsh domif-getlink 检索正在运行的域的链接状态。若要检索域的永久配置,请使用 --config 选项
。
例 20.24. 如何显示客户机虚拟机接口的链接状态
# virsh domiflist rhel7 Interface Type Source Model MAC ------------------------------------------------------- vnet0 network default virtio 52:54:00:01:1d:d0 # virsh domif-getlink rhel7 52:54:00:01:1d:d0 52:54:00:01:1d:d0 up # virsh domif-setlink rhel7 vnet0 down Device updated successfully # virsh domif-getlink rhel7 vnet0 vnet0 down
20.12.5. 设置网络接口带宽参数
Interface
或 MAC
列作为接口设备选项。应使用以下格式:
# virsh domiftune domain interface [--inbound] [--outbound] [--config] [--live] [--current]
--config
、--live
和 --current
选项包括在 第 20.43 节 “设置计划参数” 中。如果没有指定 --inbound
或 --outbound
选项,virsh domiftune 查询指定的网络接口并显示带宽设置。通过指定 --inbound
或 --outbound
,以及平均、峰值和突发值,virsh domiftune 可设置带宽设置。至少需要平均值。要清除带宽设置,请提供 0(零)。有关平均、峰值和突发值的描述,请参阅 第 20.27.6.2 节 “附加接口设备”。
例 20.25. 如何设置客户机虚拟机网络接口参数
# virsh domiftune guest1 eth0
outbound
--live
20.12.6. 检索内存统计信息
period
开关需要以秒为单位的时间。将此选项设置为大于 0 的值将允许 balloon 驱动程序返回其他统计信息,这些统计信息将通过运行后续 dommemstat 命令显示。将 period
选项设置为 0,停止 balloon 驱动程序集合,但不会清除 balloon 驱动程序中已存在的统计信息。您不能在不设置 period
选项的情况下使用 --live
、--config
或 --current
选项。如果指定了 --live
选项,则只会收集客户机运行统计。如果使用 --config
选项,它将收集持久客户机的统计信息,但仅在下次启动后。如果使用 --current
选项,它将收集当前的统计信息。
--live
和 --config
选项,但 --current
是独占的。如果没有指定标志,则客户机的状态将指示统计收集(运行或非运行)的行为。
例 20.26. 如何收集正在运行的客户机虚拟机的内存统计信息
# virsh dommemstat rhel7
actual 1048576
swap_in 0
swap_out 0
major_fault 2974
minor_fault 1272454
unused 246020
available 1011248
rss 865172
20.12.7. 在块设备中显示错误
例 20.27. 如何显示虚拟机的块设备错误
# virsh domblkerror guest1
20.12.8. 显示块设备大小
例 20.28. 如何显示块设备大小
# virsh domblklist rhel7 Target Source ------------------------------------------------ vda /home/vm-images/rhel7-os vdb /home/vm-images/rhel7-data # virsh domblkinfo rhel7 vda Capacity: 10737418240 Allocation: 8211980288 Physical: 10737418240 # virsh domblkinfo rhel7 /home/vm-images/rhel7-data Capacity: 104857600 Allocation: 104857600 Physical: 104857600
20.12.9. 显示与客户机虚拟机关联的块设备
[--inactive]
[--details]
命令显示与指定 guest 虚拟机关联的所有块设备表。
--inactive
,则结果将显示要在下次引导时使用的设备,并且不显示当前运行的客户机虚拟机正在使用的设备。如果指定了 --details
,则该磁盘类型和设备值将包含在表中。此表中显示的信息可与需要提供块设备的其他命令一起使用,如 virsh domblkinfo 和 virsh snapshot-create。在为 virsh snapshot-create 命令生成 xmlfile 上下文信息时,还可使用磁盘 Target 或 Source 上下文。
例 20.29. 如何显示与虚拟机关联的块设备
# virsh domblklist rhel7 --details
Type Device Target Source
------------------------------------------------
file disk vda /home/vm-images/rhel7-os
file disk vdb /home/vm-images/rhel7-data
20.12.10. 显示与客户机虚拟机关联的虚拟接口
--inactive
参数。后者检索不活动而不是正在运行的配置,通过默认设置检索。如果指定了 --inactive
,则结果显示要在下次引导时使用的设备,不显示当前被运行客户机使用的设备。需要虚拟接口的 MAC 地址(如 detach-interface、domif-setlink、domif-getlink、domifstat、dmifstat )和 domiftune)接受此命令显示的输出。
例 20.30. 如何显示与客户机虚拟机关联的虚拟接口
# virsh domiflist rhel7 Interface Type Source Model MAC ------------------------------------------------------- vnet0 network default virtio 52:54:00:01:1d:d0 # virsh domifstat rhel7 vnet0 vnet0 rx_bytes 55308 vnet0 rx_packets 969 vnet0 rx_errs 0 vnet0 rx_drop 0 vnet0 tx_bytes 14341 vnet0 tx_packets 148 vnet0 tx_errs 0 vnet0 tx_drop 0
20.13. 使用快照
20.13.1. 通过复制数据来缩短回填链
base ← snap1 ← snap2 ← active.
过程 20.1. 如何缩短备份链
- 输入以下命令,将 guest1 替换为您的客户机虚拟机和 disk1 的名称,并将其替换为您的磁盘名称。
# virsh blockcommit guest1 disk1 --base snap1 --top snap2
--wait
--verbose
snap2 的内容移动到 snap1 中,结果如下:基本 containerruntime snap1 ImagePullBackOff 活跃.Snap2 不再有效,可以删除警告virsh blockcommit 将破坏依赖于--base
参数的任何文件(除依赖于--top
参数的文件外,作为这些文件现在指向基础)。要防止这种情况,请不要将更改提交至多个客户端共享的文件中。--verbose
选项允许在屏幕上显示进度。
20.13.2. 通过隔离镜像来缩短反向链
- 通过使用来自其后备镜像链的数据填充镜像,以将其扁平化。使镜像文件自我包含,使其不再依赖于后备镜像,如下所示:
- 前:base.img containerruntime 活跃
- 之后:guest 和 Active 不再使用 base.img,Active 包含所有数据。
- 备份镜像链的扁平化部分。这可用于将快照扁平化到顶级镜像,如下所示:
- 前:基本 containerruntime sn1 containerruntimesn2 containerruntime active
- 之后:base.img containerruntime 活跃。请注意,当前活动 现在包含来自 sn1 和 sn2 的所有数据,并且 guest sn1 和 sn2 均没有使用 sn2。
- 将磁盘映像移到主机上的新文件系统中。这允许在客户端运行时移动镜像文件,如下所示:
- before(原始镜像文件
):/fs1/base.vm.img
- 之后:
/fs2/active.vm.qcow2
现在是新文件系统,不再使用/fs1/base.vm.img
。
- 通过后复制存储迁移,在实时迁移中非常有用。磁盘镜像会在实时迁移完成后从源主机复制到目标主机。在这里,会发生:前:
/source-host/base.vm.img
After:/destination-host/active.vm.qcow2
./source-host/base.vm.img
不再被使用。
过程 20.2. 如何通过扁平化数据来缩短后备链
- 在运行 virsh blockpull 之前创建快照可能会有帮助。为此,请使用 virsh snapshot-create-as 命令。在以下示例中,将 guest1 替换为您的客户端虚拟机的名称,并将 snap1 替换为您的快照的名称。
# virsh snapshot-create-as guest1 snap1
--disk-only
- 如果链看起来像是这样: 基本 REPOSITORY snap1 snap1 containerruntime 活动,请输入以下命令,将 guest1 替换为您的客户端虚拟机和 path1 的源路径(例如
/home/username/VirtualMachines/*
)。# virsh blockpull guest1 path1
此命令将 snap1 的备份文件从 snap2 提取到活跃状态,从而使数据从 snap2 拉取到活动中,从而使数据成为活动的基础。 - virsh 块拉取 完成后,在链中创建额外镜像的快照的 libvirt 跟踪将非常有用。使用这个命令删除过期的快照的跟踪,将 guest1 替换为您的 guest 虚拟机的名称,snap1 替换为快照的名称。
# virsh snapshot-delete guest1 snap1 --metadata
例 20.31. 如何扁平化一个镜像并使用其后备镜像链中的数据进行填充
# virsh blockpull guest1 vda --wait
例 20.32. 如何扁平化后备镜像链的一部分
# virsh blockpull guest1 vda /path/to/base.img --base
--wait
例 20.33. 如何将磁盘镜像移动到主机上的新文件系统中
# virsh snapshot-create guest1 --xmlfile /path/to/snap1.xml --disk-only
# virsh blockpull guest1 disk1 --wait
例 20.34. 如何在后复制存储迁移中使用实时迁移
# qemu-img create -f qcow2
-o
backing_file=/source-host/vm.img
/destination-host/vm.qcow2
# virsh migrate guest1
# virsh blockpull guest1 disk1 --wait
20.13.3. 更改客户机虚拟机块设备的大小
例 20.35. 如何重新定义客户机虚拟机块设备大小
# virsh blockresize guest1 90 B
20.14. 显示到图形显示的连接的 URI
--type
指定图形显示类型。如果使用 --include-password
参数,则 URI 中将包含 SPICE 通道密码。
例 20.36. 如何显示 SPICE 的 URI
# virsh domdisplay --type spice guest1
spice://192.0.2.1:5900
20.15. 显示 VNC 显示的 IP 地址和端口号
1
。
devices
元素中的图形类型。有关详情请参考 第 23.17.11 节 “图形帧缓冲”。
例 20.37. 如何显示 VNC 的 IP 地址和端口号
# virsh vncdisplay guest1
127.0.0.1:0
20.16. 不使用丢弃块
[--minimum bytes]
[--mountpoint mountPoint]
命令可在指定运行客户机虚拟机中的所有挂载的文件系统上调用 fstrim
程序。这个丢弃块不会被文件系统使用。如果使用 --minimum
参数,必须指定字节数。该数量将作为连续可用范围的长度发送到客户机内核。值小于这个数量可能会被忽略。增加这个值将利用不碎片化可用空间的文件系统创建竞争。请注意,不是此情况下的所有块都将被丢弃。默认最小值为零,表示丢弃每个可用块。如果您将这个值增加到大于零,则 fstrim 操作将更加快速地用于带有错误碎片可用空间的文件系统,尽管并非所有块都会被丢弃。如果用户只想修剪一个特定的挂载点,则应使用 --mountpoint
参数并应指定挂载点。
例 20.38. 如何丢弃未使用块
# virsh domfstrim guest1 --minimum 0
20.17. 客户端虚拟机检索命令
20.17.1. 显示主机物理机器名称
例 20.39. 如何显示主机物理机器名称
# virsh domhostname guest1
20.17.2. 显示有关虚拟机的一般信息
domain] guestname
一起使用。
例 20.40. 如何显示有关客户机虚拟机的一般信息
# virsh dominfo guest1
Id: 8
Name: guest1
UUID: 90e0d63e-d5c1-4735-91f6-20a32ca22c40
OS Type: hvm
State: running
CPU(s): 1
CPU time: 271.9s
Max memory: 1048576 KiB
Used memory: 1048576 KiB
Persistent: yes
Autostart: disable
Managed save: no
Security model: selinux
Security DOI: 0
Security label: system_u:system_r:svirt_t:s0:c422,c469 (enforcing)
20.17.3. 显示虚拟机的 ID 号
domain guestname] 选项搭配使用
。
例 20.41. 如何显示虚拟机的 ID 号
# virsh domid guest1
8
20.17.4. 在客户机虚拟机上中止运行任务
domain guestname] 选项搭配使用
。
例 20.42. 如何在客户机虚拟机上中止正在运行的作业
# virsh domjobabort guest1
20.17.5. 显示关于在客户机虚拟机中运行的作业的信息
[--domain guestname]
选项一起使用,或使用 --completed
选项返回最近完成的作业统计信息。
例 20.43. 如何显示统计反馈
# virsh domjobinfo guest1
Job type: Unbounded
Time elapsed: 1603 ms
Data processed: 47.004 MiB
Data remaining: 658.633 MiB
Data total: 1.125 GiB
Memory processed: 47.004 MiB
Memory remaining: 658.633 MiB
Memory total: 1.125 GiB
Constant pages: 114382
Normal pages: 12005
Normal data: 46.895 MiB
Expected downtime: 0 ms
Compression cache: 64.000 MiB
Compressed data: 0.000 B
Compressed pages: 0
Compression cache misses: 12005
Compression overflows: 0
20.17.6. 显示客户机虚拟机的名称
例 20.44. 如何显示客户机虚拟机的名称
# virsh domname 8
guest1
20.17.7. 显示虚拟机的状态
--reason
参数也会显示显示状态的原因。此命令还可与 [--domain guestname]
选项以及 --reason
选项搭配使用,其中显示状态的原因。如果命令显示错误,您应当运行命令 virsh domblkerror。详情请查看 第 20.12.7 节 “在块设备中显示错误”。
例 20.45. 如何显示客户机虚拟机的当前状态
# virsh domstate guest1
running
20.17.8. 显示到虚拟机的连接状态
例 20.46. 如何显示客户机虚拟机的接口状态
# virsh domcontrol guest1
ok
20.18. 将 QEMU 参数转换为 Domain XML
过程 20.3. 如何将 QEMU 客户机转换为 libvirt
- 以参数文件(文件类型为
*.args
)开头,本例中为 demo.args :$ cat demo.args LC_ALL=C PATH=/bin HOME=/home/test USER=test LOGNAME=test /usr/bin/qemu -S -M pc -m 214 -smp 1 -nographic -monitor pty -no-acpi -boot c -hda /dev/HostVG/QEMUGuest1 -net none -serial none -parallel none -usb
- 要将此文件转换为域 XML 文件,以便 guest 可以由 libvirt 管理,请输入以下命令。记得将 qemu-guest1 替换为您的虚拟客户机虚拟机的名称,并将 demo.args 替换为 QEMU args 的文件名。
# virsh domxml-from-native qemu-guest1
demo.args
这个命令将 demo.args 文件转换为以下域 XML 文件:图 20.1. 客户端虚拟机新配置文件
<domain type='qemu'> <uuid>00000000-0000-0000-0000-000000000000</uuid> <memory>219136</memory> <currentMemory>219136</currentMemory> <vcpu>1</vcpu> <os> <type arch='i686' machine='pc'>hvm</type> <boot dev='hd'/> </os> <clock offset='utc'/> <on_poweroff>destroy</on_poweroff> <on_reboot>restart</on_reboot> <on_crash>destroy</on_crash> <devices> <emulator>/usr/bin/qemu</emulator> <disk type='block' device='disk'> <source dev='/dev/HostVG/QEMUGuest1'/> <target dev='hda' bus='ide'/> </disk> </devices> </domain>
20.19. 使用 virsh dump创建 guest 虚拟机内核的转储文件
--bypass-cache
] {--live | --crash | --reset
} [--verbose
] [--memory-only
] [--format
=format] 命令。这会创建一个转储文件,其中包含客户端虚拟机的核心,以便它可以分析,例如 crash 实用程序。
--bypass-cache
- 保存的文件不会绕过主机的文件系统缓存。它对文件的内容没有影响。请注意,选择这个选项可能会减慢转储操作的速度。--live
将保存文件,因为客户机虚拟机继续运行,且不会暂停或停止客户机虚拟机。--crash
将客户机虚拟机置于崩溃状态,而不是在保存转储文件时将其保留为已暂停状态。客户机虚拟机将列出为"中断",原因为"垃圾"。--reset
- 成功保存转储文件时,将重置 guest 虚拟机。--verbose
显示转储过程的进度--memory-only
- 使用此选项运行转储文件将创建一个转储文件,该文件的内容将仅包含客户机虚拟机的内存和 CPU 通用寄存器文件。在运行完整转储时,应使用这个选项。当无法实时迁移客户机虚拟机时(由于 passthrough PCI 设备),可能会发生这种情况。您可以使用--format=格式
选项保存只内存转储。可用的格式如下:ELF
- 默认未压缩格式kdump-zlib
- kdump 压缩格式 zlib 压缩kdump-lzo
- kdump 压缩格式使用 LZO 压缩kdump-snappy
- kdump 压缩格式使用 Snappy 压缩
重要crash 工具不再支持 virsh dump 命令的默认内核转储文件格式。如果您使用 崩溃 来分析由 virsh dump 创建的内核转储文件,则必须使用 --memory-only 选项。另外,在创建内核转储文件时,还必须使用 --memory-only 选项以附加到红帽支持问题单。
例 20.47. 如何使用 virsh 创建转储文件
core/file/path.file
文件中,然后重置 guest。使用这个命令的最常见情况是,如果您的客户机虚拟机没有正确行为,则使用这个命令的最常见情况是:
# virsh dump guest1 core/file/path.file
--memory-only
--reset
20.20. 创建虚拟机 XML 转储(配置文件)
guest.xml
)来重新创建客户机虚拟机(请参阅 第 20.22 节 “编辑虚拟机 XML 配置设置”您可以编辑此 XML 配置文件来配置附加设备或部署额外的客户机虚拟机。
例 20.48. 如何检索客户机虚拟机的 XML 文件
# virsh dumpxml guest1 > guest1.xml # cat guest1.xml <domain type='kvm'> <name>guest1-rhel6-64</name> <uuid>b8d7388a-bbf2-db3a-e962-b97ca6e514bd</uuid> <memory>2097152</memory> <currentMemory>2097152</currentMemory> <vcpu>2</vcpu> <os> <type arch='x86_64' machine='rhel6.2.0'>hvm</type> <boot dev='hd'/> </os> [...]
20.21. 从配置文件创建客户机虚拟机
例 20.49. 如何从 XML 文件创建客户机虚拟机
# virsh create guest1.xml
20.22. 编辑虚拟机 XML 配置设置
例 20.50. 如何编辑客户机虚拟机的 XML 配置设置
# virsh edit guest1
20.23. 在 KVM 客户机虚拟机中添加多功能 PCI 设备
- 运行 virsh edit guestname 命令,编辑 guest 虚拟机的 XML 配置文件。
- 在
<address>
元素中,添加multifunction='on'
属性。这可让将其他功能用于特定的多功能 PCI 设备。<disk type='file' device='disk'> <driver name='qemu' type='raw' cache='none'/> <source file='/var/lib/libvirt/images/rhel62-1.img'/> <target dev='vda' bus='virtio'/> <address type='pci' domain='0x0000' bus='0x00' slot='0x05' function='0x0' multifunction='on'/> </disk>
对于有两个功能的 PCI 设备,修改 XML 配置文件使其包含第二个设备,其插槽号与第一个设备和不同的功能号,如 function='0x1'。例如:<disk type='file' device='disk'> <driver name='qemu' type='raw' cache='none'/> <source file='/var/lib/libvirt/images/rhel62-1.img'/> <target dev='vda' bus='virtio'/> <address type='pci' domain='0x0000' bus='0x00' slot='0x05' function='0x0' multifunction='on'/> </disk> <disk type='file' device='disk'> <driver name='qemu' type='raw' cache='none'/> <source file='/var/lib/libvirt/images/rhel62-2.img'/> <target dev='vdb' bus='virtio'/> <address type='pci' domain='0x0000' bus='0x00' slot='0x05' function='0x1'/> </disk>
- 运行 lspci 命令。KVM 客户机虚拟机的输出显示了 virtio 块设备:
$ lspci 00:05.0 SCSI storage controller: Red Hat, Inc Virtio block device 00:05.1 SCSI storage controller: Red Hat, Inc Virtio block device
注意SeaBIOS 应用以实际模式运行,以便与 BIOS 接口兼容。这将限制可用的内存量。因此,SeanBIOS 只能处理有限数量的磁盘。目前,支持的磁盘数量是:- virtio-scsi — 64
- virtio-blk - 4
- 一个hci/sata - 24(4 个控制器连接了所有 6 端口)
- USB-storage - 4
作为临时解决方案,当将大量磁盘附加到虚拟机时,请确定您的系统磁盘有一个小的 pci 插槽号,因此 SeaBIOS 会首先在扫描 pci 总线时看到它。另外,也建议使用 virtio-scsi 设备而不是 virtio-blk,因为每个磁盘内存开销比较小。
20.24. 显示指定客户机虚拟机的 CPU 统计
--total
start
count
命令提供指定客户机虚拟机的 CPU 统计信息。默认情况下,它显示所有 CPU 的统计信息,以及总计。--total
选项仅显示总统计信息。count 选项将仅显示
计算 CPU 的统计信息。
例 20.51. 如何生成客户机虚拟机的 CPU 统计
# virsh cpu-stats guest1
CPU0:
cpu_time 242.054322158 seconds
vcpu_time 110.969228362 seconds
CPU1:
cpu_time 170.450478364 seconds
vcpu_time 106.889510980 seconds
CPU2:
cpu_time 332.899774780 seconds
vcpu_time 192.059921774 seconds
CPU3:
cpu_time 163.451025019 seconds
vcpu_time 88.008556137 seconds
Total:
cpu_time 908.855600321 seconds
user_time 22.110000000 seconds
system_time 35.830000000 seconds
20.25. 获取虚拟客户机控制台的截屏
imagefilepath
] 命令截取当前虚拟客户机控制台的屏幕截图,并将其存储在文件中。如果没有提供文件路径,则会将屏幕截图保存到当前目录中。如果虚拟机监控程序支持多个 guest 虚拟机显示,请使用 --screen screenID
选项指定要捕获的屏幕。
例 20.52. 如何获取客户端机器控制台的截屏
/home/username/pics/guest1-screen.png
:
# virsh screenshot guest1 /home/username/pics/guest1-screen.ppm
Screenshot saved to /home/username/pics/guest1-screen.ppm, with type of image/x-portable-pixmap
20.26. 将密钥组合发送到指定的虚拟客户机虚拟机
--codeset
-- 保持time
keycode 命令,您可以将序列作为密钥代码发送到特定的 guest 虚拟机。每个 键码 可以是数字值,也可以是以下对应代码集的符号链接名称。
-- keeptime
,则会为每个按键数以毫秒为单位进行。借助 --codeset
,您可以指定代码集,默认为 Linux
,但允许以下选项:
Linux
- 选择这个选项可使符号链接名称与对应的 Linux 键恒定宏名称匹配,而数字值则是由 Linux 通用输入事件子系统提供的。XT
- 这将发送 XT 键盘控制器定义的值。不提供符号链接名称atset1
- 数字值是指 AT 键盘控制器 set1(兼容 XT 兼容集)定义的。与 atset1 的扩展密钥码可能与 XT codeset 中的扩展密钥码不同。不提供符号名。atset2
- 数字值由 AT 键盘控制器定义,设置 2。不提供符号名。atset3
- 数字值由 AT 键盘控制器定义,设置 3(兼容PS/2)。不提供符号名。os_x
- 数字值由 OS-X 键盘输入子系统定义。符号链接名称与相应的 OS-X 密钥恒定宏名匹配。xt_kbd
- 数字值由 Linux KBD 设备定义。这些是原始 XT 代码集的一个变体,但通常使用不同的编码器。不提供符号名。win32
- 数字值由 Win32 键盘输入子系统定义。符号链接名称与对应的 Win32 密钥恒定宏名匹配。USB
- 用于键盘输入的 USB HID 规范定义数字值。不提供符号名。rfb
- 用于发送原始密钥码的 RFB 扩展定义的值。这些是 XT 代码集的一个变体,但扩展密钥码的低位是第二个位,而不是第一个字节的高位。不提供符号名。
例 20.53. 如何将按键组合发送到客户机虚拟机
# virsh send-key guest1 --codeset Linux
--holdtime 1000
KEY_LEFTCTRL KEY_LEFTALT KEY_DELETE
20.27. 主机机器管理
20.27.1. 显示主机信息
例 20.54. 如何显示主机机器的信息
$ virsh nodeinfo
CPU model: x86_64
CPU(s): 4
CPU frequency: 1199 MHz
CPU socket(s): 1
Core(s) per socket: 2
Thread(s) per core: 2
NUMA cell(s): 1
Memory size: 3715908 KiB
20.27.2. 设置 NUMA 参数
<numatune>
元素中。如果不使用标志,则仅显示当前设置。numatune domain 命令需要指定的 guest 虚拟机名称,并可以采用以下参数:
--mode
- 模式可以设置为strict
、interleave
或preferred
。运行域在实时模式时无法更改其模式,除非 guest 虚拟机在严格
模式下启动。--nodeset
包含供主机物理计算机用于运行客户机虚拟机的 NUMA 节点列表。列表包含节点,它们各自用逗号分隔,使用短划线-
用于节点范围,使用^
排除某个节点。- 每个实例只能使用以下三个标志之一
--config
将在持久客户机虚拟机下次引导时生效--live
将设置正在运行的虚拟客户机的调度程序信息。--current
将影响客户虚拟机的当前状态。
例 20.55. 如何为客户机虚拟机设置 NUMA 参数
strict
用于节点 0、2 和 3:
# virsh numatune guest1 --mode strict
--nodeset 0,2-3
--live
<numatune> <memory mode='strict' nodeset='0,2-3'/> </numatune>
20.27.3. 在 NUMA Cell 中显示 Free Memory 的挂载
例 20.56. 如何显示虚拟机和 NUMA 单元的内存属性
# virsh freecell
Total: 684096 KiB
--all
选项:
# virsh freecell --all
0: 804676 KiB
--------------------
Total: 804676 KiB
--cellno
选项:
# virsh freecell --cellno 0
0: 772496 KiB
20.27.4. 显示 CPU 列表
例 20.57. 如何显示可用于主机的 CPU 数量
# virsh nodecpumap
CPUs present: 4
CPUs online: 1
CPU map: y
20.27.5. 显示 CPU 统计信息
[cpu_number] [--percent]
命令显示主机的 CPU 负载状态的统计信息。如果指定了 CPU,则统计信息仅针对指定的 CPU。如果指定了 百分比
选项,命令会显示通过一(1)秒记录的每个 CPU 统计的比例。
例 20.58. 如何显示 CPU 用量的统计信息
# virsh nodecpustats
user: 1056442260000000
system: 401675280000000
idle: 7549613380000000
iowait: 94593570000000
# virsh nodecpustats 2 --percent
usage: 2.0%
user: 1.0%
system: 1.0%
idle: 98.0%
iowait: 0.0%
20.27.6. 管理设备
20.27.6.1. 使用 virsh 附加和更新设备
过程 20.4. 热插拔 USB 设备供客户机虚拟机使用
- 运行以下命令找到您要附加的 USB 设备:
# lsusb -v idVendor 0x17ef Lenovo idProduct 0x480f Integrated Webcam [R5U877]
- 创建一个 XML 文件并为其提供逻辑名称(例如
usb_device.xml
)。复制供应商和产品 ID 号(十六进制数字)与搜索中显示的信息完全相同。在 XML 文件中添加此信息,如 图 20.2 “USB 设备 XML 片断” 所示。记住该文件的名称,因为您需要在下一步中。图 20.2. USB 设备 XML 片断
<hostdev mode='subsystem' type='usb' managed='yes'> <source> <vendor id='0x17ef'/> <product id='0x480f'/> </source> </hostdev>
- 通过运行以下命令来连接设备:运行该命令时,将 guest1 替换为虚拟机的名称,并将 usb_device.xml 替换为包含您上一步创建的厂商和产品 ID 的 XML 文件的名称。要使更改在下次重启时生效,请使用
--config
参数。要使更改对当前 guest 虚拟机生效,请使用--current
参数。如需了解更多参数,请参阅 virsh man page。# virsh attach-device guest1
--file usb_device.xml
--config
例 20.59. 如何从客户机虚拟机热拔设备
# virsh detach-device guest1 --file usb_device.xml
20.27.6.2. 附加接口设备
[<target>]
[<mac>]
[<script>]
[<model>]
[<inbound>] [<inbound>]
[< 出站>] [--config ]
[--live
] [--current]
命令可使用以下参数:
--type
- 允许您设置接口类型--source
- 允许您设置网络接口源--live
- 从正在运行的客户机虚拟机配置设置中获取值--config
- 在下次引导时生效--current
- 根据当前的配置设置获取其值--target
- 表示客户机虚拟机中的目标设备。--
MAC - 使用这个选项指定网络接口的 MAC 地址--script
- 使用这个选项指定处理网桥的脚本文件的路径,而不是默认文件。--model
- 使用这个选项指定型号类型。--inbound
- 控制接口的入站带宽。可接受的值的平均
是、峰值
和burst
。--outbound
- 控制接口的出站带宽。可接受的值的平均
是、峰值
和burst
。注意平均和峰值的值以每秒 KB 为单位表示,而在高峰速度内以千字节为单位,如网络 XML 上游文档 所述。
的网络
,或者 网桥
以指示设备的桥接。source 是设备的来源。要删除附加的设备,请使用 virsh detach-device 命令。
例 20.60. 如何将设备附加到客户机虚拟机
virtio
提供给客户端:
# virsh attach-interface guest1 networkw --model virtio
20.27.6.3. 更改 CDROM 的介质
--path
- 包含完全限定路径或磁盘设备目标的字符串--source
- 包含介质源的字符串--eject
- Ejects the media--insert
- Inserts the media--update
- 更新介质--current
- 可以是--live
和--config
,这取决于虚拟机监控程序驱动程序的实现--live
- Alters running guest 虚拟机的实时配置--config
- Alters persistent 配置,在下次引导时观察到的操作--force
- 强制介质更改
20.27.7. 设置和显示节点内存参数
[shm-pages-to-scan] [shm-sleep-milisecs] [shm-merge-across-nodes]
命令显示并允许您设置节点内存参数。可使用这个命令设置以下参数:
--shm-pages-to-scan
- 在内核相同页面合并(KSM)服务进入休眠前将页面数量设置为扫描。--shm-sleep-milisecs
- 设置 KSM 将在下一次扫描前休眠的 miliseconds 数--shm-merge-across-nodes
- 指定是否可以合并来自不同 NUMA 节点的页面
例 20.61. 如何在 NUMA 节点之间合并内存页面
# virsh node-memory-tune --shm-merge-across-nodes 1
20.27.8. 列出主机上的设备
--tree
命令列出 libvirt 服务已知的主机上可用的所有设备。--cap 可以按能力类型过滤列表,每个设备由逗号隔开,并且不能与 --tree
一起使用。使用参数 --tree
,将输出置于树结构中。
例 20.62. 如何显示主机上可用的设备
# virsh nodedev-list --tree
computer
|
+- net_lo_00_00_00_00_00_00
+- net_macvtap0_52_54_00_12_fe_50
+- net_tun0
+- net_virbr0_nic_52_54_00_03_7d_cb
+- pci_0000_00_00_0
+- pci_0000_00_02_0
+- pci_0000_00_16_0
+- pci_0000_00_19_0
| |
| +- net_eth0_f0_de_f1_3a_35_4f
[...]
# virsh nodedev-list --cap scsi
scsi_0_0_0_0
20.27.9. 在主机机器中创建设备
<设备>
描述的 XML 描述。有关此类文件的示例,请参阅 例 20.65 “如何检索设备的 XML 文件”。
例 20.63. 如何从 XML 文件创建设备
scsi_host2.xml
。以下命令允许您将这个设备附加到您的客户端:
# virsh nodedev-create scsi_host2.xml
20.27.10. 删除设备
--driver
参数,您可以指定预期的后端驱动程序。
例 20.64. 如何从主机物理机器中删除设备
# virsh nodedev-destroy scsi_host2
20.27.11. 收集设备配置设置
例 20.65. 如何检索设备的 XML 文件
# virsh nodedev-dumpxml scsi_host2 <device> <name>scsi_host2</name> <parent>scsi_host1</parent> <capability type='scsi_host'> <capability type='fc_host'> <wwnn>2001001b32a9da5b</wwnn> <wwpn>2101001b32a9da5b</wwpn> </capability> </capability> </device>
20.27.12. 为设备触发重置
例 20.66. 如何重置客户机虚拟机上的设备
# virsh nodedev-reset scsi_host2
20.28. 检索客户机虚拟机信息
20.28.1. 获取虚拟机的域 ID
例 20.67. 如何检索客户机虚拟机的域 ID
# virsh domid guest1
8
-
对于处于关闭状态的客户端虚拟机。要确认虚拟机已关闭,您可以运行 virsh list --all
命令。
20.28.2. 获取客户机虚拟机的域名
例 20.68. 如何检索虚拟机的 ID
# virsh domname 8
guest1
20.28.3. 获取客户机虚拟机的 UUID
例 20.69. 如何显示客户机虚拟机的 UUID
# virsh domuuid guest1
r5b2-mySQL01 4a4c59a7-ee3f-c781-96e4-288f2862f011
20.28.4. 显示客户机虚拟机信息
例 20.70. 如何显示客户机虚拟机常规详情
# virsh dominfo guest1
Id: 8
Name: guest1
UUID: 90e0d63e-d5c1-4735-91f6-20a32ca22c48
OS Type: hvm
State: running
CPU(s): 1
CPU time: 32.6s
Max memory: 1048576 KiB
Used memory: 1048576 KiB
Persistent: yes
Autostart: disable
Managed save: no
Security model: selinux
Security DOI: 0
Security label: system_u:system_r:svirt_t:s0:c552,c818 (enforcing)
20.29. 存储池命令
20.29.1. 搜索存储池 XML
例 20.71. 如何列出可用存储池的 XML 设置
# virsh find-storage-pool-sources logical
<sources>
<source>
<device path='/dev/mapper/luks-7a6bfc59-e7ed-4666-a2ed-6dcbff287149'/>
<name>RHEL_dhcp-2-157</name>
<format type='lvm2'/>
</source>
</sources>
20.29.2. 查找存储池
例 20.72. 如何找到潜在的存储池源
# virsh find-storage-pool-sources-as disk
--host myhost.example.com
20.29.3. 列出存储池信息
例 20.73. 如何检索存储池的信息
# virsh pool-info vdisk
Name: vdisk
UUID:
State: running
Persistent: yes
Autostart: no
Capacity: 125 GB
Allocation: 0.00
Available: 125 GB
20.29.4. 列出可用存储池
--inactive
参数仅列出非活动池,并使用 --all
参数列出所有存储池。此命令采用以下可选参数,该参数过滤搜索结果:
--inactive
- 列出不活跃的存储池--all
- 列出活跃和不活跃的存储池--persistent
- 列出持久性存储池--transient
- 列出临时存储池--autostart
- 列出启用了自动启动的存储池--no-autostart
- 列出禁用自动启动的存储池--type type
- 列出仅属于指定类型的池--details
- 列出存储池的扩展详情
persistent 将列表限制为
持久池,--transient 将列表限制为临时池,-- autostart
将列表限制为自动启动池,最后 --no-autostart
将列表限制为禁用自动启动的存储池。
dir
、fs
、netfs
、逻辑
、磁盘
、iscsi
、scsi
、mpath
、rbd
、sheepdog
和 gluster
。
details
选项指示 virsh 显示池持久性和容量相关信息。
例 20.74. 如何列出所有存储池
# virsh pool-list --all
Name State Autostart
-----------------------------------------
default active yes
vdisk active no
20.29.5. 刷新存储池列表
例 20.75. 如何刷新存储池中的存储卷列表
# virsh pool-refresh vdisk
Pool vdisk refreshed
20.29.6. 创建、定义和启动存储池
20.29.6.1. 构建存储池
--overwrite
和 --no-overwrite
只能用于 FS 存储池,或使用基于磁盘或逻辑类型的存储池。请注意,如果没有提供 [-overwrite] 或 [--no-overwrite],且使用的池为 FS,则会假定类型是基于 目录的实际情况。除了池名称外,也可以使用存储池 UUID。
--no-overwrite
,它会探测确定目标设备上是否已存在文件系统,如果目标设备中已存在,返回错误,或者使用 mkfs 来格式化目标设备(如果不存在)。如果指定了 --overwrite
,则将执行 mkfs 命令,并覆盖目标设备中任何现有的数据。
例 20.76. 如何构建存储池
# virsh pool-build vdisk
Pool vdisk built
20.29.6.2. 从 XML 文件定义存储池
例 20.77. 如何从 XML 文件中定义存储池
<pool type="dir"> <name>vdisk</name> <target> <path>/var/lib/libvirt/images</path> </target> </pool>
# virsh pool-define vdisk.xml
Pool vdisk defined
20.29.6.3. 创建存储池
例 20.78. 如何从 XML 文件创建存储池
<pool type="dir"> <name>vdisk</name> <target> <path>/var/lib/libvirt/images</path> </target> </pool>
# virsh pool-create vdisk.xml
Pool vdisk created
20.29.6.4. 创建存储池
--print-xml
- 显示 XML 文件的内容,但不定义或创建存储池--type
类型定义 存储池类型。有关您可以使用的类型,请参阅 第 20.29.4 节 “列出可用存储池”。--source-host
hostname - 用于底层存储的源主机物理机器--source-path
路径 - 底层存储的位置--source-dev
路径 - 底层存储的设备--source-name
name - 源底层存储的名称--source-format
格式 - 源底层存储的格式--target
path - 底层存储的目标
例 20.79. 如何创建和启动存储池
/mnt
目录中创建和启动一个名为 vdisk 的存储池:
# virsh pool-create-as --name vdisk --type dir
--target /mnt
Pool vdisk created
20.29.6.5. 定义存储池
--print-xml
- 显示 XML 文件的内容,但不定义或创建存储池--type
类型定义 存储池类型。有关您可以使用的类型,请参阅 第 20.29.4 节 “列出可用存储池”。--source-host
hostname - 为底层存储提供主机物理机器--source-path
path - 底层存储的位置--source-dev
devicename - 底层存储的设备--source-name
sourcename - 源底层存储的名称--source-format
格式 - 源底层存储的格式--target
targetname - 底层存储的目标
--print-xml
,则将打印池对象的 XML,而不创建或定义池。否则,池需要构建指定的类型。对于需要 类型 的所有存储池命令,池类型必须以逗号分隔。有效的池类型包括: dir
、fs
、netfs
、逻辑
、磁盘
、iscsi
、scsi
、mpath
、rbd
、sheepdog
和 gluster
。
例 20.80. 如何定义存储池
# virsh pool-define-as --name vdisk --type dir
--target /mnt
Pool vdisk defined
20.29.6.6. 启动存储池
例 20.81. 如何启动存储池
# virsh pool-start vdisk
Pool vdisk started
20.29.6.7. 自动启动存储池
--disable
参数。
例 20.82. 如何自动启动存储池
# virsh pool-autostart vdisk
Pool vdisk autostarted
20.29.7. 停止和删除存储池
例 20.83. 如何停止存储池
# virsh pool-destroy vdisk
Pool vdisk destroyed
例 20.84. 如何删除存储池
# virsh pool-delete vdisk
Pool vdisk deleted
例 20.85. 如何取消定义存储池
# virsh pool-undefine vdisk
Pool vdisk undefined
20.29.8. 为池创建 XML 转储文件
--inactive
转储在下次启动时将使用的配置,而不是当前池配置。
例 20.86. 如何检索存储池的配置设置
# virsh pool-dumpxml vdisk
<pool type="dir">
<name>vdisk</name>
<target>
<path>/var/lib/libvirt/images</path>
</target>
</pool>
20.29.9. 编辑存储池的配置文件
例 20.87. 如何编辑存储池的配置设置
# virsh pool-edit vdisk
<pool type="dir">
<name>vdisk</name>
<target>
<path>/var/lib/libvirt/images</path>
</target>
</pool>
20.30. 存储卷命令
20.30.1. 创建存储卷
--pool 字符串
- 需要 - 包含存储池的名称或存储池的 UUID(将附加到存储卷)。这个存储池不必是与您要用来将这个新存储卷关联的存储卷关联的存储池。--file string
- 必需 - 包含包含存储卷参数的 XML 文件的名称。--vol string
- 必需 - 包含您要用来基础这个新存储卷的存储卷的名称。--inputpool string
- 可选 - 允许您命名与您要用作新存储卷的输入关联的存储池。--prealloc-metadata
- 可选 - 为新存储卷预先分配元数据(用于 qcow2 而不是完整分配)。
20.30.2. 从参数创建存储卷
[--pool] 字符串
- 必需 - 包含关联的存储池的名称。[--name] string
- 必需 - 包含新存储卷的名称。- [-
capacity] 字符串
- 必需 - 包含存储卷的大小,以整数表示。除非指定,则默认为 字节。分别使用后缀 b、k、M、G、T 表示字节、kilobyte、Mabyte、Gigabyte 和 terabyte。 --allocation string
- 可选 - 包含初始分配大小,以整数表示。除非指定,则默认为 字节。--format string
- 可选 - 包含文件格式类型。可接受的类型包括:raw、bochs、qcow、qcow2、qed、host_device 和 vmdk。但是,这些只适用于基于文件的存储池。默认情况下,使用的 qcow 版本为版本 3。如果要更改版本,请参阅 第 23.19.2 节 “设置目标元素”。--backing-vol 字符串
- 可选 - 包含后备卷。如果您要生成快照,则将使用此快照。--backing-vol-format string
- 可选 - 包含后备卷的格式。如果您要生成快照,则将使用此快照。--prealloc-metadata
- 可选 - 允许您预先分配元数据(用于 qcow2 而不是全分配)。
例 20.88. 如何从一组参数创建存储卷
# virsh vol-create-as vdisk vol-new 100M
vol vol-new created
20.30.3. 从 XML 文件创建存储卷
例 20.89. 如何从现有的 XML 文件创建存储卷
<volume> <name>vol-new</name> <allocation>0</allocation> <capacity unit="M">100</capacity> <target> <path>/var/lib/libvirt/images/vol-new</path> <permissions> <owner>107</owner> <group>107</group> <mode>0744</mode> <label>virt_image_t</label> </permissions> </target> </volume>
/var/lib/libvirt/images/vol-new
:
# virsh vol-create vdisk vol-new.xml
vol vol-new created
20.30.4. 克隆存储卷
--pool 字符串
选项,它允许您指定与新存储卷关联的存储池。vol 参数是源存储卷的名称或密钥或者路径,name 参数则引用新存储卷的名称。有关详情请参考 第 13.3.2.1 节 “使用 virsh 创建存储卷”。
例 20.90. 如何克隆存储卷
# virsh vol-clone vol-new vol-clone
vol vol-clone cloned from vol-new
20.31. 删除存储卷
pool
命令删除给定卷。该命令需要卷所在存储池的名称或 UUID,以及存储卷的名称。如果卷名是要删除的卷的密钥或路径,也可以使用要删除的卷。
例 20.91. 如何删除存储卷
# virsh vol-delete new-vol vdisk
vol new-vol deleted
20.32. 删除存储卷的内容
--pool 池
,它是卷所在存储池的名称或 UUID,以及 池,即要擦除的卷名称或路径的名称。请注意,可以使用参数 --algorithm
并使用以下支持的算法之一选择不同的 wiping 算法而不是重写卷:
零
- 1-pass all zeroesnnsa
- 4-pass NNSA 策略 Letter NAP-14.1-C(XVI-8),用于清理可移动且不可删除的硬盘: random x2, 0x00, verify.- DoD - 4-pass DoD 5220.22-M 部分 8-306 部分清理可移动且不可删除的磁盘: random, 0x00, 0xff, verify.
BSI
- 信息技术领域德国安全中心推荐 9-pass 方法(http://www.bsi.bund.de):0XFF, 0xfe, 0xfd, 0xfb, 0xf7, 0xef, 0xdf, 0xbf, 0x7f.gutmann
- Gutmann 白皮书中描述的规范 35-pass 序列。schneier
- Bruce Schneier 描述的 7-pass 方法,"Applied Cryptography"(1996):0x00, 0xff, 随机 x5.pfitzner7
- Roy Pfitzner 的 7-random-pass 方法:随机 x7pfitzner33
- Roy Pfitzner 的 33-random-pass 方法:随机 x33.Random
- 1-pass pattern: random.s
例 20.92. 如何删除存储卷的内容(如何擦除存储卷)
# virsh vol-wipe new-vol vdisk
vol new-vol wiped
20.33. 将存储卷信息转储到 XML 文件
--pool
选项提供关联的存储池的名称。
例 20.93. 如何转储存储卷的内容
# virsh vol-dumpxml vol-new
20.34. 列出卷信息
--pool
选项,您可以在其中指定与存储卷关联的存储池。您可以提供池名称,或者提供 UUID。
例 20.94. 如何查看有关存储卷的信息
# virsh vol-info vol-new
--details
选项指示 virsh 额外显示卷类型和容量可用信息。
例 20.95. 如何显示与存储卷关联的存储池
# virsh vol-list vdisk
20.35. 检索存储卷信息
--uuid
选项,则返回池 UUID。命令需要存储卷的密钥或者路径来返回请求的信息。
例 20.96. 如何显示存储卷的名称或 UUID
/var/lib/libvirt/images/vol-new
中找到的存储卷的名称:
# virsh vol-pool /var/lib/libvirt/images/vol-new
vol-new
--pool pool-or-uuid
vol-name-or-key 命令返回给定卷的路径。命令需要 --pool pool-or-uuid
,这是卷所在存储池的名称或 UUID。它还需要 vol-name-or-key,这是请求路径的卷的名称或密钥。
--pool pool-or-uuid
vol-name-or-path 命令返回给定卷的卷密钥,其中 --pool pool-or-uuid
是卷的名称或 UUID,而 vol-name-or-path 是卷的名称或路径返回卷的密钥。
20.36. 显示每个虚拟机信息
20.36.1. 显示客户机虚拟机
# virsh list
--all
- 列出所有 guest 虚拟机。例如:# virsh list --all Id Name State ---------------------------------- 0 Domain-0 running 1 Domain202 paused 2 Domain010 shut off 3 Domain9600 crashed
注意如果在运行 virsh list --all 时不显示任何结果,则可能是因为您不会以 root 用户身份创建虚拟机。virsh list --all 命令识别以下状态:- Running
-
状态为 CPU 上当前活跃的 guest 虚拟机。 - idle -
idle
状态表示客户机虚拟机处于空闲状态,可能无法运行或可运行。当客户机虚拟机在 I/O(传统等待状态)上处于睡眠状态时会出现这种情况,因为它没有其他操作。 - paused - 当客户机虚拟机暂停时,它会消耗内存和其他资源,但不符合从虚拟机监控程序调度 CPU 资源的条件。在 virt-manager 或 virsh suspend 命令中使用
paused
按钮后,暂停的状态发生。 - 关闭 -
处于关闭状态,用于关闭过程中的客户机虚拟机。客户机虚拟机发送了一个关机信号,应在正常停止其操作过程中。这可能不会用于所有虚拟客户机操作系统;一些操作系统不响应这些信号。
- 关闭 -
关闭状态
表示客户机虚拟机没有运行。当 guest 虚拟机完全关闭或尚未启动时,这可能会导致。 - crashed -
crashed
状态表示客户机虚拟机已经崩溃,且只能在 guest 虚拟机被配置为崩溃时发生。 - pmsuspended - 客户机电源管理已暂停。
--inactive
- 列出已定义但当前未激活的客户机虚拟机。这包括关闭
并崩溃
的机器。--managed-save
- 启用了受管保存状态的客户机将列为已保存的
。请注意,要使用这个选项过滤 guest,还需要使用--all
或--inactive
选项。--name
- 命令列出了客户机的名称,而不是默认的表格式。这个选项与--uuid
选项相互排斥,该选项只打印客户端 UUID 列表,使用--table
选项,它决定了应当使用表风格输出。--
- 同时列出 guest 标题字段,其中通常包含 guest 的简短描述。这个选项必须与默认的(title
--table
)输出格式一起使用。例如:$ virsh list --title Id Name State Title ---------------------------------------------------------------------------- 0 Domain-0 running Mailserver1 2 rhelvm paused
--persistent
- 仅包括持久的 guest 包含在列表中。使用--transient
参数列出临时 guest。--with-managed-save
- 配置了受管保存的客户机列表。要列出没有虚拟机的虚拟机,请使用-- without-managed-save
选项。--state-running
- 仅列出正在运行的 guest.同样,使用--state-paused
用于暂停的 guest,--state-shutoff
用于关闭的 guest,--state-other
将所有状态列为回退。--autostart
- 只列出自动启动 guest。要列出禁用了这个功能的客户端,请使用--no-autostart
参数。--with-snapshot
- 列出可以列出快照映像的客户机。要过滤没有快照的 guest,请使用-- without-snapshot
选项。
20.36.2. 显示虚拟 CPU 信息
# virsh vcpuinfo {domain-id, domain-name or domain-uuid}
# virsh vcpuinfo guest1
VCPU: 0
CPU: 2
State: running
CPU time: 7152.4s
CPU Affinity: yyyy
VCPU: 1
CPU: 2
State: running
CPU time: 10889.1s
CPU Affinity: yyyy
20.36.3. 将 vCPU 固定到主机物理机器的 CPU
# virsh vcpupin guest1
VCPU: CPU Affinity
----------------------------------
0: 0-3
1: 0-3
--vCPU
需要 vcpu 号[--cpulist] 字符串
列出要设置的主机物理机器的 CPU 编号,或省略用于查询的选项--config
在下次引导时影响--live
会影响正在运行的客户机虚拟机--current
对当前客户机虚拟机状态的影响
20.36.4. 显示有关给定域的虚拟 CPU 计数的信息
# virsh vcpucount guest1
maximum config 2
maximum live 2
current config 2
current live 2
--maximum
get maximum on vcpus--active
get number 当前 active vcpus--live
从运行的客户机虚拟机获取值--config
get value 用于下一次引导时--current
根据当前客户机虚拟机状态获取值- 返回的
--guest
数量是从客户机的视角获得
20.36.5. 配置虚拟 CPU 关联性
# virsh vcpupin domain-id vcpu cpulist
--config
会对下次引导造成影响),-- live
则会影响正在运行的 guest 虚拟机,-- current
会影响当前的客户机虚拟机状态。
20.36.6. 配置虚拟 CPU 数
--config
标志。要使用 virsh 修改分配给客户机虚拟机的 CPU 数量:
# virsh setvcpus {domain-name, domain-id or domain-uuid} count [[--config] [--live] | [--current]] [--maximum] [--guest]
# virsh setvcpus guestVM1 2 --live
--config
标志,则更改将更改为 guest 虚拟机的存储 XML 配置,并且仅在启动 guest 时生效。
--live
,guest 虚拟机必须处于活动状态,且更改会立即发生。这个选项将允许热插 vCPU。如果虚拟机监控程序支持,可以将 --config
和 --live
标志一起指定。
--current
,该标志会影响当前的客户机虚拟机状态。
--live
标志。如果 guest 虚拟机未激活,该命令将会失败。另外,如果没有指定标志,它适用于虚拟机监控程序,是否也假定 --config
标志。这决定了 XML 配置是否已调整,以永久保留更改。
--maximum
标志控制下次虚拟机引导时可热插的最大虚拟 CPU 数量。因此,它只能与 --config
标志一起使用,不能与 --live
标志一起使用。
数
不能超过分配给客户机虚拟机的 CPU 数量。
--guest
,该标志会修改当前客户机虚拟机的 CPU 状态。
20.36.7. 配置内存分配
# virsh setmem {domain-id or domain-name} count
# virsh setmem vr-rhel6u1-x86_64-kvm --kilobytes 1025000
为单位指定计数
。新计数值不能超过您为客户机虚拟机指定的数量。低于 64 MB 的值不太可能用于大多数客户机虚拟机操作系统。较高最大内存值不会影响活跃的客户机虚拟机。如果新值小于可用内存,它将缩小可能会导致客户机虚拟机崩溃。
- domain - 由域名、id 或 uuid 指定
- size - 确定新内存大小,作为缩放整数。默认单位是 KiB,但可以指定不同的单位:有效内存单元包括:
b
或bytes
(以字节为单位)KB
代表 KB(103 或 1,000 字节块)k
或KiB
用于 kibibytes(210 或 1024 字节)MB
表示 MB(106 或 1,000,000 字节块)M
或MiB
代表兆字节(220 或 1,048,576 字节)GB
表示千兆字节(109 或 1,000,000 字节块)g
或GiB
用于千兆字节(230 或块 1,073,741,824 字节)TB
代表 TB(1012 或 1,000,000,000 字节块)T
或TiB
代表 tebibytes(240 或块 1,099,511,627,776 字节)
请注意,所有值都将按 libvirt 舍入到最接近的基千字节,并且也可进一步取整为管理程序支持的粒度。有些虚拟机监控程序还可强制实施最少 4000KiB(或 4000 x 210 或 4,096,000 字节)。这个值的单位由可选属性内存单元
决定,它默认为 kibibytes(KiB),以测量给出的值乘以 210 或块 1024 字节。 --config
- 命令在下次引导时生效--live
- 命令控制正在运行的客户机虚拟机的内存--current
- 命令控制当前客户机虚拟机的内存
20.36.8. 更改域的内存分配
--config
--live
--current
命令允许为客户机虚拟机设置最大内存分配,如下所示:
# virsh setmaxmem guest1 1024 --current
--config
- 在下次引导时影响--live
- 控制正在运行的虚拟客户机虚拟机的内存,提供虚拟机监控程序支持此操作,因为不是所有虚拟机监控程序都允许对最大内存限值进行实时更改。--current
- 控制当前客户端虚拟机的内存
20.36.9. 显示客户机虚拟机块设备信息
--human
以更用户友好的方式显示统计数据。
# virsh domblkstat GuestName block-device
20.36.10. 显示客户机虚拟机网络设备信息
# virsh domifstat GuestName interface-device
20.37. 管理虚拟网络
# virsh net-list
# virsh net-list
Name State Autostart
-----------------------------------------
default active yes
vnet1 active yes
vnet2 active yes
# virsh net-dumpxml NetworkName
# virsh net-dumpxml vnet1
<network>
<name>vnet1</name>
<uuid>98361b46-1581-acb7-1643-85a412626e70</uuid>
<forward dev='eth0'/>
<bridge name='vnet0' stp='on' forwardDelay='0' />
<ip address='192.168.100.1' netmask='255.255.255.0'>
<dhcp>
<range start='192.168.100.128' end='192.168.100.254' />
</dhcp>
</ip>
</network>
- virsh net-autostart network-name :将 network-name 标记为在 libvirt 守护进程启动时自动启动。
--disable
选项取消标记 network-name。 - virsh net-create XMLfile :使用来自现有文件的 XML 定义,启动新的(转换)网络。
- virsh net-define XMLfile :使用现有文件中的 XML 定义来定义新网络,而不启动它。
- virsh net-destroy network-name :销毁指定为 network-name 的网络。
- virsh net-name networkUUID :将指定的 网络UUID 转换为网络名称。
- virsh net-uuid network-name :将指定的 network-name 转换为网络 UUID。
- virsh net-start nameOfInactiveNetwork :启动不活动的网络。
- virsh net-undefine nameOfInactiveNetwork :删除网络的不活跃 XML 定义。这对网络状态没有影响。如果在执行此命令时域正在运行,则网络将继续运行。但是,网络会变得临时而不是持久。
20.37.1. 自动启动虚拟网络
# virsh net-autostart network [--disable
]
--disable
选项,该选项禁用 autostart 命令。
20.37.2. 从 XML 文件创建虚拟网络
# virsh net-create file
20.37.3. 从 XML 文件定义虚拟网络
# virsh net-define file
20.37.4. 停止虚拟网络
# virsh net-destroy network
20.37.5. 创建转储文件
--inactive
,则物理功能不会扩展到其关联的虚拟功能中。
# virsh net-dumpxml network [--inactive
]
20.37.6. 编辑虚拟网络的 XML 配置文件
# virsh net-edit network
20.37.7. 获取有关虚拟网络的信息
# virsh net-info network
20.37.8. 列出虚拟网络的信息
--all
,这也将包括定义但不活跃的网络。如果只指定 --inactive
,则将列出非活动。您可能还想通过 --persistent
过滤返回的网络来列出永久网络,使用 --transient
列出临时临时网络,--autostart
列出启用自动启动的临时网络,使用 --no-autostart
列出禁用自动启动的网络。
# virsh net-list [--inactive
| --all
] [--persistent
] [<--transient
>] [--autostart] [<--no-autostart
>]
20.37.9. 将网络 UUID 转换为网络名称
# virsh net-name network-UUID
20.37.10. 将网络名称转换为网络 UUID
# virsh net-uuid network-name
20.37.11. 启动之前定义的 Inactive 网络
# virsh net-start network
20.37.12. 取消定义 Inactive Network 的配置
# virsh net-undefine network
20.37.13. 更新现有网络定义文件
# virsh net-update network directive section XML [--parent-index index]
[[--live]
[--config]
| [--current]]
add-first
add-last
或add
(这些是同义)删除
修改
bridge
domain
ip
ip-dhcp-host
ip-dhcp-range
forward
转发接口
forward-pf
portgroup
dns-host
dns-txt
dns-srv
ip-dhcp-host
更改 <一个主机>
元素,它包含在网络的 <ip>
元素中的 <dhcp>
元素中。
<host mac="00:11:22:33:44:55' ip='1.2.3.4'/>
),或者包含完整 XML 元素的文件的名称。通过查看提供的文本的第一个字符 - 如果第一个字符是 <
,则它是 XML 文本,如果第一个字符不是 >
,则这是包含要使用的 xml 文本的文件名称。parent -index
选项用于指定所请求元素的多个父元素(基于 0)。
<主机>
元素可以是网络中的任意多个 <ip>
元素之一;如果不提供父索引,则会选择最适当的 <ip>
元素(通常是一个已具有 <dhcp>
元素),但如果给出了 --parent-index
,则特定的 <ip>
实例将会获得修改。如果指定了 --live
,会影响正在运行的网络。如果指定了 --config
,则会影响持久网络的下一次启动。如果指定了 --current
,会影响当前网络状态。可以给定 --live
和 --config
标志,但 --current
是独占的。不指定任何标志与指定 --current
相同。
20.37.14. 使用 virsh 迁移客户机虚拟机
20.37.15. 为客户机虚拟机设置静态 IP 地址
"nat"
、"route"
,或者根本没有转发模式。如果网络配置了 forward mode="bridge"
或 "hostdev"
,则此过程将无法正常工作。在这样的情形中,DCHP 服务器位于网络中的其他位置,因此不受 libvirt 的控制。在这种情况下,需要在远程 DHCP 服务器上进行静态 IP 条目。要做到这一点,查看服务器提供的文档。
过程 20.5. 设置静态 IP 地址
检查客户机 XML 配置文件
通过运行 virsh domiflist guest1 命令显示客户机的网络配置设置。替换您的虚拟机的名称,用 guest1 代替。此时会显示一个表。查看 Source 列。这是您的网络的名称。在本例中,网络名为 default。这个名称将用于剩余的步骤和 MAC 地址。# virsh
domiflist guest1
Interface Type Source Model MAC ------------------------------------------------------- vnet4 network default virtio 52:54:00:48:27:1D验证 DHCP 范围
您所设置的 IP 地址必须在为网络指定的 dhcp 范围内。另外,它还不得与网络上的任何其他现有静态 IP 地址冲突。要检查可用地址以及已使用的地址范围,请在主机中使用以下命令:# virsh
net-dumpxml default | egrep 'range|host\ mac'
<range start='198.51.100.2' end='198.51.100.254'/> <host mac='52:54:00:48:27:1C:1D' ip='198.51.100.2'/>您看到的输出将与示例不同,您可能会看到更多行和多个主机 mac 行。每个 guest 静态 IP 地址都将有一行。设置静态 IP 地址
在主机计算机上运行以下命令,将 default 替换为网络的名称。# virsh net-update default add ip-dhcp-host '<host mac="52:54:00:48:27:1D" ip="198.51.100.3"/>' --live --config
live 选项允许此更改立即发生,--config
选项则可永久保留更改。在您使用有效的 IP 和 MAC 地址时,此命令还将适用于尚未创建的客户机虚拟机。MAC 地址应该是有效的单播 MAC 地址(由 分隔的6 位十六进制对,第一个数字对为偶数);当 libvirt 创建新的随机 MAC 地址时,它会将
52:54:00
用于前三个数字对,建议遵照此惯例。重启接口(可选)
如果 guest 虚拟机当前正在运行,则需要强制客户端虚拟机重新请求 DHCP 地址。如果 guest 未运行,您下次启动时新的 IP 地址将实施。要重启接口,在主机机器中输入以下命令:# virsh domif-setlink guest1 52:54:00:48:27:1D down # sleep 10 # virsh domif-setlink guest1 52:54:00:48:27:1D up
该命令使客户机虚拟机的操作系统认为以太网电缆没有被插入,然后在十秒后重新插入。sleep 命令非常重要,因为许多 DHCP 客户端允许简短断开电缆,而无需重新请求 IP 地址。十秒足够长,以便 DHCP 客户端忘记旧的 IP 地址,并在执行命令后请求一个新地址。如果因某种原因命令失败,则必须从客户机操作系统的管理界面重置 guest 的接口。
20.38. Interface 命令
network
服务时,才会支持本节中的命令。
<接口>
元素(如系统创建桥接接口)中的名称使用,但没有任何主机接口与所有特定虚拟机配置 XML 关联。主机接口的许多命令与用于客户机虚拟机的命令类似,命名接口的方式就是其名称或其 MAC 地址。但是,当使用 iface
参数的 MAC 地址时,仅当该地址是唯一的时(如果接口和桥接共享相同的 MAC 地址,这通常是这种情况,那么使用该 MAC 地址会导致因为不确定性而造成错误,且您必须转为使用名称)。
20.38.1. 通过 XML 文件定义和启动主机物理接口
# virsh iface-define iface.xml
20.38.2. 为主机接口编辑 XML 配置文件
20.38.3. 列出主机接口
--all
,此列表还包含已定义但处于非活动状态的接口。如果只指定 --inactive
,则将列出不活动接口。
20.38.4. 将 MAC 地址转换为接口名称
20.38.5. 停止和取消定义特定主机物理接口
20.38.6. 显示主机配置文件
--
inactive 命令显示主机接口信息,作为 XML 转储到 stdout。如果指定了 --inactive
参数,则输出会反映在下次启动时将使用的接口的持久性状态。
20.38.7. 创建网桥设备
# virsh iface-bridge interface bridge
--no-stp
选项、-- no-start
选项以及延迟的秒数来更改这些设置。接口的 IP 地址配置将移到新网桥设备中。有关关闭桥接的详情,请参考 第 20.38.8 节 “关闭桥接设备”
20.38.8. 关闭桥接设备
--no-start
命令关闭名为 bridge 的指定网桥设备,将其底层接口释放回正常使用情况,并将所有 IP 地址配置从网桥设备移到基础设备。除非使用 --no-start
参数,否则将重启底层接口,但通常不建议重新启动。有关创建桥接的命令,请参阅 第 20.38.7 节 “创建网桥设备”。
20.38.9. 操作接口快照
例 20.97. 使用快照的示例
# virsh iface-begin # virsh iface-define eth4-if.xml # virsh if-start eth4
# virsh iface-rollback
# virsh iface-commit
20.39. 管理快照
20.39.1. 创建快照
<name>
和 <description>
元素以及 <disks>
)为客户机虚拟机创建一个快照。要创建快照运行:
# virsh snapshot-create domain XML file [--redefine [--current] [--no-metadata] [--halt] [--disk-only] [--reuse-external] [--quiesce] [--atomic]
--disk-only
- 客户机虚拟机的内存状态不包含在快照中。- 如果完全省略 XML 文件字符串,libvirt 将为所有字段选择一个值。新快照将变为最新状态,如 snapshot-current 所列出。此外,快照将仅包含磁盘状态,而不是包含 guest 虚拟机状态的常规系统检查点。磁盘快照比全系统检查点快,但恢复到磁盘快照可能需要 fsck 或日志重播,因为在电源 cord 拉特拉特拉特时,磁盘状态就如同磁盘状态。请注意,混合
--halt
和--disk-only
会丢失任何时间没有冲刷到磁盘的数据。 --halt
- 在创建快照后,使客户机虚拟机保持不活动状态。混合--halt
和--disk-only
会丢失任何在时间和内存状态时没有刷新到磁盘的数据。--redefine
指定:如果 virsh snapshot-dumpxml 生成的所有 XML 元素都有效;它可以用于将快照层次结构从一台计算机迁移到另一台计算机,为重新创建层次结构,以重新建立一个 临时的 guest 虚拟机,该虚拟机之后使用相同的名称和 UUID 重新创建,或者在快照元数据中对快照元数据(如主机特定部分)进行改变。提供此标志时,xmlfile
参数是必需的,除非也指定了--current
标志,否则 guest 虚拟机的当前快照不会被更改。--no-metadata
创建快照,但所有元数据都会立即丢弃(即,libvirt 不会将快照视为当前),除非稍后使用--redefine
来教授 libvirt 元数据。--reuse-external
,如果使用和快照 XML 请求一个带有现有文件目标的外部快照,目标必须存在,并且会被重复使用;否则,快照将被拒绝,以避免丢失现有文件的内容。--quiesce
libvirt 将尝试使用客户机代理冻结并取消冻结客户机虚拟机的已挂载文件系统。但是,如果客户机虚拟机没有客户机代理,则快照创建将失败。快照可以包含虚拟机的内存状态。快照必须是 external。--
Atomic 可使 libvirt 保证快照可以成功执行,或者没有更改失败。请注意,不是所有虚拟机监控程序都支持这种管理程序。如果没有指定此标志,那么某些虚拟机监控程序在部分操作后可能会失败,且必须使用 virsh dumpxml 来查看是否发生了任何部分更改。
20.39.2. 为当前客户机虚拟机创建快照
名称和描述
元素)为 guest 虚拟机创建一个快照。如果这些值不包含在 XML 字符串中,则 libvirt 将选择一个值。要创建快照运行:
# snapshot-create-as domain {[--print-xml] | [--no-metadata] [--halt] [--reuse-external]} [name] [description] [--disk-only [--quiesce]] [--atomic] [[--memspec memspec]] [--diskspec] diskspec]
--print-xml
为 snapshot-create 创建适当的 XML 作为输出,而不是实际创建快照。--halt
在创建快照后,保持客户机虚拟机处于非活动状态。--disk-only
会创建一个不包含客户机虚拟机状态的快照。--memspec
可用于控制检查点是否为内部还是外部。标志为必需,后跟 [file=]name[,snapshot=type] 形式的 memspec,其中 type 可以是 none、internal 或 external。要在 file=name 中包含字面逗号,请使用第二个逗号进行转义。--diskspec
选项可以用来控制--disk-only
和外部检查点如何创建外部文件。根据域 XML 中的<disk>
元素数量,这个选项可以多次出现。每个<diskspec>
都以磁盘[,snapshot=type][,driver=type][,file=name] 的形式。如果特定磁盘省略--diskspec
,则使用虚拟机配置中的默认行为。要在磁盘或者 file=name 中包含字面逗号,请使用第二逗号进行转义。文字--diskspec
必须在每个 diskspec 之前,除非同时存在三个 域、name 和 description。例如,vda、snapshot=external、file=/path/to 的 diskspec 会生成以下 XML:<disk name=’vda’ snapshot=’external’> <source file=’/path/to,new’/> </disk>
重要红帽建议使用外部快照,因为当由其他虚拟化工具处理时,它们更灵活且更可靠。要创建外部快照,请使用 virsh-create-as 命令和--diskspec vda,snapshot=external
选项如果没有使用这个选项,virsh 会创建内部快照,但由于缺乏稳定性和优化功能,我们不建议使用它。如需更多信息,请参阅 第 A.13 节 “使用 libvirt 创建外部快照的临时解决方案”。- 指定
--reuse-external
,域 XML 或 diskspec 选项请求一个带有现有文件目标的外部快照,然后目标必须存在,并且会被重复使用;否则,快照将拒绝,以避免丢失现有文件的内容。 指定了 --
quiesce,libvirt 将尝试使用客户机代理来冻结和取消暂停客户机虚拟机的已挂载文件系统。但是,如果域没有客户机代理,则快照创建将失败。目前,这需要仅传递--disk-only
。--no-metadata
会创建快照数据,但任何元数据都会立即丢弃(即,libvirt 不会将快照视为当前),除非稍后使用 snapshot-create 来教授 libvirt 元数据。这个标志与--print-xml
不兼容--
Atomic 将导致 libvirt 保证快照可以成功执行,或者没有更改失败。请注意,不是所有虚拟机监控程序都支持这种管理程序。如果没有指定此标志,那么某些虚拟机监控程序在部分操作后可能会失败,且必须使用 virsh dumpxml 来查看是否发生了任何部分更改。
20.39.3. 当前使用中的快照
# virsh snapshot-current domain {[--name] | [--security-info] | [snapshotname]}
snapshotname
,则 guest 虚拟机的当前快照的快照 XML(如果有)将以输出的形式显示。如果指定了 --name
,只需以输出的形式发送当前快照名称而不是完整 XML。如果提供 --security-info
的安全敏感信息将包含在 XML 中。使用 snapshotname
,生成请求使现有的名为 snapshot 成为当前快照,而无需将其恢复到客户机虚拟机。
20.39.4. snapshot-edit
# virsh snapshot-edit domain [snapshotname] [--current] {[--rename] [--clone]}
snapshotname
和 --current
,它会强制编辑的快照成为当前快照。如果省略 snapshotname
,则必须提供 --current
,以便编辑当前快照。
# virsh snapshot-dumpxml dom name > snapshot.xml # vi snapshot.xml [note - this can be any editor] # virsh snapshot-create dom snapshot.xml --redefine [--current]
--rename
,则快照被重命名。如果指定了 --clone
,然后更改快照名称将生成快照元数据的克隆。如果未指定,则编辑不会更改快照名称。请注意,必须小心更改快照名称,因为单个 qcow2 文件中内部快照的内容只能从原始快照名称访问。
20.39.5. snapshot-info
# snapshot-info domain {snapshot | --current}
快照
的基本信息,或使用 --current
的当前快照。
20.39.6. snapshot-list
# virsh snapshot-list domain [{--parent | --roots | --tree}] [{[--from] snapshot | --current} [--descendants]] [--metadata] [--no-metadata] [--leaves] [--no-leaves] [--inactive] [--active] [--disk-only] [--internal] [--external]
--parent
在 output 表中添加一个列,其中包含每个快照的父名称。此选项不能与--roots
或--tree
一起使用。--roots
将列表过滤为仅显示没有父项的快照。此选项不能与--parent
或--tree
一起使用。--tree
以树形格式显示输出,仅列出快照名称。此选项不能用于--root 或
。--
parent--from
将列表过滤为给定快照的子快照,或者如果提供了--current
,则会导致列表从当前快照开始。在隔离或者与--parent
一起使用时,该列表仅限于直接子对象,除非也存在--descendants
。与--tree
一起使用时,使用--descendants
是简化的。这个选项与--roots
不兼容。请注意,列表中不包含--from
或--current
的起点,除非也存在--tree
选项。- 指定
--leaves
,列表将过滤为仅包含任何子项的快照。同样,如果指定了--no-leaves
,则列表将过滤为仅包含带有子项的快照。(请注意,忽略这两个选项都不会过滤,而提供这两个选项将产生相同的列表或错误,具体取决于服务器是否识别了标志。)过滤选项与--tree
不兼容。 - 指定了
--metadata
,列表将过滤为仅包含 libvirt 元数据的快照,因此可防止不保护持久客户机虚拟机,或者在销毁 临时 客户机虚拟机时丢失。同样,如果指定了--no-metadata
,则列表将过滤为仅包含存在的快照,而无需提供 libvirt 元数据。 - 指定
--inactive
,列表将过滤为在客户端虚拟机关闭时拍摄的快照。如果指定了--active
,则列表将过滤为在客户机虚拟机运行时生成的快照,其中快照包含内存状态,以恢复到该运行状态。如果指定了--disk-only
,则列表将过滤为在客户机虚拟机运行时生成的快照,但快照只包括磁盘状态。 - 指定
--internal
,列表将过滤为使用现有磁盘镜像的内部存储的快照。如果指定了 --external,列表将过滤为使用外部文件进行磁盘镜像或内存状态的快照。
20.39.7. snapshot-dumpxml
# virsh snapshot-dumpxml domain snapshot [--security-info]
security-info
选项将包括安全敏感信息。使用 virsh snapshot-current
来轻松访问当前快照的 XML。
20.39.8. snapshot-parent
--current
的快照的名称。要使用,请运行:
# virsh snapshot-parent domain {snapshot | --current}
20.39.9. snapshot-revert
快照
,或使用 --current
恢复到当前快照。
snapshot-revert
完成之后域的状态将在执行原始快照时是域的状态。
# virsh snapshot-revert domain {snapshot | --current} [{--running | --paused}] [--force]
--running
或 --paused
选项将执行额外的状态更改(如引导不活跃域,或暂停正在运行的域)。因为临时域无法处于不活跃状态,因此在恢复到临时域的磁盘快照时,需要使用这些标志之一。
--force
进行。一个快照是快照中缺少恢复配置的完整域信息 ; 因为 libvirt 无法证明当前配置与快照时使用的配置匹配,请提供 --force
s,因为快照与当前配置兼容(如果不是,则域可能无法运行)。另一种情况是将正在运行的域恢复到一个活动状态,其中必须创建新的管理程序,而不是重复使用现有的虚拟机监控程序,因为它意味着破坏任何现有 VNC 或 Spice 连接等缺点;这种条件发生,使用明显不兼容的配置,以及结合 --start
或 --pause
标志的活跃快照。
20.39.10. snapshot-delete
# virsh snapshot-delete domain {snapshot | --current} [--metadata] [{--children | --children-only}]
的快照
,或使用 --current
当前的快照。如果此快照有子快照,则此快照中的更改将合并到子快照。如果使用 --children
选项,则会删除此快照和此快照的任何子项。如果使用 --children-only
,它将删除此快照的任何子项,但保留此快照不变。这两个标志是相互排斥的。
--metadata
会删除由 libvirt 维护的快照元数据,同时让快照内容完全完好以供外部工具访问;否则,删除快照也会从该时间点删除其数据内容。
20.40. 虚拟机 CPU 型号配置
20.40.1. 简介
qemu32
或 qemu64
。这些虚拟机监控程序执行更高级的过滤,将所有物理 CPU 分类到少数组中,并为向客户机虚拟机显示的每个组有一个基准 CPU 模型。这种行为使客户机虚拟机在主机物理机器之间安全迁移,只要它们都有可分类到同一组的物理 CPU。libvirt 通常并不强制实施策略本身,而是提供高层定义他们自己的策略的机制。了解如何获取 CPU 模型信息并定义合适的客户机虚拟机 CPU 模型,可确保在主机物理机器之间成功迁移客户机虚拟机。请注意,管理程序只能模拟了解在虚拟机监控程序发行后创建的功能以及可能无法模拟的功能。
20.40.2. 了解主机物理机器 CPU 型号
20.40.3. 确定 VFIO IOMMU 设备支持
图 20.3. 确定 VFIO 支持
# virsh domcapabilities [...output truncated...] <enum name='pciBackend'> <value>default</value> <value>vfio</value> [...output truncated...]
20.40.4. 确定兼容的 CPU 型号来保证主机物理机器池
图 20.4. 拉取主机物理机器的 CPU 模型信息
<capabilities> <host> <cpu> <arch>i686</arch> <model>pentium3</model> <topology sockets='1' cores='2' threads='1'/> <feature name='lahf_lm'/> <feature name='lm'/> <feature name='xtpr'/> <feature name='cx16'/> <feature name='ssse3'/> <feature name='tm2'/> <feature name='est'/> <feature name='vmx'/> <feature name='ds_cpl'/> <feature name='monitor'/> <feature name='pni'/> <feature name='pbe'/> <feature name='tm'/> <feature name='ht'/> <feature name='ss'/> <feature name='sse2'/> <feature name='acpi'/> <feature name='ds'/> <feature name='clflush'/> <feature name='apic'/> </cpu> </host> </capabilities>
图 20.5. 从随机服务器生成 CPU 描述
<capabilities> <host> <cpu> <arch>x86_64</arch> <model>phenom</model> <topology sockets='2' cores='4' threads='1'/> <feature name='osvw'/> <feature name='3dnowprefetch'/> <feature name='misalignsse'/> <feature name='sse4a'/> <feature name='abm'/> <feature name='cr8legacy'/> <feature name='extapic'/> <feature name='cmp_legacy'/> <feature name='lahf_lm'/> <feature name='rdtscp'/> <feature name='pdpe1gb'/> <feature name='popcnt'/> <feature name='cx16'/> <feature name='ht'/> <feature name='vme'/> </cpu> ...snip...
virsh-caps-workstation-cpu-only.xml
的文件中,可以在此文件上执行 virsh cpu-compare 命令:
# virsh cpu-compare virsh-caps-workstation-cpu-only.xml
Host physical machine CPU is a superset of CPU described in virsh-caps-workstation-cpu-only.xml
-
baseline 命令。运行 # virsh cpu-baseline two-cpus.xml 将生成:
图 20.6. 复合 CPU 基准
<cpu match='exact'> <model>pentium3</model> <feature policy='require' name='lahf_lm'/> <feature policy='require' name='lm'/> <feature policy='require' name='cx16'/> <feature policy='require' name='monitor'/> <feature policy='require' name='pni'/> <feature policy='require' name='ht'/> <feature policy='require' name='sse2'/> <feature policy='require' name='clflush'/> <feature policy='require' name='apic'/> </cpu>
20.41. 配置客户机虚拟机 CPU 型号
<cpu>
元素具有与 可能
值匹配的属性:
- match='minimum' - 主机物理机器 CPU 必须至少有客户机虚拟机 XML 中描述的 CPU 功能。如果主机物理计算机的附加功能除客户机虚拟机配置之外,这些功能也会暴露于客户机虚拟机。
- match='exact' - 主机物理机器 CPU 必须至少有客户机虚拟机 XML 中描述的 CPU 功能。如果主机物理计算机的附加功能在客户机虚拟机配置之外,将从客户机虚拟机中屏蔽这些功能。
- match='strict' - 主机物理机器 CPU 必须与客户机虚拟机 XML 中描述的 CPU 功能完全相同。
- policy='force' - 即使主机物理机器没有,也会向客户机虚拟机公开该功能。这通常仅在软件模拟的情况下有用。注意即使使用
强制
策略,管理程序可能无法模拟特定功能。 - policy='require' - 向客户机虚拟机公开功能,并在主机物理机没有它时失败。这是合理的默认值。
- policy='optional' - 如果支持该功能,则会向客户机虚拟机公开该功能。
- policy='disable' - 如果主机物理机器有这个功能,则从客户机虚拟机中隐藏它。
- policy='forbid' - 如果主机物理计算机具有此功能,则会失败并拒绝启动 guest 虚拟机。
20.42. 管理客户机虚拟机的资源
libvirt
服务使用以下 cgroups 来调整和监控虚拟机:
- 内存 - 内存控制器允许在 RAM 和交换使用量上设置限制,并查询组中所有进程的累积使用
- Cpuset - CPU 集控制器将一个组中的进程绑定到一组 CPU,并控制在 CPU 间的迁移。
- cpuacct - CPU accountingt 控制器提供有关一组进程的 CPU 用量的信息。
- cpu - CPU 调度程序控制器控制组中的进程的优先级。这和授予 nice 级别的权限类似。
- devices - 设备控制器授予对字符和块设备的访问控制列表。
- freezer - freezer 控制器暂停并恢复执行组中的进程。这和整个组的 SIGSTOP 类似。
- net_cls - 网络类控制器通过将进程与 tc 网络类关联来管理网络利用率。
systemd
设置。以下 virsh tuning 命令影响了 cgroup 配置的方式:
- schedinfo - 中描述的 第 20.43 节 “设置计划参数”
- blkdeviotune - 中描述的 第 20.44 节 “磁盘 I/O 轮转”
- blkiotune - 中描述的 第 20.45 节 “显示或设置块 I/O 参数”
- domiftune - 中描述的 第 20.12.5 节 “设置网络接口带宽参数”
- memtune - 描述 第 20.46 节 “配置内存调整”
20.43. 设置计划参数
# virsh schedinfo domain --set
--current
--config
--live
- 域 - 客户机虚拟机域
--set
- 这里放置的字符串是要被调用的控制器或操作。字符串使用 parameter=value 格式。如果需要,还应添加其他参数或值。--current
- 与--set
一起使用时,会将指定的 设置 字符串用作当前调度程序信息。在使用 的情况下不使用 时,会显示当前的调度程序信息。--config
- 与--set
一起使用时,将在下次重启时使用指定的 设置 字符串。在不使用 的情况下使用 时,将显示保存在 配置文件中的调度程序信息。--live
- 与--set
一起使用时,将使用当前运行的客户机虚拟机上指定的 设置 字符串。如果使用时,不使用 时,将显示运行中虚拟机当前使用的配置设置
cpu_shares
、vcpu_period
和 vcpu_quota
。这些参数应用到 vCPU 线程。
cpu_shares
:cpu.sharesvcpu_period
:cpu.cfs_period_usvcpu_quota
:cpu.cfs_quota_us
例 20.98. schedinfo 显示
# virsh schedinfo shell
Scheduler : posix
cpu_shares : 1024
vcpu_period : 100000
vcpu_quota : -1
例 20.99. schedinfo 集合
# virsh schedinfo --set cpu_shares=2046 shell
Scheduler : posix
cpu_shares : 2046
vcpu_period : 100000
vcpu_quota : -1
emulator_period
和 emulator_quota
参数,这些参数修改仿真程序进程的设置。
20.44. 磁盘 I/O 轮转
#virsh blkdeviotune domain <device> [[--config] [--live] | [--current]] [[total-bytes-sec] | [read-bytes-sec] [write-bytes-sec]] [[total-iops-sec] [read-iops-sec] [write-iops-sec]]
--config
、--live
和 --current
参数的工作方式与 第 20.43 节 “设置计划参数” 相同。如果没有指定限制,它将查询当前的 I/O 限制设置。否则,使用以下标记更改限制:
--total-bytes-sec
- 指定每秒字节数为单位的总吞吐量限制。--read-bytes-sec
- 指定读取吞吐量(以字节/秒为单位)。--write-bytes-sec
- 指定写入吞吐量(以字节/秒为单位)。--total-iops-sec
- 指定每秒总 I/O 操作限值。--read-iops-sec
- 指定每秒读取 I/O 操作限值。--write-iops-sec
- 指定每秒写入 I/O 操作限值。
20.45. 显示或设置块 I/O 参数
# virsh blkiotune domain [--weight weight] [--device-weights device-weights] [---device-read-iops-sec -device-read-iops-sec] [--device-write-iops-sec device-write-iops-sec] [--device-read-bytes-sec device-read-bytes-sec] [--device-write-bytes-sec device-write-bytes-sec] [[--config] [--live] | [--current]]
20.46. 配置内存调整
第 21 章 使用离线工具进行客户机虚拟机磁盘访问
21.1. 简介
libguestfs
工具,可访问、编辑和创建客户机虚拟机磁盘或其他磁盘镜像。这些工具有多种用途,包括:
- 查看或下载位于客户机虚拟机磁盘中的文件。
- 在客户机虚拟机磁盘上编辑或上传文件。
- 读取或写入客户机虚拟机配置.
- 准备包含文件、目录、文件系统、分区、逻辑卷和其他选项的新磁盘镜像。
- 修复无法引导的客户机虚拟机,或者需要启动配置更改的客户机虚拟机。
- 监控客户机虚拟机的磁盘使用情况.
- 审计客户虚拟机合规性,例如组织安全标准。
- 通过克隆和修改模板来部署客户机虚拟机.
- 读取 CD 和 DVD ISO 映像以及软盘磁盘映像.
--ro
选项),不会保存更改。
21.1.1. 使用远程连接时要小心
# virt-df -c qemu://remote/system
-d Guest
nbd://
URL 访问它。您可能需要在防火墙中打开端口(端口 10809),如下所示:
- guestfish
- guestmount
- virt-alignment-scan
- virt-cat
- virt-copy-in
- virt-copy-out
- virt-df
- virt-edit
- virt-filesystems
- virt-inspector
- virt-ls
- virt-rescue
- virt-sysprep
- virt-tar-in
- virt-tar-out
- virt-win-reg
21.2. 术语
- libguestfs(GUEST 文件系统 LIBrary) - 底层 C 库,提供打开磁盘镜像、读写文件的基本功能,等等。您可以将 C 程序直接写入这个 API。
- guestfish(GUEST 文件系统 Interactive SHell) 是一个交互式的 shell,您可以通过命令行或从 shell 脚本使用。它公开 libguestfs API 的所有功能。
- 各种 virt 工具在 libguestfs 之上构建,它们提供了一种从命令行执行特定任务的方法。这些工具包括 virt-df、virt-rescue、virt-resize 和 virt-edit。
- augeas 是一个用于编辑 Linux 配置文件的库。虽然这与 libguestfs 独立,但 libguestfs 的大部分值都来自此工具的组合。
- guestmount 是 libguestfs 和 FUSE 之间的接口。它主要用于从主机物理机器上的磁盘镜像挂载文件系统。这个功能不是必需功能,但会很有用。
21.3. 安装
# yum install libguestfs libguestfs-tools
# yum install '*guestf*'
21.4. guestfish Shell
$ guestfish --ro -a /path/to/disk/image
$ guestfish --ro -a /path/to/disk/image
Welcome to guestfish, the guest filesystem shell for
editing virtual machine filesystems and disk images.
Type: 'help' for help on commands
'man' to read the manual
'quit' to quit the shell
><fs>
21.4.1. 使用 guestfish 查看文件系统
21.4.1.1. 手动列出和查看
><fs> run ><fs> list-filesystems /dev/vda1: ext3 /dev/VolGroup00/LogVol00: ext3 /dev/VolGroup00/LogVol01: swap
><fs> help vfs-type NAME vfs-type - get the Linux VFS type corresponding to a mounted device SYNOPSIS vfs-type mountable DESCRIPTION This command gets the filesystem type corresponding to the filesystem on "device". For most filesystems, the result is the name of the Linux VFS module which would be used to mount this filesystem if you mounted it without specifying the filesystem type. For example a string such as "ext3" or "ntfs".
21.4.1.2. 通过 guestfish 检查
$ guestfish --ro -a /path/to/disk/image -i
Welcome to guestfish, the guest filesystem shell for
editing virtual machine filesystems and disk images.
Type: 'help' for help on commands
'man' to read the manual
'quit' to quit the shell
Operating system: Red Hat Enterprise Linux AS release 4 (Nahant Update 8)
/dev/VolGroup00/LogVol00 mounted on /
/dev/vda1 mounted on /boot
><fs> ll /
total 210
drwxr-xr-x. 24 root root 4096 Oct 28 09:09 .
drwxr-xr-x 21 root root 4096 Nov 17 15:10 ..
drwxr-xr-x. 2 root root 4096 Oct 27 22:37 bin
drwxr-xr-x. 4 root root 1024 Oct 27 21:52 boot
drwxr-xr-x. 4 root root 4096 Oct 27 21:21 dev
drwxr-xr-x. 86 root root 12288 Oct 28 09:09 etc
...
21.4.1.3. 按名称访问客户机虚拟机
$ guestfish --ro -d GuestName -i
21.4.2. 使用 guestfish 添加文件
- guestfish -a disk.img
- guestfish -a file:///directory/disk.img
- guestfish -a nbd://example.com[:port]
- guestfish -a nbd://example.com[:端口]/exportname
- guestfish -a nbd://?socket=/socket
- guestfish -a nbd:///exportname?socket=/socket
- guestfish -a rbd:///pool/disk
- guestfish -a rbd://example.com[:端口]/pool/disk
21.4.3. 使用 guestfish 修改文件
/boot/grub/grub.conf
文件的示例。当确定客户端虚拟机已关闭时,可以省略 --ro 标志,以便使用命令获得写访问,例如:
$ guestfish -d RHEL3 -i
Welcome to guestfish, the guest filesystem shell for
editing virtual machine filesystems and disk images.
Type: 'help' for help on commands
'man' to read the manual
'quit' to quit the shell
Operating system: Red Hat Enterprise Linux AS release 3 (Taroon Update 9)
/dev/vda2 mounted on /
/dev/vda1 mounted on /boot
><fs> edit /boot/grub/grub.conf
21.4.4. 使用 guestfish 的其他操作
21.4.5. 使用 guestfish 进行 shell 脚本
#!/bin/bash - set -e guestname="$1" guestfish -d "$guestname" -i <<'EOF' write /etc/motd "Welcome to Acme Incorporated." chmod 0644 /etc/motd EOF
21.4.6. augeas 和 libguestfs 脚本
#!/bin/bash - set -e guestname="$1" guestfish -d "$1" -i --ro <<'EOF' aug-init / 0 aug-get /files/etc/sysconfig/keyboard/LAYOUT EOF
#!/bin/bash - set -e guestname="$1" guestfish -d "$1" -i <<'EOF' aug-init / 0 aug-set /files/etc/sysconfig/keyboard/LAYOUT '"gb"' aug-save EOF
- 第二个示例中删除了 --ro 选项,它能够写入客户机虚拟机。
- aug-get 命令已更改为 aug-set 以修改值,而不是获取它。新值将是 "gb"( 包括引号)。
- 此处使用 aug-save 命令,因此 Augeas 会将更改写出到磁盘。
guestfish -N fs
><fs> copy-out /home /tmp/home
21.5. 其他命令
- virt-cat 与 guestfish 下载命令 类似。它下载并向客户机虚拟机显示单个文件。例如:
# virt-cat RHEL3 /etc/ntp.conf | grep ^server server 127.127.1.0 # local clock
- virt- edit 与 guestfish 编辑命令类似。它可用于交互地编辑客户机虚拟机内的单个文件。例如,您可能需要在基于 Linux 的客户机虚拟机中编辑
grub.conf
文件,不会引导:# virt-edit LinuxGuest /boot/grub/grub.conf
virt-edit 有一个模式,可用于对单个文件进行简单的非交互式更改。对于这个方法,使用 -e 选项。例如,以下命令将 Linux 客户机虚拟机中的 root 密码更改为没有密码:# virt-edit LinuxGuest /etc/passwd -e 's/^root:.*?:/root::/'
- virt-ls 与 guestfish ls ll 和 find 命令类似。它用于列出目录或目录(递归)。例如,以下命令将递归列出 Linux 客户机虚拟机中的 /home 下的文件和目录:
# virt-ls -R LinuxGuest /home/ | less
21.6. virt-rescue:Rescue Shell
21.6.1. 简介
21.6.2. 运行 virt-rescue
$ virt-rescue -d GuestName
$ virt-rescue -a /path/to/disk/image
Welcome to virt-rescue, the libguestfs rescue shell. Note: The contents of / are the rescue appliance. You have to mount the guest virtual machine's partitions under /sysroot before you can examine them. bash: cannot set terminal process group (-1): Inappropriate ioctl for device bash: no job control in this shell ><rescue>
><rescue> fdisk -l /dev/vda
/sysroot
下,它是救援计算机中的空目录,以便用户挂载您想要的任何内容。请注意,/ 下的文件
是救援虚拟机本身中的文件:
><rescue> mount /dev/vda1 /sysroot/ EXT4-fs (vda1): mounted filesystem with ordered data mode. Opts: (null) ><rescue> ls -l /sysroot/grub/ total 324 -rw-r--r--. 1 root root 63 Sep 16 18:14 device.map -rw-r--r--. 1 root root 13200 Sep 16 18:14 e2fs_stage1_5 -rw-r--r--. 1 root root 12512 Sep 16 18:14 fat_stage1_5 -rw-r--r--. 1 root root 11744 Sep 16 18:14 ffs_stage1_5 -rw-------. 1 root root 1503 Oct 15 11:19 grub.conf [...]
- --ro:在 guest 虚拟机上以只读模式运行。不会保存任何更改。您可以使用它来试验 guest 虚拟机。当您从 shell 退出后,所有更改将被丢弃。
- --network:启用来自 rescue shell 的网络访问。例如,如果您需要将 RPM 或其他文件下载到客户机虚拟机中,可使用此示例。
21.7. virt-df:监控磁盘使用情况
21.7.1. 简介
21.7.2. 运行 virt-df
# virt-df -a /dev/vg_guests/RHEL7
Filesystem 1K-blocks Used Available Use%
RHEL6:/dev/sda1 101086 10233 85634 11%
RHEL6:/dev/VolGroup00/LogVol00 7127864 2272744 4493036 32%
/dev/vg_guests/RHEL7
是 Red Hat Enterprise Linux 7 虚拟机磁盘镜像。在这种情况下,路径是此磁盘镜像所在的主机物理机器逻辑卷。)
# virt-df -h -d domname
Filesystem Size Used Available Use%
F14x64:/dev/sda1 484.2M 66.3M 392.9M 14%
F14x64:/dev/vg_f14x64/lv_root 7.4G 3.0G 4.4G 41%
RHEL6brewx64:/dev/sda1 484.2M 52.6M 406.6M 11%
RHEL6brewx64:/dev/vg_rhel6brewx64/lv_root
13.3G 3.4G 9.2G 26%
# virt-df --csv -d RHEL6Guest Virtual Machine,Filesystem,1K-blocks,Used,Available,Use% RHEL6brewx64,/dev/sda1,102396,24712,77684,24.1% RHEL6brewx64,/dev/sda2,20866940,7786652,13080288,37.3%
21.8. virt-resize:重新定义虚拟机大小
21.8.1. 简介
21.8.2. 扩展磁盘镜像
- 找到要重新定义的磁盘镜像大小。您可以将 virsh dumpxml GuestName 用于 libvirt 客户机虚拟机。
- 决定您要如何扩展 guest 虚拟机。在客户机虚拟机磁盘中运行 virt-df -h 和 virt-filesystems,如下所示:
# virt-df -h -a /dev/vg_guests/RHEL6 Filesystem Size Used Available Use% RHEL6:/dev/sda1 98.7M 10.0M 83.6M 11% RHEL6:/dev/VolGroup00/LogVol00 6.8G 2.2G 4.3G 32% # virt-filesystems -a disk.img --all --long -h /dev/sda1 ext3 101.9M /dev/sda2 pv 7.9G
- 将第一个(引导)分区的大小从大约 100MB 增加到 500MB。
- 将总磁盘大小从 8GB 增加到 16GB。
- 扩展第二个分区以填满剩余空间。
- 展开
/dev/VolGroup00/LogVol00
,以在第二个分区中填写新空间。
- 确保已关闭 guest 虚拟机。
- 将原始磁盘重命名为备份。您这样做的方式取决于原始磁盘的主机物理机器存储环境。如果存储为文件,请使用 mv 命令。对于逻辑卷(在这个示例中所示),请使用 lvrename:
# lvrename /dev/vg_guests/RHEL6 /dev/vg_guests/RHEL6.backup
- 创建新磁盘。本例中的要求可扩展到 16GB 的总磁盘大小。因为这里使用逻辑卷,所以使用以下命令:
# lvcreate -L 16G -n RHEL6 /dev/vg_guests Logical volume "RHEL6" created
- 此命令表达了第 2 步的要求:
# virt-resize \ /dev/vg_guests/RHEL6.backup /dev/vg_guests/RHEL6 \ --resize /dev/sda1=500M \ --expand /dev/sda2 \ --LV-expand /dev/VolGroup00/LogVol00
前两个参数是输入磁盘和输出磁盘。-- resize /dev/sda1=500M 重新定义第一个分区最多 500MB。- expand /dev/sda2 扩展第二个分区以填满所有剩余空间。-LV-expand /dev/VolGroup00/LogVol00 扩大客户端虚拟机逻辑卷到第二个分区中。virt-resize 描述了它在输出中执行的操作:Summary of changes: /dev/sda1: partition will be resized from 101.9M to 500.0M /dev/sda1: content will be expanded using the 'resize2fs' method /dev/sda2: partition will be resized from 7.9G to 15.5G /dev/sda2: content will be expanded using the 'pvresize' method /dev/VolGroup00/LogVol00: LV will be expanded to maximum size /dev/VolGroup00/LogVol00: content will be expanded using the 'resize2fs' method Copying /dev/sda1 ... [#####################################################] Copying /dev/sda2 ... [#####################################################] Expanding /dev/sda1 using the 'resize2fs' method Expanding /dev/sda2 using the 'pvresize' method Expanding /dev/VolGroup00/LogVol00 using the 'resize2fs' method
- 尝试启动虚拟机。如果它正常工作(在测试后对其进行彻底测试),您可以删除备份磁盘。如果失败,请关闭虚拟机,删除新磁盘,然后将备份磁盘重新重命名为其原始名称。
- 使用 virt-df 或 virt-filesystems 显示新大小:
# virt-df -h -a /dev/vg_pin/RHEL6 Filesystem Size Used Available Use% RHEL6:/dev/sda1 484.4M 10.8M 448.6M 3% RHEL6:/dev/VolGroup00/LogVol00 14.3G 2.2G 11.4G 16%
21.9. virt-inspector:检查客户机虚拟机
21.9.1. 简介
21.9.2. 安装
# yum install libguestfs-tools
/usr/share/doc/libguestfs-devel-*/
中,其中 * 被 libguestfs 版本号取代。
21.9.3. 运行 virt-inspector
$ virt-inspector -a disk.img > report.xml
$ virt-inspector -d GuestName > report.xml
report.xml
)。XML 文件的主要组件是一个顶层 <operatingsytems>
元素,它通常包含一个 <operatingsystem>
元素,如下所示:
<operatingsystems> <operatingsystem> <!-- the type of operating system and Linux distribution --> <name>linux</name> <distro>rhel</distro> <!-- the name, version and architecture --> <product_name>Red Hat Enterprise Linux Server release 6.4 </product_name> <major_version>6</major_version> <minor_version>4</minor_version> <package_format>rpm</package_format> <package_management>yum</package_management> <root>/dev/VolGroup/lv_root</root> <!-- how the filesystems would be mounted when live --> <mountpoints> <mountpoint dev="/dev/VolGroup/lv_root">/</mountpoint> <mountpoint dev="/dev/sda1">/boot</mountpoint> <mountpoint dev="/dev/VolGroup/lv_swap">swap</mountpoint> </mountpoints> < !-- filesystems--> <filesystem dev="/dev/VolGroup/lv_root"> <label></label> <uuid>b24d9161-5613-4ab8-8649-f27a8a8068d3</uuid> <type>ext4</type> <content>linux-root</content> <spec>/dev/mapper/VolGroup-lv_root</spec> </filesystem> <filesystem dev="/dev/VolGroup/lv_swap"> <type>swap</type> <spec>/dev/mapper/VolGroup-lv_swap</spec> </filesystem> <!-- packages installed --> <applications> <application> <name>firefox</name> <version>3.5.5</version> <release>1.fc12</release> </application> </applications> </operatingsystem> </operatingsystems>
$ virt-inspector GuestName | xpath //filesystem/@dev
Found 3 nodes:
-- NODE --
dev="/dev/sda1"
-- NODE --
dev="/dev/vg_f12x64/lv_root"
-- NODE --
dev="/dev/vg_f12x64/lv_swap"
$ virt-inspector GuestName | xpath //application/name
[...long list...]
21.10. 使用从编程语言中使用 API
- 要安装 C 和 C++ 绑定,请输入以下命令:
# yum install libguestfs-devel
- 安装 Perl 绑定:
# yum install 'perl(Sys::Guestfs)'
- 安装 Python 绑定:
# yum install python-libguestfs
- 安装 Java 绑定:
# yum install libguestfs-java libguestfs-java-devel libguestfs-javadoc
- 安装 Ruby 绑定:
# yum install ruby-libguestfs
- 安装 OCaml 绑定:
# yum install ocaml-libguestfs ocaml-libguestfs-devel
guestfs_launch (g);
$g->launch ()
g#launch ()
- libguestfs API 是同步的。每个调用块直到完成为止。如果要异步调用,您必须创建一个线程。
- libguestfs API 不是线程安全:每个句柄只能从一个线程使用;或者,如果您希望在线程间共享句柄,您应该实施自己的 mutex,以确保两个线程无法同时在一个句柄上执行命令。
- 您不应该在同一磁盘镜像上打开多个句柄。如果所有句柄都是只读的,但仍然不推荐这样做。
- 如果其他任何可能使用该磁盘镜像(例如,实时虚拟机)时,您不应该添加用于写入的磁盘镜像。这样做会导致磁盘崩溃。
- 在当前使用(例如,实时虚拟机)的磁盘镜像上打开只读处理。但是,结果可能会不预计或不一致,特别是当您读取它时,磁盘镜像被大量写入。
21.10.1. 使用 C 程序与 API 交互
<guestfs.h>
标头文件并创建句柄:
#include <stdio.h> #include <stdlib.h> #include <guestfs.h> int main (int argc, char *argv[]) { guestfs_h *g; g = guestfs_create (); if (g == NULL) { perror ("failed to create libguestfs handle"); exit (EXIT_FAILURE); } /* ... */ guestfs_close (g); exit (EXIT_SUCCESS); }
test.c
)。编译该程序并使用以下两个命令运行它:
gcc -Wall test.c -o test -lguestfs ./test
disk.img
,并在当前目录中创建。
- 创建句柄。
- 将磁盘添加到句柄中。
- 启动 libguestfs 后端。
- 创建分区、文件系统和文件。
- 关闭句柄并退出。
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <fcntl.h> #include <unistd.h> #include <guestfs.h> int main (int argc, char *argv[]) { guestfs_h *g; size_t i; g = guestfs_create (); if (g == NULL) { perror ("failed to create libguestfs handle"); exit (EXIT_FAILURE); } /* Create a raw-format sparse disk image, 512 MB in size. */ int fd = open ("disk.img", O_CREAT|O_WRONLY|O_TRUNC|O_NOCTTY, 0666); if (fd == -1) { perror ("disk.img"); exit (EXIT_FAILURE); } if (ftruncate (fd, 512 * 1024 * 1024) == -1) { perror ("disk.img: truncate"); exit (EXIT_FAILURE); } if (close (fd) == -1) { perror ("disk.img: close"); exit (EXIT_FAILURE); } /* Set the trace flag so that we can see each libguestfs call. */ guestfs_set_trace (g, 1); /* Set the autosync flag so that the disk will be synchronized * automatically when the libguestfs handle is closed. */ guestfs_set_autosync (g, 1); /* Add the disk image to libguestfs. */ if (guestfs_add_drive_opts (g, "disk.img", GUESTFS_ADD_DRIVE_OPTS_FORMAT, "raw", /* raw format */ GUESTFS_ADD_DRIVE_OPTS_READONLY, 0, /* for write */ -1 /* this marks end of optional arguments */ ) == -1) exit (EXIT_FAILURE); /* Run the libguestfs back-end. */ if (guestfs_launch (g) == -1) exit (EXIT_FAILURE); /* Get the list of devices. Because we only added one drive * above, we expect that this list should contain a single * element. */ char **devices = guestfs_list_devices (g); if (devices == NULL) exit (EXIT_FAILURE); if (devices[0] == NULL || devices[1] != NULL) { fprintf (stderr, "error: expected a single device from list-devices\n"); exit (EXIT_FAILURE); } /* Partition the disk as one single MBR partition. */ if (guestfs_part_disk (g, devices[0], "mbr") == -1) exit (EXIT_FAILURE); /* Get the list of partitions. We expect a single element, which * is the partition we have just created. */ char **partitions = guestfs_list_partitions (g); if (partitions == NULL) exit (EXIT_FAILURE); if (partitions[0] == NULL || partitions[1] != NULL) { fprintf (stderr, "error: expected a single partition from list-partitions\n"); exit (EXIT_FAILURE); } /* Create an ext4 filesystem on the partition. */ if (guestfs_mkfs (g, "ext4", partitions[0]) == -1) exit (EXIT_FAILURE); /* Now mount the filesystem so that we can add files. */ if (guestfs_mount_options (g, "", partitions[0], "/") == -1) exit (EXIT_FAILURE); /* Create some files and directories. */ if (guestfs_touch (g, "/empty") == -1) exit (EXIT_FAILURE); const char *message = "Hello, world\n"; if (guestfs_write (g, "/hello", message, strlen (message)) == -1) exit (EXIT_FAILURE); if (guestfs_mkdir (g, "/foo") == -1) exit (EXIT_FAILURE); /* This uploads the local file /etc/resolv.conf into the disk image. */ if (guestfs_upload (g, "/etc/resolv.conf", "/foo/resolv.conf") == -1) exit (EXIT_FAILURE); /* Because 'autosync' was set (above) we can just close the handle * and the disk contents will be synchronized. You can also do * this manually by calling guestfs_umount_all and guestfs_sync. */ guestfs_close (g); /* Free up the lists. */ for (i = 0; devices[i] != NULL; ++i) free (devices[i]); free (devices); for (i = 0; partitions[i] != NULL; ++i) free (partitions[i]); free (partitions); exit (EXIT_SUCCESS); }
gcc -Wall test.c -o test -lguestfs ./test
disk.img
的磁盘镜像,您可以使用 guestfish 检查它:
guestfish --ro -a disk.img -m /dev/sda1 ><fs> ll / ><fs> cat /foo/resolv.conf
21.11. virt-sysprep:重置虚拟机设置
# yum install /usr/bin/virt-sysprep
表 21.1. virt-sysprep 命令
命令 | 描述 | 示例 |
---|---|---|
--help | 显示有关特定命令或 virt-sysprep 命令的简短帮助条目。详情请查看 virt-sysprep man page。 | virt-sysprep --help |
-a [file] 或 --add [file] | 添加 指定的文件,它应该是 guest 虚拟机的磁盘映像。磁盘镜像的格式被自动探测到。要覆盖此选项并强制使用特定格式,请使用 --format 选项。 | virt-sysprep --add /dev/vms/disk.img |
-a [URI] 或 --add [URI] | 添加远程磁盘。URI 格式与 guestfish 兼容。如需更多信息,请参阅 第 21.4.2 节 “使用 guestfish 添加文件”。 | virt-sysprep -a rbd://example.com[:port]/pool/disk |
-c [URI] 或 --connect [URI] | 如果使用 libvirt,则连接到给定的 URI。如果省略,它会通过 KVM 管理程序进行连接。如果您直接指定客户机块设备(virt-sysprep -a),那么根本不使用 libvirt。 | virt-sysprep -c qemu:///system |
-d [guest] 或 --domain [guest] | 从指定的客户机虚拟机中添加所有磁盘。可以使用域 UUID 而不是域名。 | virt-sysprep --domain 90df2f3f-8857-5ba9-2714-7d95907b1c9e |
-n 或 --dry-run | 对客户机虚拟机执行只读"dry run" sysprep 操作。这将运行 sysprep 操作,但会丢弃对磁盘末尾的任何更改。 | virt-sysprep -n |
--enable [操作] | 启用指定的 操作。要列出可能的操作,请使用 --list 命令。 | virt-sysprep --enable ssh-hostkeys,udev-persistent-net |
--operation 或 --operations | 选择执行了哪些 sysprep 操作。要禁用某个操作,请在操作名称前面使用 -。 | virt-sysprep --operations ssh-hotkeys,udev-persistent-net 会启用这两个操作,而 virt-sysprep --operations firewall-rules,-tmp-files 会启用 firewall-rules 操作并禁用 tmp-files 操作。如需有效操作列表,请参阅 libguestfs.org。 |
--format [raw |qcow2 |auto ] | -a 选项的默认值是自动检测磁盘镜像的格式。使用此选项强制使用命令行中的 -a 选项的磁盘格式。使用 --format 自动检测自动探测到后续 -a 选项(请参阅上面的 -a 命令)。 | virt-sysprep --format raw -a disk.img 会强制为 disk.img 强制原始格式(no auto-detection),virt-sysprep --format raw -a disk.img --format auto -a another.img 会强制对 disk.img 强制(无自动探测)强制自动探测到 another.img 的自动探测。如果您有不受信任的原始格式客户机磁盘镜像,则应该使用这个选项指定磁盘格式。这可避免恶意客户端出现潜在的安全问题。 |
--list-operations | 列出 virt-sysprep 程序支持的操作。它们按照一行列出,包含一个或多个单空格分隔字段。输出中的第一个字段是操作名称,可以提供给 --enable 标志。如果默认禁用操作,或者为空白,则第二个字段是 * 字符。同一行中的其他字段包括操作的描述。 | virt-sysprep --list-operations |
--mount-options | 为客户机虚拟机中的每个挂载点设置挂载选项。使用以分号分隔的 mountpoint:options 对列表。您可能需要将该列表用引号放在此列表上,以保护它免受 shell 的影响。 | virt-sysprep --mount-options "/:notime" 将使用 notime 操作挂载根目录。 |
-q 或 --quiet | 防止打印日志消息。 | virt-sysprep -q |
-v 或 --verbose | 为调试启用详细消息。 | virt-sysprep -v |
-v 或 --version | 显示 virt-sysprep 版本号并退出。 | virt-sysprep -V |
--root-password | 设置 root 密码。可用于显式指定新密码,或者使用所选文件的第一行中的字符串(更安全)。 |
virt-sysprep
--root-password password: 123456 -a guest.img
或
virt-sysprep
--root-password 文件: SOURCE_FILE_PATH -a guest.img
|
21.12. virt-customize:自定义虚拟机设置
virt-customize
,请运行以下命令之一:
# yum install /usr/bin/virt-customize
# yum install libguestfs-tools-c
表 21.2. virt-customize 选项
命令 | 描述 | 示例 |
---|---|---|
--help | 显示有关特定命令或 virt-customize 工具的简短帮助条目。如需了解更多帮助,请参阅 virt-customize man page。 | virt-customize --help |
-a [file] 或 --add [file] | 添加 指定的文件,它应该是 guest 虚拟机的磁盘映像。磁盘镜像的格式被自动探测到。要覆盖此选项并强制使用特定格式,请使用 --format 选项。 | virt-customize --add /dev/vms/disk.img |
-a [URI] 或 --add [URI] | 添加远程磁盘。URI 格式与 guestfish 兼容。如需更多信息,请参阅 第 21.4.2 节 “使用 guestfish 添加文件”。 | virt-customize -a rbd://example.com[:port]/pool/disk |
-c [URI] 或 --connect [URI] | 如果使用 libvirt,则连接到给定的 URI。如果省略,它会通过 KVM 管理程序进行连接。如果您直接指定客户机块设备(virt-customize -a),则根本不使用 libvirt。 | virt-customize -c qemu:///system |
-d [guest] 或 --domain [guest] | 从指定的客户机虚拟机中添加所有磁盘。可以使用域 UUID 而不是域名。 | virt-customize --domain 90df2f3f-8857-5ba9-2714-7d95907b1c9e |
-n 或 --dry-run | 在客户机虚拟机上执行只读"dry run"自定义操作。这会运行自定义操作,但会丢弃对磁盘末尾的任何更改。 | virt-customize -n |
--format [raw |qcow2 |auto ] | -a 选项的默认值是自动检测磁盘镜像的格式。使用此选项强制使用命令行中的 -a 选项的磁盘格式。使用 --format 自动检测自动探测到后续 -a 选项(请参阅上面的 -a 命令)。 | virt-customize --format raw -a disk.img 会为 disk.img 强制原始格式(no auto-detection),但 virt-customize --format raw -a disk.img --format auto -a another.img 会强制为 disk.img 强制(无自动探测)强制自动探测 到另一个.img 。如果您有不受信任的原始格式客户机磁盘镜像,则应该使用这个选项指定磁盘格式。这可避免恶意客户端出现潜在的安全问题。 |
-m [MB] 或 --memsize [MB] | 更改分配给 --run 脚本的内存量。如果 --run 脚本或 --install 选项会导致内存问题,请增加内存分配。 | virt-customize --memsize 1024 |
--network 或 --no-network | 在安装过程中启用或禁用客户机的网络访问。默认为 enabled。使用 --no-network 禁用访问。此命令不会影响启动后对网络进行客户机访问。如需更多信息,请参阅 libguestfs 文档。 | virt-customize -a http://[user@]example.com[:port]/disk.img |
-q 或 --quiet | 防止打印日志消息。 | virt-customize -q |
-smp [N] | 启用可由 --install 脚本使用的 N 个虚拟 CPU。N 必须为 2 或更多。 | virt-customize -smp 4 |
-v 或 --verbose | 为调试启用详细消息。 | virt-customize --verbose |
-v 或 --version | 显示 virt-customize 版本号并退出。 | virt-customize --V |
-x | 启用 libguestfs API 调用追踪。 | virt-customize -x |
例 21.1. 使用 virt-customize 在客户端中安装软件包
virt-customize -a disk.img --install gimp,inkscape --selinux-relabel
21.13. virt-diff:列出虚拟机文件间的差异
virt-diff
,请运行以下命令之一:
# yum install /usr/bin/virt-diff
# yum install libguestfs-tools-c
-a
或 -d
选项,第二个客户机使用 -A
或 -D
选项。例如:
$ virt-diff -a old.img -A new.img
$ virt-diff -d oldguest -D newguest
表 21.3. virt-diff 选项
命令 | 描述 | 示例 |
---|---|---|
--help | 显示有关特定命令或有关 virt-diff 实用程序的简短帮助条目。详情请查看 virt-diff man page。 | virt-diff --help |
-a [file] 或 --add [file] |
添加 指定的文件,它应该是第一个虚拟机的磁盘镜像。如果虚拟机有多个块设备,您必须为所有这些设备提供单独的
-a 选项。
磁盘镜像的格式被自动探测到。要覆盖此选项并强制使用特定格式,请使用
--format 选项。
| virt-customize --add /dev/vms/original.img -A /dev/vms/new.img |
-a [URI] 或 --add [URI] | 添加远程磁盘。URI 格式与 guestfish 兼容。如需更多信息,请参阅 第 21.4.2 节 “使用 guestfish 添加文件”。 | virt-diff -a rbd://example.com[:port]/pool/newdisk -A rbd://example.com[:port]/pool/olddisk |
--all | 与 --extra-stats --times --uids --xattrs 相同。 | virt-diff --all |
--atime | 默认情况下,virt-diff 忽略文件访问时间的变化,因为它们不太可能有趣。使用 --atime 选项显示访问时间差异。 | virt-diff --atime |
-a [file] | 添加 指定的文件 或 URI,它应该是第二个虚拟机的磁盘镜像。 | virt-diff --add /dev/vms/original.img -A /dev/vms/new.img |
-c [URI] 或 --connect [URI] | 如果使用 libvirt,则连接到给定的 URI。如果省略,则它连接到默认的 libvirt 管理程序。如果您直接指定 guest 块设备(virt-diff -a),那么根本不使用 libvirt。 | virt-diff -c qemu:///system |
--csv | 提供采用逗号分隔的值(CSV)格式的结果。此格式可以轻松导入到数据库和电子表格中。有关详情请参考 注意。 | virt-diff --csv |
-d [guest] 或 --domain [guest] | 将指定客户机虚拟机中的所有磁盘添加为第一个客户机虚拟机。可以使用域 UUID 而不是域名。 | $ virt-diff --domain 90df2f3f-8857-5ba9-2714-7d95907b1c9e |
-d [guest] | 将指定客户机虚拟机中的所有磁盘添加为第二个客户机虚拟机。可以使用域 UUID 而不是域名。 | virt-diff --D 90df2f3f-8857-5ba9-2714-7d95907b1cd4 |
--extra-stats | 显示额外的统计数据。 | virt-diff --extra-stats |
--format 或 --format=[raw |qcow2 ] | -a /-A 选项的默认值是自动检测磁盘镜像的格式。使用此选项强制使用命令行上的 -a /-A 选项的磁盘格式。使用 --format 自动检测自动探测到后续 -a 选项(请参阅上面的 -a 命令)。 | virt-diff --format raw -a new.img -A old.img 为 new.img 和 old.img 强制执行原始格式(no auto-detection),但 virt-diff --format raw -a new.img --format auto -a old.img 会强制使用 raw 格式(无自动探测)用于 new.img ,并恢复为 old.img 的 auto-detectionion。如果您有不受信任的原始格式客户机磁盘镜像,则应该使用这个选项指定磁盘格式。这可避免恶意客户端出现潜在的安全问题。 |
-h 或 --human-readable | 以可读格式显示文件大小。 | virt-diff -h |
--time-days |
将更改文件的时间字段显示前的天数(如果在将来使用的话)。
请注意,输出中的
0 表示在将来的 86,399 秒(23 小时、59 分钟和 59 秒)之间。
| virt-diff --time-days |
-v 或 --verbose | 为调试启用详细消息。 | virt-diff --verbose |
-v 或 --version | 显示 virt-diff 版本号并退出。 | virt-diff -V |
-x | 启用 libguestfs API 调用追踪。 | virt-diff -x |
21.14. virt-sparsify:回收 Empty 磁盘空间
$ ls -lh test1.img -rw-rw-r--. 1 rjones rjones 100M Aug 8 08:08 test1.img $ du -sh test1.img 3.6M test1.img
重要限制
- 在使用 virt-sparsify 前必须关闭虚拟机。
- 在最糟糕的情况中,virt-sparsify 可能需要最多 2 个源磁盘镜像的虚拟大小。用于临时复制,另一个用于目标镜像。如果您使用
--in-place
选项,则不需要大量的临时空间。 - virt-sparsify 无法用于调整磁盘镜像大小。要重新定义磁盘镜像大小,请使用 virt-resize。有关 virt-resize 的详情请参考 第 21.8 节 “virt-resize:重新定义虚拟机大小”。
- virt-sparsify 无法使用加密磁盘,因为加密磁盘无法被解析。
- virt-sparsify 无法对分区之间的空间进行解析。此空间通常用于引导加载程序等关键项目,因此这不是实际未使用的空间。
- 在
复制
模式中,qcow2 内部快照不会复制到目的地镜像。
示例
virt-sparsify
,请运行以下命令之一:
# yum install /usr/bin/virt-sparsify
# yum install libguestfs-tools-c
# virt-sparsify /dev/sda1 /dev/device
/dev/sda1
的内容复制到 /dev/device
,使输出稀疏。如果 /dev/device
已存在,它会被覆盖。已检测到 /dev/sda1
格式,并用作 /dev/device
的格式。
# virt-sparsify disk.raw --convert qcow2 disk.qcow2
# virt-sparsify --ignore /dev/device /dev/sda1 /dev/device
# virt-sparsify --in-place disk.img
virt-sparsify 选项
表 21.4. virt-sparsify 选项
命令 | 描述 | 示例 |
---|---|---|
--help | 显示有关特定命令或 virt-sparsify 实用程序的简短帮助条目。详情请查看 virt-sparsify man page。 | virt-sparsify --help |
--check-tmpdir ignore |继续 |warn |失败 | 估计,如果 tmpdir 有足够的空间来完成操作。如果没有足够的空间来完成操作,则指定选项将决定该行为。
--in-place 选项一起使用。 |
virt-sparsify --check-tmpdir ignore
/dev/sda1 /dev/device
virt-sparsify --check-tmpdir continue
/dev/sda1 /dev/device
virt-sparsify --check-tmpdir warn
/dev/sda1 /dev/device
virt-sparsify --check-tmpdir 失败
/dev/sda1 /dev/device
|
--compress | 压缩输出文件。这只有在 输出格式是 qcow2 时有效。这个选项不能与 --in-place 选项一起使用。 | virt-sparsify --compress /dev/sda1 /dev/device |
--convert |
使用指定格式创建稀疏镜像。如果没有指定格式,则使用输入格式。
支持以下输出格式并已知可以正常工作:raw、qcow、vdi
您可以使用 QEMU 模拟器支持的任何格式。
建议您使用
--convert 选项。这样,virt-sparsify 不需要猜测输入格式。
这个选项不能与
--in-place 选项一起使用。
|
virt-sparsify --convert raw
/dev/sda1 /dev/device
virt-sparsify --convert qcow2
/dev/sda1 /dev/device
virt-sparsify --convert other_format indisk outdisk
|
--format | 指定输入磁盘镜像的格式。如果没有指定,则会从镜像中检测到格式。在使用不受信任的原始格式客户机磁盘镜像时,请确保指定格式。 |
virt-sparsify --format raw
/dev/sda1 /dev/device
virt-sparsify --format qcow2
/dev/sda1 /dev/device
|
--ignore |
忽略指定的文件系统或卷组。
当指定文件系统且未指定
--in-place 选项时,文件系统的可用空间不会为零。但是,现有零块被 sparsified。当指定 --in-place 选项时,该文件系统将完全忽略。
当指定卷组时,卷组将被忽略。应该在没有 /dev/ 前缀的情况下使用卷组名称。例如: --ignore vg_foo
--ignore 选项可以多次包含在命令中。
|
virt-sparsify --ignore filesystem1
/dev/sda1 /dev/device
virt-sparsify --ignore volume_group
/dev/sda1 /dev/device
|
--in-place |
使镜像稀疏原位,而不是制作临时副本。虽然原位问题比复制问题更高效,但它不能像复制差异一样恢复太多的磁盘空间。使用丢弃(也称为 trim 或 unmap)支持进行原位升级。
要使用原位解析,请指定一个要进行替换的磁盘镜像。
当指定原位升级时,无法使用以下选项:
| virt-sparsify --in-place disk.img |
-x | 启用 libguestfs API 调用追踪。 | virt-sparsify -x filesystem1 /dev/sda1 /dev/device |
第 22 章 用于客户机虚拟机管理的图形用户界面工具
22.1. virt-viewer
virt-viewer
是一个最小的命令行实用程序,用于显示客户机虚拟机的图形控制台。控制台可使用 VNC 或 SPICE 协议访问。guest 可以通过其名称、ID 或 UUID 指代。如果客户机还没有运行,可以将查看器设置为在尝试连接到控制台前等待其启动。查看器可以连接到远程主机以获取控制台信息,然后使用同一网络传输连接到远程控制台。
# yum install virt-viewer
Syntax
# virt-viewer [OPTIONS] {guest-name|id|uuid}
连接到客户机虚拟机
# virt-viewer guest-name
# virt-viewer --connect qemu:///system guest-name
# virt-viewer --connect qemu://example.org/ guest-name
# virt-viewer --direct --connect qemu+ssh://root@example.org/ guest-name
Interface
图 22.1. virt-viewer 接口示例
设置热密钥
--hotkeys
选项:
# virt-viewer --hotkeys=action1=key-combination1[,action2=key-combination2] guest-name
- 切换完整屏幕
- release-cursor
- SmartCard-insert
- SmartCard-remove
例 22.1. 设置 virt-viewer 热密钥
# virt-viewer --hotkeys=toggle-fullscreen=shift+f11 qemu:///system testguest
kiosk 模式
-k
或 --kiosk
选项连接到 guest。
例 22.2. 在 kiosk 模式中使用 virt-viewer
# virt-viewer --connect qemu:///system guest-name --kiosk --kiosk-quit on-disconnect
22.2. remote-viewer
remote-viewer
是支持 SPICE 和 VNC 的简单远程桌面显示客户端。它与 virt-viewer 分享大部分功能和局限性。
remote-viewer
工具,请运行:
# yum install virt-viewer
Syntax
# remote-viewer [OPTIONS] {guest-name|id|uuid}
连接到客户机虚拟机
例 22.3. 使用 SPICE 连接到虚拟机显示
# remote-viewer spice://testguest:5900
例 22.4. 使用 VNC 连接到客户机显示
testguest2
的机器上的 VNC 服务器,它使用端口 5900 进行 VNC 通信:
# remote-viewer vnc://testguest2:5900
Interface
图 22.2. remote-viewer 接口示例
22.3. GNOME Boxes
# yum install gnome-boxes
- - 搜索按钮,按名称搜索 guest 虚拟机,以及
- - 选择按钮。
图 22.3. 操作栏
- 喜欢 :为选定的虚拟机添加核心,并将它们移到客户机列表的顶部。随着客户机数量的增加,这变得越来越有帮助。
- 暂停 :所选客户机虚拟机将停止运行。
- 删除:删除所选 guest 虚拟机。
- 属性 :显示所选 guest 虚拟机的属性。
过程 22.1. 使用 Boxes 创建新的客户机虚拟机
点 New
此时将打开 Introduction 屏幕。点 Continue。图 22.4. 简介屏幕
选择源
Source Selection 屏幕有三个选项:- 可用介质:此处会显示任何立即可用的安装介质。点击其中任何一个都可以直接进入 Review 屏幕。
- 输入 URL:在 URL 中键入,以指定本地 URI 或 ISO 文件的路径。这也可用于访问远程机器。该地址应遵循 协议://IPaddress?端口 的模式,例如:
spice://192.168.122.1?port=5906;
协议可以是spice://
、qemu://
或vnc://
- 选择一个文件 :打开文件目录,手动搜索安装介质。
图 22.5. 源选择屏幕
查看详情
Review 屏幕显示客户机虚拟机的详细信息。图 22.6. 查看页面
这些详细信息可保留为原样,在那里进入最终步骤,或者:可选:自定义详情
单击 Customize,您可以调整客户机虚拟机的配置,如内存和磁盘大小。图 22.7. 自定义屏幕
创建
点 Create。将打开新的 guest 虚拟机。
第 23 章 操作域 XML
<域>
元素。域 XML 有两个属性: type
和 id
。type
指定用于运行域的虚拟机监控程序。允许的值是特定于驱动程序的,但包括 KVM
和其它值。id
是运行的客户机虚拟机的唯一整数标识符。非活动机器没有 id
值。本章中的部分将描述域 XML 的组件。本手册中的其他章节在操作域 XML 时可能会看到本章。
23.1. 通用信息和元数据
图 23.1. 域 XML 元数据
<domain type='kvm' id='3'> <name>fv0</name> <uuid>4dea22b31d52d8f32516782e98ab3fa0</uuid> <title>A short description - title - of the domain</title> <description>A human readable description</description> <metadata> <app1:foo xmlns:app1="http://app1.org/app1/">..</app1:foo> <app2:bar xmlns:app2="http://app1.org/app2/">..</app2:bar> </metadata> ... </domain>
表 23.1. 常规元数据元素
元素 | 描述 |
---|---|
<名称> | 为虚拟机分配名称。此名称仅由字母数字字符组成,必须在单一主机物理计算机范围内保持唯一。它通常用于组成存储持久配置文件的文件名。 |
<uuid> | 为虚拟机分配全局唯一标识符。格式必须符合 RFC 4122- 兼容,例如 3e3fce45-4f53-4fa7-bb32-11f34168b82b 。如果在定义或创建新机器时省略,将生成随机 UUID。也可以使用 sysinfo 规范提供 UUID。 |
<title> | 为域的简短描述创建空格。标题不应包含任何新行。 |
<描述> | 与标题不同,libvirt 不会使用此数据。它可以包含用户选择想要显示的任何信息。 |
<metadata> | 应用程序可以使用它以 XML 节点/树的形式存储自定义元数据。应用程序必须在 XML 节点/树上使用自定义命名空间,每个命名空间只有一个顶级元素(如果应用程序需要结构,则应具有子元素作为其命名空间元素)。 |
23.2. 操作系统引导
23.2.1. BIOS Boot Loader
<os>
部分包含以下信息:
图 23.2. BIOS 引导装载程序域 XML
... <os> <type>hvm</type> <boot dev='fd'/> <boot dev='hd'/> <boot dev='cdrom'/> <boot dev='network'/> <bootmenu enable='yes'/> <smbios mode='sysinfo'/> <bios useserial='yes' rebootTimeout='0'/> </os> ...
表 23.2. BIOS 引导装载程序元素
元素 | 描述 |
---|---|
<type> | 指定要在客户机虚拟机上引导的操作系统类型。hvm 表示操作系统设计为在裸机上运行,需要完全虚拟化。Linux 指的是支持 KVM 管理程序客户机 ABI 的操作系统。另外有两个可选属性: arch 为虚拟化指定 CPU 架构,机器则 引用机器类型。如需更多信息,请参阅 libvirt 上游文档。 |
<boot> | 指定要考虑使用以下值之一的下一个引导设备:fd 、hd、 或 network 。boot 元素可以多次重复,以设置优先级引导设备以便尝试打开。同一类型的多个设备按照目标排序,同时保留总线顺序。定义域后,libvirt 返回的 XML 配置按排序顺序列出设备。进行排序后,第一个设备将标记为可引导。如需更多信息,请参阅 libvirt 上游文档。 |
<bootmenu> | 确定是否在 guest 虚拟机上启用交互式引导菜单提示。enable 属性可以是 yes ,也可以是 yes 。如果未指定,则使用虚拟机监控程序默认。 |
<smbios> | 决定在客户机虚拟机中如何查看 SMBIOS 信息。必须指定 mode 属性,如 模拟 (允许管理程序生成所有值)、host (所有 Block 0 和 Block 1,除了 UUID 外)或 sysinfo(从主机物理机器的 SMBIOS 值);v irConnectGetSysinfo 调用可用于查看要复制的值,或 sysinfo (使用 sysinfo 元素中的值)。如果未指定,则使用虚拟机监控程序的默认设置。 |
<bios> | 此元素具有属性 使用 可能值 yes 或 no 。属性启用或禁用 Serial Graphics Adapter,它允许用户在串行端口上看到 BIOS 信息。因此,需要定义串行端口。rebootTimeout 属性控制客户机虚拟机在引导失败时是否应重新启动的时间(根据 BIOS)。值设为 毫秒,最大为 65535 ;设置 -1 可禁用重新启动。 |
23.2.2. 直接内核引导
initrd
直接引导,允许命令行参数直接传递给安装程序。这个功能通常用于完全虚拟化和半虚拟化的客户机虚拟机。
图 23.3. 直接内核引导
... <os> <type>hvm</type> <kernel>/root/f8-i386-vmlinuz</kernel> <initrd>/root/f8-i386-initrd</initrd> <cmdline>console=ttyS0 ks=http://example.com/f8-i386/os/</cmdline> <dtb>/root/ppc.dtb</dtb> </os> ...
表 23.3. 直接内核启动元素
元素 | 描述 |
---|---|
<type> | 与 BIOS 引导部分所述相同。 |
<内核> | 指定主机物理机器操作系统中内核映像的完全限定路径。 |
<initrd> | 指定主机物理机器操作系统中的 ramdisk 镜像的完全限定域名(可选)。 |
<cmdline> | 指定在引导时要传递给内核(或安装程序)的参数。这通常用于指定备选主控制台(如串行端口),或安装介质源或 kickstart 文件。 |
23.2.3. 容器引导
init
二进制文件的路径。默认情况下,它将在没有参数的情况下启动。要指定初始 argv
,请使用 initarg
元素,请根据需要多次重复。cmdline
元素提供与 /proc/cmdline
等效的,但不会影响 <initarg>
。
图 23.4. 容器启动
... <os> <type arch='x86_64'>exe</type> <init>/bin/systemd</init> <initarg>--unit</initarg> <initarg>emergency.service</initarg> </os> ...
23.3. SMBIOS 系统信息
sysinfo
元素涵盖了此类信息类别。
图 23.5. SMBIOS 系统信息
... <os> <smbios mode='sysinfo'/> ... </os> <sysinfo type='smbios'> <bios> <entry name='vendor'>LENOVO</entry> </bios> <system> <entry name='manufacturer'>Fedora</entry> <entry name='vendor'>Virt-Manager</entry> </system> </sysinfo> ...
<sysinfo>
元素具有一个强制属性 类型
,用于决定子元素的布局,其定义如下:
- SMBIOS - Sub-elements 调用特定的 SMBIOS 值,如果与
<os>
元素的<smbios>
子元素结合使用,这将影响客户机虚拟机。<sysinfo>
的每个子元素都命名 SMBIOS 块,在这些元素中,可以是描述块内字段的条目元素列表。可以识别以下块和条目:<BIOS>
- 这是 SMBIOS 块 0,其条目名取自供应商的
、版本
、日期和时间
。<System>
- 这是 SMBIOS 块 1,其条目名取自manufacturer
、产品
、版本
、serial
、uuid、s
ku,以及系列产品
。如果一个
uuid
条目与顶层uuid
元素一起提供,则两个值必须匹配。
23.4. CPU 分配
图 23.6. CPU 分配
<domain> ... <vcpu placement='static' cpuset="1-4,^3,6" current="1">2</vcpu> ... </domain>
<vcpu>
元素定义为客户端虚拟机操作系统分配的的最大虚拟 CPU 数量,该 CPU 必须在 1 之间以及虚拟机监控程序支持的最大值。此元素可以包含可选的 cpuset
属性,它是域进程和虚拟 CPU 默认可以固定到的物理 CPU 的逗号分隔列表。
cputune
属性单独指定域进程和虚拟 CPU 的固定策略。如果在 <cputune>
中指定 emulatorpin
属性,则 <vcpu>
指定的cpuset
将会被忽略。
vcpupin
设置了值的虚拟 CPU 会导致忽略 cpuset
设置。对于没有指定 vcpupin
的虚拟 CPU,它将固定到 cpuset
指定的物理 CPU。cpuset
列表中的每个元素都是单个 CPU 号、一个 CPU 数字范围,或小心(^),后面跟着要排除在之前范围内的 CPU 编号。当前
的属性可用于指定是否应启用的最大虚拟 CPU 数。
放置
可选属性可用于指示域进程的 CPU 放置模式。放置
的值可以设置为以下之一:
static
- 将 vCPU 固定到cpuset
属性定义的物理 CPU。如果未定义cpuset
,域进程将固定到所有可用的物理 CPU。auto
- 表示域进程将从 Query numad 中固定到公告节点集,如果指定了 attributecpuset
的值,则忽略它。
23.5. CPU 调整
图 23.7. CPU 调优
<domain> ... <cputune> <vcpupin vcpu="0" cpuset="1-4,^2"/> <vcpupin vcpu="1" cpuset="0,1"/> <vcpupin vcpu="2" cpuset="2,3"/> <vcpupin vcpu="3" cpuset="0,4"/> <emulatorpin cpuset="1-3"/> <shares>2048</shares> <period>1000000</period> <quota>-1</quota> <emulator_period>1000000</emulator_period> <emulator_quota>-1</emulator_quota> </cputune> ... </domain>
表 23.4. CPU 调整元素
元素 | 描述 |
---|---|
<cputune> | 提供有关域的 CPU 可调参数的详细信息。这是可选的。 |
<vcpupin> | 指定域 vCPU 将固定到的主机物理 CPU。如果省略它,且未指定 <vcpu> 元素的 cpuset 属性,则 vCPU 会默认固定到所有物理 CPU。它包含两个必要的属性: <vcpu> 属性指定 id ,而 cpuset 属性与 <vcpu> 元素中的 cpuset 属性相同。 |
<emulatorpin> | 指定哪些主机物理机器 CPU 将固定为"emulator"(一个不是包含 <vcpu> 的域的子集)。如果省略,且 <vcpu> 元素中的 cpuset 属性没有指定,则"emulator"默认固定到所有物理 CPU。它包含一个 required cpuset 属性,指定要将哪些物理 CPU 固定到。如果 <vcpu> 元素中的 placement 属性被设置为 auto ,则不允许模拟固定。
|
<共享> | 指定域的比例加权共享。如果省略此项,则默认为操作系统提供的默认值。如果没有值的单位,则会根据其它客户机虚拟机的设置来计算它。例如,配置了 <共享> 值 2048 的客户机虚拟机将获得两倍的 CPU 时间,作为配置了 <共享> 值 1024 的客户机虚拟机。 |
<周期> | 以微秒为单位指定强制间隔。通过使用 <句点> ,每个域的 vCPU 将不允许消耗超过其运行时所分配的配额。这个值应该在以下范围内:1000-1000000 .值为 0 的 <period> 表示没有值。 |
<quota> | 指定微秒允许的最大带宽。具有 <配额> 的域表示域具有无限带宽,这意味着它不控制带宽。该值应在以下范围内:1000 - 18446744073709551 或小于 0。 值为 0 的配额 表示没有值。您可以使用此功能来确保所有 vCPU 以相同的速度运行。 |
<emulator_period> | 以微秒为单位指定强制间隔。在 <emulator_period> 中,域的仿真线程(不包括 vCPU)不允许消耗超过运行时的 <emulator_ worthquota> 。<emulator_period> 值应该在以下范围内:1000 - 1000000 .值为 0 的 <emulator_period> 表示没有值。 |
<emulator_quota> | 指定域的仿真程序线程(不包括 vCPU)的最大允许带宽的最大带宽(以微秒为单位)。带有 <emulator_quota> 作为负值的域表示域具有仿真程序线程的无限带宽(除 vCPU 外),这意味着它不控制带宽。该值应位于以下范围内:1000 - 18446744073709551 或小于 0。 值为 0 的 <emulator_quota> 表示没有值。 |
23.6. 内存备份
图 23.8. 内存备份
<domain> ... <memoryBacking> <hugepages> <page size="1" unit="G" nodeset="0-3,5"/> <page size="2" unit="M" nodeset="4"/> </hugepages> <nosharepages/> <locked/> </memoryBacking> ... </domain>
23.7. 内存调整
图 23.9. 内存调整
<domain> ... <memtune> <hard_limit unit='G'>1</hard_limit> <soft_limit unit='M'>128</soft_limit> <swap_hard_limit unit='G'>2</swap_hard_limit> <min_guarantee unit='bytes'>67108864</min_guarantee> </memtune> ... </domain>
<memtune>
是可选的,但域 XML 的这个部分的组件如下:
表 23.5. 内存调整元素
元素 | 描述 |
---|---|
<memtune> | 提供有关域内存可调参数的详细信息。如果省略此项,则默认为操作系统提供的默认值。由于参数全部应用于进程,在设置限制时,通过将客户机虚拟机 RAM 添加到客户机虚拟机视频 RAM 来确定值,从而允许一些内存开销。对于每个可调整,可以指定在输入中哪个单元数,其值与 <内存> 的值相同。为了向后兼容,输出始终处于 kibibytes(KiB)中。 |
<hard_limit> | 客户机虚拟机可以使用的最大内存。这个值以 kibibytes( 1024 字节块)表示。 |
<soft_limit> | 在内存争用期间强制实施的内存限值。这个值以 kibibytes(1024 字节块)表示。 |
<swap_hard_limit> | 客户机虚拟机可使用的最大内存加上 swap。这个值以 kibibytes(1024 字节块)表示。这必须大于 <hard_limit> 值。 |
<min_guarantee> | 保证客户机虚拟机的最小内存分配量。这个值以 kibibytes(1024 字节块)表示。 |
23.8. 内存分配
dumpCore
可用于控制客户机虚拟机内存是否应该包含在生成的内核转储中(dumpCore='on'
)或未包括(dumpCore='off'
)。请注意,默认设置 在 上
,因此,除非将 参数设置为 off
,否则客户机虚拟机内存将包含在 core dumpfile 中。
<maxMemory>
元素决定客户机的最大运行时内存分配。插槽
属性指定可用于向客户机中添加内存的插槽数。
<memory>
元素指定在引导时为客户机分配的最大内存。这也可以使用 NUMA 单元大小配置来设置,也可以通过将内存热插到 maxMemory
指定的限制来增加。
<currentMemory>
元素决定客户机虚拟机的实际内存分配。这个值可能小于最大分配量(由 <内存>
设定),以根据需要允许客户机虚拟机内存到 balloon。如果省略,则默认为与 <memory>
元素相同的值。unit 属性的行为与内存相同。
图 23.10. 内存单元
<domain> <maxMemory slots='16' unit='KiB'>1524288</maxMemory> <memory unit='KiB' dumpCore='off'>524288</memory> <!-- changes the memory unit to KiB and does not allow the guest virtual machine's memory to be included in the generated core dumpfile --> <currentMemory unit='KiB'>524288</currentMemory> <!-- makes the current memory unit 524288 KiB --> ... </domain>
23.9. NUMA 节点调优
图 23.11. NUMA 节点调整
<domain> ... <numatune> <memory mode="strict" nodeset="1-4,^3"/> </numatune> ... </domain>
表 23.6. NUMA 节点调整元素
元素 | 描述 |
---|---|
<numatune> | 介绍如何通过控制域进程的 NUMA 策略来调整 NUMA 主机物理机器的性能。 |
<memory> | 指定如何在 NUMA 主机物理机器上为域进程分配内存。它包含几个可选属性。mode 属性可以设置为 interleave 、strict 或 preferred 。如果没有赋予值,则默认为 strict 。nodeset 属性使用与 <vcpu> 元素的 cpuset 属性相同的语法来指定 NUMA 节点。属性 放置 可用于指示域进程的内存放置模式。其值可以是 static ,也可以是 自动 。如果指定了 <nodeset> 属性,则默认为 <vcpu> <的放置> ,或者 为静态 。auto 则表示域进程只会从查询 numad 返回的公告 nodeset 分配内存,如果指定了 numad,则 nodeset 属性的值将会被忽略。如果 vcpu 中的 <placement> 属性设置为 auto ,并且未指定 <numatune> 属性,则将隐式地添加带有 <放置> 自动 和 严格 模式的默认 <numatune> 属性。 |
23.10. 块 I/O 调整
图 23.12. 块 I/O 调整
<domain> ... <blkiotune> <weight>800</weight> <device> <path>/dev/sda</path> <weight>1000</weight> </device> <device> <path>/dev/sdb</path> <weight>500</weight> </device> </blkiotune> ... </domain>
表 23.7. 块 I/O 调优元素
元素 | 描述 |
---|---|
<blkiotune> | 此可选元素提供了为域调优 blkio cgroup 可调参数的功能。如果省略此项,则默认为操作系统提供的默认值。 |
<weight> | 此可选 weight 元素是客户机虚拟机的整体 I/O 权重。该值应介于 100 - 1000 范围内。 |
<device> | 域可以有多个 <设备> 元素,它们可进一步调整域所使用的每个主机物理机器块设备的权重。请注意,多个客户机虚拟机磁盘可以共享单个主机物理机器块设备。另外,由于它们由同一主机物理机器文件系统中的文件提供支持,因此此调整参数位于全局域级别,而不是与每个客户机虚拟机磁盘设备关联(将其应用于单个 <磁盘的> <iotune> 元素)。每个 device 元素有两个强制子元素,用于描述设备的绝对路径的路径,<权重> 为那个设备的相对权重,其可接受的 100 到 1000 范围。<> |
23.11. 资源分区
<resource>
元素将与资源分区相关的配置分组在一起。它目前支持子元素分区,其内容定义了要放置域的资源分区的路径。如果没有列出分区,则域将放置在默认分区中。必须先创建分区,然后才能启动 guest 虚拟机。默认情况下,只有特定于管理程序的默认分区。
图 23.13. 资源分区
<resource> <partition>/virtualmachines/production</partition> </resource>
23.12. CPU 型号和拓扑
qemu32
和 qemu64
是基本的 CPU 模型,但也有其他模型(带有附加功能)可用。每个模型及其拓扑的使用域 XML 中的以下元素指定:
图 23.14. CPU 型号和拓扑示例 1
<cpu match='exact'> <model fallback='allow'>core2duo</model> <vendor>Intel</vendor> <topology sockets='1' cores='2' threads='1'/> <feature policy='disable' name='lahf_lm'/> </cpu>
图 23.15. CPU 型号和拓扑示例 2
<cpu mode='host-model'> <model fallback='forbid'/> <topology sockets='1' cores='2' threads='1'/> </cpu>
图 23.16. CPU 模型和拓扑示例 3
<cpu mode='host-passthrough'/>
<cpu>
元素:
图 23.17. CPU 型号和拓扑示例 4
<cpu> <topology sockets='1' cores='2' threads='1'/> </cpu>
图 23.18. PPC64/PSeries CPU 型号示例
<cpu mode='custom'> <model>POWER8</model> </cpu>
图 23.19. aarch64/virt CPU 型号示例
<cpu mode='host-passthrough'/>
表 23.8. CPU 模型和拓扑元素
元素 | 描述 |
---|---|
<cpu> | 这是描述客户机虚拟机 CPU 要求的主要容器。 |
<匹配> | 指定如何为客户机虚拟机提供虚拟 CPU 如何符合这些要求。如果拓扑是 <cpu> 中的唯一元素,则可以省略 match 属性。match 属性的可能值有:
match 属性,并将默认为 完全匹配 。 |
<模式> | 此可选属性可用于方便配置客户机虚拟机 CPU,尽可能地接近主机物理机器 CPU。mode 属性的可能值有:
|
<model> | 指定客户机虚拟机请求的 CPU 型号。在 libvirt 的数据目录中安装的 cpu_map.xml 文件可以找到可用 CPU 模型列表及其定义。如果虚拟机监控程序无法使用确切的 CPU 模型,则 libvirt 会自动回退到虚拟机监控程序支持的最接近的模型,同时保持 CPU 功能列表。可选 fallback 属性可用于禁止此行为,在这种情况下,尝试启动请求不支持的 CPU 模型的域将失败。fallback 属性支持的值有: allow (默认值)和 forbid 。可选的 vendor_id 属性可用于设置客户机虚拟机可见的供应商 ID。长度必须为 12 个字符。如果没有设置,则使用主机物理机器的供应商 iID。典型的可能值为 AuthenticAMD 和 GenuineIntel 。 |
<vendor> | 指定客户机虚拟机请求的 CPU 供应商。如果缺少此元素,无论其供应商如何,客户机虚拟机在 CPU 匹配的 CPU 上运行。支持的厂商列表可在 cpu_map.xml 中找到。 |
<topology> | 指定提供给客户端虚拟机的虚拟 CPU 的请求拓扑。为插槽、内核和线程分配三个非零值:CPU 插槽总数、每个插槽的内核数和每个内核的线程数量。 |
<功能> | 可以包含零或更多元素,用于微调由所选 CPU 模型提供的功能。已知功能名称列表可在 cpu_map.xml 文件中找到。每个功能元素的含义取决于其策略属性,必须设置为以下值之一:
|
23.12.1. 更改指定 CPU 的 Feature Set
过程 23.1. 启用和禁用 CPU 功能
- 要开始,请关闭 guest 虚拟机。
- 通过运行 virsh edit [domain] 命令打开 guest 虚拟机的配置文件。
- 更改功能或
<模型中>
的参数,使其包含属性值"allow"
以强制允许该功能,或"forbid"
以拒绝对这个功能的支持。<>
图 23.20. 启用或禁用 CPU 功能示例
<!-- original feature set --> <cpu mode='host-model'> <model fallback='allow'/> <topology sockets='1' cores='2' threads='1'/> </cpu> <!--changed feature set--> <cpu mode='host-model'> <model fallback='forbid'/> <topology sockets='1' cores='2' threads='1'/> </cpu>
图 23.21. 启用或禁用 CPU 功能示例 2
<!--original feature set--> <cpu match='exact'> <model fallback='allow'>core2duo</model> <vendor>Intel</vendor> <topology sockets='1' cores='2' threads='1'/> <feature policy='disable' name='lahf_lm'/> </cpu> <!--changed feature set--> <cpu match='exact'> <model fallback='allow'>core2duo</model> <vendor>Intel</vendor> <topology sockets='1' cores='2' threads='1'/> <feature policy='enable' name='lahf_lm'/> </cpu>
- 完成更改后,保存配置文件并启动客户机虚拟机。
23.12.2. 虚拟机 NUMA 拓扑
<numa>
元素指定客户机虚拟机 NUMA 拓扑:
图 23.22. 客户机虚拟机 NUMA 拓扑
<cpu> <numa> <cell cpus='0-3' memory='512000'/> <cell cpus='4-7' memory='512000'/> </numa> </cpu> ...
cpus
指定作为节点一部分的 CPU 或范围。内存
以 kibibytes(1024 字节块)指定节点内存。每个单元格或节点都会被分配一个 cellid
或 nodeid
来增加从 0 开始的顺序。
23.13. 事件配置
图 23.23. 事件配置
<on_poweroff>destroy</on_poweroff> <on_reboot>restart</on_reboot> <on_crash>restart</on_crash> <on_lockfailure>poweroff</on_lockfailure>
表 23.9. 事件配置元素
状态 | 描述 |
---|---|
<on_poweroff> | 指定在客户机虚拟机请求关闭时执行的操作。可以有四个参数:
|
<on_reboot> | 指定客户机虚拟机请求重新引导时执行的操作。可以有四个参数:
|
<on_crash> | 指定要在客户机虚拟机崩溃时执行的操作。另外,它支持这些额外操作:
|
<on_lockfailure> | 指定锁定管理器丢失资源锁定时要执行的操作。以下的操作可由 libvirt 识别,但不需要单独锁定管理器支持它们。如果没有指定操作,每个锁定管理器将采取其默认操作。以下参数可以:
|
23.14. Hypervisor 功能
state='on'
)或禁用(state='off'
)。
图 23.24. 虚拟机监控程序功能
... <features> <pae/> <acpi/> <apic/> <hap/> <privnet/> <hyperv> <relaxed state='on'/> </hyperv> </features> ...
<状态>
,则所有功能都列在 <features>
元素中。可通过调用 capabilities
XML 发现可用功能,但为完全虚拟化域的通用集合是:
表 23.10. 管理程序功能元素
状态 | 描述 |
---|---|
<pae> | 物理地址扩展模式允许 32 位客户机虚拟机处理超过 4 GB 内存。 |
<acpi> | 对于电源管理非常有用。例如,在 KVM 客户机虚拟机中,安全关闭需要它。 |
<apic> | 允许使用可编程的 IRQ 管理。此元素有一个可选属性 eoi ,其值为 on 和 off ,这会设置客户机虚拟机的 EOI(中断终止)的可用性。 |
<hap> | 如果硬件中有可用,则启用硬件辅助分页的使用。 |
23.15. timekeeping
<clock>
和 <timer>
元素提供独立于管理程序的配置设置。可以使用 virsh edit 命令编辑域 XML。详情请查看 第 20.22 节 “编辑虚拟机 XML 配置设置”。
图 23.25. timekeeping
... <clock offset='localtime'> <timer name='rtc' tickpolicy='catchup' track='guest'> <catchup threshold='123' slew='120' limit='10000'/> </timer> <timer name='pit' tickpolicy='delay'/> </clock> ...
表 23.11. 计时元素
状态 | 描述 |
---|---|
<clock> | <clock> 元素用于确定如何将客户机虚拟机时钟与主机物理机器时钟同步。offset 属性使用四个可能值,允许对将客户机虚拟机时钟与主机物理机器同步的方式进行精细控制。请注意,管理程序不需要在所有时间源中支持所有策略
|
<timer> | 请参阅备注 |
<存在> | 指定特定计时器可用于客户机虚拟机。可以设置为 yes 或 no 。 |
<时钟>
元素可以有零个或多个 <计时器>
元素作为子项。<timer>
元素指定用于客户机虚拟机时钟同步的时间源。
<计时器>
元素中,需要 名称
,所有其他属性都是可选的:
Name
- 选择修改哪个计时器
。可接受以下值:kvmclock
、pit
或rtc
。track
- 指定计时器跟踪。可接受以下值:boot
、guest
或wall
.track
仅对name="rtc"
有效。tickpolicy
- 确定在在向客户机虚拟机注入 tick 时会发生什么。可以分配以下值:delay
- 继续以正常率交付行程。由于相关空点,客户机虚拟机时间将延迟。捕获
- 按更高的速率提供电话,以便跟上空缺的支票。在捕获完成后,客户机虚拟机时间不会被显示。另外,可以有三个可选属性,每个正整数: threshold、slew 和 limit。merge
- 将错过的支票放入一个空行并注入它们。根据合并的方式,客户机虚拟机时间可能会延迟。discard
- 放弃错过的提示,并在其默认间隔设置中继续使用将来的注入。客户端虚拟机时间可能会延迟,除非有明确的声明可用于处理丢失的 ticks。
例 23.1. 始终与 UTC 同步
<clock offset="utc" />
例 23.2. 始终与主机物理计算机时区同步
<clock offset="localtime" />
例 23.3. 与任意时区同步
<clock offset="timezone" timezone="Europe/Paris" />
例 23.4. 与 UTC 同步 + 任意偏移
<clock offset="variable" adjustment="123456" />
23.16. 计时器元素属性
name
元素包含要使用的时间源的名称。它可以具有以下值:
表 23.12. 名称属性值
订阅价值 | 描述 |
---|---|
pit | 可编程的间隔时间 - 一个带有定期中断的计时器。使用此属性时,tickpolicy 延迟会成为默认设置。 |
rtc | 实时时钟 - 不断运行带有定期中断的计时器。此属性支持 tickpolicy catchup 子元素。 |
kvmclock | KVM clock - KVM 客户机虚拟机的推荐时钟源。KVM pvclock 或 kvm-clock 允许客户机虚拟机读取主机物理机器的 wall clock 时间。 |
track
属性指定计时器跟踪的内容,并且仅对 rtc
的名称
值有效。
表 23.13. 跟踪属性值
订阅价值 | 描述 |
---|---|
boot | 对应于旧的 主机物理计算机 选项,这是不受支持的跟踪选项。 |
guest | RTC 始终跟踪客户机虚拟机时间。 |
Wall | RTC 始终跟踪主机时间。 |
tickpolicy
属性和值指示用于将 ticks 传递到客户机虚拟机的策略。
表 23.14. tickpolicy 属性值
订阅价值 | 描述 |
---|---|
delay | 继续以正常率交付(ticks 为延迟)。 |
catchup | 以更高的速度实现. |
merge | 将合并成一个 tick。 |
discard | 所有错过的提示都将被丢弃。 |
present
属性用于覆盖对客户机虚拟机可见的默认计时器集。present
属性可以采用以下值:
表 23.15. 介绍属性值
订阅价值 | 描述 |
---|---|
是 | 强制此计时器对 guest 虚拟机可见。 |
否 | 强制此计时器对 guest 虚拟机不可见。 |
23.17. Devices
<>
- virtio-scsi-pci - PCI 总线存储设备
- virtio-blk-pci - PCI 总线存储设备
- virtio-net-pci - PCI 总线网络设备也称为 virtio-net
- virtio-serial-pci - PCI 总线输入设备
- virtio-balloon-pci - PCI 总线内存 balloon 设备
- virtio-rng-pci - PCI 总线虚拟随机数生成器设备
virtio-balloon-pci
和 virtio-rng-pci
以外的所有 virtio 设备都接受 向量
参数。
图 23.26. 设备 - 子元素
... <devices> <emulator>/usr/libexec/qemu-kvm</emulator> </devices> ...
<模拟器>
二进制文件的完全限定路径。capabilities XML 指定要用于每个特定域类型或架构组合的推荐默认模拟器。
23.17.1. 硬盘驱动器、软盘和 CD-ROMs
<磁盘>
元素中指定的任何软盘、硬盘、CD-ROM 或泛虚拟化驱动程序。
图 23.27. devices - 硬盘、软盘、CD-ROM 示例
<disk type='network'> <driver name="qemu" type="raw" io="threads" ioeventfd="on" event_idx="off"/> <source protocol="sheepdog" name="image_name"> <host name="hostname" port="7000"/> </source> <target dev="hdb" bus="ide"/> <boot order='1'/> <transient/> <address type='drive' controller='0' bus='1' unit='0'/> </disk>
图 23.28. devices - 硬盘、软盘、CD-ROM 示例 2
<disk type='network'> <driver name="qemu" type="raw"/> <source protocol="rbd" name="image_name2"> <host name="hostname" port="7000"/> </source> <target dev="hdd" bus="ide"/> <auth username='myuser'> <secret type='ceph' usage='mypassid'/> </auth> </disk>
图 23.29. 设备 - 硬盘、软盘、CD-ROM 示例 3
<disk type='block' device='cdrom'> <driver name='qemu' type='raw'/> <target dev='hdc' bus='ide' tray='open'/> <readonly/> </disk> <disk type='network' device='cdrom'> <driver name='qemu' type='raw'/> <source protocol="http" name="url_path"> <host name="hostname" port="80"/> </source> <target dev='hdc' bus='ide' tray='open'/> <readonly/> </disk>
图 23.30. 设备 - 硬盘、软盘、CD-ROM 示例 4
<disk type='network' device='cdrom'> <driver name='qemu' type='raw'/> <source protocol="https" name="url_path"> <host name="hostname" port="443"/> </source> <target dev='hdc' bus='ide' tray='open'/> <readonly/> </disk> <disk type='network' device='cdrom'> <driver name='qemu' type='raw'/> <source protocol="ftp" name="url_path"> <host name="hostname" port="21"/> </source> <target dev='hdc' bus='ide' tray='open'/> <readonly/> </disk>
图 23.31. 设备 - 硬盘、软盘、CD-ROM 示例 5
<disk type='network' device='cdrom'> <driver name='qemu' type='raw'/> <source protocol="ftps" name="url_path"> <host name="hostname" port="990"/> </source> <target dev='hdc' bus='ide' tray='open'/> <readonly/> </disk> <disk type='network' device='cdrom'> <driver name='qemu' type='raw'/> <source protocol="tftp" name="url_path"> <host name="hostname" port="69"/> </source> <target dev='hdc' bus='ide' tray='open'/> <readonly/> </disk> <disk type='block' device='lun'> <driver name='qemu' type='raw'/> <source dev='/dev/sda'/> <target dev='sda' bus='scsi'/> <address type='drive' controller='0' bus='0' target='3' unit='0'/> </disk>
图 23.32. devices - 硬盘、软盘、CD-ROM 示例 6
<disk type='block' device='disk'> <driver name='qemu' type='raw'/> <source dev='/dev/sda'/> <geometry cyls='16383' heads='16' secs='63' trans='lba'/> <blockio logical_block_size='512' physical_block_size='4096'/> <target dev='hda' bus='ide'/> </disk> <disk type='volume' device='disk'> <driver name='qemu' type='raw'/> <source pool='blk-pool0' volume='blk-pool0-vol0'/> <target dev='hda' bus='ide'/> </disk> <disk type='network' device='disk'> <driver name='qemu' type='raw'/> <source protocol='iscsi' name='iqn.2013-07.com.example:iscsi-nopool/2'> <host name='example.com' port='3260'/> </source> <auth username='myuser'> <secret type='chap' usage='libvirtiscsi'/> </auth> <target dev='vda' bus='virtio'/> </disk>
图 23.33. devices - 硬盘、软盘、CD-ROM 示例 7
<disk type='network' device='lun'> <driver name='qemu' type='raw'/> <source protocol='iscsi' name='iqn.2013-07.com.example:iscsi-nopool/1'> iqn.2013-07.com.example:iscsi-pool <host name='example.com' port='3260'/> </source> <auth username='myuser'> <secret type='chap' usage='libvirtiscsi'/> </auth> <target dev='sda' bus='scsi'/> </disk> <disk type='volume' device='disk'> <driver name='qemu' type='raw'/> <source pool='iscsi-pool' volume='unit:0:0:1' mode='host'/> <auth username='myuser'> <secret type='chap' usage='libvirtiscsi'/> </auth> <target dev='vda' bus='virtio'/> </disk>
图 23.34. devices - 硬盘、软盘、CD-ROM 示例 8
<disk type='volume' device='disk'> <driver name='qemu' type='raw'/> <source pool='iscsi-pool' volume='unit:0:0:2' mode='direct'/> <auth username='myuser'> <secret type='chap' usage='libvirtiscsi'/> </auth> <target dev='vda' bus='virtio'/> </disk> <disk type='file' device='disk'> <driver name='qemu' type='raw' cache='none'/> <source file='/tmp/test.img' startupPolicy='optional'/> <target dev='sdb' bus='scsi'/> <readonly/> </disk> <disk type='file' device='disk'> <driver name='qemu' type='raw' discard='unmap'/> <source file='/var/lib/libvirt/images/discard1.img'/> <target dev='vdb' bus='virtio'/> <alias name='virtio-disk1'/> <address type='pci' domain='0x0000' bus='0x00' slot='0x09' function='0x0'/> </disk> </devices> ...
23.17.1.1. 磁盘元素
<disk>
元素是描述磁盘的主容器。属性 类型
可与 <disk>
元素一起使用。允许以下类型:
file
block
dir
network
23.17.1.2. 源元素
<file>
-file
属性指定到磁盘所在的文件的完全限定路径。<block>
-dev
属性指定充当磁盘的主机设备的完全限定路径。<dir>
-dir
属性指定用作磁盘的目录的完全限定路径。<network>
-protocol
属性指定用于访问所请求镜像的协议。可能的值有:nbd
、isci
、rbd
、sheepdog
和gluster
。- 如果
协议
属性是rbd
、sheepdog
或gluster
,则其他属性
是必须的。此属性指定将使用哪些卷和镜像。 - 如果
协议
属性是nbd
,则name
属性是可选的。 - 如果
protocol
属性为
,则name
属性可以包含逻辑单元号,用斜杠将其与目标的名称分开。例如:iqn.2013-07.com.example:iscsi-pool/1。如果未指定,则默认 LUN 为零。
<卷>
- 底层磁盘源由池和
卷
属性表示。<pool>
- 磁盘源所在的存储池(由 libvirt管理)的名称。<卷>
- 用作磁盘源的存储卷(由 libvirt管理)的名称。volume
属性的值是 virsh vol-list [pool-name]的 Name 列的输出。
网络
时,源
可能具有零个或更多 主机
子元素,用于指定要连接的主机物理计算机,包括: type='dir'
和 type='network'
。对于代表 CD-ROM 或软盘( device 属性)的文件磁盘类型,可以在无法访问源文件时为磁盘定义操作的策略。
这可以通过将 startupPolicy
属性设置为以下值之一来实现:
- 如果因任何原因而丢失,
强制
会导致失败。这是默认的设置。 - 如果在引导时缺少,则必需会导致失败,如果迁移、恢复或恢复缺少,则会导致失败。
- 如果开始尝试中缺少
可选
操作,则可选 drops。
23.17.1.3. mirror 元素
<>
如果属性就绪,则代表磁盘已已知为 pivot;否则,磁盘可能仍会复制。现在,这个元素只在输出中有效,在输入时会忽略它。
23.17.1.4. target 元素
<target>
元素控制磁盘被公开给客户端虚拟机操作系统的总线或设备。dev
属性指示逻辑设备名称。指定的实际设备名称不能保证映射到客户端虚拟机操作系统中的设备名称。可选的 bus 属性指定要模拟的磁盘设备类型;可能的值特定于驱动程序,典型的值是 ide
、scsi、virtio
、kvm
、usb
或 sata
。如果省略,总线类型会从设备名称的样式中推断出来。例如:名为 "sda"
的设备通常使用 SCSI 总线导出。可选的属性 tray
表示可移动磁盘(如 CD-ROM 或 Floppy 磁盘)的托盘状态,其中值可以是 打开或关闭
。
默认设置 关闭
。
23.17.1.5. iotune 元素
<iotune>
元素提供额外的每个设备 I/O 调优功能,但每个设备的值可能会有所不同(这与 blkiotune
元素不同(将全局应用到域)。此元素具有以下可选子元素(请注意,任何未指定或所有子元素的任何子元素,值为 0,
代表没有限制):
<total_bytes_sec>
- 每秒的吞吐量总量(以字节/秒为单位)。这个元素不能与<read_bytes_sec>
或<write_bytes_sec>
一同使用。<read_bytes_sec>
- 每秒读取吞吐量限制(以字节/秒为单位)。<write_bytes_sec>
- 写入吞吐量限制(以字节/秒为单位)。<total_iops_sec>
- 每秒 I/O 操作总数。这个元素不能与<read_iops_sec>
或<write_iops_sec>
一起使用。<read_iops_sec>
- 每秒读取 I/O 操作。<write_iops_sec>
- 每秒写入 I/O 操作。
23.17.1.6. Driver 元素
<driver>
元素允许您指定与用于提供磁盘的虚拟机监控程序驱动程序相关的更多详情。可以使用以下选项:
- 如果虚拟机监控程序支持多个后端驱动程序,则
name
属性选择主后端驱动程序名称,而可选类型属性则提供子类型。 - 可选的
cache
属性控制缓存机制。可能的值有:default
,none
,writethrough
,writeback
,directsync
(与writethrough
类似,但它会绕过主机物理机器页面缓存)和不安全
(主机物理机器可能会缓存所有磁盘 I/O,并忽略来自客户机虚拟机同步请求)。 - 可选的
error_policy
属性控制管理程序在磁盘读取或写入错误上的行为方式。可能的值有停止
、报告
、忽略
,以及enospace
。error_policy
的默认设置是report
。还有一个可选的rerror_policy
,用于控制仅读取错误的行为。如果没有给出rerror_policy
,则error_policy
同时用于读取和写入错误。如果给出rerror_policy
,它将覆盖error_policy
的 read 错误。另请注意,enospace
不是读取错误的有效策略,因此如果error_policy
设为enospace
,并且没有给出rerror_policy
,则将使用读取错误设置报告
。 - 可选的
io
属性控制 I/O 上的特定策略;kvm
客户机虚拟机支持线程
和原生
。可选的ioeventfd
属性允许用户为 virtio 磁盘设备设置域 I/O 异步处理。默认值由虚拟机监控程序决定。接受的值为on
和off
。启用此项可允许客户机虚拟机在单独线程处理 I/O 时执行。通常,在 I/O 期间,遇到高系统 CPU 利用率的客户机虚拟机将从此中受益。另一方面,过载主机物理计算机可能会增加客户机虚拟机 I/O 延迟。但是,建议您不要更改默认设置,并允许虚拟机监控程序确定设置。注意ioeventfd
属性包含在磁盘
XML 部分的<
元素中,以及<driver>
>设备
XML 部分的驱动程序元素。在以前的情形中,它会影响 virtIO 磁盘,后者则影响 SCSI 磁盘。 - 可选的
event_idx
属性控制设备事件处理的各个方面,并可设置为on
或off
。如果设为上的
,它将减少中断数量,并退出客户机虚拟机。默认值由虚拟机监控程序决定,默认设置在上
。如果不需要此行为,则设置会
强制关闭该功能。但是,强烈建议您不要更改默认设置,并允许虚拟机监控程序指示设置。 - 可选的
copy_on_read
属性控制是否将读取后备文件复制到镜像文件中。接受的值可以是on
或<off>
。copy-on-read
避免重复访问同一后备文件扇区,并在后备文件超过较慢时很有用。默认情况下,copy-on-read
会为off
。 - 可以设置
discard='unmap'
来启用丢弃支持。可以使用discard='ignore'
来替换同一行,以禁用。discard='ignore'
是默认设置。
23.17.1.7. 其他设备元素
device
元素中可能会使用以下属性:
<boot>
- 指定磁盘可引导。其他引导值
<order>
- 确定在引导序列中尝试设备的顺序。<per-device>
Boot 元素不能与 BIOS 引导装载程序中的一般引导元素一起使用。
<encryption>
- 指定卷加密方式。<ReadOnly>
- 表示 guest 虚拟机无法修改该设备。此设置是带有属性
<device='cdrom'>
的磁盘的默认设置。<应>
共享该设备在域间共享(只要虚拟机监控程序和操作系统支持)。如果使用可共享
,则cache='no'
应该为该设备使用。<瞬态>
- 表示当客户机虚拟机退出时,应自动恢复对设备内容的更改。对于某些虚拟机监控程序,标记磁盘临时
可防止域参与迁移或快照。<serial>
- 指定客户机虚拟机的硬盘的序列号。例如,<串行>
WD-WMAP9A966149</串行>
。<WWN>
- 指定虚拟硬盘或 CD-ROM 驱动器的 World Wide Name(WWN)。它必须由 16 位十六进制组成。<vendor>
- 指定虚拟硬盘或 CD-ROM 设备的供应商。它不能超过 8 个可打印字符。<product>
- 指定虚拟硬盘或 CD-ROM 设备的产品。它不能超过 16 个可打印字符<主机>
- 支持以下属性:此元素的含义和元素的数量取决于name
- 指定主机名port
- 指定端口号transport
- 指定传输类型socket
- 指定套接字的路径
协议
属性,如中所示 基于协议的其他主机属性基于协议的其他主机属性
nbd
- 指定运行nbd-server
的服务器,且只能用于一台主机物理机器。此 protcol 的默认端口为 10809。RBD
- 监控 RBD 类型的服务器,并可用于一个或多个主机物理计算机。sheepdog
Gluster
- 指定运行 glusterd 守护进程的服务器,只能用于一台主机物理计算机。transport 属性的有效值是tcp
、rdma或
unix
。如果未指定任何内容,则假定tcp
。如果传输是unix
,则socket
属性指定unix
套接字的路径。
<address>
- 将磁盘放在控制器的给定插槽中。实际的<控制器>
设备通常被推断 ,但也可以明确指定它。type
属性是强制的,通常为pci
或驱动器
。对于pci
控制器,必须存在适用于总线
、插槽
和功能的附加属性,以及可选的域和
多功能
。多功能
默认为off
。对于
驱动器
控制器,提供了更多属性控制器
、总线
、目标
和单元
,每个属性的默认设置为 0。auth
- 提供访问源所需的身份验证凭据。它包括一个强制属性username
,用于标识要在身份验证期间使用的用户名,以及含有强制属性type
的子元素机密
。geometry
- 提供覆盖 geometry 设置的功能。这对 S390 DASD-disks 或旧的 DOS-disks 非常有用。它可以有以下参数:cyls
- 指定柱面的数量。heads
- 指定头数。secs
- 指定每个跟踪的扇区数。trans
- 指定 BIOS-Translation-Modes,并具有以下值:none
、lba
或auto
。
blockio
- 允许使用下面列出的任何块设备属性覆盖块设备:blockio 选项
logical_block_size
- 报告客户机虚拟机操作系统,并描述磁盘 I/O 的最小单位。physical_block_size
- 报告客户端虚拟机操作系统,并描述磁盘硬件扇区大小(与磁盘数据对齐相关)。
23.17.2. 设备地址
<的地址>
子元素,用于描述在虚拟客户机中放置于虚拟总线中的设备的位置。如果在输入中省略了地址(或地址中的任何可选属性),libvirt 将生成适当的地址;但是,如果需要更多地控制布局,则需要明确的地址。有关包括 address 元素的设备示例,请参见以下示例。
类型
,用于描述该设备所在的总线。选择为给定设备使用的地址将在设备和客户机虚拟机的架构中限制。例如,磁盘设备使用 type='disk'
,而控制台设备则在 32 位 AMD 和 Intel 上使用 type='pci'
,或者 AMD64 和 Intel 64、客户机虚拟机,或者 键入='spapr-vio'
on PowerPC64 p series guest 虚拟机。每个地址 <类型都>
有额外的可选属性,用于控制要放置该设备的总线的位置。其他属性如下:
type='pci'
- PCI 地址有以下额外属性:域
(KVM 当前不使用 2 字节十六进制整数)总线
(包含 0 到 0xff 的十六进制值)插槽
(包含 0x0 到 0x1f 的十六进制值)功能
(包含 0 到 7 之间的值)- 还提供
多功能
属性,它控制 PCI 控制寄存器中特定插槽或功能的多功能。此多功能属性默认为'off'
,但应设置为'on'
,用于将使用多个功能的插槽 0。
type='drive'
-驱动器
地址有以下额外属性:controller
- (2 位控制器号)总线
- (2 位总线号)target
- (2 位总线号)单元
- (总线中的 2 位单元号)
type='virtio-serial'
- 每个virtio-serial
地址有以下额外属性:controller
- (2 位控制器号)总线
- (2 位总线号)插槽
- (总线中的 2 位插槽)
type='ccid'
- 用于 smart-cards 的 CCID 地址,有以下额外属性:总线
- (2 位总线号)插槽
- (总线中的 2 位插槽)
type='usb'
- USB 地址有以下额外属性:总线
- (包含 0 到 0xfff 的十六进制值)port
- (最多四个八位字节的点表示法,如 1.2 或 2.1.3.1)
type='spapr-vio'
- On PowerPC pseries guest 虚拟机,可以将设备分配给 SPAPR-VIO 总线。它具有扁平 64 位地址空间;按照惯例,设备通常分配到非零 0x1000 的倍数,但其他地址有效并由libvirt
允许。可以将额外的reg
属性(决定开始寄存器的十六进制值地址)分配给此属性。
23.17.3. Controller
<控制器>
元素:
图 23.35. 控制器元素
... <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 type='scsi' index='0' model='virtio-scsi' num_queues='8'/> </controller> ... </devices> ...
类型
,它必须是 "ide ", "fdc", "scsi", "sata", "usb"、"ccid"或"virtio-serial" 或 "virtio-serial"
的一个必需属性 索引
,这是描述总线控制器已遇到的十进制整数(用于 地址
元素的控制器属性)。"virtio-serial"
控制器具有两个额外的可选属性,即 端口和
向量
(控制可以通过控制器连接的设备数量)。
<控制器 type='scsi'>
具有一个可选属性 模型
,它是 "auto", "buslogic", "ibmvscsi", "lsilogic", "lsias1068", "virtio-scsi 或 "vmpvscsi"
。<控制器 type='scsi'>
也具有 num_queues
属性,它为指定的队列数启用多队列支持。另外,可以使用 ioeventfd
属性,它指定控制器是否应该对 SCSI 磁盘使用异步处理。可接受的值是 "on" 和 "off"。
"usb"
控制器具有一个可选的属性 模型
,它是 "piix3-uhci", "piix4-uhci", "ehci", "ich9-ehci1", "ich9-uhci1", "ich9-uhci2", "ich9-uhci3", "vt82c686b-uhci1", "pci-ohci2", "ich9-uhci2", "ich9-uhci2"
另外,如果需要为客户机虚拟机明确禁用 USB 总线,可以使用 model='none'
。PowerPC64 "spapr-vio" 地址没有关联的控制器。
地址
可以指定控制器到其主总线的确切关系,以及上述语义。
master
,以指定与其主控制器相配的确切关系。配套控制器位于与其 master 的同一总线上,因此相应的索引值应该相等。
图 23.36. devices - controllers - USB
... <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> ...
23.17.4. 设备租用
图 23.37. devices - 设备租期
... <devices> ... <lease> <lockspace>somearea</lockspace> <key>somekey</key> <target path='/some/lease/path' offset='1024'/> </lease> ... </devices> ...
lease
部分可以有以下参数:
lockspace
- 识别持有该密钥的锁定空间的任意字符串。锁定管理器可能会对格式或锁定空间名称的长度施加额外限制。key
- 唯一标识要获取租期的任意字符串。锁定管理器可能会对 格式或密钥的长度施加额外限制。target
- 与锁定空间关联的文件的完全限定路径。offset 指定租期存储在文件中的位置。如果锁定管理器不需要偏移,请将值设为0。
23.17.5. 主机物理机器设备分配
23.17.5.1. USB / PCI 设备
hostdev
元素传递给客户机虚拟机,方法是使用管理工具修改主机物理机器,配置域 XML 文件的以下部分:
图 23.38. 设备 - 主机物理机器设备分配
... <devices> <hostdev mode='subsystem' type='usb'> <source startupPolicy='optional'> <vendor id='0x1234'/> <product id='0xbeef'/> </source> <boot order='2'/> </hostdev> </devices> ...
图 23.39. 设备 - 主机物理机器设备分配替代
... <devices> <hostdev mode='subsystem' type='pci' managed='yes'> <source> <address bus='0x06' slot='0x02' function='0x0'/> </source> <boot order='1'/> <rom bar='on' file='/etc/fake/boot.bin'/> </hostdev> </devices> ...
图 23.40. 设备 - 主机物理计算机 scsi 设备分配
... <devices> <hostdev mode='subsystem' type='scsi'> <source> <adapter name='scsi_host0'/> <address type='scsi' bus='0' target='0' unit='0'/> </source> <readonly/> <address type='drive' controller='0' bus='0' target='0' unit='0'/> </hostdev> </devices> ..
表 23.16. 主机物理机器设备分配元素
参数 | 描述 |
---|---|
hostdev |
这是描述主机物理设备的主要元素。它接受以下选项:
|
source | 描述在主机物理计算机中看到的设备。USB 设备可以使用供应商和产品 ID,或使用 address 元素处理设备在主机物理机器上 的地址 。 另一方面上的 PCI 设备仅可以通过其地址进行描述。请注意,USB 设备的源元素可以包含 startupPolicy 属性,该属性可用于定义当未找到指定主机物理机器 USB 设备时要做什么的规则。该属性接受以下值:
|
vendor, 产品 | 这些元素各自有一个 id 属性,用于指定 USB 厂商和产品 ID。可以用十进制、十六进制数(以 0x 开始)或八进制(以 0 开始)指定 ID。 |
boot | 指定该设备是可引导的。属性的顺序决定了在引导序列期间尝试设备的顺序。per-device 引导元素无法与 BIOS 引导装载程序中的一般引导元素一起使用。 |
rom | 用于更改 PCI 设备的 ROM 如何出现在客户机虚拟机中。可选 bar 属性可以设置为 on 或 关闭 ,并确定该设备的 ROM 是否可以在客户机虚拟机的内存映射中看到。(在 PCI 文档中,rom bar 设置会控制 ROM 的 Base Address Register。如果没有指定 rom bar ,则将使用默认设置。可选的 file 属性用于指向要作为设备的 ROM BIOS 向 guest 虚拟机呈现的二进制文件。这可用于为具有 SR-IOV 功能的虚拟功能(VF 没有引导 ROM)提供 PXE 引导 ROM。 |
address | 也具有 总线 和设备属性,用于指定设备出现在主机物理计算机上的 USB 总线和设备编号。 这些属性的值可以以十进制、十六进制(以 0x 开始)或八进制(以 0 开始)形式指定。对于 PCI 设备,该元素包含 3 个属性,以便通过 lspci 或 virsh nodedev-list 获取指定设备。 |
23.17.5.2. 块 / 字符设备
hostdev
元素传递到客户机虚拟机。请注意,这只能通过基于容器的虚拟化来实现。
图 23.41. devices - 主机物理机器设备分配块字符设备
... <hostdev mode='capabilities' type='storage'> <source> <block>/dev/sdf1</block> </source> </hostdev> ...
图 23.42. 设备 - 主机物理机器设备分配块字符设备替代 1
... <hostdev mode='capabilities' type='misc'> <source> <char>/dev/input/event3</char> </source> </hostdev> ...
图 23.43. 设备 - 主机物理机器设备分配块字符设备替代 2
... <hostdev mode='capabilities' type='net'> <source> <interface>eth0</interface> </source> </hostdev> ...
表 23.17. 块/字符设备元素
参数 | 描述 |
---|---|
hostdev | 这是介绍主机物理设备的主要容器。对于块/字符设备,直通模式 始终是 能力 ,类型为 块设备 的块,而字符设备的 char 代表字符设备。 |
source | 这描述了在主机物理机器中看到的设备。对于块设备,在嵌套块元素中提供了到主机物理机器操作系统中的 块设备的路径 ,而对于 字符设备,将使用 char 元素。 |
23.17.6. 重定向的设备
图 23.44. devices - 重定向设备
... <devices> <redirdev bus='usb' type='tcp'> <source mode='connect' host='localhost' service='4000'/> <boot order='1'/> </redirdev> <redirfilter> <usbdev class='0x08' vendor='0x1234' product='0xbeef' version='2.00' allow='yes'/> <usbdev allow='no'/> </redirfilter> </devices> ...
表 23.18. 重定向的设备元素
参数 | 描述 |
---|---|
redirdev | 这是描述重定向设备的主要容器。USB 设备的 总线 必须是 usb 。需要额外的属性类型,与其中一个支持的串行设备类型匹配,以描述隧道的主机物理机器侧: type='tcp' 或 type='spicevmc' (它使用 SPICE 图形设备的 usbredir 频道)是典型的。redirdev 元素具有一个可选的子元素(sub-element) 地址 ,可将设备绑定到特定控制器。根据给定 类型 ,但不需要 目标 子元素(因为字符设备的使用者是虚拟机监控程序本身,而不是在客户机虚拟机中可见的设备),所以可能需要 source 。 |
boot | 指定该设备是可引导的。order 属性决定了在引导序列期间尝试设备的顺序。per-device 引导元素无法与 BIOS 引导装载程序中的一般引导元素一起使用。 |
redirfilter | 这用于创建过滤器规则,以过滤从重定向过滤某些设备。它使用 sub-element usbdev 定义每个过滤规则。class 属性是 USB 类代码。 |
23.17.7. SmartCard 设备
smartcard
元素提供给客户端虚拟机。主机物理机器上的 USB 智能卡读取器设备不能用于有设备透传的客户机虚拟机。这是因为,主机物理机和客户机虚拟机均不能使用,并且在从客户机虚拟机中删除时,它可以锁定主机物理计算机。因此,一些虚拟机监控程序提供了一个特殊的虚拟设备,可向客户机虚拟机提供智能卡接口,有几种模式来描述如何从主机物理机器获取凭证,甚至是从创建到第三方智能卡供应商的频道中获取的模式。
图 23.45. devices - 智能卡设备
... <devices> <smartcard mode='host'/> <smartcard mode='host-certificates'> <certificate>cert1</certificate> <certificate>cert2</certificate> <certificate>cert3</certificate> <database>/etc/pki/nssdb/</database> </smartcard> <smartcard mode='passthrough' type='tcp'> <source mode='bind' host='127.0.0.1' service='2001'/> <protocol type='raw'/> <address type='ccid' controller='0' slot='0'/> </smartcard> <smartcard mode='passthrough' type='spicevmc'/> </devices> ...
智能卡元素
具有强制属性 模式
。在每个模式下,客户机虚拟机会在其 USB 总线中看到类似物理 USB CCID(Chip/Smart 卡接口设备)的设备。
表 23.19. SmartCard 模式元素
参数 | 描述 |
---|---|
mode='host' | 在这个模式中,虚拟机监控程序会将客户机虚拟机的所有请求中继到通过 NSS 对主机物理机器的智能卡进行直接访问。不需要其他属性或子元素。请参阅以下关于使用可选的 地址 子元素的信息。 |
mode='host-certificates' | 这个模式允许您提供三个驻留在主机物理机器数据库中的 NSS 证书名称,而不是要求将智能卡插入到主机物理机器中。这些证书可以使用命令 certutil -d /etc/pki/nssdb -x -t CT,CT,CT -S -s CN=cert1 -n cert1 -n cert1,并且生成的三个证书名称必须作为三个 证书子元素 的内容提供。额外的子元素 数据库 可以指定到备用目录的绝对路径(与创建证书时的 -d 标志匹配);如果不存在,则默认为 /etc/pki/nssdb 。 |
mode='passthrough' | 使用此模式,您可以通过二级字符设备将所有请求连接到第三方提供程序(这样又可能会与智能卡通信或使用三个证书文件),而不是让管理程序直接与主机物理机器通信。在这种运行模式中,需要额外的属性 类型 ,与支持的串行设备类型之一匹配,用于描述隧道的主机物理机器侧; type='tcp' 或 type='spicevmc' (使用 SPICE 图形设备的智能卡频道)是典型的。可根据给定类型需要其他子元素,如 源 ,但不需要 目标 子元素(因为字符设备的使用者是虚拟机监控程序本身,而不是在客户机虚拟机中可见的设备)。 |
地址
,它可以微调智能卡和合计总线控制器之间的相关性。如需更多信息,请参阅 第 23.17.2 节 “设备地址”。
23.17.8. 网络接口
图 23.46. devices - 网络接口
... <devices> <interface type='direct' trustGuestRxFilters='yes'> <source dev='eth0'/> <mac address='52:54:00:5d:c7:9e'/> <boot order='1'/> <rom bar='off'/> </interface> </devices> ...
"direct"
- 将 guest 虚拟机的 NIC 附加到主机物理计算机上的物理 NIC。详情请查看 第 23.17.8.6 节 “将附件直接附加到物理接口”。"网络"
- 建议使用动态或无线网络配置在主机物理机器上连接常规客户机虚拟机的建议配置。详情请查看 第 23.17.8.1 节 “虚拟网络”。"bridge"
- 这是在主机物理机器上使用静态有线网络配置的客户机虚拟机连接的建议配置设置。详情请查看 第 23.17.8.2 节 “网桥到 LAN”。"Ethernet"
- 提供了一种方法,供管理员执行任意脚本以将客户机虚拟机的网络连接到 LAN。详情请查看 第 23.17.8.5 节 “通用以太网连接”。"hostdev"
- 允许将 PCI 网络设备直接分配给客户机虚拟机,使用通用设备透传。详情请查看 第 23.17.8.7 节 “PCI 透传”。"mcast"
- 多播组可用于代表虚拟网络。详情请查看 第 23.17.8.8 节 “多播隧道”。"用户"
- 使用 user 选项设置用户空间 SLIRP 堆栈参数,为外界提供包含 NAT 的虚拟 LAN。详情请查看 第 23.17.8.4 节 “用户空间 SLIRP 堆栈”。"服务器"
- 使用 server 选项创建 TCP 客户端-服务器架构,以便提供一个虚拟网络,其中一个客户机虚拟机提供网络服务器端,所有其他客户端虚拟机都被配置为客户端。详情请查看 第 23.17.8.9 节 “TCP 隧道”。
<trustGuestRxFilters>
属性定义 <每个接口>
元素,以允许主机物理计算机检测和信任从客户机虚拟机接收的报告。每次接口接收对过滤器的更改时,会发送这些报告。这包括对主 MAC 地址、设备地址过滤器或 vlan 配置的更改。出于安全考虑,<trustGuestRxFilters>
属性会被默认禁用。另请注意,对此属性的支持取决于客户机网络设备模型以及主机物理计算机的连接类型。目前,它只支持 virtio 设备模型以及主机物理计算机上的 macvtap 连接。建议设置可选参数 <trustGuestRxFilters>
的简单用例是,如果您希望为客户机虚拟机提供控制主机物理机器侧过滤器的权限,因为客户机设置的任何过滤器也将在主机上进行镜像。
<interface>
元素还可使用可选 <地址>
子元素,可以将接口绑定到特定的 PCI 插槽,属性 type='pci'
。如需更多信息,请参阅 第 23.17.2 节 “设备地址”。
23.17.8.1. 虚拟网络
<网络定义>
中单独描述。此外,它还提供了一个连接,其中包含由指定网络定义描述的详细信息。根据虚拟网络的 转发模式
配置,网络可以完全隔离(无所给的 <转发>
元素),使用 NAT 连接到显式网络设备或默认路由(forward mode='nat'
)、路由 no NAT(转发模式='route'
),或者直接连接到主机物理机器的网络接口(使用 macvtap)或网桥设备(使用 macvtap 模式(forward mode='bridge|private|passve
))的名称。
网桥
、private
、vepa
和 passthrough
模式的网络,则假定主机物理计算机已在 libvirt 范围之外设置。对于隔离、nat 和路由网络,DHCP 和 DNS 由 libvirt 在虚拟网络中提供,可通过使用 virsh net-dumpxml [networkname] 检查虚拟网络配置来确定 IP 范围。"默认"虚拟网络是设置开箱即用的,它使用 NAT 连接到默认路由,并且 IP 范围为 192.168.122.0/255.255.255.0。每个客户机虚拟机都会创建一个关联的 tun 设备,其名称为 vnetN,它也可通过 <target>
元素覆盖(请参考 第 23.17.8.11 节 “覆盖 target 元素”)。
<直接>
网络连接(如下所示),类型为 network
的连接可能会指定 <虚拟>
端口元素,其中要转发到 802.1Qbg 或 802.1Qbh 兼容 虚拟以太网端口聚合器 (VEPA)交换机或 Open vSwitch 虚拟交换机。
<network>
元素中的配置设置,因此可以接受省略 <virtualport 类型>
属性。您需要指定一次或多次 <指定虚拟>
端口类型。当域启动时,通过组合到定义的类型和属性来构成完整 <的虚拟端口>
元素。这会生成新构建的虚拟端口。请注意,较低虚拟端口的属性无法对高虚拟端口中定义的属性进行更改。接口具有最高优先级,而端口组优先级最低。
profileid
和 interfaceid
。从虚拟端口填写的其他属性(如 managerid
、typeid
或 profileid
)是可选的。
图 23.47. devices - 网络接口
... <devices> <interface type='network'> <source network='default'/> </interface> ... <interface type='network'> <source network='default' portgroup='engineering'/> <target dev='vnet7'/> <mac address="00:11:22:33:44:55"/> <virtualport> <parameters instanceid='09b11c53-8b5c-4eeb-8f00-d84eaa0aaa4f'/> </virtualport> </interface> </devices> ...
23.17.8.2. 网桥到 LAN
tun
设备使用名称 <vnetN>
创建,该设备也可通过 <target>
元素覆盖(请参考 第 23.17.8.11 节 “覆盖 target 元素”)。<tun>
设备将从属于网桥。IP 范围或网络配置与 LAN 中使用的内容相同。这为 guest 虚拟机提供完全传入和传出的网络访问,就像物理计算机一样。
virtualport type='openvswitch'/
来连接到 Open vSwitch 网桥设备。Open vSwitch 类型 虚拟
端口接受 其参数
元素中的两个参数: interfaceid
是一个用于唯一标识此特定接口的标准 UUID(如果您不指定,则首先定义接口时将生成一个随机的 interfaceid
),以及发送到 Open vSwitch 作为接口 <port-profile>
的可选 配置文件id
。要将网桥设置为 LAN 设置,请使用用来配置以下域 XML 部分的管理工具:
图 23.48. devices - 网络接口到 LAN
... <devices> ... <interface type='bridge'> <source bridge='br0'/> </interface> <interface type='bridge'> <source bridge='br1'/> <target dev='vnet7'/> <mac address="00:11:22:33:44:55"/> </interface> <interface type='bridge'> <source bridge='ovsbr'/> <virtualport type='openvswitch'> <parameters profileid='menial' interfaceid='09b11c53-8b5c-4eeb-8f00-d84eaa0aaa4f'/> </virtualport> </interface> ... </devices>
23.17.8.3. 设置端口伪装范围
图 23.49. 端口伪装范围
<forward mode='nat'> <address start='1.2.3.4' end='1.2.3.10'/> </forward> ...
23.17.8.4. 用户空间 SLIRP 堆栈
图 23.50. 设备 - 网络接口 SLIRP 堆栈
... <devices> <interface type='user'/> ... <interface type='user'> <mac address="00:11:22:33:44:55"/> </interface> </devices> ...
23.17.8.5. 通用以太网连接
vnetN
创建的 <tun>
设备,该设备也可通过 <target>
元素覆盖。创建 tun
设备后,将运行 shell 脚本并完成所需的主机物理机器网络集成。默认情况下,此脚本称为 /etc/qemu-ifup
,但可以被覆盖(请参阅 第 23.17.8.11 节 “覆盖 target 元素”)。
图 23.51. devices - 网络接口通用以太网连接
... <devices> <interface type='ethernet'/> ... <interface type='ethernet'> <target dev='vnet7'/> <script path='/etc/qemu-ifup-mynet'/> </interface> </devices> ...
23.17.8.6. 将附件直接附加到物理接口
模式
属性值 vepa
("虚拟以太网端口聚合器")之一,可以为 macvtap 设备的操作模式选择 桥接
或私有
。vepa
是默认模式。
图 23.52. devices - 网络接口直接附加到物理接口
... <devices> ... <interface type='direct'> <source dev='eth0' mode='vepa'/> </interface> </devices> ...
表 23.20. 将附件直接附加到物理接口元素
元素 | 描述 |
---|---|
vepa | 所有客户机虚拟机的数据包都发送到外部网桥。目的地为同一主机物理计算机上的虚拟客户机虚拟机的数据包,该数据包源自于 VEPA 能力网桥(日常网桥通常不是 VEPA 功能)发送至主机物理计算机。 |
bridge | 其目的地位于与它们源自于目标 macvtap 设备的相同主机物理计算机上的数据包。origin 和 destination 设备都需要处于网桥模式,以进行直接发送。如果其中任何一个处于 vepa 模式,则需要一个有 VEPA 的网桥。 |
私有 | 所有数据包都发送到外部网桥,并且仅发送到同一主机物理计算机上的目标虚拟机,如果它们通过外部路由器或网关发送,设备会将它们发回到主机物理计算机。如果源或者目标设备处于私有模式,则会显示这个过程。 |
passthrough | 此功能将具有 SR-IOV 功能的虚拟功能直接附加到客户机虚拟机,而不丢失迁移功能。所有数据包都发送到配置的网络设备的 VF/IF。根据设备的功能,可能会应用额外的先决条件或限制;例如,这需要内核 2.6.38 或更高版本。 |
表 23.21. 将附件直接附加到物理接口额外元素
元素 | 描述 |
---|---|
managerid | VSI Manager ID 标识包含 VSI 类型和实例定义的数据库。这是一个整数值,值 0 为保留。 |
typeid | VSI 类型 ID 标识了 VSI 类型字符化网络访问。VSI 类型通常由网络管理员管理。这是一个整数值。 |
typeidversion | VSI Type Version 允许多个 VSI 类型版本。这是一个整数值。 |
instanceid | 当创建 VSI 实例(虚拟机的虚拟接口)时,将生成 VSI 实例 ID 标识符。这是一个全局唯一标识符。 |
profileid | 配置集 ID 包含要应用到此接口的端口配置文件的名称。此名称由 port profile 数据库解析为网络参数,这些网络参数将应用到这个接口。 |
图 23.53. devices - 网络接口直接附加到物理接口附加参数
... <devices> ... <interface type='direct'> <source dev='eth0.2' mode='vepa'/> <virtualport type="802.1Qbg"> <parameters managerid="11" typeid="1193047" typeidversion="2" instanceid="09b11c53-8b5c-4eeb-8f00-d84eaa0aaa4f"/> </virtualport> </interface> </devices> ...
图 23.54. devices - 网络接口 - 直接附加到物理接口更多的附加参数
... <devices> ... <interface type='direct'> <source dev='eth0' mode='private'/> <virtualport type='802.1Qbh'> <parameters profileid='finance'/> </virtualport> </interface> </devices> ...
profileid
属性包含要应用到此接口的端口配置集的名称。此名称由 port profile 数据库解析为网络参数,这些网络参数将应用到这个接口。
23.17.8.7. PCI 透传
源
元素指定)直接分配给使用通用设备透传的客户机虚拟机,然后选择性地将设备的 MAC 地址设置为配置的值,并使用可选指定 的虚拟端口
元素将设备与 802.1Qbh 功能关联(请参阅上面为 type='direct'
网络设备提供的虚拟端口的示例)。请注意,由于标准单一端口 PCI 以太网卡驱动程序设计的限制,只能以这种方式分配 SR-IOV(单根 I/O 虚拟化)虚拟功能(VF)设备。要为客户机虚拟机分配标准单端口 PCI 或 PCIe 以太网卡,请使用传统的 hostdev
设备定义。
hostdev
设备的功能非常相似,此方法允许为传递设备指定 MAC 地址 和虚拟
端口。如果不需要这些功能,如果您有一个标准的单端口 PCI、PCIe 或 USB 网卡,且不支持 SR-IOV(因此,在分配给客户机虚拟机域后,或者在将设备分配给客户机虚拟机域后仍然会丢失配置 MAC 地址,或者使用 0.9.11 旧的 libvirt 版本,请使用标准 hostdev
定义,而不是将设备分配给客户机虚拟机而不是 ='host 类型
)。
图 23.55. devices - 网络接口 PCI 透传
... <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> ...
23.17.8.8. 多播隧道
接口类型
并创建多播隧道,并将其设置为 mcast
,并提供 mac 地址和 源地址
,例如:
图 23.56. 设备 - 网络接口多播隧道
... <devices> <interface type='mcast'> <mac address='52:54:00:6d:90:01'> <source address='230.0.0.1' port='5558'/> </interface> </devices> ...
23.17.8.9. TCP 隧道
接口类型
创建 TCP 隧道,并将其设置为 mcast
,并提供 mac 地址和 源地址
,例如:
图 23.57. devices - 网络接口 TCP 隧道
... <devices> <interface type='server'> <mac address='52:54:00:22:c9:42'> <source address='192.168.0.1' port='5558'/> </interface> ... <interface type='client'> <mac address='52:54:00:8b:c9:51'> <source address='192.168.0.1' port='5558'/> </interface> </devices> ...
23.17.8.10. 设置 NIC 驱动程序的特定选项
的驱动程序
子元素的属性。这些选项通过使用管理工具来配置域 XML 的以下部分来设置:
图 23.58. devices - 网络接口设置 NIC 驱动程序特定选项
<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> ...
表 23.22. VirtIO NIC 驱动程序元素
参数 | 描述 |
---|---|
名称 | 可选 name 属性强制使用哪个类型的后端驱动程序。该值可以是 kvm (用户空间后端)或 vhost (一个内核后端,它需要由内核提供 vhost 模块);尝试要求 vhost 驱动程序(没有内核支持)将被拒绝。如果 vhost 驱动程序存在,默认设置为 vhost,但若不存在,将静默回退到 kvm 。 |
txmode | 指定在传输缓冲区已满时如何处理数据包传输。该值可以是 iothread 或 timer 。如果设置为 iothread ,则数据包 tx 在驱动程序的下半的 iothread 中完成(此选项转换为将 "tx=bh" 添加到 kvm 命令行 "-net-pci 选项)。如果设置为 timer ,则 KVM 中已执行 tx 工作,如果当前时间有超过 tx 数据,则会在 KVM 迁移到其他操作前设置一个计时器才能执行其他操作;当计时器触发时,将另一个尝试发送更多数据。不建议更改此值。 |
ioeventfd | 为接口设备设置域 I/O 异步处理。默认值由虚拟机监控程序自行决定。接受的值为 on 和 off 。启用此选项可让 KVM 在单独线程处理 I/O 时执行客户机虚拟机。通常,在 I/O 期间,遇到高系统 CPU 利用率的客户机虚拟机将从此中受益。另一方面,过载物理主机计算机也可以增加客户机虚拟机 I/O 延迟。不建议更改此值。 |
event_idx | event_idx 属性控制设备事件处理的一些方面。在 上 ,值可以是 . 或 off ,它可减少中断次数并退出客户机虚拟机。 如果这种行为是 sub-optimal,则此属性提供了一种强制关闭该功能的方法。不建议更改此值。 |
23.17.8.11. 覆盖 target 元素
图 23.59. devices - 网络接口覆盖 target 元素
... <devices> <interface type='network'> <source network='default'/> <target dev='vnet1'/> </interface> </devices> ...
vnet
或 vif
开头,它们是 libvirt 和某些虚拟机监控程序保留的前缀。使用这些前缀手动指定目标将被忽略。
23.17.8.12. 指定引导顺序
图 23.60. 指定引导顺序
... <devices> <interface type='network'> <source network='default'/> <target dev='vnet1'/> <boot order='1'/> </interface> </devices> ...
23.17.8.13. Interface ROM BIOS 配置
图 23.61. Interface ROM BIOS 配置
... <devices> <interface type='network'> <source network='default'/> <target dev='vnet1'/> <rom bar='on' file='/etc/fake/boot.bin'/> </interface> </devices> ...
bar
属性可以设置为 on
或 关闭
,并确定该设备的 ROM 是否可以在客户机虚拟机的内存映射中看到。(在 PCI 文档中,rom bar
设置会控制 ROM 的 Base Address Register。如果没有指定 rom 条
,将使用 KVM 默认版本(默认情况下使用 KVM 的旧版本,而较新的 KVM 管理程序则默认使用 )。
可选的 file
属性用于指向要作为设备的 ROM BIOS 向 guest 虚拟机呈现的二进制文件。这对为网络设备提供替代引导 ROM 非常有用。
23.17.8.14. 服务质量(QoS)
带宽
元素最多可以有一个入站和一个出站子元素。离开任何这些子元素后,不会将 QoS 应用到该流量方向。因此,要仅形成域的传入流量,仅使用入站流量,反之亦然。
的平均
属性均有一个强制属性( 或
下文所述)。average
指定接口生成的平均位速率。另外,有两个可选属性:
peak
- 此属性指定网桥可以发送数据的最大速率,以千字节为单位。这种实现的一个限制是出站元素中的此属性,因为 Linux 入口过滤器尚不知道它。burst
- 指定在峰值速度上可以突发的字节数。属性接受的值是整数。
平均
和 峰值
属性的单位是每秒的 KB 数,而 突发
仅以 KB 为单位设置。另外,入站流量也可以有 floor
属性。这保证了组成接口的最小吞吐量。使用 floor
要求所有流量都经过一个点,因为 QoS 决策可以发生的地方。因此,当 接口 type='network'/
带有 转发
类型为 route
、nat
或 no forward 时,才可以使用它。请注意,在虚拟网络中,所有连接接口至少需要入站 QoS 设置(至少平均为
),但 floor 属性不需要指定 平均
。但是,峰值
和 突发
属性仍需要 平均
。目前,ingress qdiscs 可能没有任何类,因此 floor
只能应用到入站流量,而不能为出站流量。
图 23.62. 服务质量
... <devices> <interface type='network'> <source network='default'/> <target dev='vnet0'/> <bandwidth> <inbound average='1000' peak='5000' floor='200' burst='1024'/> <outbound average='128' peak='256' burst='256'/> </bandwidth> </interface> <devices> ...
23.17.8.15. 设置 VLAN 标签(仅支持网络类型)
图 23.63. 设置 VLAN 标签(仅支持网络类型)
... <devices> <interface type='bridge'> <vlan> <tag id='42'/> </vlan> <source bridge='ovsbr0'/> <virtualport type='openvswitch'> <parameters interfaceid='09b11c53-8b5c-4eeb-8f00-d84eaa0aaa4f'/> </virtualport> </interface> <devices> ...
vlan
元素可以指定一个或多个 VLAN 标签,以应用到客户机虚拟机的网络流量。只有 OpenvSwitch 和 type='hostdev 的
SR-IOV 接口支持透明的 VLAN 标记客户机虚拟机流量;其他接口(包括标准 Linux 网桥和 libvirt 自身的虚拟网络)不支持它。802.1Qbh(vn-link)和 802.1Qbg(VEPA)交换机提供自己的方法(在 libvirt 外),以在特定 VLAN 上标记客户机虚拟机流量。要允许多个标签规格(如果是 VLAN 中继),tag
子元素指定要使用的 VLAN 标签(例如,标签 id='42'/
)。如果接口定义了多个 vlan
元素,则假定用户希望利用所有指定标签进行 VLAN 中继。如果需要使用单一标签的 VLAN 中继,可选属性 trunk='yes'
可以添加到顶级 vlan
元素中。
23.17.8.16. 修改虚拟链接状态
状态
的可能值是 up
和 down
。如果将 down
指定为值,接口的行为就像网络电缆的断开连接一样。如果这个元素未指定,则默认行为为
。
图 23.64. 修改虚拟链接状态
... <devices> <interface type='network'> <source network='default'/> <target dev='vnet0'/> <link state='down'/> </interface> <devices> ...
23.17.9. 输入设备
图 23.65. 输入设备
... <devices> <input type='mouse' bus='usb'/> </devices> ...
<input>
元素具有一个强制属性: 键入
,它可以设置为 鼠标或 tablet
.tablet
提供绝对光标移动,而 鼠标
使用相对移动。可以使用可选的 bus
属性来优化确切的设备类型,并可设置为 kvm
(半虚拟化)、ps2
和 usb
。
<地址>
,它可以将设备绑定到特定的 PCI 插槽(如上所述)。
23.17.10. hub Devices
图 23.66. hub 设备
... <devices> <hub type='usb'/> </devices> ...
hub
元素有一个强制属性,键入
,它只能设置为 usb
。hub
元素有一个可选的 sub-element 地址为
,类型为='usb'
,可将设备绑定到特定控制器。
23.17.11. 图形帧缓冲
图 23.67. 图形帧缓冲
... <devices> <graphics type='sdl' display=':0.0'/> <graphics type='vnc' port='5904'> <listen type='address' address='1.2.3.4'/> </graphics> <graphics type='rdp' autoport='yes' multiUser='yes' /> <graphics type='desktop' fullscreen='yes'/> <graphics type='spice'> <listen type='network' network='rednet'/> </graphics> </devices> ...
graphics
元素具有强制 类型
属性,它取值 sdl
、vnc
、rdp
、desktop
或 spice
,如下表中所述:
表 23.23. 图形帧缓冲主要元素
参数 | 描述 |
---|---|
sdl | 这会在主机物理机器桌面上显示一个窗口。它接受以下可选参数:
|
vnc | 启动 VNC 服务器。
|
spice | 启动 SPICE 服务器.
|
频道
元素
。有效频道名称包括 主
、显示
、输入
、光标
、回放
、记录
、智能卡
和 usbredir
。
图 23.68. SPICE 配置示例
<graphics type='spice' port='-1' tlsPort='-1' autoport='yes'> <channel name='main' mode='secure'/> <channel name='record' mode='insecure'/> <image compression='auto_glz'/> <streaming mode='filter'/> <clipboard copypaste='no'/> <mouse mode='client'/> </graphics>
compression
属性来配置:
镜像
设置映像压缩(接受auto_glz
、auto_
、lz
quic
、glz、lz、off
)- 通过 WAN 对 JPEG 压缩进行 JPEG 的 JPEG 压缩(接受
自动
,永不
是 ) - 用于配置 WAN 镜像压缩(接受
自动
压缩,从
、always
)和回放
的zlib
启用音频流压缩(接受或关闭
)
streaming
元素设置流模式。mode
属性可以设置为 filter
、all或
off
。
剪贴板
元素设置。默认情况下启用它,可将 copypaste
属性设置为 no
来禁用。
mouse
元素设置鼠标模式。mode
属性可以设置为 server
或 client
。如果没有指定模式,则使用 KVM 默认(客户端
模式)。
表 23.24. 其他图形帧缓冲元素
参数 | 描述 |
---|---|
rdp | 启动 RDP 服务器。
|
desktop | 这个值目前为 VirtualBox 域保留。它显示了主机物理机器桌面上的窗口,与 sdl 类似,但使用 VirtualBox viewer。与 sdl 一样,它接受 显示的 可选属性和 全屏 。 |
listen | 可以指定单独的子元素(请参阅上面的示例),而不是输入用于图形类型的侦听套接字 vnc 和 spice ,而是输入单独的子元素(请参阅上面的示例):
|
23.17.12. 视频设备
图 23.69. 视频设备
... <devices> <video> <model type='vga' vram='8192' heads='1'> <acceleration accel3d='yes' accel2d='yes'/> </model> </video> </devices> ...
graphics
元素具有一个强制 类型
属性,它取值"sdl"、"vnc"、"rdp"或"desktop",如下所述:
表 23.25. 图形帧缓冲元素
参数 | 描述 |
---|---|
video | 视频 元素是描述视频设备的容器。为了向后兼容,如果没有设置视频,但域 XML 中有一个图形元素,则 libvirt 将根据客户机虚拟机类型添加默认 视频 。 如果没有提供 "ram" 或 "vram",则会使用默认值。 |
model | 这具有一个强制 类型 属性,它取值 vga 、cirrus 、vmvga 、kvm 、vbox 或 qxl ,具体取决于可用的虚拟机监控程序功能。您还可以使用 vram 提供以 kibibytes(1024 字节块)的视频内存量以及头条数据的数量。 |
加速 | 如果支持加速,则应使用 加速 元素中的 accel3d 和 accel2d 属性启用。 |
address | 可以使用可选的地址子元素将视频设备绑定到特定的 PCI 插槽。 |
23.17.13. Console、Serial 和 Channel Devices
图 23.70. 控制台、串行和频道设备
... <devices> <serial type='pty'> <source path='/dev/pts/3'/> <target port='0'/> </serial> <console type='pty'> <source path='/dev/pts/4'/> <target port='0'/> </console> <channel type='unix'> <source mode='bind' path='/tmp/guestfwd'/> <target type='guestfwd' address='10.0.2.1' port='4600'/> </channel> </devices> ...
控制台
、频道
)都描述了如何将设备出现在客户机虚拟机中。
客户机虚拟机接口由 target
元素配置。向主机物理计算机呈现的界面在顶级元素的 type
属性中给出。主机物理机器接口由 source 元素配置。source
元素可以包含可选的 seclabel
,以覆盖在套接字路径上进行标记的方式。如果这个元素不存在,则安全标签将从每个域设置中继承。每个字符 device 元素都有一个可选的子元素 地址
,可将设备绑定到特定控制器或 PCI 插槽。
isa-parallel
设备。
23.17.14. 客户端虚拟机接口
图 23.71. 客户端虚拟机接口串行端口
... <devices> <serial type='pty'> <source path='/dev/pts/3'/> <target port='0'/> </serial> </devices> ...
<目标>
可以有一个 port
属性,用于指定端口号。端口从 0 开始编号。通常有 0、1 或 2 个串行端口。还有一个可选的 type
属性,其值有两个选择,即 isa-serial
或 usb-serial
。如果缺少 类型
,则默认为 isa-serial
。对于 usb-serial
,带有 type='usb'
的可选子元素 <地址>
可将设备绑定到特定控制器(如上所述)。
<console>
元素用于表示交互式控制台。根据正在使用的客户机虚拟机类型,控制台可能是半虚拟设备,或者可能是串行设备的克隆,具体取决于以下规则:
- 如果没有设置
targetType
属性,则默认设备类型
将根据虚拟机监控程序的规则进行。当将 XML 重新查询到 libvirt 时,将添加默认类型。对于完全虚拟化的虚拟机,默认设备类型通常是串行端口。
- 如果
targetType
属性是serial
,如果没有<serial>
元素,则 console 元素将复制到<serial>
元素。如果<serial>
元素已经存在,则 console 元素将被忽略。 - 如果
targetType
属性不是serial
,它将被正常对待。 - 只有第一个
<console>
元素才能使用serial
的targetType
。辅助控制台必须全部是半虚拟化的。 - 在 s390 中,console 元素可以使用
sclp
或sclplm
的targetType
(line mode)。SCLP 是 s390 的原生控制台类型。没有与 SCLP 控制台关联的控制器。
/dev/hvc[0-7]
(更多信息,请参阅 Fedora 项目的 virtio-serial 页面)中公开 virtio控制台设备:
图 23.72. 客户机虚拟机接口 - virtio 控制台设备
... <devices> <console type='pty'> <source path='/dev/pts/4'/> <target port='0'/> </console> <!-- KVM virtio console --> <console type='pty'> <source path='/dev/pts/5'/> <target type='virtio' port='0'/> </console> </devices> ... ... <devices> <!-- KVM s390 sclp console --> <console type='pty'> <source path='/dev/pts/1'/> <target type='sclp' port='0'/> </console> </devices> ...
<target>
元素具有与串行端口相同的属性。通常只有一个控制台。
23.17.15. Channel
图 23.73. Channel
... <devices> <channel type='unix'> <source mode='bind' path='/tmp/guestfwd'/> <target type='guestfwd' address='10.0.2.1' port='4600'/> </channel> <!-- KVM virtio channel --> <channel type='pty'> <target type='virtio' name='arbitrary.virtio.serial.port.name'/> </channel> <channel type='unix'> <source mode='bind' path='/var/lib/libvirt/kvm/f16x86_64.agent'/> <target type='virtio' name='org.kvm.guest_agent.0'/> </channel> <channel type='spicevmc'> <target type='virtio' name='com.redhat.spice.0'/> </channel> </devices> ...
<target>
元素的 type
属性中给出具体 <频道类型>
。不同的频道类型具有不同的目标属性,如下所示:
guestfwd
- 将客户机虚拟机发送的 TCP 流量发送到给定的 IP 地址,端口转发到主机物理计算机上的频道设备。target
元素必须具有地址和端口属性。virtio
- 半虚拟化 virtio<频道。频道>
在/dev/vport*
下的客户机虚拟机中公开,如果指定了可选元素名称
/dev/virtio-ports/$name
(更多信息,请参阅 Fedora 项目的 virtio-serial 页面)。可选元素地址
可以将频道绑定到特定类型='virtio-serial'
控制器。使用 KVM 时,如果 name 为 "org.kvm.guest_agent.0",则 libvirt 可以与客户机虚拟机中安装的客户机代理进行交互,用于进行客户机虚拟机关闭或文件系统等操作。spicevmc
- 半虚拟化 SPICE 频道.域还必须有 SPICE 服务器作为图形设备,其指向主机物理机器在主频道之间恢复消息。target
元素必须存在,属性type='virtio';
可选属性名称控制虚拟客户机如何对频道的访问权限,并且默认为name
='com.redhat.spice.0'<address>
元素可将频道绑定到特定类型='virtio-serial'
控制器。
23.17.16. 主机物理接口
表 23.26. 字符设备元素
参数 | 描述 | XML 片断 |
---|---|---|
域日志文件 | 禁用字符设备上的所有输入,并将输出发送到虚拟机的日志文件中。 |
|
设备日志文件 | 一个文件被打开,发送到字符设备的所有数据都会写入该文件。请注意,目标目录必须具有 virt_log_t SELinux 标签,以便具有此设置的 guest 标签才能成功启动。 |
|
虚拟控制台 | 在虚拟控制台中将字符设备连接到图形帧缓冲。这通常使用一个特殊的热键序列,如 "ctrl+alt+3"。 |
|
null 设备 | 将字符设备连接到 void。没有为输入提供任何数据。写入的所有数据都会被丢弃。 |
|
伪 TTY | 使用 /dev/ptmx 分配 Pseudo TTY。virsh console 等合适的客户端可以在本地与串行端口交互。 |
|
NB 特殊情况 | 如果 <控制台类型='pty',则 TTY 路径也会作为顶层 标签上的属性 tty='/dev/pts/3' 重复。这为 <console> 标签提供了与现有的语法。 | |
主机物理机器设备代理 | 字符设备通过 传递到底层物理字符设备。设备类型必须匹配,例如,模拟串行端口应仅连接到主机物理机器串行端口 - 不将串行端口连接到并行端口。 |
|
命名管道 | 字符设备将输出写入命名管道。有关详细信息,请参见 pipe(7)手册页。 |
|
TCP client-server | 字符设备充当连接到远程服务器的 TCP 客户端。 |
或者作为 TCP 服务器等待客户端连接。
或者,您可以使用 telnet 而不是原始 TCP。另外,您还可以使用 telnet(安全 telnet)和 tls。
|
UDP 网络控制台 | 字符设备充当 UDP netconsole 服务、发送和接收数据包。这是丢失的服务。 |
|
UNIX 域套接字客户端-服务器 | 字符设备充当 UNIX 域套接字服务器,接受本地客户端的连接。 |
|
23.17.17. 声音设备
sound
元素将虚拟声卡附加到主机物理计算机上。
图 23.74. 虚拟声卡
... <devices> <sound model='ac97'/> </devices> ...
sound
元素包含一个强制属性,即 model
,它指定模拟良好的设备。有效值特定于底层虚拟机监控程序,但典型的选择是 'sb16'
、'ac97'
和 'ich6'
。此外,设置了 "ich6"
模型的声音元素也可以有可选的 codec
子元素,用于将各种音频代码附加到音频设备。
如果没有指定,则会附加默认的 codec 以允许回放和记录。有效值为 'duplex'
(非行和换行符)和 'micro'
(非发言人和微电话)。
图 23.75. 声音设备
... <devices> <sound model='ich6'> <codec type='micro'/> <sound/> </devices> ...
<地址>
,可以将设备绑定到特定的 PCI 插槽(上面记录的)。
23.17.18. watchdog 设备
<watchdog>
设备。watchdog 设备需要在客户机虚拟机中附加驱动程序和管理守护进程。目前,当 watchdog 触发时不支持通知。
图 23.76. watchdog 设备
... <devices> <watchdog model='i6300esb'/> </devices> ... ... <devices> <watchdog model='i6300esb' action='poweroff'/> </devices> ...
model
- 必需的model
属性指定模拟真正的 watchdog 设备。有效值特定于底层虚拟机监控程序。model
属性可能采用以下值:i6300esb
- 建议的设备,模拟 PCI Intel 6300ESBib700
- 模拟 ISA iBase IB700
action
- 可选action
属性描述了 watchdog 过期时要执行的操作。有效值特定于底层虚拟机监控程序。action
属性可以具有以下值:重置
- 默认设置,强制重置 guest 虚拟机shutdown
- 正常关闭 guest 虚拟机(不推荐)poweroff
- 强制关闭客户机虚拟机暂停
- 暂停客户机虚拟机none
- 不执行任何操作dump
- 自动转储客户机虚拟机。
23.17.19. 设置 Panic 设备
pvpanic
机制检测 Linux 客户机虚拟机内核 panic。调用 pvpanic
时,pvpanic 会将一条信息发送到 libvirtd
守护进程,后者将启动预配置的反应。
pvpanic
设备,请执行以下操作:
- 在主机计算机上的
/etc/libvirt/qemu.conf
文件中添加或取消注释以下行:auto_dump_path = "/var/lib/libvirt/qemu/dump"
- 运行 virsh edit 命令以编辑指定 guest 的域 XML 文件,并将
panic
添加到设备
父级元素中。<devices> <panic> <address type='isa' iobase='0x505'/> </panic> </devices>
<address>
元素指定 panic 的地址。默认 ioport 为 0x505。在大多数情况下,不需要指定地址。
libvirtd
响应崩溃的方式是由域 XML 的 <on_crash>
元素决定的。可能的操作如下:
coredump-destroy
- 捕获客户机虚拟机的内核转储并关闭客户端。coredump-restart
- 捕获客户机虚拟机的内核转储并重启客户机。preserve
- 将客户机虚拟机引导至等待进一步操作。
pvpanic
的更多信息,请参阅 相关知识库文章。
23.17.20. 内存 Balloon 设备
<当前内存>
与 <内存设置>
之间的区别决定。例如,如果 <内存>
设置为 2 GiB,并且 <当前Memory>
设为 1 GiB,则 balloon 包含 1 GiB。如果需要手动配置,可以使用 virsh setmem 命令设置 <当前的Memory>
值,并使用 virsh setmaxmem 命令设置 <内存值>
。
<修改当前内存>
的值,请确保为客户机操作系统有足够的内存才能正常工作。如果设置值太低,客户机可能会变得不稳定。
<memballoon>
元素表示。内存膨胀由 libvirt
服务管理,并在适当的情况下自动添加。因此,除非需要分配一个特定的 PCI 插槽,否则不需要在客户机虚拟机 XML 中显式添加此元素。请注意,如果需要显式禁用 <memballoon>
设备,可以使用 model='none'
。
libvirt
自动添加的 memballoon 设备:
图 23.77. 内存 balloon 设备
... <devices> <memballoon model='virtio'/> </devices> ...
图 23.78. 手动添加内存 balloon 设备
... <devices> <memballoon model='virtio'> <address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x0'/> </memballoon> </devices> ...
模型
属性指定提供哪种类型的 balloon 设备。有效值特定于虚拟化平台;在 KVM 管理程序中,'virtio'
是默认设置。
23.18. 存储池
<池>
。它只有一个属性 类型
,它可采用以下值:dir、fs、netfs、disk、iscsi、logical、scsi、mpath、rbd、sheepdog
或 gluster
。
23.18.1. 为存储池提供元数据
图 23.79. 常规元数据标签
<pool type="iscsi"> <name>virtimages</name> <uuid>3e3fce45-4f53-4fa7-bb32-11f34168b82b</uuid> <allocation>10000000</allocation> <capacity>50000000</capacity> <available>40000000</available> ... </pool>
表 23.27. virt-sysprep 命令
元素 | 描述 |
---|---|
<名称> | 为存储池提供一个名称,对于主机物理机器必须是唯一的。在定义存储池时这是必须的。 |
<uuid> | 为存储池提供必须全局唯一的标识符。虽然提供 UUID 是可选的,但如果创建存储池时没有提供 UUID,则会自动生成 UUID。 |
<allocation> | 为存储池提供总存储分配。由于元数据开销,这可能大于所有存储卷中分配的总和。这个值以字节为单位表示。此元素为只读,不应更改值。 |
<capacity> | 提供池的总存储容量。由于底层设备限制,可能无法对存储卷使用完整的容量。这个值以字节为单位。此元素为只读,不应更改值。 |
<可用> | 提供可在存储池中分配新存储卷的可用空间。由于底层设备限制,可能无法将所有可用空间分配给单个存储卷。这个值以字节为单位。此元素为只读,不应更改值。 |
23.18.2. 源元素
<在池>
元素内,可以定义单一 <源>
元素(只能一个)。<源的子元素>
取决于存储池类型。以下是可以使用的 XML 的一些示例:
图 23.80. 源元素选项 1
... <source> <host name="iscsi.example.com"/> <device path="demo-target"/> <auth type='chap' username='myname'> <secret type='iscsi' usage='mycluster_myname'/> </auth> <vendor name="Acme"/> <product name="model"/> </source> ...
图 23.81. 源元素选项 2
... <source> <adapter type='fc_host' parent='scsi_host5' wwnn='20000000c9831b4b' wwpn='10000000c9831b4b'/> </source> ...
<>
表 23.28. 源子元素命令
元素 | 描述 |
---|---|
<device> | 为由主机物理机器设备支持的存储池提供源(基于 <池 type=> (如 第 23.18 节 “存储池” 所示)。根据后端驱动程序,可以重复多次。包含一个属性 路径 ,它是块设备节点的完全限定路径。 |
<dir> | 为由目录(<池类型='dir')支持的存储池> 提供源,或选择基于文件系统的存储池中的子目录(<池类型='gluster'> )。此元素可能仅每一次(<池> )。此元素接受单个属性(<路径> ),这是到后备目录的完整路径。 |
<adapter> | 为 SCSI 适配器支持的存储池提供源(<池 type='scsi'> )。此元素可能仅每一次(<池> )。属性名称是 SCSI 适配器名称(ex. "scsi_host1"。虽然 "host1" 仍支持向后兼容,但不建议这样做。属性 类型 指定适配器类型。有效值为 'fc_host'| 'scsi_host' 。如果省略并指定了 name 属性,则默认为 type='scsi_host' 。为保持向后兼容性, 适配器的属性类型是可选的,但 type='fc_host' adapter 是必需的。属性 wwn (Word Wide Node Name)和 wwpn (Word Wide Port Name)由 type='fc_host' 适配器用来唯一标识光纤通道存储结构中的设备(该设备可以是 HBA 或 vHBA)。必须指定 wwn 和 wwpn。有关如何获得(v)HBA 的 wwn/wwpn 的说明,请参考 第 20.27.11 节 “收集设备配置设置”。可选属性 parent 指定 type='fc_host' adapter 的父设备。 |
<主机> | 为从远程服务器存储支持的存储池提供源(type='netfs'|'iscsi'|'sheepdog'|'gluster'|'sheepdog'|'gluster' )。此元素应当与 <目录或> <设备元素组合使用> 。包含属性名称,即 服务器的主机名或 IP 地址。可以选择性地包含协议特定端口号的 port 属性。 |
<auth> | 如果存在,<auth> 元素通过设置 type 属性(pool type='iscsi'|'rbd' )提供访问源所需的身份验证凭证。类型 必须是 ='chap' 或 type='ceph' 。将"ceph"用于 Ceph RBD(Rados 块设备)网络源,将 "iscsi" 用于 CHAP(Challenge-Handshake Authentication Protocol)iSCSI 目标。另外,必需属性 username 可识别在身份验证期间使用的用户名以及带有强制属性类型的子元素 secret,以将其绑定到含有实际密码或其他凭证的 libvirt secret 对象。域 XML 有意不会公开密码,只向管理密码的对象的引用。secret 元素需要带有 secret 对象的 UUID 的 uuid 属性,或者与 secret 对象中指定的密钥匹配的用法属性。 |
<名称> | 从指定元素类型提供由存储设备支持的存储池源,它可取值:( )。 |
<format> | 提供有关存储池类型格式的信息,它可采用以下值: )。请注意,此值特定于后端。这通常用来指示文件系统类型或网络文件系统类型,或者分区表类型或者 LVM 元数据类型。因为所有驱动程序都需要具有默认值,所以该元素是可选的。 |
<vendor> | 提供有关存储设备供应商的可选信息。它包含单一 <属性名称> ,其值特定于后端。 |
<product> | 提供有关存储设备产品名称的可选信息。它包含单一 <属性名称> ,其值特定于后端。 |
23.18.3. 创建目标元素
<target>
元素包含在以下类型的顶层 <池>
元素中:(键入='dir'|'fs'|'netfs'|'disk'|'disk'|'iscsi'|'scsi'|'mpath'
)。该标签用于描述存储池到主机文件系统的映射。它可以包含以下子元素:
图 23.82. 目标元素 XML 示例
<pool> ... <target> <path>/dev/disk/by-path</path> <permissions> <owner>107</owner> <group>107</group> <mode>0744</mode> <label>virt_image_t</label> </permissions> <timestamps> <atime>1341933637.273190990</atime> <mtime>1341930622.047245868</mtime> <ctime>1341930622.047245868</ctime> </timestamps> <encryption type='...'> ... </encryption> </target> </pool>
<目标>
元素中有效的子元素:
表 23.29. 目标子元素
元素 | 描述 |
---|---|
<路径> | 提供存储池将映射到本地文件系统命名空间的位置。对于基于文件系统或者目录的存储池,它将是创建存储卷的目录的名称。对于基于设备的存储池,它将是设备节点所在的目录的名称。对于后者,/dev/ 可能像逻辑选择一样,但是,设备的节点无法保证系统重启后稳定,因为它们根据需要进行分配。最好使用稳定位置,例如其中一个 /dev/disk/by-{path,id,uuid,label} 位置。 |
<权限> | 目前,这仅适用于基于目录或文件系统的存储池,它们作为目录映射到本地文件系统命名空间中。它提供有关构建存储池时用于最终目录的权限的信息。<mode> 元素包含八进制权限集。<owner> 元素包含数字用户 ID。<group> 元素包含数字组 ID。<label> 元素包含 MAC(如 SELinux)标签字符串。 |
<timestamps> | 提供有关存储卷的时间信息。最多四个子元素存在,其中 timestamp ='atime'|'ctime|'ctime'|'ctime' |'mtime' 包含访问、更改、更改和修改存储卷的时间。使用的时间格式为。< 自 epoch 的开头(1 Jan 1970 年 1 月 1 日)开始。如果 host 操作系统或文件系统不支持 nano 秒分辨率为 0,则省略纳秒部分。这是只读属性,在创建存储卷时忽略。 |
<encryption> | 如果存在,指定存储卷的加密方式。如需更多信息,请参阅 libvirt 上游页面。 |
23.18.4. 设置设备扩展
<源>
元素中的 <device>
元素可能包含可用扩展的信息。某些存储池有一个约束,必须完全在一个约束(如磁盘分区池)内分配存储卷。因此,应用程序可以通过扩展信息来确定新存储卷的最大可能大小。
<每个设备>
元素内都将有零个或多个 <自由>
的元素。这些元素各自包含两个属性,即 <start>
和 <end>
,它可提供设备的扩展边界,单位为字节。
23.19. 存储卷
23.19.1. 常规元数据
<volume>
元素的 top 部分包含称为元数据的信息,如这个 XML 示例所示:
图 23.83. 存储卷的一般元数据
... <volume type='file'> <name>sparse.img</name> <key>/var/lib/libvirt/images/sparse.img</key> <allocation>0</allocation> <capacity unit="T">1</capacity> ... </volume>
<卷>
元素中有效的子元素:
表 23.30. 卷子元素
元素 | 描述 |
---|---|
<名称> | 为存储卷提供一个名称,它对存储池是唯一的。在定义存储卷时这是必须的。 |
<key> | 提供用于标识单个存储卷的存储卷的标识符。在某些情况下,可以有不同的键标识单个存储卷。在创建存储卷时无法设置此字段,因为它总是被生成。 |
<allocation> | 提供存储卷的总存储分配。如果存储卷被稀疏分配,这可能会小于逻辑容量。如果存储卷消耗大量元数据,则可能大于逻辑容量。这个值以字节为单位。如果在创建存储卷时省略,存储卷会在创建时被完全分配。如果设置为小于容量的值,则存储池可以选择决定为稀疏分配存储卷。不同类型的存储池可能会以不同的方式对待稀疏存储卷。例如,逻辑池不会在其满时自动扩展存储卷的分配;用户负责配置它或将 dmeventd 配置为自动这样做。默认情况下,这以字节为单位指定。请查看 注意 |
<capacity> | 为存储卷提供逻辑容量。默认情况下,这个值以字节为单位,但可以使用与 注意 所述相同的语义指定 <单位> 属性。<> 在创建存储卷时这是组合的。 |
<source> | 提供有关存储卷的基本存储分配的信息。这可能不适用于某些存储池类型。 |
<目标> | 提供有关本地主机物理机器上存储卷的表示信息。 |
单元
来调整传递值。此属性可与元素 <分配>
<和容量>
一起使用。属性 单元可接受的值包括
:
b
或bytes
(以字节为单位)KB
代表 KBk
或KiB
用于 kibibytesMB
表示 MBM
或MiB
代表兆字节GB
表示 GBg
或GiB
用于千兆字节TB
代表 TBT
或TiB
代表 tebibytesPB
for PB for PBP
或PiB
代表 pebibytesEB
用于 exabytese
或EiB
表示 exbibytes
23.19.2. 设置目标元素
<target>
元素可以放入 <卷>
顶级元素中。它被用来描述存储卷上在主机物理计算机文件系统中完成的映射。这个元素可能采用以下子元素:
图 23.84. 目标子元素
<target> <path>/var/lib/libvirt/images/sparse.img</path> <format type='qcow2'/> <permissions> <owner>107</owner> <group>107</group> <mode>0744</mode> <label>virt_image_t</label> </permissions> <compat>1.1</compat> <features> <lazy_refcounts/> </features> </target>
<目标>
的特定子元素在 表 23.31 “目标子元素” 中阐述:
表 23.31. 目标子元素
元素 | 描述 |
---|---|
<路径> | 提供在本地文件系统上访问存储卷的位置,作为绝对路径。这是一个只读属性,不应在创建卷时指定。 |
<format> | 提供有关池特定卷格式的信息。对于基于磁盘的存储池,它将提供分区类型。对于文件系统或基于目录的存储池,它将提供文件格式类型(如 cow、qcow、vmdk、raw)。如果在创建存储卷时省略,则使用存储池的默认格式。实际格式由 type 属性指定。如需有效值列表,请参阅 第 13.2 节 “使用存储池” 中特定存储池的部分。 |
<权限> | 提供有关创建存储卷时要使用的默认权限的信息。目前,这仅适用于目录或基于文件系统的存储池,其中分配的存储卷是简单文件。对于存储卷为设备节点的存储池,热插拔脚本决定权限。它包含四个子元素:<mode> 元素包含八进制权限集。<owner> 元素包含数字用户 ID。<group> 元素包含数字组 ID。<label> 元素包含 MAC(如 SELinux)标签字符串。 |
<compat> | 指定兼容性级别。目前,这仅用于 <type='qcow2'> 卷。有效值为 <compat> 0.10</compat> for qcow2(版本 2)和</ 1.1 compat for qcow2(版本 3),目前用于指定镜像应兼容的 QEMU 版本。如果存在 <feature> 元素,则会使用</ 1.1 compat。如果省略,则使用 qemu-img default。 |
<功能> | 特定于格式的功能。介绍仅用于 <格式 type='qcow2'/> (版本 3)。有效子元素包括 <lazy_refcounts/> 。这可减少元数据写入和清除量,从而改进初始写入性能。这种改进特别适用于直写缓存模式,在崩溃后需要修复镜像并允许延迟引用计数器更新。建议您在 qcow2(版本 3)中使用此功能,因为实现此功能时速度更快。 |
23.19.3. 设置备份存储元素
<后备Store>
元素包含在顶级 <卷元素中>
。此标签用于描述存储卷的可选写时复制后备存储。它可以包含以下子元素:
图 23.85. 后备存储子元素
<backingStore> <path>/var/lib/libvirt/images/master.img</path> <format type='raw'/> <permissions> <owner>107</owner> <group>107</group> <mode>0744</mode> <label>virt_image_t</label> </permissions> </backingStore>
表 23.32. 后备存储子元素
元素 | 描述 |
---|---|
<路径> | 提供在本地文件系统上访问后备存储的位置,作为绝对路径。如果省略,则没有这个存储卷的后备存储。 |
<format> | 提供有关池特定后备存储格式的信息。对于基于磁盘的存储池,它将提供分区类型。对于文件系统或基于目录的存储池,它将提供文件格式类型(如 cow、qcow、vmdk、raw)。实际格式通过 <type> 属性指定。如需有效值列表,请参阅特定于池的文档。大多数文件格式都需要一种相同格式的后备存储,但 qcow2 格式则允许不同的后备存储格式。 |
<权限> | 提供有关备份文件的权限的信息。它包含四个子元素:<owner> 元素包含数字用户 ID。<group> 元素包含数字组 ID。<label> 元素包含 MAC(如 SELinux)标签字符串。 |
23.20. 安全标签
<seclabel>
元素允许控制安全驱动程序的运行。有三种基本操作模式: 'dynamic'
,libvirt 会自动生成唯一的安全标签 "静态"
,其中应用程序/管理员选择标签或 "none"(
其中禁用限制)。使用动态标签生成时,libvirt 将始终自动重新标记与虚拟机关联的任何资源。使用静态标签分配时,管理员或应用程序必须确保在任何资源上正确设置标签,但在需要时可以启用自动重新标记。
模型
来定义。顶级安全标签的有效输入 XML 配置有:
图 23.86. 安全标签
<seclabel type='dynamic' model='selinux'/> <seclabel type='dynamic' model='selinux'> <baselabel>system_u:system_r:my_svirt_t:s0</baselabel> </seclabel> <seclabel type='static' model='selinux' relabel='no'> <label>system_u:system_r:svirt_t:s0:c392,c662</label> </seclabel> <seclabel type='static' model='selinux' relabel='yes'> <label>system_u:system_r:svirt_t:s0:c392,c662</label> </seclabel> <seclabel type='none'/>
"type"
属性,则将使用安全驱动程序默认设置,这可能是 "无"
或 "动态"。
如果设置了 <baselabel>
但没有设置 'type'
,则类型会假定为 'dynamic'
。当查看带有自动资源重新标记 active 的正在运行的虚拟客户机的 XML 时,将包括额外的 XML 元素 imagelabel
。这是一个只输出的元素,在用户提供的 XML 文档中将忽略它。
类型
-使用静态
、动态
或无
操作来确定 libvirt 是否自动生成唯一的安全标签。model
- 与当前激活的安全模型匹配的有效安全模型名称。重新标记
- 是的,或
没有
。如果使用动态标签分配,则必须始终为yes
。使用静态标签分配时,将默认为no
。<label>
- 如果使用静态标签,则必须指定分配给虚拟域的完整安全标签。内容的格式取决于所使用的安全驱动程序:SELinux
:SELinux 上下文.AppArmor
:Armor 配置集。DAC
: owner 和 group 以冒号分隔。它们可以定义为用户/组名称或 UID/GID。驱动程序将首先尝试将这些值解析为名称,但前导加号可用于强制驱动程序将其解析为 UID 或 GID。
<baselabel>
- 如果使用动态标签,可以选择性地使用它来指定基本安全标签。内容的格式取决于所使用的安全驱动程序。<imagelabel>
- 这是一个输出元素,它显示与虚拟域关联的资源上所使用的安全标签。内容的格式取决于所使用的安全驱动程序。当重新标记生效时,还可以通过禁用标签(如果 NFS 或其它文件系统中缺少安全标签)或请求备用标签(当管理应用创建特殊标签时,可以微调标签)或请求备用标签(在某个域间共享特殊标签时,使用该文件)。当 seclabel 元素附加到特定路径而不是顶级域分配时,只支持属性 relabel 或 sub-element 标签。
23.21. 示例虚拟机 XML 配置
表 23.33. 示例域 XML 配置
域 XML 部分 | 描述 |
---|---|
<domain type='kvm'> <name>Testguest1</name> <uuid>ec6fbaa1-3eb4-49da-bf61-bb02fbec4967</uuid> <memory unit='KiB'>1048576</memory> <currentMemory unit='KiB'>1048576</currentMemory> <vcpu placement='static'>1</vcpu> | 这是名为 Testguest1 的 KVM,分配了 1024 MiB 的 RAM。有关配置常规虚拟机参数的详情,请参考 第 23.1 节 “通用信息和元数据”。 |
<vcpu placement='static'>1</vcpu> | 客户机虚拟机有 1 个分配的 vCPU。有关 CPU 分配的详情,请参考 第 23.4 节 “CPU 分配”。 |
<os> <type arch='x86_64' machine='pc-i440fx-2.9'>hvm</type> <boot dev='hd'/> </os> | 机器构架被设置为 AMD64 和 Intel 64 架构,并使用 Intel 440FX 机器类型来决定功能兼容性。从硬盘引导操作系统。有关修改操作系统参数的详情,请参考 第 23.2 节 “操作系统引导”。 |
<features> <acpi/> <apic/> <vmport state='off'/> </features> | 虚拟机监控程序功能 acpi 和 apic 被禁用,并关闭 VMWare IO 端口。有关修改虚拟机监控程序功能的详情,请参考 -第 23.14 节 “Hypervisor 功能”。 |
<cpu mode='host-passthrough' check='none'/> | 客户机 CPU 功能与主机 CPU 上的功能相同。有关修改 CPU 功能的详情,请参考 -第 23.12 节 “CPU 型号和拓扑”。 |
<clock offset='utc'> <timer name='rtc' tickpolicy='catchup'/> <timer name='pit' tickpolicy='delay'/> <timer name='hpet' present='no'/> </clock> | 客户机的虚拟硬件时钟使用 UTC 时区。另外,设置了三个不同的计时器以便与 QEMU 管理程序同步。有关修改时间保存设置的详情,请参考 -第 23.15 节 “timekeeping”。 |
<on_poweroff>destroy</on_poweroff> <on_reboot>restart</on_reboot> <on_crash>destroy</on_crash> | 当虚拟机关闭或操作系统意外终止时,libvirt 会终止客户机并释放其所有分配的资源。重新引导 guest 后,它会使用相同的配置来重新启动。有关配置这些设置的详情请参考 -第 23.13 节 “事件配置”。 |
<pm> <suspend-to-mem enabled='no'/> <suspend-to-disk enabled='no'/> </pm> | 这个客户机虚拟机的 S3 和 S4 ACPI 睡眠状态被禁用。 |
<devices> <emulator>/usr/bin/qemu-kvm</emulator> <disk type='file' device='disk'> <driver name='qemu' type='qcow2'/> <source file='/var/lib/libvirt/images/Testguest.qcow2'/> <target dev='hda' bus='ide'/> <address type='drive' controller='0' bus='0' target='0' unit='0'/> </disk> <disk type='file' device='cdrom'> <driver name='qemu' type='raw'/> <target dev='hdb' bus='ide'/> <readonly/> <address type='drive' controller='0' bus='0' target='0' unit='1'/> </disk> | 虚拟机使用 /usr/bin/qemu-kvm 二进制文件模拟。另外,它连接了两个磁盘。第一个磁盘是基于主机上存储的 /var/lib/libvirt/images/Testguest.qcow2 的虚拟硬盘,其逻辑设备名称被设置为 hda 。有关管理磁盘的更多信息,请参阅 -第 23.17.1 节 “硬盘驱动器、软盘和 CD-ROMs”。 |
<controller type='usb' index='0' model='ich9-ehci1'> <address type='pci' domain='0x0000' bus='0x00' slot='0x05' function='0x7'/> </controller> <controller type='usb' index='0' model='ich9-uhci1'> <master startport='0'/> <address type='pci' domain='0x0000' bus='0x00' slot='0x05' function='0x0' multifunction='on'/> </controller> <controller type='usb' index='0' model='ich9-uhci2'> <master startport='2'/> <address type='pci' domain='0x0000' bus='0x00' slot='0x05' function='0x1'/> </controller> <controller type='usb' index='0' model='ich9-uhci3'> <master startport='4'/> <address type='pci' domain='0x0000' bus='0x00' slot='0x05' function='0x2'/> </controller> <controller type='pci' index='0' model='pci-root'/> <controller type='ide' index='0'> <address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x1'/> </controller> <controller type='virtio-serial' index='0'> <address type='pci' domain='0x0000' bus='0x00' slot='0x06' function='0x0'/> </controller> | 虚拟机使用四个控制器来附加 USB 设备,以及用于 PCI-Express(PCIe)设备的 root 控制器。另外,可以使用 virtio-serial 控制器,它可让虚拟机以各种方式与主机交互,如串行控制台。有关配置控制器的更多信息,请参阅 -第 23.17.3 节 “Controller”。 |
<interface type='network'> <mac address='52:54:00:65:29:21'/> <source network='default'/> <model type='rtl8139'/> <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/> </interface> | 在虚拟机中设置了网络接口,它使用 default 虚拟网络和 rtl8139 网络设备模型。有关配置网络接口的详情,请参考 -第 23.17.8 节 “网络接口”。 |
<serial type='pty'> <target port='0'/> </serial> <console type='pty'> <target type='serial' port='0'/> </console> <channel type='spicevmc'> <target type='virtio' name='com.redhat.spice.0'/> <address type='virtio-serial' controller='0' bus='0' port='1'/> </channel> | 在虚拟机上设置了一个 pty 串行控制台,它可启用与主机通信最多的辅助虚拟机。控制台使用泛虚拟化 SPICE 频道。这个设置是自动设置的,我们不推荐修改这些设置。有关字符设备的概述,请参考 -第 23.17.8 节 “网络接口”。有关 串行端口 和 控制台的详情, 请参考 第 23.17.14 节 “客户端虚拟机接口”。有关 频道 的详情,请参考 第 23.17.15 节 “Channel”。 |
<input type='mouse' bus='ps2'/> <input type='keyboard' bus='ps2'/> | 虚拟机使用虚拟 ps2 端口,该端口设置为接收鼠标和键盘输入。这个设置是自动设置的,我们不推荐修改这些设置。如需更多信息,请参阅 第 23.17.9 节 “输入设备”。 |
<graphics type='spice' autoport='yes'> <listen type='address'/> <image compression='off'/> </graphics> | 虚拟机使用 SPICE 协议,通过自动分配的端口号和关闭映像压缩渲染其图形输出。有关配置图形设备的详情,请参考 第 23.17.11 节 “图形帧缓冲”。 |
<sound model='ich6'> <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x0'/> </sound> <video> <model type='qxl' ram='65536' vram='65536' vgamem='16384' heads='1' primary='yes'/> <address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x0'/> </video> | 为虚拟机设置了 ICH6 HDA 声音设备,QEMU QXL 半虚拟帧缓冲设备则设置为视频加速器。这个设置是自动设置的,我们不推荐修改这些设置。有关配置 声设备 的详情,请参考 第 23.17.17 节 “声音设备”。有关配置 视频设备 ,请参考 第 23.17.12 节 “视频设备”。 |
<redirdev bus='usb' type='spicevmc'> <address type='usb' bus='0' port='1'/> </redirdev> <redirdev bus='usb' type='spicevmc'> <address type='usb' bus='0' port='2'/> </redirdev> <memballoon model='virtio'> <address type='pci' domain='0x0000' bus='0x00' slot='0x07' function='0x0'/> </memballoon> </devices> </domain> | 虚拟机有两个重定向程序来远程附加 USB 设备,打开 内存 ballooning。这个设置是自动设置的,我们不推荐修改这些设置。详情请查看 第 23.17.6 节 “重定向的设备” |
部分 III. 附录
附录 A. 故障排除
A.1. 调试和故障排除工具
- kvm_stat - 检索 KVM 运行时统计信息.如需更多信息,请参阅 第 A.4 节 “kvm_stat”。
- ftrace - Traces 内核事件。如需更多信息,请参阅什么是 ftrace 以及如何使用? 解决方案文章(需要订阅 )。
- vmstat - 显示虚拟内存统计信息。有关更多信息,请使用 man vmstat 命令。
- iostat - 提供 I/O 负载统计数据.如需更多信息,请参阅 Red Hat Enterprise Linux 性能调优指南
- lsof - 列出打开文件.有关更多信息,请使用 man lsof 命令。
- SystemTap - 用于监控操作系统的脚本实用程序。如需更多信息,请参阅 Red Hat Enterprise Linux 开发人员指南。
- 崩溃 - 分析内核崩溃转储数据或实时系统。如需更多信息,请参阅 Red Hat Enterprise Linux Kernel Crash 转储指南。
- sysrq - 内核在控制台不响应时响应的关键组合。如需更多信息,请参阅 Red Hat 知识库。
- ip addr,ip route, 和 ip monitor
- tcpdump - 诊断网络上的数据包流量。此命令可用于查找网络身份验证中的网络异常和问题。tcpdump 的图形版本名为 wireshark。
- brctl - 检查并配置 Linux 内核中的以太网网桥配置的网络实用程序。例如:
$ brctl show bridge-name bridge-id STP enabled interfaces ----------------------------------------------------------------------------- virtbr0 8000.feffffff yes eth0 $ brctl showmacs virtbr0 port-no mac-addr local? aging timer 1 fe:ff:ff:ff:ff: yes 0.00 2 fe:ff:ff:fe:ff: yes 0.00 $ brctl showstp virtbr0 virtbr0 bridge-id 8000.fefffffffff designated-root 8000.fefffffffff root-port 0 path-cost 0 max-age 20.00 bridge-max-age 20.00 hello-time 2.00 bridge-hello-time 2.00 forward-delay 0.00 bridge-forward-delay 0.00 aging-time 300.01 hello-timer 1.43 tcn-timer 0.00 topology-change-timer 0.00 gc-timer 0.02
- strace 是一个命令,可跟踪由另一个进程接收和使用的系统调用和事件。
- vncviewer 连接到在服务器或虚拟机上运行的 VNC 服务器。使用 yum install tigervnc 命令安装 vncviewer。
- vncserver 在您的服务器中启动远程桌面。为您提供使用远程会话运行图形用户界面(如 virt-manager)的能力。使用 yum install tigervnc-server 命令安装 vncserver。
A.2. 创建转储文件
<vmcoreinfo/>
元素添加到客户机 XML 配置文件的 <features>
部分。
<vmcoreinfo/>
的操作系统,迁移 使用 <vmcoreinfo/>
的客户机会失败。这包括 Red Hat Enterprise Linux 7.4 及更早版本,以及 Red Hat Enterprise Linux 6.9 及更早版本。
A.2.1. 创建 virsh Dump 文件
A.2.2. 使用 Python 脚本保存内核转储
dump-guest-memory.py
python 脚本实施 GNU Debugger(GDB)扩展,用于提取并保存主机上 qemu-kvm 进程崩溃后内核转储中的客户机内存。如果主机 QEMU 进程崩溃与客户机操作相关,则在 QEMU 进程崩溃时调查客户机状态会很有用。
dump-guest-memory.py
python 脚本:
- 在系统中安装 qemu-kvm-debuginfo 软件包。
- 启动 GDB,打开为崩溃的
/usr/libexec/qemu-kvm
二进制文件保存的核心转储文件。debug 符号会自动加载。 - 在 GDB 中载入新命令:
# source /usr/share/qemu-kvm/dump-guest-memory.py
注意加载 python 脚本后,内置 GDB 帮助命令 可以提供有关dump-guest-memory
扩展的详细信息。 - 在 GDB 中运行命令。例如:
# dump-guest-memory /home/user/extracted-vmcore X86_64
- 使用 crash 实用程序打开
/home/user/extracted-vmcore
,以便虚拟客户机内核分析。
A.3. 使用 Systemtap Flight Recorder 在 Constant Basis 上捕获 Trace 数据
过程 A.1. 配置并运行 systemtap
安装软件包
运行以下命令安装 systemtap-initscript 软件包:# yum install systemtap-initscript
复制配置文件
运行以下命令,将 systemtap 脚本和配置文件复制到 systemtap 目录中:# cp /usr/share/qemu-kvm/systemtap/script.d/qemu_kvm.stp /etc/systemtap/script.d/ # cp /usr/share/qemu-kvm/systemtap/conf.d/qemu_kvm.conf /etc/systemtap/conf.d/
要启用的追踪事件集合在 qemu_kvm.stp 中给出。可以自定义此 SystemTap 脚本来添加或删除/usr/share/systemtap/tapset/qemu-kvm-simpletrace.stp
中提供的 trace 事件。可以对qemu_kvm.conf
进行 SystemTap 自定义,以控制动态记录器缓冲区的大小,以及是否要将 trace 存储到内存中,或在磁盘中。启动服务
运行以下命令启动 systemtap 服务:# systemctl start systemtap qemu_kvm
使 systemtap 已启用在系统引导时运行
运行以下命令,启用 systemtap 服务以在引导时运行:# systemctl enable systemtap qemu_kvm
确认服务正在运行
运行以下命令确认该服务是否正常工作:# systemctl status systemtap qemu_kvm qemu_kvm is running...
过程 A.2. 检查 trace 缓冲
创建 trace 缓冲转储文件
运行以下命令,创建一个名为 trace.log 的 trace 缓冲转储文件,并将其放置在 tmp 目录中:# staprun -A qemu_kvm >/tmp/trace.log
您可以将文件名和位置更改为其他内容。启动服务
当上一步停止该服务时,运行以下命令再次启动该服务:# systemctl start systemtap qemu_kvm
将 trace 内容转换为可读的格式
要将 trace 文件内容转换为更易读的格式,请输入以下命令:# /usr/share/qemu-kvm/simpletrace.py --no-header /usr/share/qemu-kvm/trace-events /tmp/trace.log
- systemtap 服务默认为禁用。
- 启用此服务时,性能较小,但它取决于启用了哪些事件。
/usr/share/doc/qemu-kvm-*/README.systemtap
中有一个 README 文件。
A.4. kvm_stat
kvm
内核模块检索运行时统计信息。kvm_stat 命令可用于诊断对 kvm
可见的客户机行为。特别是,与客户机相关的问题。目前,报告的统计信息适用于整个系统;报告所有正在运行的 guest 的行为。要运行此脚本,您需要安装 qemu-kvm-tools 软件包。如需更多信息,请参阅 第 2.2 节 “在现有 Red Hat Enterprise Linux 系统上安装虚拟化软件包”。
kvm
内核模块并挂载 debugfs。如果没有启用这些功能,命令将输出启用 debugfs 或 kvm
模块所需的步骤。例如:
# kvm_stat
Please mount debugfs ('mount -t debugfs debugfs /sys/kernel/debug')
and ensure the kvm modules are loaded
# mount -t debugfs debugfs /sys/kernel/debug
kvm_stat 输出
kvm_stat 命令输出所有客户机和主机的统计信息。在命令终止前更新输出(使用 Ctrl+c 或 q 键)。请注意,您屏幕上看到的输出可能有所不同。有关输出元素的说明,请点击任何术语来链接到该失效。
# kvm_stat kvm statistics kvm_exit 17724 66 Individual exit reasons follow, see kvm_exit (NAME) for more information. kvm_exit(CLGI) 0 0 kvm_exit(CPUID) 0 0 kvm_exit(CR0_SEL_WRITE) 0 0 kvm_exit(EXCP_BASE) 0 0 kvm_exit(FERR_FREEZE) 0 0 kvm_exit(GDTR_READ) 0 0 kvm_exit(GDTR_WRITE) 0 0 kvm_exit(HLT) 11 11 kvm_exit(ICEBP) 0 0 kvm_exit(IDTR_READ) 0 0 kvm_exit(IDTR_WRITE) 0 0 kvm_exit(INIT) 0 0 kvm_exit(INTR) 0 0 kvm_exit(INVD) 0 0 kvm_exit(INVLPG) 0 0 kvm_exit(INVLPGA) 0 0 kvm_exit(IOIO) 0 0 kvm_exit(IRET) 0 0 kvm_exit(LDTR_READ) 0 0 kvm_exit(LDTR_WRITE) 0 0 kvm_exit(MONITOR) 0 0 kvm_exit(MSR) 40 40 kvm_exit(MWAIT) 0 0 kvm_exit(MWAIT_COND) 0 0 kvm_exit(NMI) 0 0 kvm_exit(NPF) 0 0 kvm_exit(PAUSE) 0 0 kvm_exit(POPF) 0 0 kvm_exit(PUSHF) 0 0 kvm_exit(RDPMC) 0 0 kvm_exit(RDTSC) 0 0 kvm_exit(RDTSCP) 0 0 kvm_exit(READ_CR0) 0 0 kvm_exit(READ_CR3) 0 0 kvm_exit(READ_CR4) 0 0 kvm_exit(READ_CR8) 0 0 kvm_exit(READ_DR0) 0 0 kvm_exit(READ_DR1) 0 0 kvm_exit(READ_DR2) 0 0 kvm_exit(READ_DR3) 0 0 kvm_exit(READ_DR4) 0 0 kvm_exit(READ_DR5) 0 0 kvm_exit(READ_DR6) 0 0 kvm_exit(READ_DR7) 0 0 kvm_exit(RSM) 0 0 kvm_exit(SHUTDOWN) 0 0 kvm_exit(SKINIT) 0 0 kvm_exit(SMI) 0 0 kvm_exit(STGI) 0 0 kvm_exit(SWINT) 0 0 kvm_exit(TASK_SWITCH) 0 0 kvm_exit(TR_READ) 0 0 kvm_exit(TR_WRITE) 0 0 kvm_exit(VINTR) 1 1 kvm_exit(VMLOAD) 0 0 kvm_exit(VMMCALL) 0 0 kvm_exit(VMRUN) 0 0 kvm_exit(VMSAVE) 0 0 kvm_exit(WBINVD) 0 0 kvm_exit(WRITE_CR0) 2 2 kvm_exit(WRITE_CR3) 0 0 kvm_exit(WRITE_CR4) 0 0 kvm_exit(WRITE_CR8) 0 0 kvm_exit(WRITE_DR0) 0 0 kvm_exit(WRITE_DR1) 0 0 kvm_exit(WRITE_DR2) 0 0 kvm_exit(WRITE_DR3) 0 0 kvm_exit(WRITE_DR4) 0 0 kvm_exit(WRITE_DR5) 0 0 kvm_exit(WRITE_DR6) 0 0 kvm_exit(WRITE_DR7) 0 0 kvm_entry 17724 66 kvm_apic 13935 51 kvm_emulate_insn 13924 51 kvm_mmio 13897 50 varl-kvm_eoi 3222 12 kvm_inj_virq 3222 12 kvm_apic_accept_irq 3222 12 kvm_pv_eoi 3184 12 kvm_fpu 376 2 kvm_cr 177 1 kvm_apic_ipi 278 1 kvm_msi_set_irq 295 0 kvm_pio 79 0 kvm_userspace_exit 52 0 kvm_set_irq 50 0 kvm_pic_set_irq 50 0 kvm_ioapic_set_irq 50 0 kvm_ack_irq 25 0 kvm_cpuid 90 0 kvm_msr 12 0
变量解释:
kvm_ack_irq
- 中断确认数量(PIC/IOAPIC)中断确认.kvm_age_page
- 内存管理单元(MMU)通知程序页时迭代的数量.kvm_apic
- APIC 寄存器数目。kvm_apic_accept_irq
- 本地 APIC 中可接受的中断数。kvm_apic_ipi
- 处理器中断的数量.kvm_async_pf_completed
- 异步页面错误完成次数.kvm_async_pf_doublefault
- 异步页面错误的数量停止.kvm_async_pf_not_present
- 异步页面错误初始化号.kvm_async_pf_ready
- 异步页面错误完成次数.kvm_cpuid
- 已执行的 CPUID 指令数。kvm_cr
- 陷阱和模拟控制寄存器(CR)访问(CR0、CR3、CR4、CR8)。kvm_emulate_insn
- 模拟指令的数量。kvm_entry
- 模拟指令的数量。kvm_eoi
- 中断(EOI)通知的可编程中断控制器(APIC)的数量.kvm_exit
-VM-exits
数 .kvm_exit(NAME)
- 特定于处理器的单一退出。如需更多信息,请参阅您的处理器文档。kvm_fpu
- KVM 浮点单元(FPU)的数量.kvm_hv_hypercall
- Hyper-V 超calls 数.kvm_hypercall
- 非Hyper-V 超calls 的数量.kvm_inj_exception
- 注入到 guest 中的异常数量.kvm_inj_virq
- 注入到客户机中的中断数。kvm_invlpga
- INVLPGA 指令的数量已截获。kvm_ioapic_set_irq
- 虚拟 IOAPIC 控制器的中断级别数变化。kvm_mmio
- 模拟内存映射的 I/O(MMIO)操作数量.kvm_msi_set_irq
- 消息信号中断(MSI)的数量。kvm_msr
- 特定型号寄存器(MSR)访问的数量.kvm_nested_intercepts
- L1 mvapich L2 嵌套 SVM 交换机的数量。kvm_nested_vmrun
- L1 nested L2 嵌套 SVM 交换机的数量。kvm_nested_intr_vmexit
- 由于中断窗口导致嵌套虚拟机退出注入的数量。kvm_nested_vmexit
- 在执行嵌套(L2)guest 时退出管理程序.kvm_nested_vmexit_inject
- L2 nested L1 嵌套交换机的数量。kvm_page_fault
- 管理程序处理的页面错误数量.kvm_pic_set_irq
- 对虚拟可编程中断控制器(PIC)的更改。kvm_pio
- 模拟程序 I/O(PIO)操作的数量。kvm_pv_eoi
- 输入的半虚拟化结束(EOI)事件的数量.kvm_set_irq
- 通用 IRQ 控制器级别的中断级别更改(counts PIC、IOAPIC 和 MSI)。kvm_skinit
- SVM SKINIT 的数量可退出。kvm_track_tsc
- 时间戳计数器(TSC)写入的数量。kvm_try_async_get_page
- 异步页面错误尝试次数.kvm_update_master_clock
- pvclock masterclock 更新的数量.kvm_userspace_exit
- 退出给用户空间的数量.kvm_write_tsc_offset
- TSC offset 写入数.vcpu_match_mmio
- SPTE 缓存内存映射的 I/O(MMIO)的数量。
/sys/kernel/debug/tracing/events/kvm/
目录中。
A.5. 使用 Serial Consoles 的故障排除
- 确保 guest 的域 XML 文件包括串行控制台的配置。例如:
<console type='pty'> <source path='/dev/pts/16'/> <target type='virtio' port='1'/> <alias name='console1'/> </console>
- 在客户机上,请遵循 如何为 Red Hat Enterprise Linux 7 启用串行控制台? 文章。
# virsh console guestname
A.6. 虚拟化日志
- 每个客户机都有一个日志,保存在
/var/log/libvirt/qemu/
目录中。日志命名为 GuestName.log,并在达到大小限制时定期压缩。 - auvirt 命令显示与系统管理程序上客户机相关的审核结果。可通过选择特定的客户机、时间范围和信息格式来缩小显示的数据。例如,以下命令提供当前日期的
testguest
虚拟机上的事件摘要。# auvirt --start today --vm testguest --summary Range of time for report: Mon Sep 4 16:44 - Mon Sep 4 17:04 Number of guest starts: 2 Number of guest stops: 1 Number of resource assignments: 14 Number of related AVCs: 0 Number of related anomalies: 0 Number of host shutdowns: 0 Number of failed operations: 0
您还可以配置 auvirt 信息,使其自动包含在systemd
Journal 中。为此,请编辑/etc/libvirt/libvirtd.conf
文件,并将audit_logging
参数的值设置为1
。如需更多信息,请参阅 auvirt man page。 - 如果在 Virtual Machine Manager 中遇到任何错误,您可以检查
$HOME/.virt-manager/
目录中的virt-manager.log
文件中生成的数据。 - 有关虚拟机监控程序系统的审计日志,请查看
/var/log/audit/audit.log
文件。 - 根据客户端操作系统,也可以将各种系统日志文件保存在客户端中。
A.7. 循环设备错误
/etc/modprobe.d/
目录中调整配置的循环设备数量。添加以下行:
options loop max_loop=64
A.8. 实时迁移错误
A.9. 在 BIOS 中启用 Intel VT-x 和 AMD-V 虚拟化硬件扩展
过程 A.3. 在 BIOS 中启用虚拟化扩展
- 重新引导计算机并打开系统的 BIOS 菜单。根据系统,通常可以通过按 删除 键、F1 键或 Alt 和 F4 键来完成此操作。
在 BIOS 中启用虚拟化扩展
注意以下很多步骤可能会因您的主板、处理器类型、芯片组和 OEM 而异。有关配置系统的正确信息,请参阅您的系统附带的文档。- 打开 Processor 子菜单 The processor settings 菜单可以在 Chipset、Advanced CPU Configuration 或 Northbridge 中隐藏。
- 启用 Intel 虚拟化技术 (也称为 Intel VT-x)。在 BIOS 中无法禁用 AMD-V 扩展,应该已经启用。虚拟化扩展可能被标记为虚拟化扩展、 V anderpool 或其他名称,具体取决于 OEM 和系统 BIOS。
- 如果选项可用,启用 Intel VT-d 或 AMD IOMMU。Intel VT-d 和 AMD IOMMU 用于 PCI 设备分配。
- 选择 Save & Exit。
- 重启机器。
- 引导计算机后,运行 grep -E "vmx|svm" /proc/cpuinfo。指定
--color
是可选的,但如果您想要突出显示搜索词,则很有用。如果命令输出,虚拟化扩展现已启用。如果没有输出您的系统可能没有启用虚拟化扩展或正确的 BIOS 设置。
A.10. 在 Red Hat Enterprise Linux 7 主机上关闭 Red Hat Enterprise Linux 6 虚拟机
Minimal
安装选项安装 Red Hat Enterprise Linux 6 虚拟机不会安装 acpid (acpi 守护进程)。Red Hat Enterprise Linux 7 不再需要这个软件包,因为它被 systemd
接管。但是,在 Red Hat Enterprise Linux 7 主机上运行的 Red Hat Enterprise Linux 6 客户机虚拟机仍需要它。
过程 A.4. Red Hat Enterprise Linux 6 客户端临时解决方案
安装 acpid 软件包
acpid 服务侦听和处理 ACPI 请求。登录到客户机虚拟机并在客户机虚拟机上安装 acpid 软件包:# yum install acpid
在客户端中启用 acpid 服务
将acpid
服务设置为在客户机虚拟机启动序列中启动,并启动该服务:# chkconfig acpid on # service acpid start
准备客户机域 XML
编辑域 XML 文件以包含下列元素:将 virtio serial 端口替换为org.qemu.guest_agent.0
,并使用您的客户机的名称而不是显示的端口。在本例中,guest 是 guest1。记得保存文件。图 A.1. 虚拟机 XML 替换
<channel type='unix'> <source mode='bind' path='/var/lib/libvirt/qemu/guest1.agent'/> <target type='virtio' name='org.qemu.guest_agent.0'/> </channel>
安装 QEMU 客户机代理
安装 QEMU 客户机代理(QEMU-GA),并以 Red Hat Enterprise Linux 6 虚拟化管理指南 中的指示启动该服务。关闭客户端
- 列出已知客户机虚拟机,以便可以检索您要关闭的名称。
# virsh list --all Id Name State ---------------------------------- 14 guest1 running
- 关闭客户机虚拟机。
# virsh shutdown guest1 guest virtual machine guest1 is being shutdown
- 等待几秒钟,让 guest 虚拟机关闭。验证它是否已关闭。
# virsh list --all Id Name State ---------------------------------- 14 guest1 shut off
- 使用您编辑的 XML 文件,启动名为 guest1 的客户机虚拟机。
# virsh start guest1
- 关闭 guest1 客户机虚拟机中的 acpi。
# virsh shutdown --mode acpi guest1
- 再次列出所有 guest 虚拟机,guest1 仍应在列表中,并且应指明它已关闭。
# virsh list --all Id Name State ---------------------------------- 14 guest1 shut off
- 使用您编辑的 XML 文件,启动名为 guest1 的客户机虚拟机。
# virsh start guest1
- 关闭 guest1 客户机虚拟机客户机代理。
# virsh shutdown --mode agent guest1
- 列出客户机虚拟机。guest1 应该仍位于列表中,并且应指明它已关闭。
# virsh list --all Id Name State ---------------------------------- guest1 shut off
libvirt-guests
服务来自动关闭 guest。有关这个方法的更多信息,请参阅 第 A.11 节 “允许 Graceful Shutdown 的可选临时解决方案”。
A.11. 允许 Graceful Shutdown 的可选临时解决方案
libvirt-guests
服务有参数设置,可以将其配置为确保客户机可以正常关闭。它是作为 libvirt 安装的一部分的软件包,默认安装。当主机关闭时,这个服务会自动将 guest 保存到磁盘,并在主机重启时将其恢复到其预下状态。默认情况下,此设置被设置为暂停客户机。如果您希望 guest 正常关闭,则需要更改 libvirt-guests
配置文件的其中一个参数。
过程 A.5. 更改 libvirt-guests 服务参数,以允许安全关闭 guest
打开配置文件
配置文件位于/etc/sysconfig/libvirt-guests
中。编辑 文件,删除注释标记(#),并将ON_SHUTDOWN=suspend
更改为ON_SHUTDOWN=shutdown
。记得保存更改。$ vi /etc/sysconfig/libvirt-guests # URIs to check for running guests # example: URIS='default xen:/// vbox+tcp://host/system lxc:///' #URIS=default # action taken on host boot # - start all guests which were running on shutdown are started on boot # regardless on their autostart settings # - ignore libvirt-guests init script won't start any guest on boot, however, # guests marked as autostart will still be automatically started by # libvirtd #ON_BOOT=start # Number of seconds to wait between each guest start. Set to 0 to allow # parallel startup. #START_DELAY=0 # action taken on host shutdown # - suspend all running guests are suspended using virsh managedsave # - shutdown all running guests are asked to shutdown. Please be careful with # this settings since there is no way to distinguish between a # guest which is stuck or ignores shutdown requests and a guest # which just needs a long time to shutdown. When setting # ON_SHUTDOWN=shutdown, you must also set SHUTDOWN_TIMEOUT to a # value suitable for your guests. ON_SHUTDOWN=shutdown # If set to non-zero, shutdown will suspend guests concurrently. Number of # guests on shutdown at any time will not exceed number set in this variable. #PARALLEL_SHUTDOWN=0 # Number of seconds we're willing to wait for a guest to shut down. If parallel # shutdown is enabled, this timeout applies as a timeout for shutting down all # guests on a single URI defined in the variable URIS. If this is 0, then there # is no time out (use with caution, as guests might not respond to a shutdown # request). The default value is 300 seconds (5 minutes). #SHUTDOWN_TIMEOUT=300 # If non-zero, try to bypass the file system cache when saving and # restoring guests, even though this may give slower operation for # some file systems. #BYPASS_CACHE=0
- ???
URIS
- checks the specified connections for a running guest. TheDefault
setting functions in the same manner as virsh does when no explicit URI is set In addition, one can explicitly set the URI from/etc/libvirt/libvirt.conf
. Note that when using the libvirt configuration file default setting, no probing will be used.- ???
ON_BOOT
- specifies the action to be done to / on the guests when the host boots. Thestart
option starts all guests that were running prior to shutdown regardless on their autostart settings. Theignore
option will not start the formally running guest on boot, however, any guest marked as autostart will still be automatically started bylibvirtd
.- ???
- The
START_DELAY
- sets a delay interval in between starting up the guests. This time period is set in seconds. Use the 0 time setting to make sure there is no delay and that all guests are started simultaneously. - ???
ON_SHUTDOWN
- specifies the action taken when a host shuts down. Options that can be set include:suspend
which suspends all running guests using virsh managedsave andshutdown
which shuts down all running guests. It is best to be careful with using theshutdown
option as there is no way to distinguish between a guest which is stuck or ignores shutdown requests and a guest that just needs a longer time to shutdown. When setting theON_SHUTDOWN=shutdown
, you must also setSHUTDOWN_TIMEOUT
to a value suitable for the guests.- ???
PARALLEL_SHUTDOWN
Dictates that the number of guests on shutdown at any time will not exceed number set in this variable and the guests will be suspended concurrently. If set to0
, then guests are not shutdown concurrently.- ???
- Number of seconds to wait for a guest to shut down. If
SHUTDOWN_TIMEOUT
is enabled, this timeout applies as a timeout for shutting down all guests on a single URI defined in the variable URIS. IfSHUTDOWN_TIMEOUT
is set to0
, then there is no timeout (use with caution, as guests might not respond to a shutdown request). The default value is 300 seconds (5 minutes). - ???
BYPASS_CACHE
can have 2 values, 0 to disable and 1 to enable. If enabled it will by-pass the file system cache when guests are restored. Note that setting this may effect performance and may cause slower operation for some file systems.
启动 libvirt-guests 服务
如果您还没有启动该服务,请启动libvirt-guests
服务。不要重启该服务,因为这将导致所有正在运行的 guest 虚拟机关闭。
A.12. KVM 网络性能
e1000
)驱动程序也支持作为仿真驱动程序选择。要使用 e1000
驱动程序,请将以下流程中的 virtio
替换为 e1000
。为了获得最佳性能,建议使用 virtio
驱动程序。
过程 A.6. 切换到 virtio 驱动程序
- 关闭客户端操作系统。
- 使用 virsh 命令编辑 guest 的配置文件(其中
GUEST
是 guest 的名称):# virsh edit
GUEST
virsh edit 命令使用 $EDITOR shell 变量来确定要使用哪些编辑器。 - 找到配置的网络接口部分。本节类似以下片段:
<interface type='network'> [output truncated] <model type='rtl8139' /> </interface>
- 将 model 元素的 type 属性从
'rtl8139'
更改为'virtio'
。这会将 rtl8139 驱动程序中的驱动程序改为 virtio 驱动程序。<interface type='network'> [output truncated] <model type=
'virtio'
/> </interface> - 保存更改并退出文本编辑器
- 重启客户端操作系统。
使用其他网络驱动程序创建新客户端
或者,也可以使用其他网络驱动程序创建新 guest。如果您在通过网络连接安装 guest 时,可能需要这样做。这个方法要求您至少有一个 guest 已创建(可能通过 CD 或者 DVD 安装)以用作模板。
- 从现有 guest(在本示例中,名为 Guest1)创建 XML 模板:
# virsh dumpxml Guest1 > /tmp/guest-template.xml
- 复制并编辑 XML 文件并更新唯一字段:虚拟机名称、UUID、磁盘镜像、MAC 地址以及任何其他唯一参数。请注意,您可以删除 UUID 和 MAC 地址行,virsh 将生成一个 UUID 和 MAC 地址。
# cp /tmp/guest-template.xml /tmp/new-guest.xml # vi /tmp/new-guest.xml
在网络接口部分添加型号行:<interface type='network'> [output truncated] <model type='virtio' /> </interface>
- 创建新虚拟机:
# virsh define /tmp/new-guest.xml # virsh start new-guest
A.13. 使用 libvirt 创建外部快照的临时解决方案
- 内部快照 完全包含在 qcow2 文件中,并且由 libvirt 完全支持,允许创建、删除和恢复快照。这是 libvirt 在创建快照时使用的默认设置,特别是未指定选项时。此文件类型比其他文件创建快照的时间稍长,并且存在需要 qcow2 磁盘的缺陷。重要内部快照不会被主动开发,红帽不建议使用它们。
- 外部快照 可用于任何类型的原始磁盘映像,无需客户机停机时间,而且更稳定可靠。因此,建议在 KVM 客户机虚拟机中使用外部快照。但是,目前没有在 Red Hat Enterprise Linux 7 上完全实现外部快照,在使用 virt-manager 时无法使用。要创建外部快照,请使用 snapshot-create-as 和
--diskspec vda,snapshot=external
选项,或者在快照 XML 文件中使用以下 磁盘 行:<disk name=’vda’ snapshot=’external’> <source file=’/path/to,new’/> </disk>
目前,外部快照是一个单向操作,因为 libvirt 可以创建它们,但无法做任何操作。在 libvirt 上游页面中 描述了一个临时解决方案。
A.14. 在带有日语键盘的客户机控制台中缺少字符
atkdb.c: Unknown key pressed (translated set 2, code 0x0 on isa0060/serio0). atkbd.c: Use 'setkeycodes 00 <keycode>' to make it known.
- 在 virt-manager 中打开受影响的 guest。
- 单击 View → Details。
- 从列表中选择 Display VNC。
- 在" 密钥 映射 "下拉菜单中将 Auto 更改为 ja。
- 点 Apply 按钮。
- 运行 virsh edit guestname
- 将以下属性添加到 <graphics> tag: keymap='ja' 中。例如:
<graphics type='vnc' port='-1' autoport='yes' keymap='ja'/>
A.15. 虚拟机故障切换至关闭
过程 A.7. 在客户机虚拟机中配置客户机代理频道
- 停止 guest 虚拟机。
- 为客户机虚拟机打开 Domain XML,并添加以下内容:
图 A.2. 配置客户机代理频道
<channel type='unix'> <source mode='bind'/> <target type='virtio' name='org.qemu.guest_agent.0'/> </channel>
- 通过运行 virsh start [domain] 启动 guest 虚拟机。
- 在客户机虚拟机(yum install qemu-guest-agent )上安装 qemu-guest-agent,并使其在每次引导时自动运行(qemu-guest-agent.service)。
A.16. 为客户机虚拟机禁用 SMART Disk Monitoring
# service smartd stop # systemctl --del smartd
A.17. libguestfs 故障排除
$ libguestfs-test-tool
===== TEST FINISHED OK =====
A.18. SR-IOV 故障排除
- 启动客户机时出错
- 启动配置的虚拟机时,会出错:
# virsh start test error: Failed to start domain test error: Requested operation is not valid: PCI device 0000:03:10.1 is in use by domain rhel7
此错误通常是由已经分配给另一个虚拟客户机或主机本身的设备所致。 - 迁移、保存或转储客户机时出错
- 尝试迁移并转储虚拟机会导致类似如下的错误:
# virsh dump rhel7/tmp/rhel7.dump error: Failed to core dump domain rhel7 to /tmp/rhel7.dump error: internal error: unable to execute QEMU command 'migrate': State blocked by non-migratable device '0000:00:03.0/vfio-pci'
由于设备分配使用虚拟机启动的特定主机上的硬件,因此在使用设备分配时,不支持客户机迁移和保存。目前,同样的限制也适用于 core-dumping a guest;这可能会在以后有所变化。请注意,除非指定了--memory-only
选项,否则 QEMU 目前不支持在附加了 PCI 设备的虚拟客户机上迁移、保存和转储操作。目前,它只支持使用 USB 设备的这些操作。目前正在做的工作,以便在未来进行这个改进。
A.19. 常见 libvirt 错误和故障排除
表 A.1. 常见 libvirt 错误
Error | 问题描述 | 解决方案 |
---|---|---|
libvirtd 无法启动 | libvirt 守护进程无法启动。但是,/var/log/messages 中没有有关此错误的信息。 | 第 A.19.1 节 “libvirtd 无法启动” |
无法读取 CA 证书 | 这是 URI 无法连接到管理程序时出现的几个错误之一。 | 第 A.19.2 节 “到虚拟机监控程序的 URI 失败” |
其他连接错误 | 这些是 URI 无法连接管理程序时出现的其他错误。 | 第 A.19.2 节 “到虚拟机监控程序的 URI 失败” |
客户端中的 PXE 引导(或 DHCP)失败 | 客户机虚拟机可以成功启动,但无法从 DHCP 获取 IP 地址,或使用 PXE 协议引导。这通常是由于为网桥设置的较长的转发延迟时间,或者当 iptables 软件包和内核不支持 checksum mangling 规则时。 | 第 A.19.3 节 “客户机失败的 PXE 引导(或 DHCP)” |
客户机可以访问外部网络,但在使用 macvtap 接口时无法访问主机 |
客户机可以与其他虚拟客户机通信,但在配置为使用 macvtap(或
type='direct' )网络接口后无法连接到主机。
这实际上不是错误 - 它是 macvtap 的定义的行为。
| 第 A.19.4 节 “Guest Can Reach Outside Network,但在使用 macvtap 界面时可能会重新访问主机” |
无法添加规则来修复网络 "默认"上的 DHCP 响应校验和 | 此警告消息几乎总是没有损害,但通常被误认为是问题证。 | 第 A.19.5 节 “无法添加规则来修复网络 "默认"上的 DHCP 响应校验和” |
无法添加网桥 br0 端口 vnet0:没有这样的设备 | 此错误消息或类似的 Failed 将 tap 接口添加到网桥 'br0' :没有这样的设备 显示客户机(或域) <interface> 定义中指定的网桥设备不存在。 | 第 A.19.6 节 “无法添加网桥 br0 端口 vnet0:没有这样的设备” |
无法解析地址 name_of_host 服务 '49155':未知的名称或服务 | QEMU 虚拟客户机迁移失败,且显示此错误消息并显示不熟悉的主机名。 | 第 A.19.7 节 “migration Fails with error: unables to address ” |
无法允许访问磁盘路径 /var/lib/libvirt/images/qemu.img:没有这些文件或目录 | 无法迁移客户机虚拟机,因为 libvirt 无法访问磁盘映像。 | 第 A.19.8 节 “带有 Unables 的 migration Fails 以允许访问磁盘路径:没有这些文件或目录 ” |
当 libvirtd 启动时没有客户机虚拟机 | libvirt 守护进程成功启动,但在运行 virsh list --all 时不会显示客户机虚拟机。 | 第 A.19.9 节 “当 libvirtd 已启动时,没有演示客户机虚拟机” |
常见 XML 错误 | libvirt 使用 XML 文档来存储结构化的数据。当 XML 文档通过 API 传递至 libvirt 时,会会出现几个常见错误。这个条目提供了编辑客户机 XML 定义的说明,以及 XML 语法和配置中的常见错误。 | 第 A.19.10 节 “常见 XML 错误” |
A.19.1. libvirtd 无法启动
- 症状
- libvirt 守护进程不会自动启动。手动启动 libvirt 守护进程也失败:
# systemctl start libvirtd.service * Caching service dependencies ... [ ok ] * Starting libvirtd ... /usr/sbin/libvirtd: error: Unable to initialize network sockets. Check /var/log/messages or run without --daemon for more info. * start-stop-daemon: failed to start `/usr/sbin/libvirtd' [ !! ] * ERROR: libvirtd failed to start
此外,/var/log/messages
中没有有关此错误的更多信息。 - 正在调查
- 通过启用下面的行 ,更改 libvirt 在
/etc/libvirt/libvirtd.conf
中的登录。要启用设置行,请在文本编辑器中打开/etc/libvirt/libvirtd.conf
文件,从以下行的开头删除 hash(或#
)符号,并保存更改:log_outputs="3:syslog:libvirtd"
注意默认情况下,该行会被注释掉,以防止 libvirt 生成过量日志消息。诊断问题后,建议在/etc/libvirt/libvirtd.conf
文件中再次为该行添加注释。重新启动 libvirt 以确定是否解决了该问题。如果libvirtd
仍然没有成功启动,则会输出类似以下内容的错误:# systemctl restart libvirtd Job for libvirtd.service failed because the control process exited with error code. See "systemctl status libvirtd.service" and "journalctl -xe" for details. Sep 19 16:06:02 jsrh libvirtd[30708]: 2017-09-19 14:06:02.097+0000: 30708: info : libvirt version: 3.7.0, package: 1.el7 (Unknown, 2017-09-06-09:01:55, js Sep 19 16:06:02 jsrh libvirtd[30708]: 2017-09-19 14:06:02.097+0000: 30708: info : hostname: jsrh Sep 19 16:06:02 jsrh libvirtd[30708]: 2017-09-19 14:06:02.097+0000: 30708: error : daemonSetupNetworking:502 : unsupported configuration: No server certif Sep 19 16:06:02 jsrh systemd[1]: libvirtd.service: main process exited, code=exited, status=6/NOTCONFIGURED Sep 19 16:06:02 jsrh systemd[1]: Failed to start Virtualization daemon. -- Subject: Unit libvirtd.service has failed -- Defined-By: systemd -- Support: http://lists.freedesktop.org/mailman/listinfo/systemd-devel -- -- Unit libvirtd.service has failed. -- -- The result is failed.
libvirtd man page 显示,当 libvirt 在TCP/IP 连接
模式下运行时,缺少的cacert.pem
文件将用作 TLS 颁发机构。这表示将传递--listen
参数。 - 解决方案
- 使用以下方法之一配置 libvirt 守护进程的设置:
- 安装 CA 证书。注意有关 CA 证书和配置系统身份验证的更多信息,请参阅 Red Hat Enterprise Linux 7 域身份、身份验证和策略指南中的 管理证书和证书颁发机构章节。
- 不要使用 TLS;改为使用裸机 TCP。在
/etc/libvirt/libvirtd.conf
中设置listen_tls = 0
和listen_tcp = 1
。默认值为listen_tls = 1
,listen_tcp = 0。
- 不要传递
--listen
参数。在/etc/sysconfig/libvirtd.conf
中,更改LIBVIRTD_ARGS
变量。
A.19.2. 到虚拟机监控程序的 URI 失败
A.19.2.1. 无法读取 CA 证书
- 症状
- 在运行命令时,会出现以下错误(或类似):
$ virsh -c qemu://$hostname/system_list error: failed to connect to the hypervisor error: Cannot read CA certificate '/etc/pki/CA/cacert.pem': No such file or directory
- 正在调查
- 错误消息是关于实际原因的误导。此错误可能是由各种因素造成的,如指定的 URI 或未配置的连接。
- 解决方案
- 不正确的指定 URI
- 当将
qemu://system
或qemu://session
指定为连接 URI 时,virsh 尝试分别连接到主机名的系统或
会话
。这是因为 virsh 识别第二个正斜杠之后的文本作为主机。使用三个正斜杠连接到本地主机。例如,指定qemu:///system
会指示 virsh 连接到本地主机上 libvirtd的系统
实例。当指定主机名时,QEMU 传输默认为TLS
。这会导致证书。 - 没有配置连接
- URI 正确(例如
qemu[+tls]://server/system
),但不会在您的机器上正确设置证书。有关配置 TLS 的详情,请查看 上游 libvirt 网站。
A.19.2.2. 无法通过 'host:16509' 连接到服务器:连接已拒绝
- 症状
- 虽然 libvirtd 应该侦听连接的 TCP 端口,但连接会失败:
# virsh -c qemu+tcp://host/system error: failed to connect to the hypervisor error: unable to connect to server at 'host:16509': Connection refused
即使在更改/etc/ libvirt /libvirtd.conf 中的配置后,libvirt
守护进程不会在 TCP 端口上侦听 TCP 端口:# grep listen_ /etc/libvirt/libvirtd.conf listen_tls = 1 listen_tcp = 1 listen_addr = "0.0.0.0"
但是,在更改配置后,libvirt 的 TCP 端口仍会打开:# netstat -lntp | grep libvirtd #
- 正在调查
- libvirt 守护进程在没有
--listen
选项的情况下启动。运行以下命令验证:# ps aux | grep libvirtd root 10749 0.1 0.2 558276 18280 ? Ssl 23:21 0:00 /usr/sbin/libvirtd
输出中不包含--listen
选项。 - 解决方案
- 使用
--listen
选项启动守护进程。要做到这一点,修改/etc/sysconfig/libvirtd
文件并取消注释以下行:# LIBVIRTD_ARGS="--listen"
然后,使用以下命令重启 libvirtd 服务:# /bin/systemctl restart libvirtd.service
A.19.2.3. 身份验证失败
- 症状
- 在运行命令时,会出现以下错误(或类似):
$ virsh -c qemu://$hostname/system_list error: failed to connect to the hypervisor error: authentication failed: authentication failed
- 正在调查
- 如果即使在使用了正确的凭证时也无法身份验证,则可能不会配置 SASL 身份验证。
- 解决方案
- 编辑
/etc/libvirt/libvirtd.conf
文件,并将auth_tcp
参数的值设置为sasl
。验证:# cat /etc/libvirt/libvirtd.conf | grep auth_tcp auth_tcp = "sasl"
- 编辑
/etc/sasl2/libvirt.conf
文件,并将以下几行添加到文件中:mech_list: digest-md5 sasldb_path: /etc/libvirt/passwd.db
- 确定安装了 cyrus-sasl-md5 软件包:
# yum install cyrus-sasl-md5
- 重启
libvirtd
服务:# systemctl restart libvirtd
- 为 libvirt SASL 设置用户名和密码:
# saslpasswd2 -a libvirt 1
A.19.2.4. 权限已拒绝
- 症状
- 当以非 root 用户身份运行 virsh 命令时,会出现以下错误(或类似):
$ virsh -c qemu://$hostname/system_list error: Failed to connect socket to '/var/run/libvirt/libvirt-sock': Permission denied error: failed to connect to the hypervisor
- 解决方案
- 编辑
/etc/libvirt/libvirt.conf
文件,并将以下几行添加到文件中:#unix_sock_group = "libvirt" #unix_sock_ro_perms = "0777" #unix_sock_rw_perms = "0770"
- 重启
libvirtd
服务:# systemctl restart libvirtd
A.19.3. 客户机失败的 PXE 引导(或 DHCP)
- 症状
- 客户机虚拟机可以成功启动,但随后无法从 DHCP 获取 IP 地址或使用 PXE 协议引导。此错误有两个常见原因:为网桥设置了很长时间,当 iptables 软件包和内核不支持 checksum mangling 规则时。
- 网桥上的 forward 延迟时间
- 正在调查
- 这是此错误的最常见原因。如果客户机网络接口连接到启用了 STP(Spanning Tree 协议)的桥接设备,并且设置了长的延时,则网桥将不会将网络数据包从客户机虚拟机转发到网桥,直到在客户机连接到网桥以来至少经过转发延迟秒数。此延迟允许网桥时间监控来自接口的流量,并确定其后面的 MAC 地址,并阻止网络拓扑中的转发循环。如果转发延迟比客户机的 PXE 或 DHCP 客户端的超时时间更长,客户端的操作将失败,并且客户机将无法引导(如果是 PXE),或者无法获取 IP 地址(如果是 DHCP)。
- 解决方案
- 如果是这种情况,请将网桥的转发延迟更改为 0,在网桥中禁用 STP,或者同时更改这两者。注意只有网桥不使用多个网络来连接多个网络,但只是将多个端点连接到一个网络(由 libvirt使用的网桥,最常见的用例)才适用。如果客户机具有连接到 libvirt- 管理的虚拟网络的接口,请编辑网络的定义,然后重新启动它。例如,使用以下命令编辑默认网络:
# virsh net-edit default
在<bridge>
元素中添加以下属性:<name_of_bridge='virbr0'
delay='0' stp='on'
/>注意delay='0'
和stp='on'
是虚拟网络的默认设置,因此仅当从默认修改配置时才需要这个步骤。如果客户机接口连接到在 libvirt 之外配置的主机网桥,请更改延迟设置。在/etc/sysconfig/network-scripts/ifcfg-name_of_bridge
文件中添加或编辑以下行,以使用 0 秒打开 STP:STP=on DELAY=0
更改配置文件后,重启网桥设备:/usr/sbin/ifdown name_of_bridge /usr/sbin/ifup name_of_bridge
注意如果 name_of_bridge 不是网络中的 root 网桥,则该网桥的延迟最终会重置为 root 网桥的延时。要防止这种情况的发生,请在 name_of_bridge 上禁用 STP。
- iptables 软件包和内核不支持 checksum mangling 规则
- 正在调查
- 只有当所有四个条件都为 true 时,这个信息才会出现问题:
- 客户机使用 virtio 网络设备。如果是这样,配置文件将包含
model type='virtio'
- 主机已加载
vhost-net
模块。如果ls
没有返回空结果,则会出现这种情况。/dev/vhost-net
- 客户机尝试从主机上直接运行的 DHCP 服务器获取 IP 地址。
- 主机上的 iptables 版本早于 1.4.10。iptables 1.4.10 是第一个版本,用来添加
libxt_CHECKSUM
扩展。如果 libvirtd 日志中出现以下信息,会出现这种情况:warning: Could not add rule to fixup DHCP response checksums on network default warning: May need to update iptables package and kernel to support CHECKSUM rule.
重要除非此列表中的所有其他条件也是 true,否则上述警告消息可以忽略,并且不是任何其他问题的指示符。
当出现这些条件时,从主机发送到客户机的 UDP 数据包具有取消计算的校验和。这使得主机的 UDP 数据包在客户机的网络堆栈看起来无效。 - 解决方案
- 要解决这个问题,使上述任何四点无效。最佳解决方案是将主机 iptables 和内核更新至 iptables-1.4.10 或更新版本。否则,最具体的修复是禁用这个特定虚拟机的
vhost-net
驱动程序。要做到这一点,使用以下命令编辑客户机配置:virsh edit name_of_guest
在<driver>
部分更改或添加<interface>
行:<interface type='network'> <model type='virtio'/> <driver name='qemu'/> ... </interface>
保存更改,关闭 guest,然后重新启动它。如果问题仍未解决,则问题可能是 firewalld 和默认的 libvirt 网络之间的冲突。要解决这个问题,使用 service firewalld stop 命令停止 firewalld,然后使用 服务 libvirtd restart 命令重启 libvirt。
注意另外,如果正确配置了/etc/sysconfig/network-scripts/ifcfg-network_name
文件,您可以确保客户机使用 dhclient 命令作为 root 用户获取 IP 地址。
A.19.4. Guest Can Reach Outside Network,但在使用 macvtap 界面时可能会重新访问主机
- 症状
- 客户机虚拟机可以与其他虚拟客户机通信,但在配置为使用 macvtap(也称为
type='direct 的
)网络接口后无法连接到主机。 - 正在调查
- 即使没有连接到虚拟以太网端口聚合器(VEPA)或 VN-Link 功能切换,但 macvtap 接口也很有用。将此类接口的模式设置为
网桥
可让客户机以非常简单的方式直接连接到物理网络,而无需设置问题(或 NetworkManager 不兼容),这些模式可以同时使用传统主机桥接设备。但是,当 guest 虚拟机配置为使用type='direct'
网络接口(如 macvtap)时,尽管能够与网络上的其他客户机和其他外部主机通信,但客户机无法与其自己的主机通信。这种情况实际上不是 error - 它是 macvtap 的定义行为。由于主机物理以太网连接到 macvtap 网桥的方式,从客户机的流量传输到物理接口,无法退回到主机的 IP 堆栈。另外,发送到物理接口的主机 IP 堆栈的流量无法退回到 macvtap 网桥,以转发到客户机。 - 解决方案
- 使用 libvirt 创建隔离网络,并为连接到此网络的每个客户机虚拟机创建第二个接口。然后,主机和客户机可以通过这个隔离网络直接进行通信,同时还可保持与 NetworkManager 的兼容性。
过程 A.8. 使用 libvirt创建隔离网络
- 在
/tmp/isolated.xml
文件中添加并保存以下 XML。如果 192.168.254.0/24 网络已在您的网络其他位置使用,您可以选择不同的网络。图 A.3. 隔离网络 XML
... <network> <name>isolated</name> <ip address='192.168.254.1' netmask='255.255.255.0'> <dhcp> <range start='192.168.254.2' end='192.168.254.254'/> </dhcp> </ip> </network> ...
- 使用此选项创建网络: virsh net-define /tmp/isolated.xml
- 使用 virsh net-autostart 隔离 命令将网络设置为 autostart。
- 使用 virsh net-start isolated 命令启动网络。
- 使用 virsh edit name_of_guest,编辑每个使用 macvtap 进行网络连接的客户机配置,并在
<devices>
部分中添加新接口,类似于以下内容(请注意<模型 type='virtio'/>
行为 include 可选):<>
图 A.4. 接口设备 XML
... <interface type='network' trustGuestRxFilters='yes'> <source network='isolated'/> <model type='virtio'/> </interface>
- 关闭,然后重启每个虚拟机。
现在,客户机可以通过地址 192.168.254.1 访问主机,主机则能够通过从 DHCP 获取的 IP 地址(此外,您可以手动配置客户机的 IP 地址)。由于此新网络仅隔离到主机和客户机,来自客户机的所有其他通信都将使用 macvtap 界面。如需更多信息,请参阅 第 23.17.8 节 “网络接口”。
A.19.5. 无法添加规则来修复网络 "默认"上的 DHCP 响应校验和
- 症状
- 此时会出现这个信息:
Could not add rule to fixup DHCP response checksums on network 'default'
- 正在调查
- 尽管此消息似乎是错误的证据,但几乎总是有危害。
- 解决方案
- 除非遇到的问题是客户机虚拟机无法通过 DHCP 获取 IP 地址,否则可以忽略此消息。如果是这种情况,请参阅 第 A.19.3 节 “客户机失败的 PXE 引导(或 DHCP)” 以了解这种情况的详情。
A.19.6. 无法添加网桥 br0 端口 vnet0:没有这样的设备
- 症状
- 此时会出现以下出错信息:
Unable to add bridge name_of_bridge port vnet0: No such device
例如,如果网桥名称是 br0,则错误消息会显示如下:Unable to add bridge br0 port vnet0: No such device
在 libvirt 版本 0.9.6 及更早版本中,会出现相同的错误:Failed to add tap interface to bridge name_of_bridge: No such device
或者,如果网桥命名为 br0 :Failed to add tap interface to bridge 'br0': No such device
- 正在调查
- 两个错误消息都显示客户机(或域)
<interface>
定义中指定的网桥设备不存在。要验证错误消息中列出的网桥设备没有被存在,请使用 ip addr show br0。这条消息通过该名称确认主机没有网桥:br0: error fetching interface information: Device not found
如果是这样,请继续解决方案。但是,如果生成的信息类似如下,这个问题会在其他位置存在:br0 Link encap:Ethernet HWaddr 00:00:5A:11:70:48 inet addr:10.22.1.5 Bcast:10.255.255.255 Mask:255.0.0.0 UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:249841 errors:0 dropped:0 overruns:0 frame:0 TX packets:281948 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes:106327234 (101.4 MiB) TX bytes:21182634 (20.2 MiB)
- 解决方案
- 编辑现有网桥或使用 virsh创建新桥接
- 使用 virsh 编辑现有网桥或网络的设置,或者将网桥设备添加到主机系统配置中。
- 使用 virsh编辑现有网桥设置
- 使用 virsh edit name_of_guest 将
<interface>
定义更改为使用已存在的桥接或网络。例如,将type='bridge'
改为type='network'
,<source bridge='br0'/>
改为<source network='default'/>
。 - 使用 virsh创建主机桥接
- 对于 libvirt 版本 0.9.8 及更高版本,可使用 virsh iface-bridge 命令创建网桥设备。这会创建一个使用
eth0
的桥接设备 br0,它是作为附加桥接的一部分设置的物理网络接口:virsh iface-bridge eth0 br0
可选:如果需要,请删除此网桥,并使用这个命令恢复原始eth0
配置:virsh iface-unbridge br0
- 手动创建主机桥接
- 对于较旧版本的 libvirt,可以在主机上手动创建网桥设备。具体说明请查看 第 6.4.3 节 “使用 libvirt 进行桥接网络”。
A.19.7. migration Fails with error: unables to address
- 症状
- QEMU 客户机代理失败,并显示这个错误消息:
# virsh migrate qemu qemu+tcp://192.168.122.12/system error: Unable to resolve address name_of_host service '49155': Name or service not known
例如,如果目标主机名是newyork
,则错误消息会显示如下:# virsh migrate qemu qemu+tcp://192.168.122.12/system error: Unable to resolve address 'newyork' service '49155': Name or service not known
但是,这个错误看上去有些奇怪,因为我们没有在任何位置使用newyork
主机名。 - 正在调查
- 在迁移过程中,在目标主机上运行的 libvirtd 从地址和端口创建一个 URI,用于接收迁移数据并将其发回源主机上运行的 libvirtd。在这种情况下,目标主机(
192.168.122.12)
的名称被设置为 'newyork'。出于某种原因,在该主机上运行的虚拟机的 libvirtd 无法将名称解析为可以返回并仍然有用的 IP 地址。因此,它会在解析名称时返回 "newyork "主机名希望源 libvirtd 更加成功。如果 DNS 没有被正确配置,或者/etc/hosts
具有与本地回环地址(127.0.0.1
)关联的主机名,则可能会出现此情况。请注意,无法从连接到目标 libvirtd 的地址自动决定用于迁移数据的地址(例如,来自qemu+tcp://192.168.122.12/system
)。这是因为,要与目标 libvirtd 通信,源 libvirtd 可能需要使用与 virsh (可能在独立计算机上运行)类型不同的网络基础架构。 - 解决方案
- 最佳解决方案是正确配置 DNS,以便涉及迁移的所有主机都可以解析所有主机名。如果 DNS 无法配置为执行此操作,则可以手动将用于迁移的每个主机添加到每个主机上的
/etc/hosts
文件中。但是,在动态环境中让这类列表保持一致非常困难。如果主机名不能被任何途径解析,virsh migrate 支持指定迁移主机:# virsh migrate qemu qemu+tcp://192.168.122.12/system tcp://192.168.122.12
目的地 libvirtd 将采用tcp://192.168.122.12
URI,并附加自动生成的端口号。如果这不是理想的情况(例如,由于防火墙配置),可在此命令中指定端口号:# virsh migrate qemu qemu+tcp://192.168.122.12/system tcp://192.168.122.12:12345
另一种选择是使用隧道迁移。隧道的迁移不会为迁移数据创建单独的连接,而是通过用于连接目标 libvirtd 的连接(例如qemu+tcp://192.168.122.12/system
):# virsh migrate qemu qemu+tcp://192.168.122.12/system --p2p --tunnelled
A.19.8. 带有 Unables 的 migration Fails 以允许访问磁盘路径:没有这些文件或目录
- 症状
- 无法迁移客户机虚拟机(或域),因为 libvirt 无法访问磁盘映像:
# virsh migrate qemu qemu+tcp://name_of_host/system error: Unable to allow access for disk path /var/lib/libvirt/images/qemu.img: No such file or directory
例如,如果目标主机名是newyork
,则错误消息会显示如下:# virsh migrate qemu qemu+tcp://newyork/system error: Unable to allow access for disk path /var/lib/libvirt/images/qemu.img: No such file or directory
- 正在调查
- 默认情况下,迁移仅传输正在运行的客户机的内存中状态(如内存或 CPU 状态)。虽然磁盘镜像不会在迁移期间传输,但它们都需要在这两个主机在同一个路径上保持访问。
- 解决方案
- 在两个主机上的同一位置设置并挂载共享存储。执行此操作的最简单方法是使用 NFS:
过程 A.9. 设置共享存储
- 在主机上设置 NFS 服务器作为共享存储。NFS 服务器可以是迁移中涉及的主机之一,只要涉及的主机都通过 NFS 访问共享存储。
# mkdir -p /exports/images # cat >>/etc/exports <<EOF /exports/images 192.168.122.0/24(rw,no_root_squash) EOF
- 在运行 libvirt 的所有主机上,将导出的目录挂载到一个通用位置。例如,如果 NFS 服务器的 IP 地址为 192.168.122.1,使用以下命令挂载该目录:
# cat >>/etc/fstab <<EOF 192.168.122.1:/exports/images /var/lib/libvirt/images nfs auto 0 0 EOF # mount /var/lib/libvirt/images
注意使用 NFS 从一个主机导出本地目录,并将它挂载到另一主机上的相同路径 - 用于存储磁盘镜像的目录必须从两个主机上的共享存储挂载。如果没有正确配置,客户机虚拟机在迁移过程中可能会丢失对磁盘映像的访问,因为源主机的 libvirt 守护进程可能会在成功将客户机成功迁移到其目的地后更改磁盘映像的所有者、权限和 SELinux 标签。如果 libvirt 检测到磁盘镜像是从共享存储位置挂载的,则不会进行这些更改。
A.19.9. 当 libvirtd 已启动时,没有演示客户机虚拟机
- 症状
- libvirt 守护进程成功启动,但没有显示客户机虚拟机。
# virsh list --all Id Name State ----------------------------------------------------
- 正在调查
- 此问题有多种可能的原因。执行这些测试有助于确定此情况的原因:
- 验证 KVM 内核模块
- 确定在内核中插入 KVM 内核模块:
# lsmod | grep kvm kvm_intel 121346 0 kvm 328927 1 kvm_intel
如果您使用 AMD 机器,请验证在内核中使用类似命令 lsmod | grepkvm_amd
内核模块是否已插入到内核中。如果模块不存在,请使用 modprobe <modulename> 命令插入它们。注意虽然这比较常见,但 KVM 虚拟化支持可能会被编译到内核中。在这种情况下,不需要模块。 - 验证虚拟化扩展
- 验证主机上是否支持并启用虚拟化扩展:
# egrep "(vmx|svm)" /proc/cpuinfo flags : fpu vme de pse tsc ... svm ... skinit wdt npt lbrv svm_lock nrip_save flags : fpu vme de pse tsc ... svm ... skinit wdt npt lbrv svm_lock nrip_save
在 BIOS 设置中启用硬件固件配置中的虚拟化扩展。详情请查看您的硬件文档。 - 验证客户端 URI 配置
- 验证客户端的 URI 是否已按预期配置:
# virsh uri vbox:///system
例如,此消息显示 URI 已连接到 VirtualBox 管理程序,而不是 QEMU,并显示了设置为连接到 QEMU 管理程序的 URI 的配置错误。如果 URI 正确连接到 QEMU,则会显示相同的信息:# virsh uri qemu:///system
当存在其他虚拟机监控程序时,默认情况下 libvirt 可能进行通信时会出现这种情况。
- 解决方案
- 执行这些测试后,使用以下命令查看客户端虚拟机列表:
# virsh list --all
A.19.10. 常见 XML 错误
A.19.10.1. 编辑域定义
# virsh edit name_of_guest.xml
# virsh edit name_of_guest.xml
Domain name_of_guest.xml XML configuration edited.
# xmllint --noout config.xml
# virt-xml-validate config.xml
- libvirt存储的 XML 文档
- 这些文档包含客户机的状态和配置定义。这些文档会自动生成,不应手动编辑。这些文档中的错误包含损坏的文档的文件名。文件名仅在 URI 定义的主机上有效,这可能看到运行 命令的机器。libvirt 创建的文件中的错误很少见。但是,这些错误的一个可能源是 libvirt 的降级问题,而较新版本的 libvirt 总是可以读取由较旧版本生成的 XML,而较旧版本的 libvirt 可能会与新版本中添加的 XML 元素混淆。
A.19.10.2. XML 语法错误
error: (name_of_guest.xml):6: StartTag: invalid element name <vcpu>2</vcpu>< -----------------^
- 此消息中包含的信息:
- (name_of_guest.xml)
- 这是包含该错误的文档的文件名。括号中的文件名是用来描述从内存中解析的 XML 文档的符号链接,不直接对应于磁盘上的文件。不在括号中包含的文件名是驻留在连接目标的本地文件。
- 6
- 这是包含错误的 XML 文件中的行号。
- StartTag: 无效的元素名称
- 这是 libxml2 parser 的错误消息,它描述了特定的 XML 错误。
A.19.10.2.1. 文档中的位置 <
- 症状
- 发生以下错误:
error: (name_of_guest.xml):6: StartTag: invalid element name <vcpu>2</vcpu>< -----------------^
- 正在调查
- 这个错误消息显示,解析器需要在客户机 XML 文件的 6 行上
<
符号后有一个新的元素名称。确保在文本编辑器中启用了行号显示。打开 XML 文件,并在第 6 行中找到文本:<domain type='kvm'> <name>name_of_guest</name> <memory>524288</memory> <vcpu>2</vcpu><
此客户机 XML 文件的片段在文档中包含一个额外的<
: - 解决方案
- 删除额外的
<
或完成新元素。
A.19.10.2.2. Unterminated 属性
- 症状
- 发生以下错误:
error: (name_of_guest.xml):2: Unescaped '<' not allowed in attributes values <name>name_of_guest</name> --^
- 正在调查
- 该客户机 XML 文件中的这个片段包含一个未确定的元素属性值:
<domain type='kvm> <name>name_of_guest</name>
在本例中,"kvm"
缺少第二个引号。属性值必须使用引号或 postrophes 打开和关闭,类似于 XML start 和 end 标签。 - 解决方案
- 正确打开和关闭所有属性值字符串。
A.19.10.2.3. 打开和结束的标签不匹配
- 症状
- 发生以下错误:
error: (name_of_guest.xml):61: Opening and ending tag mismatch: clock line 16 and domain </domain> ---------^
- 正在调查
- 以上错误消息包含三个附加标签:最后一个冒号(
时钟行 16 和域
)后面的消息显示<clock>
在文档的第 16 行上包含一个不匹配的标签。最后一个提示是消息的上下文部分中的指针,用于标识第二个出错标签。未对的标签必须使用/>
关闭。以下片段没有遵循这个规则,并生成上述错误消息:<domain type='kvm'> ... <clock offset='utc'>
这个错误是由文件中不匹配的 XML 标签造成的。每个 XML 标签都必须具有匹配的 start 和 end 标签。- 不匹配 XML 标签的其他示例
- 以下示例生成类似的错误消息,并显示不匹配 XML 标签的变体。此片段包含
<features>
不匹配的错误,因为没有结束标签(</name>
):<domain type='kvm'> ... <features> <acpi/> <pae/> ... </domain>
此片段包含一个结尾标签(</name>
),没有对应的 start tag:<domain type='kvm'> </name> ... </domain>
- 解决方案
- 确保所有 XML 标签都正确启动和结束。
A.19.10.2.4. 标记中的排字错误
- 症状
- 此时会出现以下出错信息:
error: (name_of_guest.xml):1: Specification mandate value for attribute ty <domain ty pe='kvm'> -----------^
- 正在调查
- XML 错误很容易由一个简单的拼写错误导致。此错误消息突出显示 XML 错误 - 在这种情况下,单词
type
- 额外空格,带有指针。<domain ty pe='kvm'>
由于拼写错误(如缺少特殊字符)或额外字符,这些 XML 示例无法正确解析:<domain type 'kvm'>
<dom#ain type='kvm'>
- 解决方案
- 要识别有问题的标签,请读取文件上下文的错误消息,并找到与指针相关的错误。更正 XML 并保存更改。
A.19.10.3. 逻辑和配置错误
A.19.10.3.1. Vanishing 部分
- 症状
- 您所做的部分更改在编辑或定义域后不会显示任何影响。定义 或编辑命令 可以正常工作,但在再次转储 XML 时,更改将消失。
- 正在调查
- libvirt 不解析的构造或语法中的这个错误可能产生。libvirt 工具通常仅查找其知道的构造内容,但忽略了其他内容,从而导致 libvirt 解析输入后的一些 XML 更改传播。
- 解决方案
- 在传递 编辑或 定义 命令之前验证 XML 输入。libvirt 开发人员维护与 libvirt 捆绑的一组 XML 模式,用于定义 libvirt 使用的 XML 文档中允许的大部分构造。使用以下命令验证 libvirt XML 文件:
# virt-xml-validate libvirt.xml
如果这个命令通过,则 libvirt 可能会了解 XML 中的所有结构,除非架构无法检测仅对给定管理程序有效的选项。例如,libvirt 生成的任何 XML 作为 virsh dump 命令生成的任何 XML 应该验证且无错误。
A.19.10.3.2. 不正确的驱动器设备类型
- 症状
- CD-ROM 虚拟驱动器的源镜像定义不存在,尽管添加了:
# virsh dumpxml domain <domain type='kvm'> ... <disk type='block' device='cdrom'> <driver name='qemu' type='raw'/> <target dev='hdc' bus='ide'/> <readonly/> </disk> ... </domain>
- 解决方案
- 通过添加缺少的
<source>
参数更正 XML:<disk type='block' device='cdrom'> <driver name='qemu' type='raw'/> <source file='/path/to/image.iso'/> <target dev='hdc' bus='ide'/> <readonly/> </disk>
type='block'
磁盘设备预期源是一个物理设备。要将磁盘与镜像文件搭配使用,使用type='file'
替代。
附录 B. 在多个构架中使用 KVM 虚拟化
B.1. 在 IBM POWER 系统中使用 KVM 虚拟化
安装
- 从客户门户网站中的可引导镜像安装主机系统:具体步骤请查看 Red Hat Enterprise Linux 7 安装指南。
- 确定您的主机系统满足管理程序要求:
- 验证您具有正确的机器类型:
# grep ^platform /proc/cpuinfo
这个命令的输出必须包含PowerNV
条目,这代表您在受支持的 PowerNV 机器类型中运行:platform : PowerNV
- 载入 KVM-HV 内核模块:
# modprobe kvm_hv
- 验证是否载入了 KVM-HV 内核模块:
# lsmod | grep kvm
如果成功载入了 KVM-HV,这个命令的输出会包括kvm_hv
。
- 除了 第 2 章 安装虚拟化软件包 中描述的其他虚拟化软件包外,安装 qemu-kvm-ma 软件包。
架构特定
- IBM POWER 主机上客户机的建议 最小内存分配 是 2GB RAM。
- AMD64 和 Intel 64 主机上禁用了以下虚拟化功能,但可在 IBM POWER 上工作。但是,红帽不支持它们,因此不推荐使用:
- I/O 线程
- SMBIOS 配置不可用。
- POWER8 虚拟机,包括兼容模式客户机,可能无法启动类似如下的错误:
qemu-kvm: Failed to allocate KVM HPT of order 33 (try smaller maxmem?): Cannot allocate memory
这在使用 Red Hat Enterprise Linux 7.3 或更早版本的客户端发生的可能性更大。要解决这个问题,通过将kvm_cma_resv_ratio= 内存添加到主机的内核命令行(其中 memory
是 CMA 池保留的主机内存的百分比)来增加 CMA 内存池(默认为 5)。 - 透明巨页(THP)目前在 IBM POWER8 客户端中不提供任何显著的性能优势另请注意,IBM POWER8 系统中静态 巨页 的大小是 16MiB 和 16GiB,而 AMD64 和 Intel 64 和 Intel 64 和 IBM POWER9 上的 2MiB 和 1GiB 不同。因此,如果客户机配置了静态巨页,将客户机从 IBM POWER8 主机迁移到 IBM POWER9 主机会失败。另外,为了能够在 IBM POWER8 客户端中 使用静态巨页或 THP,您必须首先在 主机 中设置巨页。
- IBM POWER 系统中不支持在 AMD64 和 Intel 64 系统中支持很多虚拟 外围设备,或者支持不同的设备替换:
- 不支持用于 PCI-E 层次结构的设备,包括
ioh3420
和xio3130-downstream
设备。这个功能由spapr-pci-host-bridge
设备提供的多个独立 PCI 根网桥替代。 - 不支持 UHCI 和 EHCI PCI 控制器。使用 OHCI 和 XHCI 控制器。
- 不支持 IDE 设备,包括虚拟 IDE CD-ROM(
ide-cd
)和虚拟 IDE 磁盘(ide-hd
)。改为使用virtio-scsi
和virtio-blk
设备。 - 不支持模拟 PCI NIC(
rtl8139
)。改为使用virtio-net
设备。 - 不支持声音设备,包括
intel-hda
、hda-output
和AC97
。 - 不支持 USB 重定向设备,包括
usb-redir
和usb-tablet
。
kvm-clock
服务 不必为 IBM POWER 系统上的 时间管理 配置。- IBM POWER 系统不支持
pvpanic
设备。但是,默认在该架构中提供了等同的功能并激活。要在客户端中启用它,请使用带有保留
值的<on_crash>
配置元素。另外,确保从<devices>
部分删除<panic>
元素,因为它存在可能会导致客户机无法在 IBM POWER 系统中引导。 - 在 IBM POWER8 系统中,主机机器必须以单线程模式运行,才能支持客户机。如果安装了 qemu-kvm-ma 软件包,则会自动进行配置。但是,在单线程主机上运行的虚拟机仍然可以使用多个线程。
- 当在 RHEL 7 主机中运行的 IBM POWER 虚拟机时,配置了使用零内存(
memory='0'
)的 NUMA 节点,虚拟机无法正常工作。因此,红帽不支持在 RHEL 7 中带有零内存 NUMA 节点的 IBM POWER 虚拟机
B.2. 在 IBM Z 中使用 KVM 虚拟化
安装
- 从 客户门户网站中的可引导镜像安装 主机系统 - 了解更多详细信息,请参阅 安装指南。
- 确定您的系统满足管理程序要求:
- 验证 CPU 虚拟化扩展是否可用:
# grep sie /proc/cpuinfo
此命令的输出必须包含sie
条目,这表示您的处理器具有所需的虚拟化扩展。features : esan3 zarch stfle msa ldisp eimm dfp edat etf3eh highgprs te sie
- 载入 KVM 内核模块:
# modprobe kvm
- 验证是否载入了 KVM 内核模块:
# lsmod | grep kvm
如果成功载入 KVM,此命令的输出包括kvm
。如果没有,请确定您正在为 Red Hat Enterprise Linux 7 使用 kernel-alt 版本。
- 除了 第 2 章 安装虚拟化软件包 中描述的其他虚拟化软件包外,安装 qemu-kvm-ma 软件包。
- 在设置客户机时,建议以 以下一种方式配置其 CPU,以保护客户机不受 "Spectre" 漏洞的影响:
- 使用主机 CPU 模型,例如:
<cpu mode='host-model' check='partial'> <model fallback='allow'/> </cpu>
这样,如果主机支持,则客户端可使用ppa15
和bpb
功能。 - 如果使用特定的主机模型,请添加
ppa15
和bpb
功能。以下示例使用zEC12
CPU 模型:<cpu mode='custom' match='exact' check='partial'> <model fallback='allow'>zEC12</model> <feature policy='force' name='ppa15'/> <feature policy='force' name='bpb'/> </cpu>
注意使用带有z114
和z196
CPU 型号的ppa15
功能时,请确保使用最新的 microcode 级别(bundle 95 或更高版本)。
架构特定
- IBM Z 不支持 SPICE 和 VNC 协议,因此无法显示客户机图形输出。???
- IBM Z 不支持虚拟 PCI 和 USB 设备。这也意味着 virtio-*-pci 设备不受支持,应当使用
virtio-*-ccw
设备。例如,使用virtio-net-ccw
而不是virtio-net-pci
。 - IBM Z 不支持 <boot dev='device'/> XML 配置元素。要定义设备引导顺序,请使用 <devices> 部分中的 <boot order='number'/> 元素。例如,请参阅 上游 libvirt 文档。注意在 AMD64 和 Intel 64 主机上使用 <boot order='number'/> 进行引导顺序管理。
- SMBIOS 配置不可用。
- IBM Z 中使用的 watchdog 设备模型 应为
diag288
。 - 检查是否在您的系统中启用了嵌套虚拟化:
$ cat /sys/module/kvm/parameters/nested
如果这个命令返回1
,则代表该功能已经启用。如果命令返回0,
请使用以下步骤启用它。 - 卸载
kvm
模块:# modprobe -r kvm
- 激活嵌套功能:
# modprobe kvm nested=1
- 现在,嵌套功能只有在下次重启主机时才会启用。要永久启用它,请在
/etc/modprobe.d/kvm.conf
文件中添加以下行:options kvm nested=1
kvm-clock
服务专用于 AMD64 和 Intel 64 系统,且不必为 IBM Z 上的时间管理 进行配置。
B.3. 在 ARM 系统上使用 KVM 虚拟化
安装
- 从客户门户网站中的可引导镜像安装 主机系统。
- 安装该系统后,使用以下命令在系统中安装虚拟化堆栈:
# yum install qemu-kvm-ma libvirt libvirt-client virt-install AAVMF
确保启用了Optional
频道以便安装成功。
架构特定
- PXE 引导只支持
virtio-net-device
和virtio-net-pci
网络接口控制器(NIC)。另外,ARM 架构虚拟机固件(AAVMF)的内置VirtioNetDxe
驱动程序需要用于 PXE 引导。请注意,不支持 iPXE 选项 ROM。 - 只能分配给一个虚拟机,最多 123 个虚拟 CPU(vCPU)。
附录 C. 虚拟化限制
C.1. 系统限制
- 主机系统
- 只有在以下主机构架中才支持带 KVM 的 Red Hat Enterprise Linux:
- AMD64 和 Intel 64
- IBM Z
- IBM POWER8
- IBM POWER9
本文档主要论述 AMD64 和 Intel 64 功能和功能,但其他支持的构架非常相似。详情请查看 附录 B, 在多个构架中使用 KVM 虚拟化。 - 客户端系统
- 在 Red Hat Enterprise Linux 7 中,只有特定订阅程序(如 Advanced mission Critical)支持 Microsoft Windows 客户机虚拟机。如果您不确定您的订阅模式是否包括 Windows 客户机支持,请联系客户服务。有关 Red Hat Enterprise Linux 7 中 Windows 客户机虚拟机的更多信息,请参阅 Red Hat Enterprise Linux 7 的 Windows 客户机虚拟机文章。
C.2. 功能限制
- 每个虚拟机的最大 vCPU
- Red Hat Enterprise Linux 7.2 及更高版本支持每个客户机的 240 个 vCPU,Red Hat Enterprise Linux 7.0 中最多支持 160 个 vCPU。
- 嵌套虚拟化
- 在 Red Hat Enterprise Linux 7.2 及更新的版本中,嵌套虚拟化 作为技术预览提供。这个功能可让 KVM 启动作为虚拟机监控程序并创建自己的客户机的客户机。
- TCG 支持
- QEMU 和 libvirt 包括使用 QEMU Tiny Code Generator(TCG)的动态转换模式。这个模式不需要硬件虚拟化支持。但是,红帽不支持 TCG。当使用 qemu-kvm 软件包在虚拟机中创建嵌套虚拟客户机时,它使用 TCG,除非父虚拟机上启用了嵌套虚拟化。请注意,嵌套虚拟化目前还是一个技术预览功能。如需更多信息,请参阅 第 12 章 嵌套虚拟化。可使用以下方法识别基于 TCG 的客户机:
- 客户机的域 XML 文件包含
<domain type='qemu'>
行,而 KVM 客户机包含<domain type='kvm'>
。
- 持续 TSC 位
- 没有 Constant 时间戳计数器(TSC)的系统需要额外的配置。有关确定您是否具有 Constant 时间戳计数器和配置步骤以修复相关问题的详细信息,请参阅 第 8 章 KVM 客户机计时管理。
- 模拟 SCSI 适配器
- SCSI 设备模拟只支持 virtio-scsi 半虚拟化主机总线适配器(HBA)。Red Hat Enterprise Linux 中的 KVM 不支持模拟 SCSI HBA。
- 模拟 IDE 设备
- KVM 限制为每个虚拟机最多四个虚拟化(模拟)IDE 设备。
- 半虚拟设备
- 半虚拟设备也称为 VirtIO 设备。它们是纯粹的虚拟设备,设计为在虚拟机中最佳工作。Red Hat Enterprise Linux 7 每个虚拟机总线支持 32 个 PCI 设备插槽,每个设备插槽支持 8 个 PCI 功能。当虚拟机中启用了多功能并且使用 PCI 网桥时,每个总线最多提供了 256 个 PCI 功能。每个 PCI 网桥都添加了一个新的总线,可能会启用其它 256 设备地址。但是,一些总线不会为用户提供所有 256 个设备地址;例如,根总线有几个内置设备占用的插槽。有关 PCI 网桥的更多信息,请参阅 第 16 章 虚拟机设备配置 和 第 16.1.5 节 “PCI Bridges”。
- 迁移限制
- 设备分配指的是已公开给虚拟机的物理设备,以独占地使用该虚拟机。由于设备分配使用虚拟机运行的特定主机上的硬件,所以使用设备分配时不支持迁移和保存/恢复。如果客户机操作系统支持热插拔,可以在迁移或保存/恢复操作之前删除分配的设备,以启用此功能。实时迁移只能在具有相同 CPU 类型的主机之间实现(即 Intel 到 Intel 或 AMD)。对于实时迁移,两个主机都必须为 No eXecution(NX)位设置相同的值,
可在
或关闭
。要使迁移正常工作,必须为在写入模式下打开的所有块设备指定cache=none
。警告未能包括cache=none
选项可能会导致磁盘崩溃。 - 存储限制
- 向 guest 虚拟机授予对整个磁盘或块设备(如
/dev/sdb
)的写入权限存在风险。如果客户机虚拟机可以访问整个块设备,它可以与主机共享任何卷标签或分区表。如果主机系统的分区识别代码中存在错误,这可能会造成安全隐患。通过将主机机器配置为忽略分配给客户机虚拟机的设备,避免出现此风险。警告未能遵守存储限制会导致出现安全性风险。 - 实时快照
- Red Hat Enterprise Linux 中的 KVM 中的备份和恢复 API 不支持实时快照。
- 流、镜像(mirror)和实时更新
- 不支持流、镜像(mirror)和 live-merge。这可防止 block-jobs。
- I/O 节流
- Red Hat Enterprise Linux 不支持为虚拟磁盘上的操作配置最大输入和输出等级。
- I/O 线程
- Red Hat Enterprise Linux 不支持为使用 VirtIO 接口的磁盘上输入和输出操作创建独立线程。
- 内存热插拔和热拔
- Red Hat Enterprise Linux 不支持热插拔或热拔虚拟机的内存。
- vhost-user
- Red Hat Enterprise Linux 不支持实现用户空间 vhost 接口。
- CPU 热拔
- Red Hat Enterprise Linux 不支持从虚拟机热拔 CPU。
- 适用于 PCIe 的 NUMA 客户机位置
- Red Hat Enterprise Linux 不支持将虚拟 PCIe 设备绑定到特定的 NUMA 节点。
- 内核转储限制
- 因为当前在迁移之上实施内核转储,所以使用设备分配时不支持它。
- 实时内核
- KVM 目前不支持实时内核,因此无法在 Red Hat Enterprise Linux for Real Time 中使用。
C.3. 应用程序限制
- Kdump 服务器
- netdump 服务器
C.4. 其他限制
C.5. 存储支持
- 本地存储中的文件
- 物理磁盘分区
- 本地连接的物理 LUN
- LVM 分区
- NFS 共享文件系统
- iSCSI
- GFS2 集群文件系统
- 基于 Fibre Channel 的 LUN
- 通过以太网的光纤(FCoE)
C.6. USB 3 / xHCI 支持
- 由于轮询开销减少了,虚拟化兼容硬件设计,这意味着 xHCI 模拟需要比之前的版本要少。
- USB 透传 USB 3 设备可用。
- 不支持 Red Hat Enterprise Linux 5 guest。
附录 D. 其它资源
D.1. 在线资源
- http://www.libvirt.org/ 是 libvirt 虚拟化 API 的官方上游网站。
- https://virt-manager.org/ 是 虚拟机管理器 (virt-manager)的上游项目网站,用于管理虚拟机的图形应用程序。
- Red Hat Virtualization - http://www.redhat.com/products/cloud-computing/virtualization/
- 虚拟化技术概述 - http://virt.kernelnewbies.org
D.2. 安装的文档
- man virsh 和
/usr/share/doc/libvirt-version-number
- 包含 virsh 虚拟机管理实用程序的子命令和选项以及libvirt
虚拟化库 API 的综合信息。 /usr/share/doc/gnome-applet-vm-version-number
- 监控和管理本地运行中虚拟机的 GNOME 图形面板小程序的文档。/usr/share/doc/libvirt-python-version-number
- 提供libvirt
库的 Python 绑定详情。libvirt-python
软件包允许 python 开发人员创建与libvirt
虚拟化管理库交互的程序。/usr/share/doc/virt-install-version-number
- 提供 virt-install 命令的文档,该文档可帮助开始在虚拟机内部安装 Fedora 和 Red Hat Enterprise Linux 相关发行版本。/usr/share/doc/virt-manager-version-number
- 提供虚拟机管理器的文档,它提供了一个用于管理虚拟机的图形工具。- 注意有关其他 Red Hat Enterprise Linux 组件的详情,请查看
usr/share/doc/
中的相应 man page 或文件。
附录 E. 使用 IOMMU 组[1]
- IOMMU 组概述
- 设备隔离的重要性
- VFIO 的好处
E.1. IOMMU 概述
- 当设备的寻址功能低于平台中的功能时,需要 退回缓冲区。例如,如果设备的地址空间限制为 4GB(32 位),并且驱动程序被分配给超过 4 GB 的缓冲区,则该设备将无法直接访问缓冲区。这种情况需要使用反转缓冲区;一个位于较低的内存中的缓冲空间,其中设备可以执行 DMA 操作。在完成该操作时,缓冲区中的数据仅复制到驱动程序分配的缓冲区中。换句话说,缓冲区将从较低的内存地址退回到更高的内存地址。IOMMU 可避免通过在设备的地址空间内提供 IOVA 转换来避免反转缓冲。这允许设备直接执行 DMA 操作到缓冲区,即使缓冲区已超过设备的物理地址空间。过去,IOMMU 功能通常是 IOMMU 的独占用例,但在采用 PCI-Express (PCIe)时,所有非传统端点都需要支持上述 4GB 的能力。
- 在传统内存分配中,根据应用程序的需求分配和释放的内存块。使用此方法可造成在物理地址空间中分散的内存空白。如果内存差距相结合,最好使用,以便更高效地使用,如果收集了内存差距,则最好在基本术语中使用。IOMMU 将这些分散内存列表与 IOVA 空间一致,有时被称为 scatter-gather 列表。这样,IOMMU 可创建连续的 DMA 操作,并最终提高 I/O 性能的效率。在最简单的示例中,驱动程序可以分配在物理内存空间中不连续的两个 4KB 缓冲区。IOMMU 可以为这些缓冲区分配连续范围,以便 I/O 设备能够执行单个 8KB DMA,而不是两个独立的 4KB DMA。
E.2. 修正到 IOMMU 组
E.3. 如何识别和分配 IOMMU 组
过程 E.1. IOMMU 组
列出设备
通过运行 virsh nodev-list device-type 命令确定系统中的设备。本例演示如何定位 PCI 设备。为简洁起见,输出已被截断。# virsh nodedev-list pci pci_0000_00_00_0 pci_0000_00_01_0 pci_0000_00_03_0 pci_0000_00_07_0 [...] pci_0000_00_1c_0 pci_0000_00_1c_4 [...] pci_0000_01_00_0 pci_0000_01_00_1 [...] pci_0000_03_00_0 pci_0000_03_00_1 pci_0000_04_00_0 pci_0000_05_00_0 pci_0000_06_0d_0
找到设备的 IOMMU 分组
对于列出的每个设备,可以使用 virsh nodedev-dumpxml name-of-device 命令找到有关设备(包括 IOMMU 分组)的每个设备的信息。例如,要查找名为 pci_0000_04_00_0(PCI 地址 0000:04:00.0)的 PCI 设备的 IOMMU 分组,请使用以下命令:# virsh nodedev-dumpxml pci_0000_04_00_0
这个命令会生成类似于显示的 XML 转储。图 E.1. IOMMU 组 XML
<device> <name>pci_0000_04_00_0</name> <path>/sys/devices/pci0000:00/0000:00:1c.0/0000:04:00.0</path> <parent>pci_0000_00_1c_0</parent> <capability type='pci'> <domain>0</domain> <bus>4</bus> <slot>0</slot> <function>0</function> <product id='0x10d3'>82574L Gigabit Network Connection</product> <vendor id='0x8086'>Intel Corporation</vendor> <iommuGroup number='8'> <!--This is the element block you will need to use--> <address domain='0x0000' bus='0x00' slot='0x1c' function='0x0'/> <address domain='0x0000' bus='0x00' slot='0x1c' function='0x4'/> <address domain='0x0000' bus='0x04' slot='0x00' function='0x0'/> <address domain='0x0000' bus='0x05' slot='0x00' function='0x0'/> </iommuGroup> <pci-express> <link validity='cap' port='0' speed='2.5' width='1'/> <link validity='sta' speed='2.5' width='1'/> </pci-express> </capability> </device>
查看 PCI 数据
在以上输出中,有一个有 4 个设备的 IOMMU 组。这是在没有 ACS 支持的多功能 PCIe root 端口的示例。插槽 0x1c 中的两个功能是 PCIe root 端口,可以通过运行 lspci 命令(来自 pciutils 软件包)来标识:# lspci -s 1c 00:1c.0 PCI bridge: Intel Corporation 82801JI (ICH10 Family) PCI Express Root Port 1 00:1c.4 PCI bridge: Intel Corporation 82801JI (ICH10 Family) PCI Express Root Port 5
在总线 0x04 和 0x05 上为两个 PCIe 设备重复此步骤,它们是端点设备。# lspci -s 4 04:00.0 Ethernet controller: Intel Corporation 82574L Gigabit Network Connection This is used in the next step and is called 04:00.0 # lspci -s 5 This is used in the next step and is called 05:00.0 05:00.0 Ethernet controller: Broadcom Corporation NetXtreme BCM5755 Gigabit Ethernet PCI Express (rev 02)
为客户机虚拟机分配端点
要为虚拟机分配其中一个端点(您目前没有分配的端点)必须与 VFIO 兼容驱动程序绑定,以便 IOMMU 组不在用户和主机驱动程序之间分割。例如,使用上面收到的输出时,您要使用 04:00.0 配置虚拟机,除非 05:00.0 断开与主机驱动程序分离,否则虚拟机将无法启动。要分离 05:00.0,以 root 用户身份运行 virsh nodedev-detach 命令:# virsh nodedev-detach pci_0000_05_00_0 Device pci_0000_05_00_0 detached
为虚拟机分配两个端点是解决此问题的另一种选择。请注意,当为<hostdev>
元素内的managed
属性使用 yes 值时,libvirt 将自动为附加设备执行此操作。例如:<hostdev mode='subsystem' type='pci' managed='yes'>
。如需更多信息,请参阅 注意。
<hostdev>
元素中的 managed
属性的值决定。当设备被管理时,libvirt 会自动从现有驱动程序中分离该设备,然后将其绑定到 vfio-pci on boot(用于虚拟机)来将其分配给虚拟机。当虚拟机关闭或删除时,或者 PCI 设备与虚拟机分离时,libvirt 不会绑定来自 vfio-pci 的设备,并将其重新绑定到原始驱动程序。如果设备是非受管设备,则 libvirt 不会自动这个过程,且必须在将设备分配给虚拟机之前确保所有这些管理方面完成,且在该设备不再被虚拟机使用后,您必须重新分配设备。在非受管设备中无法执行这些操作将导致虚拟机失败。因此,确保 libvirt 管理该设备可能更简单。
E.4. IOMMU 策略和用例
附录 F. 修订历史记录
修订历史 | |||
---|---|---|---|
修订 2-42 | Thu August 9 2019 | Jiri Herrmann | |
| |||
修订 2-40 | Thu May 23 2019 | Jiri Herrmann | |
| |||
修订 2-39 | Thu Oct 25 2018 | Jiri Herrmann | |
| |||
修订 2-37 | Thu Aug 14 2018 | Jiri Herrmann | |
| |||
修订 2-36 | Thu Aug 14 2018 | Jiri Herrmann | |
| |||
修订 2-35 | Thu Apr 5 2018 | Jiri Herrmann | |
| |||
修订 2-32 | Thu Jul 27 2017 | Jiri Herrmann | |
| |||
修订 2-32 | Thu Jul 27 2017 | Jiri Herrmann | |
| |||
修订 2-29 | Mon Oct 17 2016 | Jiri Herrmann | |
| |||
修订 2-24 | Thu Dec 17 2015 | Laura Novich | |
| |||
修订 2-23 | Sun Nov 22 2015 | Laura Novich | |
| |||
修订 2-21 | Thu Nov 12 2015 | Laura Novich | |
| |||
修订 2-19 | Thu Oct 08 2015 | Jiri Herrmann | |
| |||
修订 2-17 | Thu Aug 27 2015 | Dayle Parker | |
|