libvirt 官方文档:Domain XML format
所有虚拟机的根元素都命名为 domain。
<domain type='kvm' id='1' xmlns:qemu='http://libvirt.org/schemas/domain/qemu/1.0'>
<name>template-00000001name>
<uuid>86328398-1c5d-4f28-a57c-636d6f75ae98uuid>
<memory unit='KiB'>2097152memory>
<currentMemory unit='KiB'>2097152currentMemory>
<vcpu placement='auto'>2vcpu>
domain>
属性
type
:指定用于运行 domain 的 hypervisor。可选值:xen、kvm、qemu、lxc。
id
:是正在运行的 guest 的唯一整数标识符。不活动的虚拟机没有 id
值。
xmlns:qemu='http://libvirt.org/schemas/domain/qemu/1.0'
:QEMUSwitchToLibvirt
以下元素都是一级元素。
<domain type='kvm' id='1'>
<name>MyGuestname>
<uuid>4dea22b3-1d52-d8f3-2516-782e98ab3fa0uuid>
<genid>43dc0cf8-809b-4adb-9bea-a9abb5f3d90egenid>
<title>A short description - title - of the domaintitle>
<description>Some human readable descriptiondescription>
<metadata>
<app1:foo xmlns:app1="http://app1.org/app1/">..app1:foo>
<app2:bar xmlns:app2="http://app1.org/app2/">..app2:bar>
metadata>
...
虚拟机名称,字母、数字,在单个host范围内必须是唯一的。通常用作xml文件名。
虚拟机的全局唯一标识符(Since0.0.1)。格式必须符合 RFC 4122,例如3e3fce45-4f53-4fa7-bb32-11f34168b82b。如果在定义/创建新VM时省略,则libvirt会自动生成一个随机 UUID。也可以通过 sysinfo 提供 UUID(Since 0.8.7)。
虚拟机生成 ID(Since 4.4.0)。可以通过
指定一个具体的128位GUID,也可以通过
不指定具体值,由 Libvirt 自动生成一个 GUID 并将其保存到 XML 中。(注:GUID是Microsoft对UUID标准的实现)
用于在虚拟机重新执行之前已经执行的操作时帮助通知 guest 操作系统的全局唯一标识符(GUID),例如:VM 开始执行一个快照、从备份中恢复 VM、VM 用作故障转移、导入或复制或克隆 VM。在执行这些操作时,libvirt 将修改值,以此通知 guest 操作系统,让其注意到变化,从而 guest 能够通过将其分布式数据库的副本标记为 dirty、重新初始化其随机数生成器等方式作出适当的反应。
Domain 的简短描述(Since 0.9.10),不能包含换行符。
人类可读的虚拟机描述(Since0.7.2)。Libvirt 不以任何方式使用此数据,它可以包含用户想要的任何信息。
<metadata>
<app1:foo xmlns:app1="http://app1.org/app1/">..app1:foo>
<app2:bar xmlns:app2="http://app1.org/app2/">..app2:bar>
metadata>
应用程序可以使用
以 XML 节点/树的形式存储自定义元数据(Since 0.9.10)。应用程序必须在其 XML 节点/树上使用自定义名称空间,每个名称空间只有一个顶级元素(如果应用程序需要结构,它们应该在其名称空间元素中包含子元素)。
(注:xmlns 属性可以在文档中定义一个或多个可供选择的命名空间。)
是一级元素。
<os>
<type arch='x86_64' machine='pc-i440fx-rhel7.2.0'>hvmtype>
<bootmenu enable='yes'/>
<smbios mode='sysinfo'/>
os>
虚拟机操作系统启动引导。有许多不同的方法来引导虚拟机,每种方法都有自己的优点和缺点。
支持完全虚拟化的 hypervisors 可以通过 BIOS 启动。BIOS 有一个引导顺序优先级(软盘、硬盘、 cdrom、网络) ,决定从哪里获取/查找引导映像。
<os firmware='efi'>
<type>hvmtype>
<loader readonly='yes' secure='no' type='rom'>/usr/lib/xen/boot/hvmloaderloader>
<nvram template='/usr/share/OVMF/OVMF_VARS.fd'>/var/lib/libvirt/nvram/guest_VARS.fdnvram>
<boot dev='hd'/>
<boot dev='cdrom'/>
<bootmenu enable='yes' timeout='3000'/>
<smbios mode='sysinfo'/>
<bios useserial='yes' rebootTimeout='0'/>
os>
属性
firmware
可选值:bios
、efi
。此属性允许管理应用程序自动填充
和
二级元素,并可能启用所选固件所需的一些特性。libvirt 将扫描下列路径中描述了 installed firmware images 的文件,并使用能满足 domain 要求的最具体的文件。扫描路径(优先顺序:从一般到最具体):/usr/share/qemu/firmware
、/etc/qemu/firmware
、$XDG_CONFIG_HOME/qemu/firmware
。
有关更多信息,请参考 QEMU repository 中的 docs/interop/firmware.json
中描述的 firmware 元数据规范。普通用户不需要考虑这些。Since 5.2.0 (QEMU and KVM only) ,对于 VMware guest,当 guest 使用 UEFI 引导启动时此属性值将设置为efi
,而在使用 BIOS 引导启动时不设置。Since 5.3.0 (VMware ESX and Workstation/Player)。
<os firmware='efi'>
<type>hvmtype>
...
os>
:是
的二级子元素,指定在虚拟机中引导的操作系统的类型。
可选值
hvm
用于未修改的操作系统,表明操作系统是设计用于在裸机上运行的,因此需要完全虚拟化。
linux
(遗留名称)用于支持 Xen 3 hypervisor guest ABI 的操作系统。
xen
用于 XEN PV。
xenpvh
用于 XEN PVH。
exe
用于基于容器的虚拟化。
属性
arch
:指定虚拟化的 CPU 架构。缺省时,对于大多数 hypervisor 驱动程序,将选择主机的 arch
。然而,对于test、ESX、VMWare hypervisor 驱动程序,即使在arch
为 x86_64 的主机上,也将始终选择 i686 。
machine
:机器类型。查看qemu支持的虚拟机框架
<os firmware='efi'>
<loader readonly='yes' secure='no' type='rom'>/usr/lib/xen/boot/hvmloaderloader>
...
os>
:是
的二级子元素,指向一个 firmware blob(绝对路径),用于帮助创建 domain。Xen 完全虚拟化的 domain 可以使用它(since 0.1.0),也可以用来为 QEMU/KVM的 domain 设置 QEMU BIOS 文件路径(since 0.9.12)。
属性
readonly
:(since 1.2.8)可选值yes
表示只读、no
表示可写。
type
:(since 1.2.8)可选值rom
和 pflash
。告诉 hypervisor 在 guest 内存中的哪个位置映射
文件。例如,如果
的路径指向 了UEFI 图像,则type
属性值应为 pflash
。
secure
:(Since 2.1.0)一些固件可能会实现安全引导功能,此属性可以用来控制它。
<os firmware='efi'>
<nvram template='/usr/share/OVMF/OVMF_VARS.fd'>/var/lib/libvirt/nvram/guest_VARS.fdnvram>
...
os>
:是
的二级子元素,一些 UEFI 固件可能想使用 non-volatile memory 存储一些变量。在 host 主机上,这被表示为一个文件,文件的绝对路径存储在
元素中。此外,当 domain 启动时 libvirt 会拷贝在 qemu.conf 中定义的 master NVRAM 存储文件。
属性
template
:( Since 1.2.8)用于让单个 domain 覆盖 qemu.conf 中定义的 master NVRAM 存储文件。注意,对于临时 domain,如果 NVRAM 文件是由 libvirt 创建的,则它会被留下,保存或删除文件是应用程序的责任。
<os firmware='efi'>
<boot dev='hd'/>
<boot dev='cdrom'/>
...
os>
:是
的二级子元素。
属性
dev
可选值:fd
、hd
、cdrom
、network
,用于指定下一个要考虑的引导设备。
元素可以重复多次,以设置一个引导设备的优先级列表,依次进行尝试。同一类型的多个设备根据其目标进行排序,同时保持 bus 总线的顺序。定义 domain 之后,libvirt (通过 virDomainGetXMLDesc)返回的 XML 配置将按排序顺序列出设备。排序后,第一个设备被标记为可引导。因此,例如,一个配置为从hd
(with vdb, hda, vda, hdc disks)引导的 domain ,将从 vda 开始引导(顺序是 vda、 vdb、 hda、 hdc)。类似的 domain (with hdc, vda, vdb, hda disks)将从 hda 开始引导(顺序是 hda、 hdc、 vda、 vdb)。以期望的方式进行配置可能比较棘手,这就是为什么引入了每个设备的
三级元素(请参阅下面的disks、network interfaces、USB、PCI 设备部分) ,并且它们才是对引导顺序进行完全控制的首选方式。
二级级元素(Since 0.1.3)和每个设备的
三级元素(Since 0.8.8)是互斥的。
<os firmware='efi'>
<smbios mode='sysinfo'/>
...
os>
:是
的二级子元素,指定如何填充 guest 中可见的 SMBIOS 信息。如果未指定此元素,则使用 hypervisor 默认值。
属性
mode
:【必填】可选值为:emulate
(让 hypervisor 生成所有值)、host
(从主机的 SMBIOS 值中复制 Block 0和 Block 1中除 UUID 外的所有值; 可以调用 virConnectGetSysinfo 查看复制了哪些值)、sysinfo
(使用
元素中的值)。
上述
的二级子元素,对于 BIOS/UEFI 是通用的,可以被大多数固件实现。然而,下述
的二级子元素,不是每一个设置对所有的固件都有意义。例如,rebootTimeout
对于 UEFI 来说没有意义,对于不能在串行线上产生任何输出的 BIOS 固件来说,useserial
可能无法使用,等等。此外,固件通常不会导出其功能供 libvirt (或用户)检查。而且他们的能力集合会随着每一个新版本的发布而改变。因此,建议用户在生产环境中使用这些设置之前先充分测试。
<os firmware='efi'>
<bootmenu enable='yes' timeout='3000'/>
...
os>
:是
的二级子元素,指定是否在 guest 启动时显示 boot menu 交互界面。如果未指定此元素,则使用 hypervisor 默认值。
属性
enable
:yes
或no
。
timeout
:(Since 0.8.3)boot menu 等待超时的毫秒数。范围 [0,65535]。除非enable='yes'
,否则将忽略timeout
(Since 1.2.8)。
<os firmware='efi'>
<bios useserial='yes' rebootTimeout='0'/>
...
os>
:是
的二级子元素。
属性
useserial
:(Since 0.9.4)可选值:yes
或no
。它启用或禁用 Serial Graphics Adapter,即是否允许用户在串行端口上查看 BIOS 消息。因此,需要定义串行端口。
rebootTimeout
:(Since 0.10.2, QEMU only)万一引导失败,控制 guest 是否以及在多长时间后应该重新启动。该值以毫秒为单位,最大值为65535,特殊值 -1 表示禁用重新启动。
使用半虚拟化的管理程序通常不会模拟 BIOS,而是由主机负责启动操作系统。这可能使用主机中的伪引导加载程序(pseudo-bootloader)来提供一个接口为 guest 选择内核。一个例子是 Xen 的 pygrub。Bhyve hypervisor 也使用主机引导加载程序,bhyveload 或 grub-Bhyve。
<bootloader>/usr/bin/pygrubbootloader>
<bootloader_args>--append singlebootloader_args>
:(Since 0.1.0)指定 host 主机 OS 中 bootloader 可执行文件的绝对路径。这个引导加载程序将被运行,从而为 guest 选择引导哪个内核。引导加载程序所需的输出取决于所使用的 hypervisor。
:用于将命令行参数传递给 bootloader。
当安装一个新的 guest 操作系统时,直接从存储在 host 主机操作系统中的内核和 initrd 引导通常是有用的,并允许命令行参数直接传递给安装程序。此功能通常可用于准虚拟化和全虚拟化 guest 。
<os>
<type>hvmtype>
<loader>/usr/lib/xen/boot/hvmloaderloader>
<kernel>/root/f8-i386-vmlinuzkernel>
<initrd>/root/f8-i386-initrdinitrd>
<cmdline>console=ttyS0 ks=http://example.com/f8-i386/os/cmdline>
<dtb>/root/ppc.dtbdtb>
<acpi>
<table type='slic'>/path/to/slic.dattable>
acpi>
os>
、
这两个二级元素的语义与前面在 BIOS 引导部分中描述的相同。
二级元素
<os>
<kernel>/root/f8-i386-vmlinuzkernel>
...
os>
指定 host 主机 OS 中内核镜像的绝对路径。
二级元素
<os>
<initrd>/root/f8-i386-initrdinitrd>
...
os>
指定 host 主机 OS 中 ramdisk 镜像(可选)的绝对路径。
二级元素
<os>
<cmdline>console=ttyS0 ks=http://example.com/f8-i386/os/cmdline>
...
os>
指定在引导时传递给内核(或安装程序)的参数。这通常用于指定备用主控制台(如串行端口)或安装媒体源/启动文件。
二级元素
<os>
<dtb>/root/ppc.dtbdtb>
...
os>
:( Since 1.0.4)指定 host 主机 OS 中设备树二进制(dtb)镜像(可选)的完全限定路径。
二级元素
<os>
<acpi>
<table type='slic'>/path/to/slic.dattable>
acpi>
...
os>
子元素 二级元素 当使用基于容器的虚拟化引导 domain 时,需要使用 二级元素 启动时默认没有参数。如要指定init argv,可以使用 二级元素 如要设置环境变量,使用 二级元素 如要为 init 设置自定义工作目录,请使用 二级元素 若要作为指定用户或组运行 init 命令,请分别使用 二级元素 如果你想启用 user namespace,设置 三级元素 有些 hypervisor 允许控制向 guest 提供哪些系统信息(例如,SMBIOS 字段可以被 hypervisor 填充,并通过 guest 中的 属性 为 guest 操作系统分配的虚拟 cpu 的最大数量,此值必须在 1 到 hypervisor 支持的最大数量之间。 属性 属性 IOThreads 是支持磁盘设备的专用事件循环线程,用于执行 block i/o 请求,以提高可伸缩性,特别是对具有许多 LUN 的 SMP host 主机或 guest。 (Since 1.2.8, QEMU only) 属性 二级元素 属性 二级元素 属性 二级元素 属性 二级元素 二级元素 二级元素 二级元素 二级元素 二级元素 The optional emulator_period element specifies the enforcement interval (unit: microseconds). Within emulator_period, emulator threads (those excluding vCPUs) of the domain will not be allowed to consume more than emulator_quota worth of runtime. The value should be in range [1000, 1000000]. A period with value 0 means no value. Only QEMU driver support since 0.10.0 二级元素 二级元素 二级元素 二级元素 二级元素 属性 三级子元素 二级元素 属性 三级子元素 属性 属性 属性 二级元素 三级子元素 二级元素 二级元素 二级元素 属性 二级元素 属性 二级元素 Using the mode attribute, specify when to allocate the memory by supplying either “immediate” or “ondemand”. 属性 二级元素 对于每个可调参数,可以使用与一级元素 二级元素 二级元素 二级元素 The optional swap_hard_limit element is the maximum memory plus swap the guest can use. The units for this value are kibibytes (i.e. blocks of 1024 bytes). This has to be more than hard_limit value provided 二级元素 二级元素 属性 二级元素 属性 二级元素 二级元素 domain 可以具有多个 必选三级子元素 可选三级子元素(Since 0.9.8) Hypervisors 可能允许将虚拟机放置到资源分区中,potentially with nesting of said partitions。 二级元素 QEMU 和 LXC 驱动程序目前支持资源分区,它们把分区路径映射到 cgroups 目录,在所有已挂在的 controllers 中 (Since 1.0.5)。 CPU 模型、特性、拓扑的需求,可以使用 如果不需要对 CPU 模型及其特性进行限制,则可以使用简单版的 指定实际提供给 guest 的 VCPU 与需求匹配的严格程度。(Since 0.8.5 ) 可选值 (Since 3.2.0)指定检查 VCPU 是否符合需求的方式。在启动 domain 时省略此属性并保持默认值通常是安全的。一旦 domain 启动,libvirt 将自动把 可选值 (Since 0.9.10)用于更容易地将 guest CPU 配置为尽可能接近主机 CPU。 可选值 此模式实质上是将主机 CPU 定义从 capabilities XML 复制到 domain XML 的快捷方式。由于 CPU 定义是在启动 domain 的前一刻复制的,因此可以在不同的主机上使用完全相同的 XML,同时仍然提供每个主机支持的最佳 guest CPU。不能在此模式中使用 在此模式下,guest 可见的 CPU 应该与主机 CPU 完全相同,即使在 libvirt 不理解的方面也是如此。其缺点是不能在不同的硬件上再现 guest 环境。因此,如果你遇到了任何问题,你只能靠自己了。可以使用 如果 domain 可以直接在主机 CPU 上运行(例如,基于 kvm 的 domain ) ,那么 二级元素 属性 二级元素 二级元素 属性 二级元素 一级元素 属性 二级元素 属性 二级元素 三级子元素 目前,只有 Xen 和 QEMU 支持描述 NUMA 单元之间的距离。如果没有给出 ACPI Heterogeneous Memory Attribute Table 异构内存属性表 cache子元素 NUMA 描述具有一个可选的 interconnects子元素 有时需要覆盖对各种事件采取的默认操作。并非所有 hypervisors 都支持所有事件和操作。这些操作可能是调用 libvirt APIs virDomainReboot、 virDomainShutdown 、virDomainShutdownFlags 的结果。使用 以下元素允许指定在 guest 操作系统触发生命周期操作时的行为。一个常见的用例是在进行初始操作系统安装时强制将重启视为断电。这允许为第一次安装后引导重新配置 VM(This allows the VM to be re-configured for the first post-install bootup)。 QEMU/KVM 支持 (Since 3.9.0)可以通过 virDomainSetLifecycleAction API 配置生命周期事件。 (Since 0.10.2, Only qemu driver suppor)强制启用或禁用 guest 操作系统的 BIOS advertisements 是可能的。(注意: 只支持 qemu 驱动程序) Hypervisors 可能允许开关某些 CPU/机器特性。 所有的特性都在 pae acpi apic hap viridian privnet pvspinlock pmu vmport gic ioapic vmcoreinfo htm nested-hv msrs ccf-assist cfpc sbbc ibs 子元素 子元素 子元素 子元素 如果虚拟机正在启动,你不应该使用这个选项,除非你非常确定你知道你在做什么。 这个值是可配置的,因为无法保证计算一定是正确的。在 QEMU 中,用户可配置的扩展 TSEG 特性在 为了显著提高的 VCPU 计数或增加地址空间,可能需要额外的大小(可以是内存、 maxMemory、 64-bit PCI MMIO aperture 大小; 大约8 MiB TSEG 每1TiB 地址空间 ) ,也可以进行舍入。 由于这个设置的性质类似于“guest 应该拥有多少 RAM”,建议用户要么查阅 guest 操作系统或 loader 的文档(如果有的话) ,要么通过改变值的尝试和错误来测试,直到 VM 成功启动为止。然而,对于用户来说,另一个指导价值可能是这样一个事实: 48 MiB 对于非常大的 guest (240个 VCPU 和 4TB guest RAM)来说应该足够了,但是它故意不设置为缺省值 48 MiB,因为不可用 RAM 对于小 guests 来说可能太多了(例如,有512 MiB 的 RAM)。 有关 属性 子元素 属性 属性 有些平台允许监视虚拟机的性能和内部执行的代码。要启用性能监视事件,您可以在
三级元素指定 ACPI 表的绝对路径。
type
属性指定 ACPI 表的类型(目前只支持 slic
) 。(Since 1.3.5, QEMU) (Since 5.9.0, Xen)
2.4 容器启动(Container boot)
<os>
<type arch='x86_64'>exetype>
<init>/bin/systemdinit>
<initarg>--unitinitarg>
<initarg>emergency.serviceinitarg>
<initenv name='MYENV'>some valueinitenv>
<initdir>/my/custom/cwdinitdir>
<inituser>testerinituser>
<initgroup>1000initgroup>
<idmap>
<uid start='0' target='1000' count='10'/>
<gid start='0' target='1000' count='10'/>
idmap>
os>
init
<os>
<init>/bin/systemdinit>
...
os>
元素指定 init 二进制文件的路径,而不是使用内核或引导镜像。initarg
<os>
<initarg>--unitinitarg>
<initarg>emergency.serviceinitarg>
...
os>
元素,并根据需要重复多次。 如果设置了
元素 ,将用于提供给 /proc/cmdline,但不会影响 init argv。initenv
<os>
<initenv name='MYENV'>some valueinitenv>
...
os>
元素,每个变量一个。initdir
<os>
<initdir>/my/custom/cwdinitdir>
...
os>
元素。inituser、initgroup
<os>
<inituser>testerinituser>
<initgroup>1000initgroup>
...
os>
或
元素。两个元素都可以提供 id 或 name。在元素值前放一个+
将强制将其视为数值(id)。否则,将把元素值首先作为 name 进行尝试。idmap
<os>
<idmap>
<uid start='0' target='1000' count='10'/>
<gid start='0' target='1000' count='10'/>
idmap> ...
os>
元素。
和
有三个属性:
start
:容器中的第一个用户 ID,必须是0。
target
:容器中的第一个用户 ID 将映射到 host 主机中的这个目标用户 ID。
count
:容器中允许有多少用户映射到 host 主机的用户。3 SMBIOS 系统信息(SMBIOS System Information)
是一级元素。<os>
<smbios mode='sysinfo'/>
...
os>
<sysinfo type='smbios'>
<bios>
<entry name='vendor'>LENOVOentry>
bios>
<system>
<entry name='manufacturer'>Fedoraentry>
<entry name='product'>Virt-Managerentry>
<entry name='version'>0.9.4entry>
system>
<baseBoard>
<entry name='manufacturer'>LENOVOentry>
<entry name='product'>20BE0061MCentry>
<entry name='version'>0B98401 Proentry>
<entry name='serial'>W1KS427111Eentry>
baseBoard>
<chassis>
<entry name='manufacturer'>Dell Inc.entry>
<entry name='version'>2.12entry>
<entry name='serial'>65X0XF2entry>
<entry name='asset'>40000101entry>
<entry name='sku'>Type3Sku1entry>
chassis>
<oemStrings>
<entry>myappname:some arbitrary dataentry>
<entry>otherappname:more arbitrary dataentry>
oemStrings>
sysinfo>
<sysinfo type='fwcfg'>
<entry name='opt/com.example/name'>example valueentry>
<entry name='opt/com.coreos/config' file='/tmp/provision.ign'/>
sysinfo>
dmidecode -t 1
命令进行检查)。可选的
元素涵盖了所有这类信息。(Since 0.8.7)
type
【必填】,确定二级子元素布局。type='smbios'
:表示二级子元素调用特定的 SMBIOS 值,与
的
二级子元素一起使用,才会生效。每个二级子元素代表一个 SMBIOS block,其中每个三级元素
代表一个 block 字段。
、
、
、
、
二级元素分别代表 block 0、1、2、3、11。 具体详见官方文档。type='fwcfg'
:( Since 6.5.0)一些 hypervisors 提供了统一的方式来调整固件本身的配置,或者可能包含要为 guest 操作系统安装的表,例如 boot order、 ACPI、 SMBIOS 等等。它甚至允许用户定义自己的 config blobs。对于 QEMU,它们会出现在 domain 的 sysfs 下(如果 guest 内核启用了 FW_CFG_SYSFS 选项) ,即 /sys/firmware/qemu_fw_cfg 目录下。注意,无论 < os/>
下的 < smbios/>
使用了哪种 mode,这些值都会生效。请注意,由于数据槽数量有限,强烈建议不使用type='fwcfg'
,应改为使用
。
可以有多个三级子元素,每个三级子元素都具必须指定name
属性,该属性定义 blob 的名称,并且必须以opt/
开头,为了避免与其他名称冲突,建议采用 opt/$RFQDN/$name
的形式,其中 $RFQDN
是您控制的反向完全限定的域名。然后,元素可以包含值(直接设置 blob 值)或 file
属性(从文件中设置 blob 值)。4 CPU 分配(CPU Allocation)
<domain>
...
<vcpu placement='static' cpuset="1-4,^3,6" current="1">2vcpu>
<vcpus>
<vcpu id='0' enabled='yes' hotpluggable='no' order='1'/>
<vcpu id='1' enabled='no' hotpluggable='yes'/>
vcpus>
...
domain>
vcpu
是一级元素。<domain>
<vcpu placement='static' cpuset="1-4,^3,6" current="1">2vcpu>
...
domain>
cpuset
:(Since 0.4.4)以逗号分隔的物理 CPU 编号列表,domain 进程和 VCPU 在默认情况下可以固定到这个列表。该列表中的每个元素要么是单个 CPU 编号,要么是一个 CPU 编号范围,要么是一个^
符号后跟一个 CPU 编号,这个^
符号表示排除此编号。domain 进程和虚拟 cpu 的钉住策略可以通过一级元素
单独指定。如果指定了
的emulatorpin
属性,那么一级元素
指定的cpuset
属性将被忽略。类似地,对于指定了
的三级子元素
的虚拟 cpu,那么一级元素
指定的cpuset
属性将被忽略。对于没有指定三级元素
的虚拟 cpu,每个 cpu 都将固定在cpuset
属性指定的物理 cpu 上。current
:(Since 0.8.5)指定是否应该启用少于最大数量的虚拟 cpu 。placement
:指定 domain 进程 的 CPU 放置模式,可选值为:static
、auto
。如果设置了cpuset
属性,则此属性值缺省时默认为static
。auto
表示 domain 进程将会被固定到 the advisory nodeset from querying numad,此时将忽略cpaset
属性值。vcpus
是一级元素。<domain>
<vcpus>
<vcpu id='0' enabled='yes' hotpluggable='no' order='1'/>
<vcpu id='1' enabled='no' hotpluggable='yes'/>
vcpus>
...
domain>
元素允许控制单个 vcpu 的状态。
id
:指定了 libvirt 在其他位置使用的 VCPU ID(如 VCPU 钉住、调度器信息、 NUMA 分配)。注意,在 guest 中看到的 VCPU ID 在某些情况下可能不同于 libvirt ID。有效的 id 范围是[0,
元素值 - 1]。enabled
:允许控制 VCPU 的状态,可选值为yes
、no
。hotpluggable
:控制 VCPU 是否可以被热插拔,可选值为yes
、no
。注意,所有禁用的VCPU 都必须是可热插拔的。order
:指定添加在线 VCPU 的顺序。对于需要同时插入多个 VCPU 的 hypervisors/platforms ,可以在需要同时启用的所有 VCPU 之间复制顺序。指定顺序不是必须的,不指定时将按任意顺序添加 VCPU。如果使用order
,它必须被用于所有的在线 VCPU。hypervisor 可以在某些操作期间清除或更新顺序信息,以确保配置有效。注意,hypervisor 可能会创建不同于 boog VCPU 的可热插拔 VCPU,因此可能需要特殊的初始化。hypervisor 可能要求 boot 时启用的那些不可热插拔的 VCPU are clustered at the beginning starting with ID 0。可能还要求 VCPU 0 始终存在并且不可热插拔。注意,为单个 cpu 提供状态可能是必要的,以支持可寻址的 VCPU 热插拔,并且这个特性可能不会被所有 hypervisor 所支持。对于 QEMU,需要满足以下条件: VCPU 0 需要启用并且不能热插拔。对于 PPC64 和它一起使用的位于同一核心的 VCPU 也需要启用。boot 时所有不可热插拔的 CPU 都需要在 VCPU 0 之后进行分组。(Since 2.2.0, QEMU only)5 IOThreads 分配(IOThreads Allocation)
iothreads
是一级元素。<domain>
...
<iothreads>4iothreads>
...
domain>
:(Since 1.2.8)定义分配给 domain 的 IOThreads 数量,供受支持的目标存储设备使用。每个 host 主机 CPU 应该只有1或2个 IOThreads。可能有多个受支持的设备分配给每个 IOThread。从1.2.8开始iothreadids
是一级元素。<domain>
...
<iothreadids>
<iothread id="2"/>
<iothread id="4"/>
<iothread id="6"/>
<iothread id="8"/>
iothreadids>
...
domain>
元素提供了专门定义 domain 的 IOThread ID 的功能。默认情况下,IOThread ID 是顺序编号,从1到为 domain 定义的 iothreads 的数量 。
id
:(Since 1.2.15)用于定义 IOThread ID,必须是大于 0 的正整数。如果为 domain 定义的
少于
,那么 libvirt 将从 1 开始顺序填充
,避免任何预定义的 id。如果为 domain定义的
多于
,则将相应地调整
的值。从1.2.15开始6 CPU 调整(CPU Tuning)
cputune
是一级元素。<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"/>
<iothreadpin iothread="1" cpuset="5,6"/>
<iothreadpin iothread="2" cpuset="7,8"/>
<shares>2048shares>
<period>1000000period>
<quota>-1quota>
<global_period>1000000global_period>
<global_quota>-1global_quota>
<emulator_period>1000000emulator_period>
<emulator_quota>-1emulator_quota>
<iothread_period>1000000iothread_period>
<iothread_quota>-1iothread_quota>
<vcpusched vcpus='0-4,^3' scheduler='fifo' priority='1'/>
<iothreadsched iothreads='2' scheduler='batch'/>
<cachetune vcpus='0-3'>
<cache id='0' level='3' type='both' size='3' unit='MiB'/>
<cache id='1' level='3' type='both' size='3' unit='MiB'/>
<monitor level='3' vcpus='1'/>
<monitor level='3' vcpus='0-3'/>
cachetune>
<cachetune vcpus='4-5'>
<monitor level='3' vcpus='4'/>
<monitor level='3' vcpus='5'/>
cachetune>
<memorytune vcpus='0-3'>
<node id='0' bandwidth='60'/>
memorytune>
cputune>
...
domain>
元素提供了有关 domain 的 CPU 可调参数的详细信息。注意: 对于 qemu 驱动程序,可选的二级元素
和
钉住设置将在模拟器启动并考虑 NUMA 约束之后执行。这意味着在此期间 domain 将使用 host 主机的其他物理 cpu,这将通过virsh cpu-stats
命令的输出得到反映。(Since 0.9.0)vcpupin
<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"/>
...
<cputune>
元素指定 domain 的 VCPU 将固定到 host 主机的哪个物理 cpu 上。如果没有指定此元素,并且没有指定一级元素
的
属性,则 VCPU 将默认钉在所有物理 cpu 上。
:【必填】指定 VCPU ID。
:【必填】与一级元素
的
属性相同。( Since 0.9.0, Only qemu driver support)emulatorpin
<cputune>
<emulatorpin cpuset="1-3"/>
...
<cputune>
元素指定 host 主机的哪个物理 cpu 是 emulator,即不包括 VCPU 或 iothreads 的 domain 的子集将被固定到其上。如果省略此元素,并且没有指定一级元素
的
属性,则默认将 emulator 固定到所有物理 cpu 上。
:【必填】指定要钉到哪个物理 cpu 上。iothreadpin
<cputune>
<iothreadpin iothread="1" cpuset="5,6"/>
<iothreadpin iothread="2" cpuset="7,8"/>
...
<cputune>
元素指定 IOThreads 将固定到 host 主机的哪个物理 cpu 上。如果省略次元素,并且没有指定一级元素
的
属性,则默认将 IOThreads 固定在所有物理 cpu 上。
iothread
:【必填】(Since 1.2.9)指定 IOThread,有效值请参见
说明。
:【必填】指定要钉到哪个物理 cpu 上。shares
<cputune>
<shares>2048shares>
...
<cputune>
元素指定 domain 的比例加权份额。如果省略此元素,将默认为 OS 提供的缺省值。注意,此元素值没有单位,它是基于其他 VM 的设置的相对度量。例如,用值 2048 配置的 VM 将获得比用值 1024 配置的 VM 多两倍的 CPU 时间。(Since 0.9.0)period
<cputune>
<period>1000000period>
...
<cputune>
元素指定执行间隔(单位: microseconds)。在此期间,domain 的每个 VCPU 不允许消耗超过运行时
指定的资源。值范围[1000, 1000000]。值为 0 表示没有值。 (Since 0.9.4, Only QEMU driver support, LXC since 0.9.10)quota
<cputune>
<quota>-1quota>
...
<cputune>
元素指定允许的最大带宽(单位: microseconds)。负值表示该 domain 对于 VCPU 线程具有无限的带宽,这意味着它不受带宽控制。值范围 [1000, 18446744073709551] 或小于 0。值为 0 表示没有值,您可以使用这个特性来确保所有的 VCPU 以相同的速度运行。 (Since 0.9.4, Only QEMU driver support, LXC since 0.9.10)global_period
<cputune>
<global_period>1000000global_period>
...
<cputune>
元素指定执行 CFS 调度程序间隔(单位: microseconds) ,这是针对整个 domain 的,与执行每个 VCPU 使用间隔的
元素形成对比。值范围[1000, 1000000]。值为0表示没有值。(Since 1.3.3, Only QEMU driver support)global_quota
<cputune>
<global_quota>-1global_quota>
...
<cputune>
元素指定在一个
周期内的最大允许带宽(单位: 微秒) ,这是针对整个 domain 的。负值表示该 domain 具有无限带宽,这意味着它不受带宽控制。值应范围 [1000, 18446744073709551] 或小于0。值为0 表示没有值。(Since 1.3.3, Only QEMU driver support)emulator_period
<cputune>
<emulator_period>1000000emulator_period>
...
<cputune>
元素指定执行间隔(单位: 微秒)。在
周期内,domain 的 emulator 线程(不包括 vcpu)运行时不允许消耗超过
指定的资源。值范围 [1000, 1000000]。值为0 表示没有值。(Since 0.10.0, Only QEMU driver support)emulator_quota
<cputune>
<emulator_quota>-1emulator_quota>
...
<cputune>
元素指定 domain 的 emulator 线程(不包括 vcpu)的最大允许带宽(单位: microseconds)。负值表示该 domain 对于 emulator 线程(不包括 vcpu)具有无限的带宽,这意味着它不受带宽控制。值应范围 [1000, 18446744073709551] 或小于0。值为 0 表示没有值。(Since 0.10.0, Only QEMU driver support)iothread_period
<cputune>
<iothread_period>1000000iothread_period>
...
<cputune>
元素指定 IOThreads 的执行间隔(单位: microseconds)。在
周期内,domain 的每个 IOThread 运行时不允许消耗超过
指定的资源。值范围 [1000, 1000000]。值为 0 表示没有值。(Since 2.1.0, Only QEMU driver support)iothread_quota
<cputune>
<iothread_quota>-1iothread_quota>
...
<cputune>
元素指定 IOThreads 的最大允许带宽(单位: microseconds)。负值表明 domain IOThreads 具有无限的带宽,这意味着它不受带宽控制。值范围 [1000, 18446744073709551] 或小于0。值为 0 表示没有值,您可以使用这个特性来确保所有 IOThreads 以相同的速度运行。(Since 2.1.0, Only QEMU driver support)vcpusched、iothreadsched 、emulatorsched
<cputune>
<vcpusched vcpus='0-4,^3' scheduler='fifo' priority='1'/>
<iothreadsched iothreads='2' scheduler='batch'/>
...
<cputune>
、
、
元素分别为特定的 VCPU、 IOThread 和 emulator 线程指定调度程序类型(可选值 batch
、 idle
、 fifo
、 rr
)。对于
、
,vcpus
和iothreads
属性指定将此设置应用于哪个 VCPUs/IOThreads,将它们设置为缺省值。模拟器
元素没有这个属性。有效的vcpus
属性值从0开始到比为 domain 定义的 VCPU 数量少一个。有效的iothreads
属性值在一级元素
中进行了描述。如果没有定义
,则 libvirt 将自动 把 IOThreads 的数量设置为从1增加到可用于 domain 的 IOThreads 的数量。对于实时调度器(fifo
、 rr
) ,也必须指定priority
属性(对于非实时调度器,则忽略priority
属性)。priority
属性值范围取决于 host 主机内核(通常为1-99)。(Since 1.2.13, emulatorsched Since 5.3.0)cachetune
<cputune>
<cachetune vcpus='0-3'>
<cache id='0' level='3' type='both' size='3' unit='MiB'/>
<cache id='1' level='3' type='both' size='3' unit='MiB'/>
<monitor level='3' vcpus='1'/>
<monitor level='3' vcpus='0-3'/>
cachetune>
<cachetune vcpus='4-5'>
<monitor level='3' vcpus='4'/>
<monitor level='3' vcpus='5'/>
cachetune>
...
<cputune>
元素可以使用 host 主机上的 resctrl 来控制 CPU 缓存的分配。支持与否可以通过报告最小大小和所需粒度等限制的功能来收集。(Since 4.1.0)
vcpus
:【必填】指定这个分配应用于哪个 VCPU。一个 VCPU 只能是一个
元素分配的成员。
指定的 VPCU 可以与
中的相同,但是它们不允许相互重叠(overlap)。
:控制 CPU 缓存的分配,并具有以下属性:
level
:要从中分配的 host 主机缓存级别。
id
:要从中分配的 host 主机缓存 ID。
type
:分配类别。可选值:code
(代码指令) ,data
(数据)、both
(代码和数据统一)。目前,只能使用 host 主机支持的相同类型进行分配,这意味着您不能对启用了 CDP (代码/数据优先级)的 host 主机使用both
。
size
:要分配的区域大小。默认值以字节为单位,但是可以使用unit
属性来缩放该值。
unit
:区域大小的单位 ,如 KiB、 MiB、 GiB 或 TiB ,默认为字节。
:(Since 4.10.0 )为当前缓存分配创建缓存监视器,并具有以下属性:
level
:监视器所属的 host 主机缓存级别。
vcpus
:应用监视器的 VCPU 列表,只能是相关分配的 VCPU 列表的成员。默认监视器与关联的分配具有相同的 VCPU 列表。对于非默认监视器,不允许重叠的 VCPU。memorytune
<cputune>
<memorytune vcpus='0-3'>
<node id='0' bandwidth='60'/>
memorytune>
...
<cputune>
元素使用 host 主机上的 resctrl 来控制内存带宽的分配。是否支持这一点可以通过报告最小带宽和所需粒度等限制的功能来收集。(Since 4.7.0)
vcpus
:【必填】指定这个分配应用于哪个 VCPU。一个 VCPU 只能是一个
元素分配的成员。
指定的 VPCU 可以与
中的相同,但是它们不允许相互重叠(overlap)。
:控制 CPU 内存带宽的分配,具有以下属性:
id
:从中分配内存带宽的 host 主机节点 id。
bandwidth
:要从此节点分配的内存带宽。默认使用百分比格式。7 内存分配(Memory Allocation)
<domain>
...
<maxMemory slots='16' unit='KiB'>1524288maxMemory>
<memory unit='KiB'>524288memory>
<currentMemory unit='KiB'>524288currentMemory>
...
domain>
memory
是一级元素,指定 guest boot 时的最大内存分配。内存分配包括可能的附加内存设备,这些设备在启动时指定,或在以后热插拔时指定。此元素值将由 libvirt 舍入到最近的 kibibyte,并可能进一步舍入到 hypervisor 支持的粒度。一些 hypervisor 也执行最小值,如4000KiB。如果为 guest 配置了 NUMA,则可以省略
元素。
unit
:(Since 0.9.11 )单位,可选值为 b\bytes、k\KiB(默认,2^10 b
)、M\MiB、G\GiB、T\TiB、KB(10^3 b
)、MB、GB、TB。
dumpCore
:(since 0.10.2, QEMU only)可选值为on
、off
,用于控制在崩溃的情况下是否应该将 guest 内存包含在生成的 coredump 中。maxMemory
是一级元素,指定 guest 运行时的最大内存分配。可以通过将内存热插拔到此元素指定的限制来增加
元素或 NUMA 单元大小配置指定的初始内存。
unit
:同上。
slots
:指定用于向 guest 添加内存的可用槽数。界限是特定于 hypervisor 的。请注意,由于对通过内存热插拔添加的内存块的对齐,此元素指定的全尺寸分配可能无法实现。(Since 1.2.14 supported by the QEMU driver)currentMemory
是一级元素,指定 guest 的实际内存分配。这个值可以小于最大分配值,以允许 guest 内存动态膨胀。如果不指定,则默认与
元素相同。
unit
:同上。8 Memory Backing
是一级元素。<domain>
...
<memoryBacking>
<hugepages>
<page size="1" unit="G" nodeset="0-3,5"/>
<page size="2" unit="M" nodeset="4"/>
hugepages>
<nosharepages/>
<locked/>
<source type="file|anonymous|memfd"/>
<access mode="shared|private"/>
<allocation mode="immediate|ondemand"/>
<discard/>
memoryBacking>
...
domain>
包含几个元素,这些元素会影响 host 主机页面对虚拟内存页面的支持方式。hugepages
<memoryBacking>
<hugepages>
<page size="1" unit="G" nodeset="0-3,5"/>
<page size="2" unit="M" nodeset="4"/>
hugepages>
...
memoryBacking>
:(Since 1.2.5 )这告诉系统 hypervisor,应该使用较大的页面而不是通常的本机页面大小来分配 guest 的内存。
:可以为 每个 NUMA 节点设置更具体的页面,具有以下属性:
size
:用于指定应该使用哪些大型页面(特别适用于支持不同大小的大型页面的系统)。
unit
:默认单位为kilobytes。
nodeset
:对于使用 NUMA 的系统,此属性可能很方便,因为它将 guest 的 NUMA 节点与特定的页面大小联系起来。从示例代码片段中可以看出,除了4号节点之外,每个 NUMA 节点都使用了1G 的 hugepages。有关正确的语法,请参见章节 NUMA Node Tuning。nosharepages
<memoryBacking>
<nosharepages/>
...
memoryBacking>
:(Since 1.0.6)指示 hypervisor 为此 domain 禁用共享页面(内存合并,KSM)locked
<memoryBacking>
<locked/>
...
memoryBacking>
:(Since 1.0.6)当设置了此元素并且 hypervisor 并支持时,属于该 domain 的内存页将被锁定在 host 主机的内存中,并且不允许 host 主机将它们交换出来(swap out),这对于一些实时工作负载可能是必需的。对于 QEMU/KVM 客户机,QEMU 进程本身使用的内存也将被锁定: 与 guest 内存不同,这是 libvirt 无法预先计算出的数量,因此它必须完全去除锁定内存的限制。因此,启用这个选项可能会带来潜在的安全风险: 当内存耗尽时,主机将无法从 guest 收回锁定的内存,这意味着恶意 guest 分配大量锁定内存可能导致主机出现 denial-of-service 攻击。因此,除非您的工作负载需要,否则不鼓励使用此元素; 即使如此,强烈建议对适合特定环境的内存分配设置硬限制(请参阅章节 Memory Tuning 内存调整) ,以减轻上述风险。source
<memoryBacking>
<source type="file|anonymous|memfd"/>
...
memoryBacking>
type
:可选值:file
利用文件进行内存备份,anonymous
默认,memfd
备份(Since 4.10.0, QEMU/KVM onlyQEMU/KVM)。access
<memoryBacking>
<access mode="shared|private"/>
...
memoryBacking>
mode
:指定内存是“共享”还是“私有”,可选值shared
、private
。可以通过对单个 NUMA 节点设置 memAccess
覆盖此属性。allocation
<memoryBacking>
<allocation mode="immediate|ondemand"/>
...
memoryBacking>
mode
:指定何时分配内存,可选值 immediate
、ondemand
。discard
<memoryBacking>
<discard/>
...
memoryBacking>
:(Since 4.4.0, QEMU/KVM only)当设置了此元素并且 hypervisor 并支持时,内存内容会在 guest 关闭之前丢弃(或者当 DIMM 模块被拔出时)。请注意,这只是一个优化,并不能保证在所有情况下都能工作(例如,当 hypervisor 崩溃时)。9 Memory Tuning 内存调整
是一级元素<domain>
...
<memtune>
<hard_limit unit='G'>1hard_limit>
<soft_limit unit='M'>128soft_limit>
<swap_hard_limit unit='G'>2swap_hard_limit>
<min_guarantee unit='bytes'>67108864min_guarantee>
memtune>
...
domain>
元素提供了 domain 内存可调参数的详细信息。如果省略此元素,将默认为 OS 提供的缺省值。对于 QEMU/KVM,参数作为一个整体应用于 QEMU 进程。因此,在计算它们时,需要把 guest RAM、guest 视频 RAM 、QEMU 本身的一些内存开销都加在一起。最后一部分很难确定,所以需要猜测和尝试。
相同的可选单位作为属性unit
的值(Since 0.9.11)。为了向后兼容,输出总是以 KiB 为单位。所有名称为*_limit
的三级子元素,其值范围都是 [0, VIR_DOMAIN_MEMORY_PARAM_UNLIMITED]。hard_limit
<memtune>
<hard_limit unit='G'>1hard_limit>
...
memtune>
指定 guest 可以使用的最大内存。该值的单位为 kibibytes (即1024字节的块)。强烈建议 QEMU 和 KVM 的用户不要设置这个限制,因为如果猜测值太低, domain 可能会被内核杀死,并且确定进程运行所需的内存是一个无解的问题; 也就是说,如果因为工作负载需要而已经在一级元素
中设置了
,那么就必须考虑部署的细节,并计算出
的值,这个值足以支持 guest 的内存需求,但又足以保护 host 主机不受恶意 guest 锁定所有内存的影响。soft_limit
<memtune>
<soft_limit unit='M'>128soft_limit>
...
memtune>
指定在内存争用期间要强制执行的内存限制。该值的单位为 kibibytes (即1024字节的块)。swap_hard_limit
<memtune>
<swap_hard_limit unit='G'>2swap_hard_limit>
...
memtune>
指定 guest 可以使用的最大内存加 swap。该值的单位为 kibibytes (即1024字节的块)。必须大于
指定的值。min_guarantee
<memtune>
<min_guarantee unit='bytes'>67108864min_guarantee>
...
memtune>
指定为 guest 保证提供的最小内存分配。该值的单位为 kibibytes (即1024字节的块)。此元素只支持 VMware ESX 和 OpenVZ 驱动程序。10 NUMA 节点调整(NUMA Node Tuning)
是一级元素<domain>
...
<numatune>
<memory mode="strict" nodeset="1-4,^3"/>
<memnode cellid="0" mode="strict" nodeset="1"/>
<memnode cellid="2" mode="preferred" nodeset="2"/>
numatune>
...
domain>
指定如何通过控制 domain 进程的 NUMA 策略来调优 NUMA 主机的性能。只支持 QEMU 驱动程序。(Since 0.9.3)(什么是 NUMA?)memory
<numatune>
<memory mode="strict" nodeset="1-4,^3"/>
...
numatune>
指定如何为 NUMA 主机上的 domain 进程分配内存。它包含几个可选属性。
mode
:可选值为 interleave
、 strict
(默认)、 preferred
。
nodeset
: 指定 NUMA 节点,使用与一级元素
的cpuset
属性相同的语法。
placement
:(Since 0.9.12)指定 domain 进程的内存放置模式。可选值为 static
、 auto
,默认值为一级元素
的placement
属性 值;或者如果指定了nodeset
,则本属性的默认值为static
。 auto
表示 domain 进程将只从由 querying numad 返回的 advisory nodeset 中分配内存,nodeset
属性的值将被忽略。如果一级元素
的属性placement='auto'
,并且没有指定
元素,将隐式添加其默认值(placement='auto'
,mode= 'strict'
)。memnode
<numatune>
<memnode cellid="0" mode="strict" nodeset="1"/>
<memnode cellid="2" mode="preferred" nodeset="2"/>
...
numatune>
为单个 guest NUMA 节点指定内存分配策略。对于没有相应
元素的节点,将使用二级元素
的值作为默认值。此元素的设置与二级元素
的placement='auto'
不兼容。(QEMU Since 1.2.7)
cellid
:指定要应用此设置的 guest NUMA 节点。
mode
和nodeset
与二级元素
的属性相同。11 I/O 块调整(Block I/O Tuning)
是一级元素<domain>
...
<blkiotune>
<weight>800weight>
<device>
<path>/dev/sdapath>
<weight>1000weight>
device>
<device>
<path>/dev/sdbpath>
<weight>500weight>
<read_bytes_sec>10000read_bytes_sec>
<write_bytes_sec>10000write_bytes_sec>
<read_iops_sec>20000read_iops_sec>
<write_iops_sec>20000write_iops_sec>
device>
blkiotune>
...
domain>
提供了为 domain 调优 Blkio cgroup 可调参数的能力。如果省略此参数,将默认为 OS 提供的缺省值。(Since 0.8.8)weight
<blkiotune>
<weight>800weight>
...
blkiotune>
指定 guest 的总体 I/O 权重。值范围 [100,1000]。在内核2.6.39之后,值范围扩展为 [10,1000]。device 设备
<blkiotune>
<device>
<path>/dev/sdapath>
<weight>1000weight>
device>
<device>
<path>/dev/sdbpath>
<weight>500weight>
<read_bytes_sec>10000read_bytes_sec>
<write_bytes_sec>10000write_bytes_sec>
<read_iops_sec>20000read_iops_sec>
<write_iops_sec>20000write_iops_sec>
device>
...
blkiotune>
元素,用于进一步调整 domain 使用的每个主机块设备的权重。注意,如果多个 guest 磁盘由相同的主机文件系统中的文件所提供(if they are backed by files within the same host file system),那么它们可以共享一个主机块设备,这就是为什么这个调优参数位于全局 domain 级别,而不是与每个 guest 磁盘设备相关联(与可以应用于单个
的
元素形成对比)。
:【必需】描述设备的绝对路径。
:【必需】给出该设备的相对权重,值范围为[100,1000]。在内核2.6.39之后,该值可以在[10,1000]范围内。
read_bytes_sec
:读吞吐量限制,单位:字节数/每秒(Since 1.2.2)。
write_bytes_sec
:写吞吐量限制,单位:字节数/每秒(Since 1.2.2)。
read_iops_sec
:每秒读 I/O 操作次数限制(Since 1.2.2)。
write_iops_sec
:每秒写 I/O 操作次数限制(Since 1.2.2)。12 资源分区(Resource partitioning )
元素把资源分区相关的配置组合在一起。partition
...
<resource>
<partition>/virtualmachines/productionpartition>
resource>
...
:定义了放置 domain 资源分区的绝对路径。如果没有列出分区,那么 domain 将被放置在默认分区中。应用程序/管理员有责任确保在启动 guest 之前分区已经存在。只有(特定于 hypervisor 的)默认分区能够被假定默认存在。13 CPU 模型和拓扑(CPU model and topology )
元素来指定( Since 0.7.5)。
是一级元素,是描述 guest CPU 需求的主容器。...
<cpu match='exact'>
<model fallback='allow'>core2duomodel>
<vendor>Intelvendor>
<topology sockets='1' dies='1' cores='2' threads='1'/>
<cache level='3' mode='emulate'/>
<feature policy='disable' name='lahf_lm'/>
cpu>
...
<cpu mode='host-model'>
<model fallback='forbid'/>
<topology sockets='1' dies='1' cores='2' threads='1'/>
cpu>
...
<cpu mode='host-passthrough' migratable='off'>
<cache mode='passthrough'/>
<feature policy='disable' name='lahf_lm'/>
cpu>
...
元素(Since 0.7.6)。...
<cpu>
<topology sockets='1' dies='1' cores='2' threads='1'/>
cpu>
...
属性
match
<cpu match='exact'>
<model fallback='allow'>core2duomodel>
<vendor>Intelvendor>
<topology sockets='1' dies='1' cores='2' threads='1'/>
<cache level='3' mode='emulate'/>
<feature policy='disable' name='lahf_lm'/>
cpu>
match
可以省略,并默认为exact
。
match='minimum'
:需求是对 VCPU 的最低要求。如果 host 主机支持,将提供更好的 VCPU 配置。这是一种受约束的host-model
mode,如果不能满足需求,则不创建 domain。
match='exact'
:提供给 guest 的 VCPU 必须完全匹配需求。如果不支持所需 CPU,则 libvirt 将拒绝启动 domain。
match='strict'
:除非主机 CPU 完全匹配需求,否则 libvirt 不会创建 domain。这在实践中并不常用,只有在真正有理由的情况下才能使用。check
check
属性更改为最佳支持值,以确保当 domain 迁移到另一个主机时,VCPU 不会更改。
check='none'
:Libvirt 不进行检查,由 hypervisor 负责对无法提供匹配 VCPU 的情况发出拒绝启动 domain。对于 QEMU,这意味着根本不进行检查,因为 QEMU 的默认行为是只发出警告,但仍然启动 domain。
check='partial'
:Libvirt 将在启动 domain 之前检查 guest 的 CPU 需求,但其余工作留给 hypervisor,它仍然可以提供一个不同的 VCPU。
check='full'
:Libvirt 将检查,除非 hypervisor 创建的 VCPU 与需求匹配,否则不会启动 domain。mode
mode='custom'
:(默认)无论 guest 启动在哪个主机上,持久的 guest 都会看到相同的硬件。mode='host-model'
:<cpu mode='host-model'>
<model fallback='forbid'/>
<topology sockets='1' dies='1' cores='2' threads='1'/>
cpu>
match
属性。也不支持指定 CPU 的 model ,但是仍然可以使用model
的fallback
属性。在此模式下,还可以使用
元素启动或禁用某些特定标志,用来微调能够模拟的特性(Since 1.1.1)。Libvirt 不会对每个 CPU 的每个方面建模,因此 guest CPU 不会与主机 CPU 完全匹配。另一方面,提供给 guest 的 ABI 是可复用的。在迁移过程中,将把完整的 CPU 模型定义传输到目标主机上,这样,即使目标主机包含更强大的 CPU 或更新的内核,被迁移的 guest 也会看到与正在运行实例完全相同的 CPU 模型; 但是,关闭和重启 guest 可能会根据新主机的功能向 guest 提供不同的硬件。在 libvirt 3.2.0 和 QEMU 2.9.0之前,不支持通过 QEMU 检测主机 CPU 的 model。因此,使用此模式创建的 CPU 配置可能不会像预期的那样工作。Since 3.2.0 和 QEMU 2.9.0,此模式就能按照设计的方式工作,并且可以设置fallback=forbid
属性来禁止这种模式(在 domain capabilities XML中设置)。当在 domain capabilities XML 中设置了fallback=allow
属性时,建议mode='custom'
只与 host capabilities XML 中的 CPU 模型 一起使用。Since 1.2.11,PowerISA 允许处理器以二进制兼容模式运行 VM,支持老版本的 ISA。PowerPC 体系结构上的 Libvirt 使用mode='host-model'
表示以二进制兼容模式运行的 guest CPU。例如: 当用户需要让 power7的虚拟机在 Power8的主机上以兼容模式运行时,可以使用以下 XML 进行描述:<cpu mode='host-model'>
<model>power7model>
cpu>
...
mode='host-passthrough'
:<cpu mode='host-passthrough' migratable='off'>
<cache mode='passthrough'/>
<feature policy='disable' name='lahf_lm'/>
cpu>
元素更改该 CPU 的详细信息。如果源主机和目标主机在硬件、 QEMU 版本、microcode 版本和配置上不完全相同,那么对使用此模式的 guest 进行迁移是危险的。如果尝试这样的迁移,那么在目标主机上恢复执行时,guest 可能会挂起或崩溃。根据 hypervisor 版本的不同, VCPU 可能包含阻止迁移的特性(即使迁移到相同主机)。(Since 6.5.0)可选的migratable
属性可以用来显式地制定将这些特性从 VCPU 上移除(on
)或保留(off
)。这个属性并不能使迁移到另一个主机更安全: 即使migratable='on'
迁移也是危险的,除非两个主机在上述方面都是相同的。mode='host-model'
和mode='host-passthrough'
都有意义。实际的主机 CPU 与为 domain 模拟的 VCPU 无关(例如,基于 qemu 的 domain)。然而,为了向后兼容,mode='host-model'
可能会支持在模拟 CPU 上运行的 domain,在这种情况下,可能会使用 hypervisor 能够模拟的最好的 CPU ,而不是试图模拟主机 CPU 模型。二级子元素
model
<cpu match='exact'>
<model fallback='allow'>core2duomodel>
...
cpu>
指定 guest 要求的 CPU 模型。可用的 CPU 模型及其定义的列表可以在目录 cpu_map 中找到,该目录安装在 libvirt 的数据目录中。
fallback
:是否允许回退。allow
(默认)如果 hypervisor 不能使用准确的 CPU 模型,libvirt 会自动回退到 hypervisor 支持的最接近的模型,同时维护 CPU 特性列表。forbidden
对于不支持的 CPU 模型,domain 会启动失败(Since 0.9.10)。vendor_id
:设置 guest 看到的供应商 id。长度必须为12个字符。如果没有设置,则使用主机的供应商 id。典型的可能值是 AuthenticAMD 和 GenuineIntel。vendor
<cpu match='exact'>
<vendor>Intelvendor>
...
cpu>
:(Since 0.8.3)指定 guest 要求的 CPU 供应商。如果省略此元素,则 guest 可以在一个匹配指定特性的 CPU 上运行,而不用考虑它的供应商。支持的供应商列表可以在 cpu_map/*_vendors.xml
中找到。topology
<cpu match='exact'>
<topology sockets='1' dies='1' cores='2' threads='1'/>
...
cpu>
:指定 guest 要求的 VCPU 拓扑。四个属性都只接受非零正整数值。Hypervisors 可能要求一级元素
指定的最大 VCPU 数量等于
产生的 VCPU 数量。(注:原文写的cpus
元素,可能是笔误:Hypervisors may require that the maximum number of vCPUs specified by the cpus
element equals to the number of vcpus resulting from the topology.)
sockets
:【必填】每个 NUMA 节点的 CPU 插槽数。
dies
:默认为1,每个插槽的切片数。
cores
:【必填】每个切片上的核心数。
threads
:【必填】每个核心上的线程数。feature
<cpu match='exact'>
<feature policy='disable' name='lahf_lm'/>
...
cpu>
可以包含零个或多个用于微调所选 CPU 模型的特性的
元素。已知的特性名称列表可以在与 CPU 模型相同的文件中找到。
policy
:每个
元素的含义取决于它的policy
属性,必须设置为以下值之一。
policy='force'
:无论主机 CPU 支持与否,VCPU 都会声明支持该特性。
policy='require'
:(默认,Since 0.8.5)除非主机 CPU 支持这个特性,或者 hypervisor 能够模拟它,否则 guest 将会创建失败。
policy='optional'
:当且仅当主机 CPU 支持该特性时,VCPU 才会支持该特性。
policy='disable'
:VCPU 不支持该特性。
policy='forbid'
:如果主机 CPU 支持该特性,则 guest 将会创建失败。name
:指定特性名称。例如,使用 Intel IvyBridge CPU 模型时显式指定pcid
特性:...
<cpu match='exact'>
<model fallback='forbid'>IvyBridgemodel>
<vendor>Intelvendor>
<feature policy='require' name='pcid'/>
cpu>
...
cache
<cpu match='exact'>
<cache level='3' mode='emulate'/>
...
cpu>
:(Since 3.3.0)描述了 VCPU 缓存。如果省略此元素,hypervisor 将使用一个合理的默认值。
level
:指定
元素所描述的缓存级别。缺少此属性意味此
元素一次描述所有 CPU 缓存级别。禁止把具有level
属性和不具有level
属性的
元素混合使用。mode
:可选值为:
mode='emulate'
:hypervisor 将提供一个伪造的 CPU 缓存数据。
mode='passthrough'
:主机 CPU 报告的实际 CPU 缓存数据将被透传到 VCPU。
mode='disable'
: VCPU 将报告没有当前指定级别的 CPU 缓存(如果缺少level
属性,则根本没有缓存)。numa
...
<cpu>
...
<numa>
<cell id='0' cpus='0-3' memory='512000' unit='KiB' discard='yes'/>
<cell id='1' cpus='4-7' memory='512000' unit='KiB' memAccess='shared'/>
numa>
...
cpu>
...
:( Since 0.9.8)指定 Guest NUMA 拓扑。目前,这个 guest NUMA 规范仅适用于 QEMU/KVM 和 Xen。cell
每个
三级子元素指定一个 NUMA 单元或 NUMA 节点。cell属性
cpus
:指定把某个 CPU 或 CPU 范围作为节点的一部分。(Since 6.5.0 For the qemu driver)如果模拟程序二进制支持在每个
中指定不连续的cpus
范围,那么每个
中声明的所有 CPU 之和将与一级元素
中声明的 VCPU 的最大数量相匹配。这是通过将任何剩余的 CPU 填充到第一个 NUMA 单元来完成的。鼓励用户提供一个完整的 NUMA 拓扑,其中 NUMA CPU 的总和与一级元素
中声明的最大虚拟 cpu 数量相匹配,从而使 domain 在 qemu 和 libvirt 版本之间保持一致。(Since 6.6.0)cpus
可以省略,如果省略,就会创建一个无 CPU 的 NUMA 节点。memory
:以 kibibibytes (即1024字节的块)为单位指定节点内存。unit
:(Since 1.2.11)指定memory
属性的单位。id
:(Since 1.2.7)以防在代码中需要引用某个单元,所有的
都应该具有id
属性,否则这些单元按从0开始的递增顺序分配id
。不建议把带id
属性和不带id
属性的
混合使用,因为可能导致无法预期的行为。memAccess
:(Since 1.2.9)控制内存映射为“共享”还是“私有”。这只适用于 hugepages-backed 的内存和 nvdimm 模块。discard
:(Since 4.4.0)指定 NUMA 节点的 discard 特性(详见 Memory Backing )。可选值:yes
、no
。cell四级子元素
distances
:NUMA 硬件体系结构支持 NUMA 单元之间的距离概念。(Since 3.10.0)可以在 NUMA
元素中使用
元素定义 NUMA 单元之间的距离。五级子元素
用于指定同级 NUMA 单元之间的距离值。有关更多细节,请参阅 ACPI (Advanced Configuration and Power Interface,高级配置与电源接口)规范中解释系统 SLIT (System Locality Information Table,系统局部信息表)的章节。
来描述不同单元之间的 SLIT 数据,那么它将默认使用10表示本地距离,20表示远程距离。...
<cpu>
...
<numa>
<cell id='0' cpus='0,4-7' memory='512000' unit='KiB'>
<distances>
<sibling id='0' value='10'/>
<sibling id='1' value='21'/>
<sibling id='2' value='31'/>
<sibling id='3' value='41'/>
distances>
cell>
<cell id='1' cpus='1,8-10,12-15' memory='512000' unit='KiB' memAccess='shared'>
<distances>
<sibling id='0' value='21'/>
<sibling id='1' value='10'/>
<sibling id='2' value='21'/>
<sibling id='3' value='31'/>
distances>
cell>
<cell id='2' cpus='2,11' memory='512000' unit='KiB' memAccess='shared'>
<distances>
<sibling id='0' value='31'/>
<sibling id='1' value='21'/>
<sibling id='2' value='10'/>
<sibling id='3' value='21'/>
distances>
cell>
<cell id='3' cpus='3' memory='512000' unit='KiB'>
<distances>
<sibling id='0' value='41'/>
<sibling id='1' value='31'/>
<sibling id='2' value='21'/>
<sibling id='3' value='10'/>
distances>
cell>
numa>
...
cpu>
...
cache
...
<cpu>
...
<numa>
<cell id='0' cpus='0-3' memory='512000' unit='KiB' discard='yes'/>
<cell id='1' cpus='4-7' memory='512000' unit='KiB' memAccess='shared'/>
<cell id='3' cpus='0-3' memory='2097152' unit='KiB'>
<cache level='1' associativity='direct' policy='writeback'>
<size value='10' unit='KiB'/>
<line value='8' unit='B'/>
cache>
cell>
<interconnects>
<latency initiator='0' target='0' type='access' value='5'/>
<latency initiator='0' target='0' cache='1' type='access' value='10'/>
<bandwidth initiator='0' target='0' type='access' value='204800' unit='KiB'/>
interconnects>
numa>
...
cpu>
...
:(Since 6.6.0 )用于描述内存邻近 domain 的内存端缓存(memory side cache for memory proximity domains)。此元素具有描述缓存级别的level
属性,因此可以多次重复该元素以描述不同级别的缓存。
cache属性
level
:【必填】缓存级别。
associativity
:描述缓存关联性,可选值:none
、direct
、full
。
policy
:描述缓存写关联性可选值:none
、writeback
、writethrough
。
元素有两个强制子元素: size
和 line
,描述缓存大小和缓存线大小。两个元素都接受两个属性: value
和 unit
,它们设置相应缓存属性的值。interconnects
元素,用于描述规范化内存读/写延迟、Initiator Proximity Domains (Processor or I/O) 和Target Proximity Domains (Memory) 之间的读/写带宽。
interconnects
元素可以有零个或多个
子元素,用于描述两个内存节点之间的延迟。还可以有零个或多个
子元素,用于描述两个内存节点之间的带宽。两者都有以下强制属性:
initiator
:指定源 NUMA 节点。
target
:目标 NUMA 节点。
type
:访问的类型。可选值:access
、read
、write
。
value
:实际值。对于
,这是以纳秒为单位的延迟,对于
,这个值是每秒的 kibibytes。
unit
:指定value
的单位。
cache
:为了描述从一个 NUMA 节点到另一个 NUMA 节点的缓存的延迟,
元素具有可选属性cache
,该属性与target
属性结合创建对远端 NUMA 节点缓存级别的完全引用。例如,target='0' cache='1'
引用 NUMA 节点0的第一级缓存。14 事件配置(Events configuration)
virsh reboot
或 virsh shutdown
也会触发事件。...
<on_poweroff>destroyon_poweroff>
<on_reboot>restarton_reboot>
<on_crash>restarton_crash>
<on_lockfailure>poweroffon_lockfailure>
...
on_poweroff、on_reboot、on_crash
、
、
分别指定 guest 请求断电、重启、崩溃时要采取的操作。可选值:
destroy
:domain 将被完全终止并释放所有资源。
restart
:domain 将被终止,然后使用相同的配置重新启动。
preserve
:domain 将被终止,其资源将被保留以便进行分析。
rename-restart
:domain 将被终止,然后用一个新名称重新启动。
和
事件来处理destroy
和restart
操作。
事件的preserve
操作被视为 destroy
,
事件的rename-restart
操作被视为restart
事件。
事件支持以下额外操作(Since 0.8.4):
coredump-destroy
:崩溃 domain 的核心将被转储,然后 domain 将被完全终止并释放所有资源。
coredump-restart
:崩溃 domain 的核心将被转储,然后 domain 将使用相同的配置重新启动on_lockfailure
: ( Since 1.0.0 ) 可用于配置锁管理器丢失资源锁时应采取的操作。Libvirt 可以识别以下操作,但并非所有操作都需要每个锁管理器支持。当未指定任何操作时,每个锁管理器将执行其默认操作。poweroff
: domain 将被强制关闭。
restart
: domain 将被关闭电源并重新启动以重新获得其锁。
pause
:domain 将暂停,以便在解决锁问题后手动恢复 domain 。
ignore
:保持domain 运行,就像什么都没发生一样。15 电源管理(Power Management)
...
<pm>
<suspend-to-disk enabled='no'/>
<suspend-to-mem enabled='yes'/>
pm>
...
:对 S3(suspend-to-mem)和 S4(suspend-to-disk) ACPI 睡眠状态启用(yes
)或禁用(no
) BIOS 支持。如果没有指定任何值,那么 hypervisor 将保留其默认值。注意: 这个设置不能阻止 guest 操作系统执行暂停,因为 guest 操作系统本身可以选择规避睡眠状态的不可用性(例如完全关闭 S4)。16 Hypervisor 特性 (Hypervisor features)
...
<features>
<pae/>
<acpi/>
<apic/>
<hap/>
<privnet/>
<hyperv>
<relaxed state='on'/>
<vapic state='on'/>
<spinlocks state='on' retries='4096'/>
<vpindex state='on'/>
<runtime state='on'/>
<synic state='on'/>
<stimer state='on'>
<direct state='on'/>
stimer>
<reset state='on'/>
<vendor_id state='on' value='KVM Hv'/>
<frequencies state='on'/>
<reenlightenment state='on'/>
<tlbflush state='on'/>
<ipi state='on'/>
<evmcs state='on'/>
hyperv>
<kvm>
<hidden state='on'/>
<hint-dedicated state='on'/>
<poll-control state='on'/>
kvm>
<xen>
<e820_host state='on'/>
<passthrough state='on' mode='share_pt'/>
xen>
<pvspinlock state='on'/>
<gic version='2'/>
<ioapic driver='qemu'/>
<hpt resizing='required'>
<maxpagesize unit='MiB'>16maxpagesize>
hpt>
<vmcoreinfo state='on'/>
<smm state='on'>
<tseg unit='MiB'>48tseg>
smm>
<htm state='on'/>
<ccf-assist state='on'/>
<msrs unknown='ignore'/>
<cfpc value='workaround'/>
<sbbc value='workaround'/>
<ibs value='fixed-na'/>
features>
...
元素中列出,省略某个特性就会关闭它。可用的特性可以在 capabilities XML 和 domain capabilities XML 中找到。以下列出了完全虚拟化 domain 的常见特性:
:指定 Physical address extension 模式,允许32位的 guest 寻址到 4GB 以上的内存。
:对于电源管理非常有用,例如,当 hypervisor 为 KVM 时,为了允许优雅关机(virsh shutdown
),必须使用
。
:允许使用可编程 IRQ 管理。(Interrupt ReQuest:“紧急事件”须向处理器提出申请(发一个电脉冲信号),要求“中断”,即要求处理器先停下“自己手头的工作”先去处理“我的急件”,这一“申请”过程,称——中断请求。)
属性eoi
:(Since 0.10.2, QEMU only)可选值:on
、off
,对 guest 开关 EOI (End of Interrupt)能力。
:根据state
属性(on
、off
)启用或禁用硬件辅助分页(Hardware Assisted Paging)。如果 hypervisor 检测到硬件辅助分页的可用性,则默认设置为 on
。
为半虚拟化的 guest 操作系统启用 Viridian hypervisor 扩展。
:始终创建一个专用的网络命名空间。如果定义了任何接口设备,则自动设置此值。这个特性只适用于基于容器的虚拟化驱动程序,比如 LXC。
通知 guest 主机支持半虚拟自旋锁( paravirtual spinlocks),例如公开 pvticketlocks 机制。可以使用state='off'
属性显式禁用此特性。
( Since 1.2.12)根据state
属性(默认on
、off
)启用或禁用 guest 的性能监视单元。
:( Since 1.2.16)根据state
属性(默认on
、off
)启用或禁用对 VMware IO 端口的模拟,例如 vmmouse 等。
(Since 1.2.16)让体系结构使用通用中断控制器(General Interrupt Controller)而不是 APIC ,以便处理中断。例如,“ aarch64”架构使用gic
而不是 apic
。
属性version
:指定了 GIC 版本; 但是,它可能不受所有 hypervisor 的支持。可选值:2
、3
、host
。
调整 I/O APIC。driver
属性的可选值: kvm
(KVM domain 的默认值)、qemu
(将 I/O APIC 置于用户空间,也称为分割 I/O APIC 模式)(Since 3.4.0, QEMU/KVM only)。
启用 QEMU vmcoreinfo 设备让 guest 内核保存调试细节(Since 4.4.0, QEMU only)
配置 pSeries guest 的 HTM (Hardware Transational Memory)可用性。state
属性可选值:on
、off
。如果没有定义state
属性,将使用 hypervisor 默认值。(Since 4.6.0, QEMU/KVM only)
为 pSeries guest 配置嵌套 HV 可用性。这需要从主机(L0)启用才能有效; 如果计划在主机(L1) guest 中运行嵌套(L2) guest,那么在(L1) guest 中启用 HV 支持是非常可取的,因为这将使那些嵌套 guest 拥有比使用 KVM PR 或 TCG 更好的性能。state
属性可选值:on
、off
。如果没有定义state
属性,将使用 hypervisor 默认值。(Since 4.10.0, QEMU/KVM only)
有些 guest 可能需要忽略未知的 Model Specific Registers(MSRs)读写。可以通过设置
的属性unknown='ignore'
。如果unknown
属性没有定义,或者设置为 fault
,那么未知的读写操作将不会被忽略。( Since 5.1.0, bhyve only)
为 pSeries guest 配置 ccf-Assist (Count Cache Flush Assist)可用性。state
属性可选值:on
、off
。如果没有定义state
属性,将使用 hypervisor 默认值。(Since 5.9.0, QEMU/KVM only)
配置 pSeries guest 的 cfpc (Cache Flush on Privilege Change)可用性。value
属性的可选值:broken
(没有保护)、workaround
(可用的软件变通)和fixed
(在硬件中修复)。如果没有定义value
属性,将使用 hypervisor 默认值。(Since 6.3.0, QEMU/KVM only)
为 pSeries guest 配置 sbbc (Speculation Barrier Bounds Checking)可用性。value
属性的可选值:broken
(没有保护)、workaround
(可用的软件变通)和fixed
(在硬件中修复)。如果没有定义value
属性,将使用 hypervisor 默认值。(Since 6.3.0, QEMU/KVM only)
为 pSeries guest 配置 ibs (Indirect Branch Speculation)可用性。value
属性的可选值:broken
(没有保护)、workaround
(计数缓存刷新)、 fixed-ibs
(通过序列化间接分支来修复)、 fixed-ccd
(通过禁用缓存计数来修复)和 fixed-na
(在硬件中修复 – 不再适用)。如果没有定义value
属性,将使用 hypervisor 默认值。(Since 6.3.0, QEMU/KVM only)hyperv
<features>
<hyperv>
<relaxed state='on'/>
<vapic state='on'/>
<spinlocks state='on' retries='4096'/>
<vpindex state='on'/>
<runtime state='on'/>
<synic state='on'/>
<stimer state='on'>
<direct state='on'/>
stimer>
<reset state='on'/>
<vendor_id state='on' value='KVM Hv'/>
<frequencies state='on'/>
<reenlightenment state='on'/>
<tlbflush state='on'/>
<ipi state='on'/>
<evmcs state='on'/>
hyperv>
...
features>
:启用各种特性改进采用 Microsoft Windows 系统的 guest 的行为。
:放松对计时器的限制,state
属性可选值:on
、off
(Since 1.0.0, QEMU 2.0)。
:启用虚拟 APIC,state
属性可选值:on
、off
(Since 1.0.0, QEMU 2.0)。
:启用自旋锁支持(spinlock),state
属性可选值:on
、off
;retries
属性最小为4095 (Since 1.0.0, QEMU 2.0)。
:虚拟处理器索引(Virtual processor index),state
属性可选值:on
、off
(Since 1.3.3, QEMU 2.5)。
:处理器花费在运行 guest 代码和代表 guest 代码上的时间,state
属性可选值:on
、off
(Since 1.3.3, QEMU 2.5)。
:启用综合中断控制器(SynIC:Synthetic Interrupt Controller),state
属性可选值:on
、off
(Since 1.3.3, QEMU 2.6)。
:启用 SynIC 计时器,支持选择 Direct Mode,state
属性可选值:on
、off
;direct
子元素的state
属性可选值:on
、off
(Since 1.3.3 , QEMU 2.6, direct mode 5.7.0 , QEMU 4.1)
:启用 hypervisor 重置,state
属性可选值:on
、off
(Since 1.3.3, QEMU 2.5)。
:设置 hypervisor 供应商 id,state
属性可选值:on
、off
; value
属性值为字符串,最多12个字符(Since 1.3.3, QEMU 2.5)。
:暴露频率 MSRs(Expose frequency MSRs),state
属性可选值:on
、off
(Since 4.7.0, QEMU 2.12)。
:启用迁移的 re-enlightenment 通知,state
属性可选值:on
、off
(Since 4.7.0, QEMU 3.0)。
:启用 PV TLB 刷新支持,state
属性可选值:on
、off
(Since 4.7.0, QEMU 3.0)。
:启用 PV IPI 支持,state
属性可选值:on
、off
(Since 4.10.0, QEMU 3.1)。
:启用 Enlightened VMCS,state
属性可选值:on
、off
(Since 4.10.0, QEMU 3.1)。kvm
<features>
<kvm>
<hidden state='on'/>
<hint-dedicated state='on'/>
<poll-control state='on'/>
kvm>
...
features>
用于更改 KVM hypervisor 行为的各种特性。
:在标准 MSR based discovery 中隐藏 KVM hypervisor,state
属性可选值:on
、off
(Since 1.2.8, QEMU 2.10)。
:允许 guest 在专用的 VCPU 上运行时启用优化,state
属性可选值:on
、off
(Since 5.7.0, QEMU 2.12.0)。
:通过引入繁忙等待的宽限期来减少 IO 完成延迟,state
属性可选值:on
、off
(Since 6.10.0 , QEMU 4.2)。xen
<features>
<xen>
<e820_host state='on'/>
<passthrough state='on' mode='share_pt'/>
xen>
...
features>
用于更改 Xen hypervisor 行为的各种特性。
:将主机 e820 暴露给guest (PV only),state
属性可选值:on
、off
(Since 6.3.0)。
:启用 IOMMU 映射,允许 PCI passthrough,state
属性可选值:on
、off
;mode
属性可选值:sync_pt
、share_pt
(Since 6.3.0)。smm
<features>
<smm state='on'>
<tseg unit='MiB'>48tseg>
smm>
...
features>
:(Since 2.1.0)根据state
属性(默认on
、off
)启用或禁用系统管理模式(System Management Mode)。
:用于指定专用于 SMM 扩展 TSEG 的内存量。除了现有的选项(1 MiB、2 MiB 和8 MiB)之外,还提供了第四个选项大小,guest 操作系统(或者更确切地说是 loader)可以从中选择。大小可以指定为
元素的值,可选属性unit
可以用来指定此值的单位(默认为‘ MiB’)。如果设置为0,扩展大小不会被广告,只有默认大小(见上文)可用。pc-q35-2.9
之前不可用。从 pc-q35-2.10
开始,该功能可用,默认大小为16 MiB。这应该足够大约272个 VCPU,总共 5 GiB guest RAM,无热插拔内存范围,以及 32 GiB 的 64-bit PCI MMIO aperture。或者对于48个 VCPU,具有 1TB 的 guest RAM,,无热插拔 DIMM 范围,和32 GiB 的 64-bit PCI MMIO aperture。这些值也可能随着 VM 使用的 loader 而变化。unit
属性的详细信息,请参阅 Memory Allocation 章节。(Since 4.5.0, QEMU only)hpt
<features>
<hpt resizing='required'>
<maxpagesize unit='MiB'>16maxpagesize>
hpt>
...
features>
配置 pSeries guest的 HPT (Hash Page Table,哈希页表)。
resizing
:可选值:enabled
(如果 guest 和主机都支持,就会启用 HPT 调整大小); disabled
( 禁用HPT 调整大小,不考虑 guest 和主机是否支持); required
(除非 guest 和主机都支持 HPT 调整大小,否则阻止 guest 启动)。如果没有定义resizing
属性,则将使用 hypervisor 的默认值。(Since 3.10.0, QEMU/KVM only)
:用于限制 HPT guest 的可用页面大小。通用值是64 KiB、16 MiB、16 GiB; 如果没有指定,将使用 hypervisor 缺省值。(Since 4.5.0, QEMU/KVM only)17 计时(Time keeping)
...
<clock offset='localtime'>
<timer name='rtc' tickpolicy='catchup' track='guest'>
<catchup threshold='123' slew='120' limit='10000'/>
timer>
<timer name='pit' tickpolicy='delay'/>
clock>
...
是一级元素。guest 时钟通常由主机时钟初始化。大多数操作系统希望硬件时钟保持在 UTC,这是默认的。然而,Windows 希望它处于所谓的 localtime。
offset
:允许对 guest 时钟如何与主机同步进行细粒度控制。注意,并非所有 hypervisor 都支持所有模式。可选值:
offset='utc'
:guest 时钟总是在启动时与 UTC 同步。(Since 0.9.11)offset='utc'
模式可以转换为offset='variable'
模式,这可以通过使用adjustment
属性来控制。如果值是adjustment='reset'
,则转换永远不会完成(并非所有的 hypervisor 在每次引导时都能同步到 UTC; 使用adjustment='reset'
将导致这些 hypervisor 出错)。如果值是数值,将强制转换为offset='variable'
模式,使用该值作为初始调整量。默认的adjustment
是特定于 hypervisor 的。
offset='localtime'
:guest 时钟将在启动时与主机配置的 timezone 同步。
offset='timezone'
:guest 时钟将与指定的 timezone 同步。(Since 0.9.11)adjustment
属性的行为与offset='utc'
模式相同。
offset='variable'
:guest 时钟将与 UTC 或 localtime (由basis
属性指定,默认 UTC)保持指定的偏移量(adjustment
属性指定,单位为秒)。随着时间的推移,guest 可以自由调整 RTC,并期望在下次重新启动时得到尊重。这与offset='utc'
和offset='variable'
模式(带有可选属性adjustment='reset'
)形成对比,在这两种模式下,RTC 调整在每次重新启动时都会丢失。(Since 0.7.7)basis
:可选值: utc
(默认)、localtime
。(Since 0.9.11)timer
:一个
元素可以有零个或多个
子元素(Since 0.8.0)。每个计时器元素都需要一个name
属性,并具有其他依赖于指定name
的可选属性。各种 hypervisor 支持不同的属性组合。
name
:必填。可选值为:platform
(当前不支持)、hpet
(xen,qemu,lxc)、kvmclock
(qemu)、pit
(qemu)、rtc
(qemu,lxc)、tsc
(xen,qemu -since 3.2.0)、hypervclock
(qemu -since 1.2.2)、armvtimer
(qemu -since 6.1.0)。hypervclock
计时器为运行 Windows 操作系统的 guest 添加了对参考时间计数器和 iTSC 特性参考页面的支持。track
:指定计时器跟踪的内容,可以值为:boot
、guest
、wall
。仅对 name='rtc'
或 name='platform'
有效。tickpolicy
:指定当 QEMU 错过向 guest 注入 tick 的截止时间时会发生什么。例如,guest 被暂停时。请注意,libvirt 不要求 hypervisor 支持跨所有时间源的所有策略。
tickpolicy='delay'
:继续以正常速度传递 ticks 。guest 操作系统不会注意到任何问题,因为从它的角度来看,时间将继续正常流动。guest 落后于主机的时间,应该正好是错过 ticks 的时间。
tickpolicy='catchup'
:以更快的速度提供 ticks ,以赶上错过的 ticks 。guest 操作系统不会注意到任何问题,因为从它的角度来看,时间将继续正常流动。一旦计时器赶上了所有丢失的 ticks ,guest 和主机的时间应该匹配。当tickpolicy='catchup'
时,可以通过子元素
指定更多细节。
子元素有三个可选属性,属性值都是正整数,这三个属性分别是 threshold
、 slew
、limit
。
tickpolicy='merge'
:将错过的 ticks 合并到一个 tick 并注入。guest 时间可能会延迟,这取决于操作系统对 ticks 合并的反应。
tickpolicy='discard'
:丢掉错过的 ticks ,然后继续正常的注射。 guest 操作系统会看到计时器一下子提前了相当可观的数量,就好像中间的时间块根本不存在一样; 不用说,这种突然的跳转很容易迷惑没有特别准备处理它的 guest 操作系统。假设 guest 操作系统可以正确处理时间跳转,那么 guest 和主机中的时间现在应该匹配。frequency
:其值是一个无符号整数,指定 name = 'tsc'
运行的频率。mode
:控制如何管理 name = 'tsc'
计时器,可选值:auto
、native
、emulate
、parzh
、smpsafe
。其他计时器的mode
属性值总是为emulate
。present
:指定该计时器对 guest 是否可用,可选值:yes
、no
。18 性能监视事件(Performance monitoring events )
...
<perf>
<event name='cmt' enabled='yes'/>
<event name='mbmt' enabled='no'/>
<event name='mbml' enabled='yes'/>
<event name='cpu_cycles' enabled='no'/>
<event name='instructions' enabled='yes'/>
<event name='cache_references' enabled='no'/>
<event name='cache_misses' enabled='no'/>
<event name='branch_instructions' enabled='no'/>
<event name='branch_misses' enabled='no'/>
<event name='bus_cycles' enabled='no'/>
<event name='stalled_cycles_frontend' enabled='no'/>
<event name='stalled_cycles_backend' enabled='no'/>
<event name='ref_cpu_cycles' enabled='no'/>
<event name='cpu_clock' enabled='no'/>
<event name='task_clock' enabled='no'/>
<event name='page_faults' enabled='no'/>
<event name='context_switches' enabled='no'/>
<event name='cpu_migrations' enabled='no'/>
<event name='page_faults_min' enabled='no'/>
<event name='page_faults_maj' enabled='no'/>
<event name='alignment_faults' enabled='no'/>
<event name='emulation_faults' enabled='no'/>
perf>
...
元素中指定它们,也可以通过 virDomainSetPerfEvents API 启用它们。然后使用 virConnectGetAllDomainStats API 检索性能值。( Since 2.0.0)
:平台上运行的应用程序使用 l3缓存的字节数(stats 参数名:perf.cmt)。
:缓存级的系统总带宽(stats 参数名:perf.mbmt)。
:内存控制器的内存流量带宽(stats 参数名:perf.mbml)。
:CPU 周期的计数(total/elapse)(stats 参数名:perf.cpu_cycles)。
:平台上运行的应用程序的指令数(stats 参数名:perf.instructions)。
:平台上运行的应用程序的缓存命中次数(stats 参数名:perf.cache_references)。
:平台上运行的应用程序未命中缓存的次数(stats 参数名:perf.cache_misses)。
:平台上运行的应用程序的分支指令数(stats 参数名:perf.branch_instructions)。
:在平台上运行的应用程序失败的分支数(stats 参数名:perf.branch_misses)。
:在平台上运行的应用程序的总线周期(bus cycles)计数(stats 参数名:perf.bus_cycles)。
:在平台上运行的应用程序在指令处理器流水线的前端停止运行的 CPU 周期计数(stats 参数名:perf.stalled_cycles_frontend)。
:在平台上运行的应用程序在指令处理器流水线的后端停止运行的 CPU 周期计数(stats 参数名:perf.stalled_cycles_backend)。
:平台上运行的应用程序不受 CPU 频率调整影响的总 CPU 周期计数(stats 参数名:perf.ref_cpu_cycles)。
:CPU 时钟时间的计数,由 monotonic high-resolution per-CPU timer 测量,由运行在平台上的应用程序测量(stats 参数名:perf.cpu_clock)。
任务时钟时间的计数,由 monotonic high-resolution CPU timer 测量,特定于在平台上运行的应用程序所运行的任务(stats 参数名:perf.task_clock)。
:平台上运行的应用程序的页面错误数。这包括较小、较大、无效和其他类型的页面错误(stats 参数名:perf.page_faults)。
:在平台上运行的应用程序上下文切换的计数(stats 参数名:perf.context_switches)。
:CPU 迁移的计数,即进程通过从一个逻辑处理器迁移到另一个逻辑处理器,以平台上运行的应用程序为维度(stats 参数名:perf.cpu_migrations)。
:小页面错误的计数,也就是说,页面存在于页面缓存中,因此错误避免了在平台上运行的应用程序从存储中加载它(stats 参数名:perf.page_faults_min)。
:主要页面错误的计数,即页面没有出现在页面缓存中,因此必须通过平台上运行的应用程序从存储中获取(stats 参数名:perf.page_faults_maj)。
:对齐错误的计数,即平台上运行的应用程序在加载或存储时没有正确对齐(stats 参数名:perf.alignment_faults)。
:模拟错误的计数,即内核捕获未实现的指令并通过在平台上运行的应用程序模拟用户空间的错误(stats 参数名:perf.emulation_faults)。