Qemu (Quick Emulator的缩写)是一个开源的虚拟机管理程序,可以模拟物理计算机。从Qemu运行的主机系统的角度来看,Qemu是一个用户程序,它可以访问许多本地资源,如分区、文件、网卡,然后将这些资源传递给模拟计算机,模拟计算机将它们视为真正的设备。

在模拟计算机中运行的客户操作系统访问这些设备,并像在真实硬件上运行一样运行。例如,您可以将一个iso映像作为参数传递给Qemu,在模拟计算机中运行的操作系统将看到一个真实的光盘插入到一个CD驱动器中。

Qemu可以模拟从ARM到Sparc的各种硬件,但Proxmox VE只关心32位和64位PC克隆模拟,因为它代表了绝大多数服务器硬件。由于处理器扩展的可用性,PC克隆的模拟也是最快的模拟之一,当模拟的体系结构与主机体系结构相同时,处理器扩展极大地提高了Qemu的速度。

  1. 请注意
  2. 您有时可能会遇到术语KVM(基于内核的虚拟机)。这意味着Qemu是在虚拟化处理器扩展的支持下通过Linux kvm模块运行的。在Proxmox VE的上下文中,QemuKVM可以互换使用,因为QemuProxmox VE中将始终尝试加载KVM模块。

在Proxmox VE中,Qemu作为root进程运行,因为这是访问块和PCI设备所必需的。

10.1、仿真设备和准虚拟化设备

Qemu仿真的PC硬件包括主板、网络控制器、scsi、ide和sata控制器、串口(完整列表可以在kvm(1)手册中看到),所有这些都是通过软件仿真的。所有这些设备都是与现有硬件设备完全相同的软件,如果在客户机上运行的操作系统有适当的驱动程序,它就会像在真实的硬件上运行一样使用这些设备。这允许Qemu运行未经修改的操作系统。

然而,这有一个性能成本,因为在软件中运行本应在硬件中运行的功能涉及到主机CPU的大量额外工作。为了减轻这种情况,Qemu可以向客户操作系统提供半虚拟化设备,客户操作系统可以识别它在Qemu内部运行,并与管理程序合作。

Qemu依赖于virtio虚拟化标准,因此能够提供半虚拟化的virtio设备,这些设备包括半虚拟化的通用磁盘控制器、半虚拟化的网卡、半虚拟化的串口、半虚拟化的SCSI控制器等等。

强烈建议尽可能使用virtio设备,因为它们提供了很大的性能改进。与使用仿真IDE控制器相比,使用virtio通用磁盘控制器将使顺序写吞吐量加倍,这是用bonnie++(8)测量的结果。使用virtio网络接口可以提供仿真Intel E1000网卡吞吐量的三倍,这是用iperf(1)测量的结果。

10.2、虚拟机设置

一般来说,Proxmox VE会尝试为虚拟机(VM)选择合理的默认值。请确保您理解所更改设置的含义,因为它可能导致性能放缓,或将数据置于风险之中。

10.2.1、一般设置

image.png
包括虚拟机的常规设置

  • 节点:虚拟机运行的物理服务器

  • 虚拟机ID:在这个Proxmox VE安装中用来识别您的虚拟机的唯一编号

  • Name:一个自由形式的文本字符串,用于描述虚拟机

  • 资源池:虚拟机的逻辑分组

See this benchmark on the KVM wiki http://www.linux-kvm.org/page/Using_VirtIO_NIC
_

10.2.2、OS设置

image.png
在创建虚拟机时,通过设置合适的操作系统,可以优化一些低级的参数。例如,Windows操作系统希望BIOS时钟使用本地时间,而基于Unix的操作系统希望BIOS时钟使用UTC时间。

10.2.3、系统设置

在创建虚拟机时,可以修改新虚拟机的一些基本系统组件。您可以指定要使用的显示类型Section 10.2.8
image.png
此外,SCSI控制器第10.2.4节可以更改。如果您计划安装QEMU客人代理,或者如果您选择自动ISO映像已经船只和安装它,你可能想在QEMU代理的方格,可以让Proxmox已经知道它可以利用其特性来显示更多的信息,并完成一些操作(例如,关闭或快照)更聪明。

Proxmox VE允许引导不同固件和机器类型的虚拟机,即SeaBIOS和OVMF Section 10.2.10。在大多数情况下,只有在计划使用PCIe pass Section10.9时,才希望从默认的SeabBIOS切换到OVMF。VMs机器类型定义了VM的虚拟主板的硬件布局。您可以在默认的Intel 440FXQ35芯片组之间进行选择,Q35芯片组也提供了一个虚拟PCIe总线,因此,如果想要通过PCIe硬件,Q35芯片组可能是需要的。

10.2.4、硬盘

总线/控制器
**
Qemu可以模拟许多存储控制器:

  • IDE控制器的设计可以追溯到1984年的PC/AT磁盘控制器。即使这个控制器已经被最近的设计所取代,你能想到的每个操作系统都支持它,如果你想运行2003年之前发布的操作系统,它是一个很好的选择。该控制器最多可以连接4个设备。

  • SATA(串行ATA)控制器,从2003年开始,有一个更现代的设计,允许更高的吞吐量和更多数量的设备连接。该控制器最多可以连接6个设备。

  • SCSI控制器,设计于1985年,通常在服务器级硬件上发现,并且可以连接多达14个存储设备。Proxmox VE默认提供LSI 53C895A控制器仿真功能。 如果您的目标是性能,推荐设置类型为VirtIO SCSI的SCSI控制器,并且自Proxmox VE 4.3以来,它会自动为新创建的Linux虚拟机选择。Linux发行版从2012年开始支持这个控制器,从2014年开始支持FreeBSD。对于Windows操作系统,安装过程中需要提供额外的驱动文件iso。如果您的目标是最大的性能,您可以选择类型为VirtIO SCSI single的SCSI控制器,这将允许您选择IO Thread选项。选择VirtIO SCSI时,单个Qemu将为每个磁盘创建一个新的控制器,而不是将所有磁盘添加到同一个控制器。

  • VirtIO块控制器通常称为VirtIO或VirtIO -blk,是一种较老的半虚拟化控制器。就特性而言,它已被VirtIO SCSI控制器所取代。

镜像格式

在每个控制器上,您附加了许多模拟硬盘,这些硬盘由驻留在配置存储中的文件或块设备支持。存储类型的选择将决定硬盘映像的格式。提供块设备的存储(LVM、ZFS、Ceph)将需要原始磁盘映像格式,而基于文件的存储(Ext4、NFS、CIFS、GlusterFS)将允许您选择
原始磁盘映像格式(raw)QEMU映像格式**。

  • QEMU镜像格式是一种写时复制的格式,允许快照和精简磁盘镜像。

  • 原始磁盘映像是硬盘的位到位映像,类似于在Linux的块设备上执行dd命令时得到的映像。该格式本身不支持精简配置或快照,需要存储层配合。然而,它可能比QEMU图像格式快10%。

  • VMware镜像格式仅适用于将磁盘镜像导入/导出到其他虚拟化环境的情况。

缓存模式

设置硬盘的缓存模式将影响主机系统在块写完成时通知来宾系统的方式。默认情况下,No cache意味着当每个块到达物理存储写队列时,客户系统将收到写完成的通知,忽略主机页面缓存。这在安全和速度之间提供了一个很好的平衡。

如果希望Proxmox VE备份管理器在对虚拟机进行备份时跳过某个磁盘,可以在该磁盘上设置No backup选项。

如果希望Proxmox VE存储复制机制在启动复制任务时跳过某个磁盘,可以在该磁盘上设置skip replication选项。在Proxmox VE 5.0中,复制要求磁盘映像位于类型为zfspool的存储上,因此当VM配置了复制时,向其他存储添加磁盘映像需要跳过该磁盘映像的复制。

修剪/丢弃

如果您的存储支持精简配置(参见Proxmox VE指南中的存储章节),您可以在驱动器上激活Discard选项。使用Discard set和支持修剪的guest OS 3,当虚拟机的文件系统在删除文件后将块标记为未使用时,控制器将把这个信息转发给存储,然后存储将相应地收缩磁盘映像。要让客户机能够发出修剪命令,必须在驱动器上启用Discard选项。一些来宾操作系统可能还需要设置SSD仿真标志。注意,仅在使用Linux内核5.0或更高版本的来宾操作系统上支持丢弃VirtIO块驱动器。

如果希望将驱动器作为固态驱动器而不是旋转硬盘呈现给来宾,则可以在该驱动器上设置SSD仿真选项。不要求底层存储实际上由ssd支持;此特性可用于任何类型的物理介质。注意,在VirtIO块驱动器上不支持SSD仿真。

IO 线程

选项IO Thread只能在使用带有VirtIO控制器的磁盘时使用,或者在模拟控制器类型为VirtIO SCSI single时使用SCSI控制器时使用。启用此功能后,Qemu将为每个存储控制器创建一个I/O线程,而不是为所有I/O创建单个线程。当使用多个磁盘且每个磁盘都有自己的存储控制器时,这可以提高性能。

10.2.5、CPU

image.png
CPU插座是PC主板上的一个物理插槽,您可以在这里插入CPU。这个CPU可以包含一个或多个核心,它们是独立的处理单元。从性能的角度来看,是使用一个4核的CPU插槽,还是使用两个2核的CPU插槽,都是无关紧要的。然而,一些软件许可证取决于机器的套接字数量,在这种情况下,将套接字数量设置为许可证所允许的值是有意义的。

增加虚拟cpu(内核和插槽)的数量通常会提高性能,但这在很大程度上依赖于VM的使用。多线程应用程序当然会从大量的虚拟cpu中受益,因为对于您添加的每个虚拟cpu, Qemu都会在主机系统上创建一个新的执行线程。如果您不确定VM的工作负载,那么将总内核数设置为2通常是一个安全的选择。

  1. 请注意
  2. 如果您所有虚拟机的总核数大于服务器上的核数,则是非常安全的(例如,在一台只有8核的机器上,4个虚拟机每个4核)。在这种情况下,主机系统将在服务器内核之间平衡Qemu执行线程,就像运行一个标准的多线程应用程序一样。然而,Proxmox VE将防止您启动虚拟CPU核多于物理可用核的虚拟机,因为这只会由于上下文切换的成本而降低性能。

资源限制

除了虚拟核数之外,您还可以根据主机CPU时间和其他虚拟机的关系来配置虚拟机可以获得多少资源。通过cpulimit(“主机CPU时间”)选项,您可以限制整个虚拟机在主机上可以使用的CPU时间。它是一个浮点值,以百分比表示CPU时间,所以1.0等于100%,2.5到250%等等。如果单个进程完全使用单个核,那么它将占用100%的CPU时间。如果一个四核VM充分利用了它的所有核,理论上它将使用400%。实际上,这个使用量可能会更高一些,因为除了vCPU核心线程之外,Qemu还可以为VM外设提供额外的线程。如果虚拟机应该有多个vcpu,这个设置可能会很有用,因为它并行运行一些进程,但虚拟机作为一个整体不应该100%同时运行所有的vcpu。举个具体的例子:假设我们有一个虚拟机,它将从8个vcpu中获益,但是在任何时候这8个内核都不应该满负荷运行——因为这将使服务器超载,其他虚拟机和CTs将获得更少的CPU。因此,我们将cpulimit限制设置为4.0(=400%)。如果所有内核都做同样繁重的工作,那么它们都将获得50%的真实主机内核CPU时间。但是,如果只有4个可以工作,他们仍然可以获得几乎100%的真正核心。

  1. 请注意
  2. 虚拟机可以,根据它们的配置,使用额外的线程,例如,用于网络或IO操作,也可以用于热迁移。因此,VM使用的CPU时间可能比虚拟CPU使用的时间更多。为保证虚拟机使用的CPU数量不会超过虚拟CPU数量,请将cpulimit设置为与总内核数相同的值。

第二个CPU资源限制设置,CPU units(现在通常称为CPU共享或CPU重量),控制一个虚拟机在其他虚拟机运行时获得的CPU时间。它是一个相对权重,默认值为1024,如果你增加一个虚拟机的相对权重,它将被调度程序优先级高于其他权重较低的虚拟机。例如,虚拟机100设置为默认的1024,虚拟机200设置为2048,此时后一个虚拟机200将获得两倍于前一个虚拟机100的CPU带宽。

更多信息请参见man systemd。资源控制,这里CPUQuota对应于cpulimit而CPUShares对应于我们的cpuunits设置,请访问它的Notes部分以获取参考资料和实现细节。

CPU类型

Qemu可以模拟从486到最新的Xeon处理器的许多不同的CPU类型。每一代新处理器都会增加新的功能,如硬件辅助3d渲染、随机数生成、内存保护等。通常,您应该为您的VM选择与主机系统CPU紧密匹配的处理器类型,因为这意味着主机CPU特性(也称为CPU标志)将在您的VM中可用。如果您想要精确匹配,可以将CPU类型设置为host,在这种情况下,VM将具有与主机系统完全相同的CPU标志。

但这也有缺点。如果您希望在不同主机之间进行虚拟机的热迁移,那么您的虚拟机可能会在一个具有不同CPU类型的新系统上结束。如果传递给客户的CPU标志缺失,qemu进程将停止。为了解决这个问题,Qemu也有自己的CPU类型kvm64, promox VE默认使用它。kvm64是一种类似Pentium 4的CPU类型,它具有减少的CPU标志集,但保证在任何地方都能工作。

简而言之,如果您关心热迁移和在节点之间移动虚拟机,请保留kvm64的默认值。如果您不关心动态迁移或拥有一个所有节点都拥有相同CPU的同构集群,那么将CPU类型设置为host,因为从理论上讲,这将为客户机提供最大的性能。

定制的CPU类型

您可以使用一组可配置的特性来指定自定义CPU类型。这些由管理员在配置文件/etc/pve/virtual-guest/cpu-models.conf中维护。格式详细信息请参见man cpu-models.conf。

指定的自定义类型可以由任何使用Sys. cn的用户选择。审计/节点权限。通过命令行或API为虚拟机配置自定义CPU类型时,需要在名称前加上custom-。

与Meltdown / Spectre相关的CPU标志
**
有几个与Meltdown和Spectre漏洞相关的CPU标志4,需要手动设置,除非所选的虚拟机CPU类型已经默认启用它们。

为了使用这些CPU标志,需要满足两个要求:

  • 主机CPU必须支持该特性,并将其传播到客户的虚拟CPU
  • 客户操作系统必须更新到一个能够减轻攻击并能够利用CPU特性的版本

否则,需要在web界面编辑CPU选项,或在虚拟机配置文件中设置CPU选项的flags属性,设置虚拟CPU的flags属性。

对于Spectre v1、v2、v4补丁,CPU或系统供应商还需要为CPU提供所谓的“微码更新”。

检查Proxmox VE主机是否存在漏洞,以root用户执行如下命令:

for f in /sys/devices/system/cpu/vulnerabilities/*; do echo "${f##*/} -" $(cat "$f"); done

社区脚本也可用来检测主机是否仍然脆弱。

英特尔处理器
**

  • pcid

**
这减少了Meltdown (CVE-2017-5754)缓解措施(称为内核分页隔离(KPTI))对性能的影响,该缓解措施有效地将内核内存隐藏在用户空间之外。如果没有PCID, KPTI是一种非常昂贵的机制。

检查Proxmox VE主机是否支持PCID,以root用户执行如下命令:

# grep ' pcid ' /proc/cpuinfo

如果这没有返回空,您的主机的CPU支持pcid。

  • spec-ctrl

需要启用Spectre v1 (CVE-2017-5753)和Spectre v2 (CVE-2017-5715)的修复,在retpoline不足够的情况下。默认包含在带有-IBRS后缀的Intel CPU型号中。对于没有-IBRS后缀的Intel CPU型号,必须显式打开。需要更新主机CPU微码(intelmicrocode >= 20180425)。

  • ssbd

**
需要启用Spectre V4 (CVE-2018-3639)补丁。在任何英特尔CPU型号中默认不包括。必须为所有Intel CPU型号显式地打开。需要更新主机CPU微码(intelmicrocode >= 20180703)。

AMD处理器
**

  • ibpb

需要启用Spectre v1 (CVE-2017-5753)和Spectre v2 (CVE-2017-5715)的修复,在retpoline不足够的情况下。默认包含在AMD CPU型号中,后缀为-IBPB。对于没有-IBPB后缀的AMD CPU型号,必须显式打开。需要主机CPU微码支持此特性,然后才能将其用于客户CPU。

  • virt-ssbd

需要启用Spectre v4 (CVE-2018-3639)补丁。默认情况下不包含在任何AMD CPU模型中。所有AMD CPU型号都必须显式打开。这应该提供给客户机,即使也提供了amd-ssbd,以实现客户机的最大兼容性。注意,当使用“host”cpu模型时,这必须显式启用,因为这是一个物理cpu中不存在的虚拟特性。

  • amd-ssbd

需要启用Spectre v4 (CVE-2018-3639)补丁。默认情况下不包含在任何AMD CPU模型中。所有AMD CPU型号都必须显式打开。这比virt-ssbd提供了更高的性能,因此支持这一点的主机应该尽可能向客户机公开这一点。尽管如此,还是应该公开virt-ssbd,以获得最大的客户兼容性,因为有些内核只知道virt-ssbd。

  • amd-no-ssb

建议指出主机不受Spectre V4攻击(CVE-2018-3639)。默认情况下不包含在任何AMD CPU模型中。未来的CPU硬件不会受到CVE-2018-3639的攻击,因此应该告诉客户不要通过暴露amd-no-ssb来启用其缓解攻击的功能。这与virt-ssbd和amd-ssbd是互斥的。

NUMA

您还可以选择在虚拟机中模拟NUMA 8架构。NUMA架构的基本原理意味着,不是所有核心都可以使用全局内存池,而是将内存分散到每个插槽附近的本地存储中。这可以带来速度的提高,因为内存总线不再是瓶颈。如果您的系统具有NUMA架构9,我们建议激活该选项,因为这将允许在主机系统上正确分配VM资源。在VM中热插拔内核或RAM时也需要此选项。

如果使用NUMA选项,建议将socket的数量设置为主机系统的节点数量。

vCPU 热插拔

现代操作系统在运行的系统中引入了热插拔功能,并在一定程度上热拔cpu。虚拟化使我们能够避免在这样的场景中实际硬件可能导致的许多(物理)问题。尽管如此,这仍然是一个相当新的和复杂的特性,因此它的使用应该仅限于绝对需要它的情况。大多数功能都可以用其他经过良好测试且不太复杂的特性复制,请参阅参考资料限制第10.2.5节。

在Proxmox VE中,插入的最大cpu数总是核心*套接字。如果启动一个虚拟机的核心cpu总数小于这个数字,您可以使用vpus设置,它表示在虚拟机启动时应该插入多少vcpu。

目前仅在Linux上支持此特性,需要更新到3.10以上的内核,建议更新到4.7以上的内核。

可以使用如下udev规则在guest中自动设置新cpu为online:

SUBSYSTEM=="cpu", ACTION=="add", TEST=="online", ATTR{online}=="0", ATTR{online}="1"

保存在“/etc/udev/rules.d”目录下作为一个以.rules结尾的文件。

注意:CPU热删除依赖于机器,需要客户合作。删除命令并不能保证移除CPU的实际发生,通常它是使用目标依赖机制转发给客户的请求,例如x86/amd64上的ACPI。

10.2.6、内存

对于每个VM,您可以选择设置固定大小的内存,或者请求Proxmox VE根据主机的当前RAM使用情况动态分配内存。

固定的内存分配
image.png
当将内存和最小内存设置为相同数量时,Proxmox VE将简单地将您指定的内存分配给您的VM。

即使使用固定的内存大小,膨胀设备也会添加到VM中,因为它提供有用的信息,比如客户机实际使用了多少内存。一般来说,你应该让气球保持启用状态,但如果你想禁用它(例如为了调试目的),只需在配置中取消选中气球装置或设置

balloon: 0

自动内存分配

当将最小内存设置为低于memory时,Proxmox VE将确保您指定的最小内存始终对VM可用,如果主机上的RAM使用量低于80%,则会动态地将内存添加到客户机,直至指定的最大内存。

当主机的RAM不足时,VM将释放一些内存给主机,如果需要,将交换正在运行的进程,最后启动oom杀手。主机和客户机之间的内存传递是通过在客户机内部运行的特殊气球内核驱动程序完成的,它将从主机获取或释放内存页。

当多个虚拟机使用自动分配功能时,可以设置一个共享系数,该系数表示每个虚拟机应该占用的空闲主机内存的相对数量。例如,假设您有4个vm,其中3个运行HTTP服务器,最后一个是数据库服务器。为了在数据库服务器RAM中缓存更多的数据库块,您需要在空闲RAM可用时对数据库VM进行优先级排序。为此,您将共享属性分配给数据库虚拟机3000,而将其他虚拟机的共享默认设置保留为1000。主机服务器有32GB RAM,目前使用16GB,剩余32 80/100 - 16 = 9GB RAM分配给虚拟机。数据库VM将获得9 3000 / (3000 + 1000 + 1000 + 1000)= 4.5 GB额外RAM,每个HTTP服务器将获得1.5 GB。

2010年以后发布的所有Linux发行版都包含了balloon内核驱动程序。对于Windows操作系统,气球驱动程序需要手动添加,可能会导致客户端运行速度减慢,因此我们不建议在关键系统上使用它。

在为虚拟机分配RAM时,一个很好的经验法则是总是给主机留出1GB的可用RAM。

10.2.7、网络设备

image.png
每个虚拟机可以有四个不同类型的网络接口控制器(NIC):

  • Intel E1000是默认的,并模拟英特尔千兆网卡。

  • 如果你想获得最大的性能,应该使用VirtIO半虚拟化网卡。与所有VirtIO设备一样,来宾操作系统应该安装了正确的驱动程序。

  • Realtek 8139仿真较老的100 MB/s网卡,应该只在仿真较老的操作系统时使用(在2002年之前发布)

  • vmxnet3是另一个半虚拟化设备,仅在从其他虚拟化环境导入虚拟机时使用。

Proxmox VE将为每个网卡生成一个随机MAC地址,这样您的虚拟机就可以在以太网上寻址。

添加给虚拟机的网卡有以下两种类型:

  • 在默认桥接模式下,每个虚拟网卡都通过一个tap设备(模拟以太网卡的软件环回设备)在主机上备份。这个tap设备被添加到网桥中,在Proxmox VE中默认为vmbr0。该模式下,虚拟机直接访问主机所在的以太局域网。

  • 在可选的NAT模式中,每个虚拟网卡将只与Qemu用户网络堆栈通信,其中内置路由器和DHCP服务器可以提供网络访问。这个内置的DHCP将提供私有10.0.2.0/24范围内的地址。NAT模式比桥接模式慢得多,只能用于测试。该模式仅支持CLI或API,不支持web。

说明创建虚拟机时,也可以不添加网络设备。

Multiqueue

如果您正在使用VirtIO驱动程序,您可以选择性地激活Multiqueue选项。这个选项允许客户操作系统使用多个虚拟cpu处理网络数据包,从而增加传输的数据包总数。

当与Proxmox VE一起使用VirtIO驱动程序时,每个网卡网络队列都被传递给主机内核,vhost驱动程序生成的内核线程将处理该队列。激活此选项后,可以为每个网卡向主机内核传递多个网络队列。

当使用Multiqueue时,建议将其设置为等于客户机的总内核数的值。您还需要使用ethtool命令在虚拟机中设置每个VirtIO网卡上的多用途通道数量:

ethtool -L ens1 combined X

其中X为虚拟机vcpu个数。

您应该注意,将Multiqueue参数设置为大于1的值将随着通信流量的增加而增加主机和客户系统上的CPU负载。我们建议仅在VM必须处理大量传入连接时设置此选项,例如VM作为路由器、反向代理或繁忙的HTTP服务器进行长轮询时。

10.2.8、显示

QEMU可以虚拟化几种类型的VGA硬件。一些例子:

  • std,默认值,用Bochs VBE扩展模拟卡。

  • cirrus,这曾经是默认的,它模拟了一个非常老的硬件模块和它所有的问题。这种显示类型应该只在确实需要时使用11,例如,如果使用Windows XP或更早版本

  • vmware,是vmware SVGA-II兼容的适配器。

  • qxl,是qxl半虚拟化显卡。选择此选项还会为VM启用SPICE(一种远程查看器协议)。

你可以通过设置memory选项来编辑虚拟图形处理器的内存量。这可以在VM内启用更高的分辨率,特别是使用SPICE/QXL。

由于内存是由显示设备保留的,为SPICE选择多显示器模式(例如,qxl2为双显示器)有一些含义:

  • Windows需要一个设备为每个监视器,所以如果你的ostype是Windows的某个版本,Proxmox VE给VM一个额外的设备为每个监视器。每个设备获得指定数量的内存。

  • Linux虚拟机,可以总是启用更多的虚拟监视器,但选择多监视器模式乘以给设备的内存与监视器的数量。

选择serialX作为显示类型将禁用VGA输出,并将Web控制台重定向到所选的串口。在这种情况下,配置的显示内存设置将被忽略。

10.2.9、USB直通

有两种不同类型的USB直通设备:

  • 主机USB直通

  • SPICE USB直通

主机USB直通通过给虚拟机一个主机的USB设备来实现。这可以通过供应商和产品id完成,也可以通过主机总线和端口完成。

供应商/产品id看起来是这样的:0123:abcd,其中0123是供应商的id, abcd是产品的id,这意味着相同usb设备的两个部分具有相同的id。

总线/端口看起来像这样:1-2.3.4,其中1是总线,2.3.4是端口路径。这表示主机的物理端口(取决于usb控制器的内部顺序)。

如果虚拟机启动时配置中存在某个设备,而主机中不存在该设备,则虚拟机启动没有问题。一旦设备/端口在主机中可用,它就会通过。

  1. 警告
  2. 使用这种USB直通方式意味着您不能将虚拟机在线移动到另一个主机上,因为硬件仅在虚拟机当前驻留的主机上可用。

第二种直通方式是SPICE USB直通。如果你使用支持它的SPICE客户端,这是非常有用的。如果你添加了一个SPICE USB端口到你的虚拟机,你就可以从你的SPICE客户端所在的地方直接通过一个USB设备到虚拟机(例如一个输入设备或硬件狗)。

10.2.10、BIOS和UEFI

为了正确地模拟计算机,QEMU需要使用固件。在普通pc上,通常称为BIOS或(U)EFI,它是作为启动VM的第一步执行的。它负责进行基本的硬件初始化,并为操作系统提供到固件和硬件的接口。默认情况下,QEMU使用的是开源的x86 BIOS实现的SeaBIOS。对于大多数标准设置来说,SeaBIOS是一个很好的选择。

然而,在某些情况下,BIOS不是一个好的引导固件,例如,如果你想做VGA直通。在这种情况下,您应该使用OVMF,它是开源的UEFI实现。

如果您想使用OVMF,需要考虑以下几点:

为了保存引导顺序等内容,需要有一个EFI磁盘。该磁盘将包含在备份和快照中,并且只能有一个。

可以使用如下命令创建这样的磁盘:

qm set <vmid> -efidisk0 <storage>:1,format=<format>

其中是你想要存储磁盘的存储,而是存储支持的格式。您也可以通过虚拟机硬件部分的Add→EFI disk的web界面创建这样的磁盘。

当使用带有虚拟显示(不带VGA直通)的OVMF时,需要在OVMF菜单中设置客户端分辨率(在启动过程中按ESC键即可达到),或者选择SPICE作为显示类型。

10.2.11、inter-VM共享内存

您可以添加vm间共享内存设备(ivshmem),它允许在主机和客户机之间共享内存,或者在多个客户机之间共享内存。

要添加这样的设备,可以使用qm:

qm set <vmid> -ivshmem size=32,name=foo

其中,size在MiB中。该文件将位于/dev/shm/pve-shm-$name(默认名称是vmid)下。

  1. 请注意
  2. 目前,一旦使用该设备的任何虚拟机被关闭或停止,该设备就会被删除。打开的连接仍然会保持,但是不能再建立到完全相同的设备的新连接。

这种设备的一个用例是Looking Glass 项目,它可以在主机和客户端之间实现高性能、低延迟的显示镜像。

10.2.12、音频设备

添加音频设备命令如下:

qm set <vmid> -audio0 device=<device>

支持的音频设备有:

  • ich9-intel-hda:英特尔HD音频控制器,模拟ICH9
  • 英特尔hda:英特尔HD音频控制器,模拟ICH6
  • AC97:音频编解码器’ 97,适用于较老的操作系统,如Windows XP
    1. Note
    2. 音频设备只能与SPICE结合使用。像微软的RDP这样的远程协议有播放声音的选项。要使用主机的物理音频设备,请使用设备直通(参见PCI直通章节10.9USB直通章节10.2.9)。

10.2.13、VirtIO RNG

RNG(随机数生成器)是一种为系统提供熵(随机性)的设备。虚拟硬件- rng可用于提供从主机系统到来宾VM的这样的熵。这有助于避免客户机中的熵饥饿问题(在这种情况下,没有足够的熵可用,系统可能会变慢或出现问题),特别是在客户机引导过程中。

添加基于virtio的仿真RNG,使用如下命令:

qm set <vmid> -rng0 source=<source>[,max_bytes=X,period=Y]

source指定在主机上从哪里读取熵,必须是以下之一:

  • /dev/urandom: Non-blocking kernel entropy pool(首选)

  • /dev/random:阻塞内核池(不推荐,可能导致主机系统的熵饥饿)

  • /dev/hwrng:通过连接到主机的硬件RNG(如果有多个可用,将使用在/sys/devices/virtual/misc/hw_random/rng_current中选择的一个)

可以通过max_bytes和period参数指定一个限制,它们被读取为每个周期的max_bytes,以毫秒为单位。但是,它并不表示线性关系:1024B/1000ms意味着在1秒计时器上最多有1 KiB数据可用,而不是在1秒内将1 KiB流发送给客户机。因此,缩短周期可以用来以更快的速度向客体注入熵。

缺省情况下,限制为1024bytes / 1000ms (1kib /s)。建议总是使用一个限制器,以避免客户机使用过多的主机资源。如果需要,max_bytes的值为0可以用来禁用所有限制。

10.2.14、设备启动顺序

QEMU可以告诉来宾它应该从哪个设备启动,以及以什么顺序启动。这可以通过boot属性在配置中指定,例如:

boot: order=scsi0;net0;hostpci0

image.png
这样,客人首先尝试从磁盘引导scsi0,如果失败了,它将尝试从net0网络引导,如果失败,最后试图从通过引导作为PCIe设备(视为磁盘NVMe,否则试图进入一个选项ROM)。

在GUI上,您可以使用拖放编辑器来指定引导顺序,并使用复选框来启用或禁用某些设备以共同引导。

  1. 请注意
  2. 如果客户端使用多个磁盘引导操作系统或加载引导加载程序,则必须将所有磁盘标记为可引导的(也就是说,它们必须启用复选框或出现在配置中的列表中),以便客户端能够引导。这是因为最近的SeaBIOSOVMF版本只在磁盘被标记为可引导时才初始化磁盘。

在任何情况下,即使没有出现在列表中或禁用了选中标记的设备对客户机仍然是可用的,只要操作系统已经启动并初始化它们。引导标志只影响客户BIOS和引导加载程序。

10.2.15、自动启动和关闭虚拟机

创建虚拟机之后,您可能希望它们在主机系统启动时自动启动。为此,您需要在web界面的虚拟机选项卡中选择“Start at boot”选项,或者使用以下命令设置:

qm set <vmid> -onboot 1

启停指令
image.png
**
在某些情况下,您希望能够优化VM的引导顺序,例如,如果其中一个VM向其他客户系统提供防火墙或DHCP。为此,你可以使用以下参数:

  • Start/Shutdown order:定义启动顺序优先级。例如,如果您希望虚拟机第一个启动,则将其设置为1。(我们使用相反的启动顺序来关闭机器,因此启动顺序为1的机器将是最后一个被关闭的机器)。如果在一台主机上定义了相同顺序的多个虚拟机,则按照VMID从小到大的顺序对它们进行排序。

  • 启动延迟:定义本次虚拟机启动到后续虚拟机启动的时间间隔。例如,如果你想在启动其他虚拟机之前等待240秒,请将其设置为240。

  • 关机超时:在发出关机命令后,promox VE应该等待虚拟机离线的时间,以秒为单位。默认情况下,此值设置为180,这意味着Proxmox VE将发出关闭请求,并等待180秒以使机器脱机。如果超时后机器仍处于在线状态,将强制停止机器。

    1. 请注意
    2. HA栈管理的虚拟机目前不遵循启动时启动和启动顺序选项。这些虚拟机将被启动和关闭算法跳过,因为HA manager本身会确保虚拟机的启动和停止。

    请注意,没有Start/Shutdown order参数的机器总是在设置了该参数的机器之后启动。而且,该参数只能在运行在同一台主机上的虚拟机之间执行,而不是在整个集群范围内。

10.2.16、SPICE增强

SPICE增强功能是可选的,可以提高远程查看器的体验。

要通过GUI启用它们,请转到虚拟机的选项面板。通过命令行开启:

qm set <vmid> -spice_enhancements foldersharing=1,videostreaming=all

  1. 请注意
  2. 要使用这些特性,必须将虚拟机的显示设置为SPICE (qxl)。

文件夹共享
**
与客户共享本地文件夹。需要在客户端安装spice- webdavid守护进程。它使共享文件夹可以通过位于http://localhost:9843的本地WebDAV服务器使用。

对于Windows客户,可以从Spice的官方网站下载安装程序。

大多数Linux发行版都有一个可以安装的名为spice- webdavid的包。

要在Virt-Viewer(远程查看器)中共享文件夹,请转到File→Preferences。选择要共享的文件夹,然后启用复选框。

  1. 请注意
  2. 文件夹共享目前仅适用于Linux版本的Virt-Viewer
  3. 谨慎
  4. 实验!目前该特性还不可靠。

流媒体视频

快速刷新区域被编码到视频流中。有两种选择:

  • all:任何快速刷新区域将被编码到视频流。

  • 过滤器:额外的过滤器被用来决定是否应该使用视频流(目前只有小窗口表面被跳过)。

一个一般的建议,如果视频流应该启用和选择从哪个选项不能给出。根据具体情况,您的里程可能有所不同。

故障排除

共享文件夹不显示

确保WebDAV服务已启用并在来宾系统中运行。在Windows上,它被称为Spice webdav代理。在Linux中,名称是spice- webdavid,但根据发行版的不同,名称可能有所不同。

如果服务正在运行,请在客户端浏览器中打开http://localhost:9843检查WebDAV服务器。

它可以帮助重新启动SPICE会话。

10.3、迁移

image.png
如果您有一个集群,您可以迁移您的虚拟机到另一个主机

qm migrate <vmid> <target>

通常有两种机制

  • 在线迁移(又名Live Migration)

  • 离线迁移

10.3.1、在线迁移

当VM运行时,它没有定义本地资源(例如本地存储上的磁盘,通过设备传递,等等),您可以使用-online标志发起热迁移。

它是如何工作的

这将在目标主机上启动带有传入标志的Qemu进程,这意味着该进程将启动并等待来自源虚拟机的内存数据和设备状态(因为所有其他资源,例如。磁盘,共享,内存内容和设备状态是唯一剩下的东西要传输)。

一旦建立了此连接,源就开始以异步方式向目标发送内存内容。如果源上的内存发生变化,这些部分将被标记为dirty,并将进行另一次发送数据的传递。直到要发送的数据量非常小,它可以在一秒钟内暂停源上的VM,将剩余的数据发送到目标上,并在目标上启动VM。

需求

为了活迁移到工作,需要做一些事情:

  • 虚拟机没有本地资源(例如直通设备、本地磁盘等)

  • 主机在同一个Proxmox VE集群中。

  • 主机网络连接正常(且可靠)。

  • 目标主机必须与Proxmox VE包版本相同或更高。(也有可能反过来,但这并不能保证)

10.3.2、离线迁移

如果您有本地资源,您仍然可以离线迁移您的虚拟机,只要所有磁盘都在存储上,存储是在两台主机上定义的。然后,迁移将通过网络将磁盘复制到目标主机。

10.4、复制和克隆

image.png
VM安装通常使用操作系统供应商提供的安装媒体(CD-ROM)完成。根据操作系统的不同,这可能是一个需要避免的耗时任务。

部署许多相同类型的虚拟机的一种简单方法是复制一个现有的虚拟机。我们使用克隆一词来区分这种复制,并区分链接克隆和完整克隆。

完整的克隆

复制的结果为独立的虚拟机。新创建的虚拟机不能与原虚拟机共享存储资源。

可以选择目标存储,因此可以使用它将VM迁移到完全不同的存储。如果存储驱动程序支持多种格式,还可以更改磁盘映像格式。

  1. 请注意
  2. 完整克隆需要读取和复制所有虚拟机镜像数据。这通常比创建一个链接克隆要慢得多。

某些存储类型允许复制特定的快照,默认为当前虚拟机数据。这也意味着最终的副本不会包含来自原始VM的任何额外快照。

链接克隆

现代存储驱动程序支持一种生成快速链接克隆的方法。这种克隆是一种可写副本,其初始内容与原始数据相同。创建一个链接克隆几乎是瞬间的,并且最初不消耗额外的空间。

它们之所以被称为链接,是因为新图像仍然指向原始图像。未修改的数据块从原始图像读取,但修改的数据块从新的位置写入(然后读取)。这种技术称为写时复制。

这要求原始卷是只读的。使用Proxmox VE可以将任何VM转换为只读模板)。这样的模板以后可以用来高效地创建链接克隆。

  1. 请注意
  2. 当存在链接克隆时,您不能删除原始模板。

不可能更改链接克隆的目标存储,因为这是存储内部特性。


Target node选项允许您在不同的节点上创建新的VM。唯一的限制是虚拟机在共享存储上,并且该存储在目标节点上也可用。

为了避免资源冲突,所有网络接口MAC地址都是随机的,我们为VM BIOS (smbios1)设置生成一个新的UUID。

10.5、虚拟机模板

将虚拟机转为模板。这样的模板是只读的,您可以使用它们来创建链接克隆。

  1. 请注意
  2. 启动模板是不可能的,因为这会修改磁盘映像。如果要更改模板,请创建一个链接克隆,并对其进行修改。

10.6、VM 生成 ID

Proxmox VE支持虚拟机vmgenid (Virtual Machine Generation ID) 15。客户操作系统可以使用它来检测导致时间转移事件的任何事件,例如,恢复备份或快照回滚。

创建新虚拟机时,会自动生成vmgenid,并保存在配置文件中。要创建并添加vmgenid到一个已经存在的虚拟机,可以通过传递特殊值“1”让Proxmox VE自动生成一个vmgenid,或者通过使用它作为值手动设置UUID ,例如:

qm set VMID -vmgenid 1
qm set VMID -vmgenid 00000000-0000-0000-0000-000000000000

  1. 请注意
  2. vmgenid设备初始添加到现有的虚拟机,可能会产生与快照回滚、备份恢复等更改相同的效果,因为虚拟机可以将此解释为生成更改。

在很少的情况下,vmgenid机制是不需要的,可以在虚拟机创建时传递’ 0 ‘值,或在配置中通过以下方式删除属性:

qm set VMID -delete vmgenid

vmgenid最突出的用例是较新的Microsoft Windows操作系统,使用它来避免在快照回滚、备份恢复或整个虚拟机克隆操作上的时间敏感或复制服务(如数据库、域控制器17)的问题。

10.7、导入虚拟机和磁盘镜像

从外部管理程序导出的VM通常采用一个或多个磁盘映像的形式,并带有描述VM设置(RAM、内核数)的配置文件。如果磁盘来自VMware或VirtualBox,可以选择vmdk格式的磁盘镜像;如果磁盘来自KVM hypervisor,可以选择qcow2格式的磁盘镜像。VM导出最流行的配置格式是OVF标准,但是在实践中,互操作是有限的,因为许多设置没有在标准本身中实现,并且管理程序以非标准扩展导出补充信息。

除了格式问题外,如果模拟的硬件从一个管理程序到另一个管理程序的更改太多,那么从其他管理程序导入磁盘映像可能会失败。Windows虚拟机尤其关注这一点,因为操作系统对任何硬件的改变都非常挑剔。这个问题可以通过在导出之前安装Internet上的MergeIDE.zip工具和在启动导入的Windows虚拟机之前选择IDE类型的硬盘来解决。

最后还有半虚拟化驱动程序的问题,它提高了被模拟系统的速度,并且特定于hypervisor。GNU/Linux和其他免费的Unix操作系统默认安装了所有必要的驱动程序,您可以在导入虚拟机之后立即切换到半虚拟化驱动程序。对于Windows操作系统的虚拟机,需要用户自行安装Windows半虚拟化驱动。

GNU/Linux和其他免费Unix通常可以毫不费力地导入。由于上述问题,我们无法保证在任何情况下都能成功导入/导出Windows虚拟机。

10.7.1、Windows OVF导入的逐步示例

微软提供虚拟机下载来开始Windows开发。我们将使用其中一个来演示OVF导入特性。

下载虚拟机压缩包

获取用户协议后,选择VMware平台的Windows 10 Enterprise (Evaluation - Build),下载zip文件。

从zip文件中提取磁盘映像

使用解压缩工具或您选择的任何存档程序解压缩,并通过ssh/scp将ovf和vmdk文件复制到您的Proxmox VE主机。

导入虚拟机

这将创建一个新的虚拟机,使用从OVF清单中读取的内核、内存和虚拟机名称,并将磁盘导入到local-lvm存储中。您必须手动配置网络。

qm importovf 999 WinDev1709Eval.ovf local-lvm

待启动的虚拟机已准备就绪。

10.7.2、向虚拟机添加外部磁盘映像

您还可以向VM添加现有的磁盘映像,这些映像可以来自外部管理程序,也可以来自您自己创建的管理程序。

假设你用vmdebootstrap工具创建了一个Debian/Ubuntu磁盘镜像:

vmdebootstrap --verbose \
--size 10GiB --serial-console \
--grub --no-extlinux \
--package openssh-server \
--package avahi-daemon \
--package qemu-guest-agent \
--hostname vm600 --enable-dhcp \
--customize=./copy_pub_ssh.sh \
--sparse --image vm600.raw

现在可以为该映像创建一个新的目标VM。

qm create 600 --net0 virtio,bridge=vmbr0 --name vm600 --serial0 socket \
--bootdisk scsi0 --scsihw virtio-scsi-pci --ostype l26

在虚拟机中添加磁盘镜像unused0,使用存储pvedir:

qm importdisk 600 vm600.raw pvedir

最后将未使用的磁盘绑定到虚拟机的SCSI控制器上:

qm set 600 --scsi0 pvedir:600/vm-600-disk-1.raw

待启动的虚拟机已准备就绪。

10.8、Cloud-init 支持

Cloud-Init实际上是一个多分发包,用于处理虚拟机实例的早期初始化。使用Cloud-Init,可以在管理程序端配置网络设备和ssh密钥。

当虚拟机第一次启动时,虚拟机中的Cloud-Init软件将应用这些设置。许多Linux发行版提供了随时可用的Cloud-Init映像,这些映像主要是为OpenStack设计的。这些图像也将与Proxmox VE一起工作。虽然获取这种随时可用的图像似乎很方便,但我们通常建议您自己准备图像。这样做的好处是,您将确切地知道您安装了什么,这有助于您稍后根据需要轻松地定制映像。

创建了这样的Cloud-Init映像之后,我们建议将其转换为VM模板。您可以从VM模板快速创建链接克隆,因此这是一种快速推出新VM实例的方法。您只需要在启动新的VM之前配置网络(可能还有ssh密钥)。

推荐使用SSH密钥认证方式登录Cloud-Init发放的虚拟机。也可以设置密码,但这不如使用SSH基于密钥的身份验证安全,因为Proxmox VE需要在Cloud-Init数据中存储该密码的加密版本。

Proxmox VE生成ISO镜像,将Cloud-Init数据传递给虚拟机。为此,所有Cloud-Init虚拟机都需要分配一个CDROM驱动器。此外,许多Cloud-Init映像都假定有一个串行控制台,因此建议添加一个串行控制台,并将其用作这些虚拟机的显示。

10.8.1、准备Cloud-init模板

第一步是准备VM。基本上,您可以使用任何VM。只需在您想要准备的VM中安装Cloud-Init包。在基于Debian/Ubuntu的系统中,这很简单:

apt-get install cloud-init

已经有许多发行版提供了随时可用的Cloud-Init映像(以.qcow2文件的形式提供),所以您也可以简单地下载并导入这些映像。对于下面的示例,我们将使用Ubuntu在https://cloud-images.ubuntu.com上提供的云映像。

  1. # download the image
  2. wget https://cloud-images.ubuntu.com/bionic/current/bionic-server-cloudimg-amd64.img
  3. # create a new VM
  4. qm create 9000 --memory 2048 --net0 virtio,bridge=vmbr0
  5. # import the downloaded disk to local-lvm storage
  6. qm importdisk 9000 bionic-server-cloudimg-amd64.img local-lvm
  7. # finally attach the new disk to the VM as scsi drive
  8. qm set 9000 --scsihw virtio-scsi-pci --scsi0 local-lvm:vm-9000-disk-1
  1. 请注意
  2. Ubuntu Cloud-Init映像对于SCSI驱动器需要virtio-scsi-pci控制器类型。

添加Cloud-Init光盘驱动器
image.png
下一步是配置一个用于将Cloud-Init数据传递到VM的CDROM驱动器。

qm set 9000 --ide2 local-lvm:cloudinit

为了能够直接从Cloud-Init映像启动,将bootdisk参数设置为scsi0,并限制BIOS仅从磁盘启动。这将加快引导速度,因为VM BIOS跳过了对可引导光盘的测试。

qm set 9000 --boot c --bootdisk scsi0

还可以配置一个串行控制台并将其用作显示器。许多Cloud-Init映像都依赖于此,因为这是OpenStack映像的要求。

qm set 9000 --serial0 socket --vga serial0

最后一步是将虚拟机转换为模板。然后,您可以从这个模板快速创建链接克隆。从虚拟机模板部署比创建完整克隆(副本)快得多。

qm template 9000

10.8.2、部署Cloud-init模板

image.png
你可以很容易地通过克隆来部署这样的模板:

qm clone 9000 123 --name ubuntu2

然后配置用于认证的SSH公钥,并配置IP setup:

qm set 123 --sshkey ~/.ssh/id_rsa.pub
qm set 123 --ipconfig0 ip=10.0.10.123/24,gw=10.0.10.1

您还可以仅使用一个命令配置所有Cloud-Init选项。我们简单地分割了上面的示例,以分隔命令以减少行长度。还要确保为您的特定环境采用IP设置。

10.8.3、自定义Cloud-init设置

Cloud-init集成还允许使用自定义配置文件,而不是自动生成的配置文件。这是通过命令行中的ciccustom选项完成的:

qm set 9000 —cicustom “user=,network=,meta=

自定义配置文件必须位于支持snippet的存储上,并且必须在VM将要迁移到的所有节点上可用。否则虚拟机将无法启动。例如:

qm set 9000 --cicustom "user=local:snippets/userconfig.yaml"

Cloud-Init有三种配置。第一个是如上例所示的用户配置。第二个是网络配置,第三个是元配置。它们可以一起指定,也可以根据需要混合和匹配。自动生成的配置将用于任何没有指定自定义配置文件的配置。

生成的配置可以转储为自定义配置的基础:

qm cloudinit dump 9000 user

network和meta也有相同的命令。

10.8.4、Cloud-init特定选项

cicustom: [meta=] [,network=] [,user=]
指定自定义文件来替换在开始时自动生成的文件。

meta=
指定一个自定义文件,包含通过“.”cloud-init传递给虚拟机的所有元数据。这是提供商特定的含义configdrive2和nocloud不同。

network=
指定一个包含通过cloud-init传递到VM的所有网络数据的自定义文件。

user=
指定一个自定义文件,其中包含通过cloud-init传递给VM的所有用户数据。

cipassword:
指定用户的密码。通常不推荐使用这种方法。使用ssh密钥代替。还要注意,旧的cloud-init版本不支持散列密码。

citype:
指定cloud-init配置格式。默认值取决于配置的操作系统类型(ostype。我们在Linux上使用nocloud格式,在windows上使用configdrive2格式。

ciuser:
更改ssh密钥和密码的用户名,而不是映像配置的默认用户。

ipconfig[n]: [gw=] [,gw6=] [,ip=] [,ip6=]
指定对应接口的IP地址和网关。

IP地址采用CIDR表示法,网关为可选,但需要指定与IP地址类型相同的IP地址。

特殊字符串dhcp可以用于IP地址使用dhcp,这种情况下不需要提供显式网关。对于IPv6,可以使用特殊字符串auto来使用无状态自动配置。

启用cloud-init后,如果不指定IPv4地址和IPv6地址,则默认在IPv4上使用dhcp。

gw=
IPv4流量的默认网关。

  1. 请注意
  2. 需要选择(s): ip

gw6=
IPv6流量的默认网关。

  1. 请注意
  2. 需要选择(s): ip6

ip= (default = dhcp)
IPv4 CIDR格式地址。

ip6= (default = dhcp)
IPv6 CIDR格式地址。
nameserver:
设置容器的DNS服务器IP地址。如果searchdomain和nameserver ‘ . ‘都没有设置,Create will ‘ . ‘将自动从主机使用设置。

searchdomain:
为容器设置DNS搜索域。如果searchdomain和nameserver ‘ . ‘都没有设置,Create will ‘ . ‘将自动从主机使用设置。

sshkeys:
设置公共SSH密钥(每行一个密钥,OpenSSH格式)。

10.9、PCI(e)直通

PCI(e)直通是一种机制,让虚拟机从主机控制PCI设备。这比使用虚拟化硬件有一些优势,例如更低的延迟、更高的性能或更多的特性(例如,卸载)。

但是,如果您将一个设备传递给虚拟机,您就不能在主机或任何其他虚拟机中使用该设备了。

10.9.1、一般要求

由于直通也是一种需要硬件支持的特性,因此需要进行一些检查和准备工作才能使其正常工作。

硬件
**
您的硬件需要支持IOMMU (I/O内存管理单元)中断重新映射,这包括CPU和主板。

一般来说,带有VT-d的英特尔系统和带有AMD- vi的AMD系统都支持这一点。但是,由于糟糕的硬件实现和缺少或低质量的驱动程序,不能保证所有东西都能开箱即用。

而且,服务器级硬件通常比消费级硬件有更好的支持,但即使这样,许多现代系统也可以支持这一点。

请与硬件供应商联系,检查他们是否支持Linux下针对您的特定设置的这个特性。

配置
**
确保硬件支持直通后,您需要做一些配置来启用PCI(e)直通。

IOMMU

IOMMU必须在内核命令行3.11.5节上激活。

命令行参数如下:

  • intel CPU:

intel_iommu=on

  • AMD CPU

amd_iommu=on

内核模板

您必须确保加载了以下模块。这可以通过将它们添加到“/etc/modules”来实现。

vfio
vfio_iommu_type1
vfio_pci
vfio_virqfd

在更改任何相关模块之后,您需要刷新initramfs。在Proxmox VE上可以执行以下命令:

# update-initramfs -u -k all

完成配置
**
最后,重新启动以使更改生效,并检查是否确实启用了它。

# dmesg | grep -e DMAR -e IOMMU -e AMD-Vi

如果显示启用了IOMMU、定向I/O或中断重新映射,具体消息可能会根据硬件和内核而变化。

同样重要的是,你想要通过的设备在一个单独的IOMMU组中。这可以通过以下方式进行验证:

# find /sys/kernel/iommu_groups/ -type l

如果设备和它的功能(例如,带有HDMI音频设备的GPU)或它的根端口或PCI(e)桥接器在IOMMU组中,这是可以的。

PCI插槽(e)
一些平台以不同的方式处理它们的物理PCI(e)插槽。因此,有时它可以帮助把卡放在另一个PCI(e)槽,如果你没有得到想要的IOMMU群分离。

不安全的中断
对于某些平台,可能需要允许不安全的中断。为此,在以’结尾的文件中添加以下行。/etc/modprobe.d/ conf文件:

options vfio_iommu_type1 allow_unsafe_interrupts=1

请注意,这个选项会使您的系统不稳定。

GPU 直通 注意

在Proxmox VE web界面上无法通过NoVNC或SPICE显示GPU的帧缓冲区。

当通过整个GPU或vGPU和图形输出是需要的,一个必须物理连接监视器到卡,或配置远程桌面软件(例如,VNC或RDP)在来宾。

如果你想使用GPU作为硬件加速器,例如,对于使用OpenCL或CUDA的程序,这是不必要的。

10.9.2、主机设备直通

最常用的PCI(e)直通方式是通过整个PCI(e)卡,例如GPU或网卡。

主机配置
**
在这种情况下,主机不能使用该卡。有两种方法可以实现这一点:

  • 通过添加设备id到vfio-pci模块的选项

options vfio-pci ids=1234:5678,4321:8765

到/etc/modprobe. conf文件中。其中1234:5678和4321:8765为厂商id和设备id
获得的:

# lspci -nn

  • 在主机上完全将驱动程序列入黑名单,确保它可以自由绑定直通,在/etc/modprobe.d的.conf文件中。

blacklist DRIVERNAME

对于这两个方法,您都需要再次更新initramfs第10.9.1节,并在此之后重新启动。

验证配置

要检查更改是否成功,可以使用

# lspci -nnk

检查你的设备条目。如果它说

Kernel driver in use: vfio-pci

或者正在使用的线路完全缺失,设备就可以接通了。

VM 配置
**
要通过该设备,需要在虚拟机配置中设置hostpciX选项,例如执行以下命令:

# qm set VMID -hostpci0 00:02.0
**
如果你的设备有多个功能(例如’ 00:02.0 ‘和’ 00:02.1 ‘),你可以使用缩写语法’ 00:02 ‘将它们一起传递。

有一些选项可能是必要的,取决于设备和客户操作系统:

  • x-vga=on|off表示该虚拟机的GPU主用PCI(e)设备。这样,vga配置选项将被忽略。

  • pcie=on|off指示Proxmox VE使用pcie或PCI端口。有些客户机/设备组合需要PCIe,而不是PCI。PCIe仅适用于q35机型。

  • rombar=on|off使客户端可见固件ROM。默认的是。一些PCI(e)设备需要禁用这个。

  • romfile=,是设备要使用的ROM文件的可选路径。这是/usr/share/kvm/下的相对路径。

示例
**
GPU设置为primary的PCIe直通示例:

# qm set VMID -hostpci0 02:00,pcie=on,x-vga=on

其他的考虑

当通过GPU时,使用q35作为机器类型,OVMF(虚拟机EFI)代替SeaBIOS, PCIe代替PCI,达到最佳兼容性。注意,如果你想使用OVMF作为GPU直通,GPU需要有EFI能力的ROM,否则使用SeaBIOS代替。

10.9.3、SR-IOV

通过PCI(e)设备的另一种变体是使用设备的硬件虚拟化特性(如果可用的话)。

SR-IOV (single - root Input/Output Virtualization)支持单台设备向系统提供多个VF (Virtual Functions)。每个VF都可以在不同的VM中使用,具有完整的硬件特性,也比软件虚拟化设备有更好的性能和更低的延迟。

目前,最常见的用例是支持SR-IOV的网卡(网络接口卡),它可以为每个物理端口提供多个VFs。这允许在虚拟机内部使用校验和卸载等特性,减少(主机)CPU开销。

主机配置
**
一般情况下,在设备上启用虚拟功能有两种方式。

  • 有时会有驱动模块的选项,例如一些英特尔驱动

max_vfs=4

可以把以.conf结尾的文件放在/etc/modprobe.d下。(不要忘记在那之后更新你的initramfs)

具体参数和选项请参考驱动模块文档。

  • 第二种更通用的方法是使用sysfs。如果设备和驱动程序支持此功能,则可以动态更改VFs的数量。例如,要在设备0000:01:00.0上设置4个VFs,执行以下命令:

# echo 4 > /sys/bus/pci/devices/0000:01:00.0/sriov_numvfs

要使这个更改持久,你可以使用’ sysfsutils ‘ debian包。安装后通过/etc/sysfs.conf或’/etc/sysfs.d/中文件.conf进行配置

VM配置
创建VFs之后,当使用lspci输出它们时,应该将它们视为单独的PCI(e)设备。获取他们的ID并像普通的PCI(e)设备一样通过Section 10.9.2。

其他的考虑
**
对于这个特性,平台支持尤其重要。可能需要首先在BIOS/EFI中启用此特性,或者使用特定的PCI(e)端口使其工作。如有疑问,请查阅平台手册或联系其供应商。

10.9.4、调节设备(VGPU、GVT-gi)

中介设备是将物理硬件的特性和性能重用为虚拟硬件的另一种方法。这些是最常见的虚拟GPU设置,如英特尔GVT-g和英伟达vgpu在他们的网格技术中使用。

这样,物理卡就可以创建虚拟卡,类似于SR-IOV。不同之处在于中介设备在主机中不作为PCI(e)设备出现,只适合在虚拟机中使用。

主机配置

一般来说,你的卡的驱动程序必须支持这个功能,否则它将无法工作。因此,请向您的供应商了解兼容的驱动程序以及如何配置它们。

GVT-g的英特尔驱动集成在内核中,可以与第5、第6和第7代Intel Core处理器以及E3 v4、E3 v5和E3 v6 Xeon处理器兼容。

要为Intel图形启用它,你必须确保加载模块kvmgt(例如通过/etc/modules),并在内核命令行3.11.5节中启用它,并添加以下参数:

i915.enable_gvt=1

在此之后,请记住更新initramfs第10.9.1节,并重新启动主机。

VM配置

要使用中介设备,只需在hostpciX虚拟机配置选项上指定mdev属性。

您可以通过sysfs获得支持的设备。例如,要列出设备00000:02.0支持的类型,你只需执行:

# ls /sys/bus/pci/devices/0000:00:02.0/mdev_supported_types

每个条目都是一个包含以下重要文件的目录:

  • available_instances包含这种类型的仍然可用的实例数量,每个mdev在虚拟机中的使用都会减少这种数量。

  • description包含对类型的能力的简短描述

  • create是创建这样一个设备的端点,如果配置了mdev的hostpciX选项,Proxmox VE会自动为您做这个。

使用Intel GVT-g vGPU (Intel Skylake 6700k)配置示例:

# qm set VMID -hostpci0 00:02.0,mdev=i915-GVTg_V5_4

使用此设置,Proxmox VE会在VM启动时自动创建这样一个设备,并在VM停止时重新清理它。

10.10、挂钩脚本

通过配置属性hookscript,可以为虚拟机添加钩子脚本

qm set 100 -hookscript local:snippets/hookscript.pl

它将在来宾生命周期的各个阶段被调用。有关示例和文档,请参阅/usr/share/pve-docs/examples/guest-example-hookscript.pl下的示例脚本。

10.11、休眠

您可以挂起虚拟机到磁盘,通过GUI选项Hibernate或

qm suspend ID --todisk

这意味着内存中的当前内容将保存到磁盘上,VM将停止。在下一次开始时,内存内容将被加载,虚拟机可以继续它离开的地方。

状态存储选择

如果没有为内存指定目标存储,它将自动选择,第一个是:

1.存储vmstatestorage来自VM的配置。

  1. 任何虚拟机磁盘的第一个共享存储。

3.任何虚拟机磁盘的第一个非共享存储。

  1. 本地存储作为后备。

10.12、管理qm虚拟机

qm是在Proxmox VE上管理Qemu/Kvm虚拟机的工具。您可以创建和销毁虚拟机,并控制执行(启动/停止/暂停/恢复)。除此之外,您还可以使用qm在相关的配置文件中设置参数。也可以创建和删除虚拟磁盘。

10.12.1、CLI使用示例

使用上传至本地存储的iso文件,在本地lvm的存储上创建一个4gb IDE磁盘的虚拟机

qm create 300 -ide0 local-lvm:4 -net0 e1000 -cdrom local:iso/proxmox-mailgateway_2.1.iso

启动新的虚拟机

qm start 300

发送关闭请求,然后等待直到虚拟机停止。

qm shutdown 300 && qm wait 300

和上面一样,但只等待40秒。

qm shutdown 300 && qm wait 300 -timeout 40

10.13、配置

虚拟机配置文件存储在Proxmox集群文件系统中,可以通过/etc/pve/qemu-server/.conf访问。与存储在/etc/pve/中的其他文件一样,它们会自动复制到所有其他集群节点。

  1. 请注意
  2. VMIDs < 100的预留给内部使用,vm在整个集群范围内必须是唯一的。

VM配置示例

  1. boot: order=virtio0;net0
  2. cores: 1
  3. sockets: 1
  4. memory: 512
  5. name: webmail
  6. ostype: l26
  7. net0: e1000=EE:D2:28:5F:B6:3E,bridge=vmbr0
  8. virtio0: local:vm-100-disk-1,size=32G

这些配置文件是简单的文本文件,您可以使用普通的文本编辑器(vi, nano,…)编辑它们。有时,这对于做一些小的修改是有用的,但是请记住,您需要重新启动VM来应用这些更改。

因此,最好使用qm命令来生成和修改这些文件,或者使用GUI完成全部工作。我们的工具包足够聪明,可以立即将大多数更改应用到运行中的VM。该特性称为“热插拔”,在这种情况下不需要重启虚拟机。

10.13.1、文件格式

虚拟机配置文件的“键/值”格式使用简单的“:”分隔。每行有以下格式:

# this is a comment
OPTION: value

这些文件中的空行会被忽略,以#字符开头的行会被视为注释,也会被忽略。

10.13.2、快照

在创建快照时,qm在快照时将配置存储到同一个配置文件中的单独的快照部分中。例如,在创建一个名为“testsnapshot”的快照后,您的配置文件将如下所示:

虚拟机配置(带快照)

  1. memory: 512
  2. swap: 512
  3. parent: testsnaphot
  4. ...
  5. [testsnaphot]
  6. memory: 512
  7. swap: 512
  8. snaptime: 1457170803
  9. ...

有一些快照相关的属性,如parent和snaptime。parent属性用于存储快照之间的父/子关系。snaptime是快照创建时间戳(Unix epoch)。

您可以选择保存正在运行的虚拟机的内存,选项为vmstate。关于如何为虚拟机状态选择目标存储的详细信息,请参见休眠章节10.11中的“状态存储选择状态存储选择”。

10.13.3、选项

acpi: (default = 1)
启用/禁用 ACPI

agent: [enabled=]<1|0> [,fstrim_cloned_disks=<1|0>]**[,type=]**
启用/禁用Qemu GuestAgent及其属性。

enabled= (default = 0)
启用/禁用Qemu GuestAgent。

fstrim_cloned_disks= (default = 0)
克隆/移动磁盘完成后,运行fstrim命令。

type= (default = virtio)
选择代理类型

arch:
虚拟处理器体系结构。默认为主机。

args:
传递给kvm的任意参数,例如:
参数:-no-reboot -no-hpet
请注意:这个选项只适合专家。

audio0: device= [,driver=]
配置一个音频设备,与QXL/Spice结合使用很有用。

device=
配置音频设备

driver= (default = spice)
音频设备的驱动后端。

autostart: (default = 0)
崩溃后自动重启(目前忽略)。

balloon: (0 - N)
虚拟机的目标RAM数量(以MB为单位)。使用0将禁用ballon驱动程序。

bios: (default = seabios)
选择BIOS实现。

boot: [[legacy=]<[acdn]{1,4}>] [,order=]
指定来宾引导顺序。不赞成使用order=、Use with no key或legacy=。

legacy=<[acdn]{1,4}> (default = cdn)
启动软盘(a),硬盘(c),光盘(d),或网络(n)。弃用,使用order=代替。

order=**
来宾程序将尝试按照设备在这里出现的顺序引导它们。

磁盘、光驱和直通存储USB设备将被直接引导,网卡将加载PXE, PCIe设备要么表现得像磁盘(如NVMe),要么加载一个选项ROM(如RAID控制器、硬件网卡)。

注意,只有这个列表中的设备将被标记为可引导的,因此由客户固件(BIOS/UEFI)加载。如果需要多个磁盘来启动(例如,软件raid),则需要在这里指定所有磁盘。

当给出时,重写已弃用的legacy=[acdn]*值。

bootdisk: (ide|sata|scsi|virtio)\d+
启用从指定磁盘启动。已弃用:使用boot: order=foo;bar代替。

cdrom:
这是选项-ide2的别名

cicustom: [meta=] [,network=] [,user=]
cloud-init:指定自定义文件来替换开始时自动生成的文件。

meta=
指定一个自定义文件,包含通过“。”cloud-init传递给虚拟机的所有元数据。这是提供商特定的含义configdrive2和nocloud不同。

network=
指定一个包含通过cloud-init传递到VM的所有网络数据的自定义文件。

user=
指定一个自定义文件,其中包含通过cloud-init传递给VM的所有用户数据。

cipassword:
cloud-init:分配用户的密码。通常不推荐使用这种方法。使用ssh密钥代替。还要注意,旧的cloud-init版本不支持散列密码。

citype:
指定cloud-init配置格式。默认值取决于配置的操作系统类型(ostype。我们在Linux上使用nocloud格式,在windows上使用configdrive2格式。

ciuser:
cloud-init:更改ssh密钥和密码的用户名,而不是映像配置的默认用户。

cores: (1 - N) (default = 1)
每个插槽的内核数。

cpu: [[cputype=]] [,flags=<+FLAG[;-FLAG…]>][,hidden=<1|0>] [,hv-vendor-id= ][,phys-bits=<8-64|host>] [,reported-model=]
模拟CPU类型。

cputype= (default = kvm64)
模拟CPU类型。可以是默认名称或自定义名称(自定义模型名称必须以custom-作为前缀)。

flags=<+FLAG[;-FLAG…]>
用;分隔的附加CPU标志列表。使用+FLAG启用,-FLAG禁用一个标志。自定义CPU型号可以指定QEMU/KVM支持的任何标志,出于安全原因,虚拟机特定的标志必须来自以下设置:pcid、spec-ctrl、ibpb、ssbd、virt-ssbd、amd-ssbd、amd-no-ssb、pdpe1gb、md-clear、hv-tlbflush、hv-evmcs、aes。

hidden= (default = 0)
不能识别为KVM虚拟机。

hv-vendor-id=**
Hyper-V供应商ID。Windows客户端的一些驱动程序或程序需要一个特定的ID。

phys-bits=<8-64|host>
报告给客户操作系统的物理内存地址位。应该小于或等于主机的。设置为host以使用来自主机CPU的值,但请注意,这样做将破坏对带有其他值的CPU的热迁移。

reported-model=<486 | Broadwell | Broadwell-IBRS |
Broadwell-noTSX | Broadwell-noTSX-IBRS | Cascadelake-Server |
Cascadelake-Server-noTSX | Conroe | EPYC | EPYC-IBPB |
EPYC-Rome | Haswell | Haswell-IBRS | Haswell-noTSX |
Haswell-noTSX-IBRS | Icelake-Client | Icelake-Client-noTSX |
Icelake-Server | Icelake-Server-noTSX | IvyBridge |
IvyBridge-IBRS | KnightsMill | Nehalem | Nehalem-IBRS |
Opteron_G1 | Opteron_G2 | Opteron_G3 | Opteron_G4 | Opteron_G5
| Penryn | SandyBridge | SandyBridge-IBRS | Skylake-Client |
Skylake-Client-IBRS | Skylake-Client-noTSX-IBRS |
Skylake-Server | Skylake-Server-IBRS |
Skylake-Server-noTSX-IBRS | Westmere | Westmere-IBRS | athlon |
core2duo | coreduo | host | kvm32 | kvm64 | max | pentium |
pentium2 | pentium3 | phenom | qemu32 | qemu64> (default = kvm64)
向客户报告CPU型号和供应商。必须是QEMU/KVM支持的型号。仅对自定义CPU模型定义有效,默认模型将始终向客户操作系统报告自己。

cpulimit: (0 - 128) (default = 0)
CPU使用限制。
请注意:如果计算机有2个CPU,则总共有2个CPU时间。取值为0表示不做CPU限制。

cpuunits: (2 - 262144) (default = 1024)
虚拟机的CPU权重。参数在内核公平调度程序中使用。这个数字越大,虚拟机获得的CPU时间就越多。“数量”与其他所有运行虚拟机的权重值相关。

description:
对虚拟机的描述。仅用于web配置界面。这是作为注释保存在配置文件中。

efidisk0: [file=] [,format=] [,size=]**
配置EFI vars的磁盘

file=
驱动器的备份卷。

format=
硬盘备份文件的数据格式。

size=
磁盘大小。这纯粹是信息,没有任何影响

freeze: **
在启动时冻结CPU(使用c monitor命令启动执行)。

hookscript:
将在vms生命周期的各个步骤中执行的脚本。

hostpci[n]: [host=] [,legacy-igd=<1|0>][,mdev=] [,pcie=<1|0>] [,rombar=<1|0>] [,romfile=][,x-vga=<1|0>]
将主机PCI设备映射到客户端。

  1. 请注意
  2. 这个选项允许直接访问主机硬件。因此,迁移这样的机器不再是可能的——使用时要特别小心。
  3. 谨慎
  4. 实验!用户报告了这个选项的问题。

host=
主机PCI设备通过。主机的PCI设备的PCI ID或主机的PCI虚拟功能列表。HOSTPCIID语法是:

总线:开发。func(十六进制数字)

可以使用lspci命令列出现有的PCI设备。

legacy-igd= (default = 0)
以传统的IGD模式传递该设备,使其成为虚拟机中唯一的图形设备。要求pc-i440fx机器类型和VGA设置为none。

mdev=
要使用的媒介设备类型。该类型的实例将在虚拟机启动时创建,并在虚拟机停止时清除。

pcie= (default = 0)
选择PCI-express总线(需要q35机器型号)。

rombar= (default = 1)
指定设备的ROM是否在客户的内存映射中可见。

romfile=
自定义pci设备rom文件名(必须位于/usr/share/kvm/)。

x-vga= (default = 0)
使能vfio-vga设备支持。

hotplug: (default = network,disk,usb)
有选择地启用热插拔特性。这是一个逗号分隔的热插拔功能列表:网络,磁盘,cpu,内存和usb。使用0完全禁用热插拔。“1”为默认“网络、磁盘、usb”的别名。

hugepages: <1024 | 2 | any>
启用/禁用hugepages内存

ide[n]: [file=] [,aio=] [,backup=<1|0>]
[,bps=] [,bps_max_length=] [,bps_rd=]
[,bps_rd_max_length=] [,bps_wr=]
[,bps_wr_max_length=] [,cache=] [,cyls=]
[,detect_zeroes=<1|0>] [,discard=] [,format=]
[,heads=] [,iops=] [,iops_max=]
[,iops_max_length=] [,iops_rd=]
[,iops_rd_max=] [,iops_rd_max_length=]
[,iops_wr=] [,iops_wr_max=]
[,iops_wr_max_length=] [,mbps=] [,mbps_max=]
[,mbps_rd=] [,mbps_rd_max=] [,mbps_wr=]
[,mbps_wr_max=] [,media=] [,model=]
[,replicate=<1|0>] [,rerror=] [,secs=]
[,serial=] [,shared=<1|0>] [,size=]
[,snapshot=<1|0>] [,ssd=<1|0>] [,trans=]
[,werror=] [,wwn=]
使用volume作为IDE硬盘或CD-ROM (n为0到3)。

aio=
要使用的AIO类型。

backup=**
在进行备份时是否应该包括该驱动器。

bps=
最大收发速度(以字节/秒为单位)。

bps_max_length=
最大I/O爆发长度,以秒为单位。

bps_rd=
最大读速度(单位为字节/秒)。

bps_rd_max_length=
最大读I/O爆发长度(以秒为单位)。

bps_wr=
最大写速度,以字节/秒为单位。

bps_wr_max_length=
最大写I/O爆发长度(秒)。

cache=
驱动器的缓存模式

cyls=
强制驱动器的物理几何形状具有特定的圆柱数。

detect_zeroes=
控制是否检测并尝试优化对零的写操作。

discard=
控制是否将丢弃/修剪请求传递给基础存储。

file=
驱动器的备份卷。

format=
硬盘备份文件的数据格式。

heads=
强制驱动器的物理几何有一个特定的人数。

iops=**
每秒操作数的最大r/w I/O。

iops_max=
每秒操作数中未节流的最大读写I/O池。

iops_max_length=**
最大I/O爆发长度,以秒为单位。

iops_rd=
每秒最大读I/O。

iops_rd_max=
每秒操作数中未调整的最大读I/O池。

iops_rd_max_length=
最大读I/O爆发长度(以秒为单位)。

iops_wr=
每秒最大写I/O。

iops_wr_max=
最大未调整的写I/O池(以每秒操作数计算)。

iops_wr_max_length=
最大写I/O爆发长度(秒)。

mbps=
最大收发速度,单位为兆字节/秒。

mbps_max=
最大未调整的读写池(单位为兆字节/秒)。

mbps_rd=
最大读取速度,单位为每秒兆字节。

mbps_rd_max=
最大未节流读池,单位为兆字节/秒。

mbps_wr=
最大写入速度,单位为每秒兆字节。

mbps_wr_max=
最大未限制的写池,单位为每秒兆字节。

media= (default = disk)
驱动器的媒体类型。

model=
驱动器报告的模型名称,url编码的,长达40个字节。

replicate= (default = 1)
该驱动器是否需要考虑用于复制任务。

rerror=
读取错误行动。

secs=**
强制驱动器的物理几何图形具有特定的扇区计数。

serial=
驱动器报告的序列号,url编码,长达20字节。

shared= (default = 0)**
将这个本地管理的卷标记为在所有节点上可用。

  1. 警告
  2. 这个选项不会自动共享卷,它假设卷已经被共享了!

size=
磁盘大小。这纯粹是信息,没有任何影响。

snapshot=
控制qemu的快照模式功能。激活后,对磁盘的修改是临时的,在虚拟机关闭时将被丢弃。

ssd=
是否将该驱动器公开为SSD,而不是旋转硬盘。

trans=
强制磁盘几何bios转换模式。

werror=
写错误的行动。

wwn=
驱动器的全球名称,编码为16字节十六进制字符串,前缀为0x。

ipconfig[n]: [gw=] [,gw6=][,ip=] [,ip6= ]
cloud-init:指定对应接口的IP地址和网关。

IP地址采用CIDR表示法,网关为可选,但需要指定与IP地址类型相同的IP地址。

特殊字符串dhcp可以用于IP地址使用dhcp,这种情况下不需要提供显式网关。对于IPv6,可以使用特殊字符串auto来使用无状态自动配置。

启用cloud-init后,如果不指定IPv4地址和IPv6地址,则默认在IPv4上使用dhcp。

gw=
IPv4流量的默认网关。请注意:需要选择(s): ip

gw6=
IPv6流量的默认网关。请注意:需要选择(s): ip6

ip= (default = dhcp)
CIDR格式的IPv4地址。

ip6= (default = dhcp)**
CIDR格式的IPv6地址。

ivshmem: size= [,name=]
Inter-VM共享内存。用于虚拟机之间的直接通信,或与主机的直接通信。

name=
文件的名称。将以pve-shm-作为前缀。默认为VMID。,将在虚拟机停止后删除。

size= (1 - N)
文件大小(MB)。

keephugepages: (default = 0)
与大页面一起使用。开启后,虚拟机关闭后,大页面不会被删除,后续启动时可使用。

keyboard: <da | de | de-ch | en-gb | en-us | es | fi | fr | fr-be |fr-ca | fr-ch | hu | is | it | ja | lt | mk | nl | no | pl | pt |**pt-br | sl | sv | tr>**
vnc服务器的键盘布局。默认值从/etc/pve/datacenter.cfg配置文件中读取。应该没有必要设置它。

kvm: (default = 1)
开启/关闭KVM硬件虚拟化。

localtime:
设置实时时钟为当地时间。如果ostype为微软操作系统,则默认启用。

lock:
锁定/解锁VM。

machine:
(pc|pc(-i440fx)?-\d+(.\d+)+(+pve\d+)?(.pxe)?|q35|pc-q35-\d+(.\d+)+(+pve\d+)?(.pxe)?|virt(?:-\d+(.\d+)+)?(+pve\d+)?)
指定Qemu机器类型。

memory: (16 - N) (default = 512)
虚拟机的最大内存,单位为MB。这是使用气球设备时的最大可用内存。

migrate_downtime: (0 - N) (default = 0.1)
为迁移设置最大允许停机时间(以秒为单位)。

migrate_speed: (0 - N) (default = 0)
设置迁移的最大速率(MB/s)。取值为0表示不限制。

name:
设置虚拟机名称。仅用于web配置界面。

nameserver:
cloud-init:设置容器的DNS服务器IP地址。如果searchdomain和nameserver ‘ . ‘都没有设置,Create will ‘ . ‘将自动从主机使用设置。

net[n]: [model=] [,bridge=] [,firewall=<1|0>][,link_down=<1|0>] [,macaddr=] [,mtu=][,queues=] [,rate=] [,tag=]
[,trunks=] [,=]
指定网络设备。

bridge=
网桥连接网络设备。Proxmox VE标准网桥称为vmbr0。如果不指定网桥,则创建kvm用户(NATed)网络设备,用于提供DHCP和DNS服务。使用的地址如下:
10.0.2.2 Gateway
10.0.2.3 DNS Server
10.0.2.4 SMB Server
DHCP服务器从10.0.2.15开始为客户端分配地址。

firewall=
该接口是否需要防火墙保护。

link_down=
这个接口是否应该断开(如拔插头)。

macaddr=
一个没有设置I/G(个人/组)位的通用MAC地址。

model=<e1000 | e1000-82540em | e1000-82544gc | e1000-82545em |
i82551 | i82557b | i82559er | ne2k_isa | ne2k_pci | pcnet |
rtl8139 | virtio | vmxnet3>
网卡的模式。virtio模型以非常低的CPU开销提供了最好的性能。如果您的客户端不支持此驱动程序,通常最好使用e1000。

mtu= (1 - 65520)
Force MTU,仅用于VirtIO。设置为1表示使用桥的MTU

queues= (0 - 16)
设备上要使用的包队列数。

rate= (0 - N)
以mbps(兆字节每秒)作为浮点数的速率限制。

tag= (1 - 4094)
在本接口上应用的VLAN tag。

trunks=
通过该接口的VLAN trunk。

numa: (default = 0)
启用/禁用NUMA。

numa[n]: cpus= [,hostnodes=][,memory=] [,policy=]
NUMA拓扑。

cpus=
访问NUMA节点的cpu。

hostnodes=**
主机NUMA节点使用。

memory=
NUMA节点提供的内存量。

policy=
NUMA分配策略。

onboot: (default = 0)
虚拟机是否在系统启动时启动。

ostype:
指定客户操作系统。这是用来为特定的操作系统启用特殊的优化/特性:
other unspecified OS
wxp Microsoft Windows XP
w2k Microsoft Windows 2000
w2k3 Microsoft Windows 2003
w2k8 Microsoft Windows 2008
wvista Microsoft Windows Vista
win7 Microsoft Windows 7
win8 Microsoft Windows 8/2012/2012r2
win10 Microsoft Windows 10/2016
l24 Linux 2.4 Kernel
l26 Linux 2.6 - 5.X Kernel
solaris Solaris/OpenSolaris/OpenIndiania kernel

parallel[n]: /dev/parport\d+|/dev/usb/lp\d+
映射主机并行设备(n从0到2)。

  1. 请注意
  2. 这个选项允许直接访问主机硬件。因此,迁移这样的机器不再是可能的——使用时要特别小心。
  3. 谨慎
  4. 实验!用户报告了这个选项的问题。

protection: (default = 0)
设置虚拟机的保护标志。这将禁用“移除虚拟机”和“移除磁盘”操作。

reboot: (default = 1)
允许重新启动。设置为“0”表示虚拟机重启后退出。

rng0: [source=] [,max_bytes=] [,period=]
配置基于virtio的随机数生成器。

max_bytes= (default = 1024)
每一周期毫秒注入客户机的最大熵字节数。当使用/dev/random作为源时,选择较低的值。使用0禁用限制(可能有危险!)

period= (default = 1000)
每一周期毫秒,熵注入配额都会重置,允许客户机检索另一个熵的max_bytes。

source=
主机上要从中收集熵的文件。在大多数情况下,/dev/urandom应该优于/dev/random,以避免主机上的熵饥饿问题。使用urandom并不会以任何有意义的方式降低安全性,因为它仍然来自于真实的熵,并且所提供的字节也很可能与来宾的真实熵混合在一起。/dev/hwrng可以用来通过主机的硬件RNG。

sata[n]: [file=] [,aio=] [,backup=<1|0>]
[,bps=] [,bps_max_length=] [,bps_rd=]
[,bps_rd_max_length=] [,bps_wr=]
[,bps_wr_max_length=] [,cache=] [,cyls=]
[,detect_zeroes=<1|0>] [,discard=] [,format=]
[,heads=] [,iops=] [,iops_max=]
[,iops_max_length=] [,iops_rd=]
[,iops_rd_max=] [,iops_rd_max_length=]
[,iops_wr=] [,iops_wr_max=]
[,iops_wr_max_length=] [,mbps=] [,mbps_max=]
[,mbps_rd=] [,mbps_rd_max=] [,mbps_wr=]
[,mbps_wr_max=] [,media=] [,replicate=<1|0>]
[,rerror=] [,secs=] [,serial=]
[,shared=<1|0>] [,size=] [,snapshot=<1|0>] [,ssd=<1|0>]
[,trans=] [,werror=] [,wwn=]
使用“卷”作为SATA硬盘或光盘(n = 0 ~ 5)。

aio=
要使用的AIO类型

backup=**
在进行备份时是否应该包括该驱动器。

bps=
最大收发速度(以字节/秒为单位)。

bps_max_length=
最大I/O爆发长度,以秒为单位。

bps_rd=
最大读速度(单位为字节/秒)。

bps_rd_max_length=
最大读I/O爆发长度(以秒为单位)。

bps_wr=
最大写速度,以字节/秒为单位。

bps_wr_max_length=
最大写I/O爆发长度(秒)。

cache=
驱动器的缓存模式

cyls=
强制驱动器的物理几何形状具有特定的圆柱数。

detect_zeroes=
控制是否检测并尝试优化对零的写操作。

discard=
控制是否将丢弃/修剪请求传递给基础存储。

file=
驱动器的备份卷。

format=
硬盘备份文件的数据格式。

heads=
强制驱动器的物理几何有一个特定的人数。

iops=
每秒操作数的最大r/w I/O。

iops_max=
每秒操作数中未节流的最大读写I/O池。

iops_max_length=
最大I/O爆发长度,以秒为单位。

iops_rd=
每秒最大读I/O。

iops_rd_max=
每秒操作数中未调整的最大读I/O池。

iops_rd_max_length=
最大读I/O爆发长度(以秒为单位)。

iops_wr=
每秒最大写I/O。

Maximum unthrottled write I/O pool in operations per second.
最大未调整的写I/O池(以每秒操作数计算)。

iops_wr_max_length=
最大写I/O爆发长度(秒)。

mbps=
最大收发速度,单位为兆字节/秒。

mbps_max=
最大未调整的读写池(单位为兆字节/秒)。

mbps_rd=
最大读取速度,单位为每秒兆字节。

mbps_rd_max=
最大未节流读池,单位为兆字节/秒。

mbps_wr=
最大写入速度,单位为每秒兆字节。

mbps_wr_max=
最大未限制的写池,单位为每秒兆字节。

media= (default = disk)
驱动器的媒体类型。

replicate= (default = 1)
该驱动器是否需要考虑用于复制任务。

rerror=
读取错误行动。

secs=
强制驱动器的物理几何图形具有特定的扇区计数。

serial=
驱动器报告的序列号,url编码,长达20字节。

shared= (default = 0)
将这个本地管理的卷标记为在所有节点上可用。

  1. Warning
  2. 这个选项不会自动共享卷,它假设卷已经被共享了!


size=**
磁盘大小。这纯粹是信息,没有任何影响。

snapshot=
控制qemu的快照模式功能。激活后,对磁盘的修改是临时的,在虚拟机关闭时将被丢弃。

ssd=
是否将该驱动器公开为SSD,而不是旋转硬盘。

trans=
强制磁盘几何bios转换模式。

werror=
写错误的行动。

wwn=
驱动器的全球名称,编码为16字节十六进制字符串,前缀为0x。

scsi[n]: [file=] [,aio=] [,backup=<1|0>]
[,bps=] [,bps_max_length=] [,bps_rd=]
[,bps_rd_max_length=] [,bps_wr=]
[,bps_wr_max_length=] [,cache=] [,cyls=]
[,detect_zeroes=<1|0>] [,discard=] [,format=]
[,heads=] [,iops=] [,iops_max=]
[,iops_max_length=] [,iops_rd=]
[,iops_rd_max=] [,iops_rd_max_length=]
[,iops_wr=] [,iops_wr_max=]
[,iops_wr_max_length=] [,iothread=<1|0>] [,mbps=]
[,mbps_max=] [,mbps_rd=] [,mbps_rd_max=]
[,mbps_wr=] [,mbps_wr_max=] [,media=]
[,queues=] [,replicate=<1|0>]
[,rerror=] [,scsiblock=<1|0>] [,secs=]
[,serial=] [,shared=<1|0>] [,size=]
[,snapshot=<1|0>] [,ssd=<1|0>] [,trans=]
[,werror=] [,wwn=]
使用“卷”作为SCSI硬盘或CD-ROM (n为0 ~ 30)。

aio=
要使用的AIO类型

backup=**
在进行备份时是否应该包括该驱动器。

bps=
最大收发速度(以字节/秒为单位)。

bps_max_length=
最大I/O爆发长度,以秒为单位。

bps_rd=
最大读速度(单位为字节/秒)。

bps_rd_max_length=
最大读I/O爆发长度(以秒为单位)。

bps_wr=
最大写速度,以字节/秒为单位。

bps_wr_max_length=
最大写I/O爆发长度(秒)。

cache=
驱动器的缓存模式

cyls=
强制驱动器的物理几何形状具有特定的圆柱数。

detect_zeroes=
控制是否检测并尝试优化对零的写操作。

discard=
控制是否将丢弃/修剪请求传递给基础存储。

file=
驱动器的备份卷。

format=
硬盘备份文件的数据格式。

heads=
强制驱动器的物理几何有一个特定的人数。

iops=
每秒操作数的最大r/w I/O。

iops_max=
每秒操作数中未节流的最大读写I/O池。

iops_max_length=
最大I/O爆发长度,以秒为单位。

iops_rd=
每秒最大读I/O。

iops_rd_max=
每秒操作数中未调整的最大读I/O池。

iops_rd_max_length=
最大读I/O爆发长度(以秒为单位)。

iops_wr=
每秒最大写I/O。

iops_wr_max=
最大未调整的写I/O池(以每秒操作数计算)。

iops_wr_max_length=
最大写I/O爆发长度(秒)。

mbps=
最大收发速度,单位为兆字节/秒。

mbps_max=
最大未调整的读写池(单位为兆字节/秒)。

mbps_rd=
最大读取速度,单位为每秒兆字节。

mbps_rd_max=
最大未节流读池,单位为兆字节/秒。

mbps_wr=
最大写入速度,单位为每秒兆字节。

mbps_wr_max=
最大未限制的写池,单位为每秒兆字节。

media= (default = disk)
驱动器的媒体类型。

replicate= (default = 1)
该驱动器是否需要考虑用于复制任务。

rerror=
读取错误行动。

secs=
强制驱动器的物理几何图形具有特定的扇区计数。

serial=
驱动器报告的序列号,url编码,长达20字节。

shared= (default = 0)
将这个本地管理的卷标记为在所有节点上可用。

  1. Warning
  2. 这个选项不会自动共享卷,它假设卷已经被共享了!


size=**
磁盘大小。这纯粹是信息,没有任何影响。

snapshot=
控制qemu的快照模式功能。激活后,对磁盘的修改是临时的,在虚拟机关闭时将被丢弃。

trans=
强制磁盘几何bios转换模式。

werror=
写错误的行动。

wwn=
驱动器的全球名称,编码为16字节十六进制字符串,前缀为0x。

scsihw: (default = lsi)
SCSI控制器模型

searchdomain:
cloud-init:设置容器的DNS搜索域。如果searchdomain和nameserver ‘ . ‘都没有设置,Create will ‘ . ‘将自动从主机使用设置。

serial[n]: (/dev/.+|socket)
在VM内部创建一个串行设备(n为0到3),并通过一个主机串行设备(即/dev/ttyS0),或在主机端创建一个unix套接字(使用qm终端打开终端连接)。

  1. 请注意
  2. 如果你通过一个主机串行设备,它是不可能再迁移这样的机器-使用特别小心。
  3. 谨慎
  4. 实验!用户报告了这个选项的问题。

shares: (0 - 50000) (default = 1000)
用于自动膨胀的内存共享数量。这个数字越大,这个虚拟机获得的内存就越多。数值与其他所有运行虚拟机的权重值相关。使用零禁用自动膨胀。自动膨胀是由pvestatd完成的。

smbios1: [base64=<1|0>] [,family=]
[,manufacturer=] [,product=<Base64 encoded
string>] [,serial=] [,sku=<Base64 encoded
string>] [,uuid=] [,version=]
指定SMBIOS type 1字段。

base64=
标志,指示SMBIOS值是用base64编码的

family=
设置SMBIOS1家族字符串。

manufacturer=
设置SMBIOS1制造商。

product=
设置“SMBIOS1产品ID”。

serial=
设置“SMBIOS1序列号”。

sku=
设置SMBIOS1 SKU字符串。

uuid=
设置SMBIOS1 UUID。

version=
设置SMBIOS1版本。**

smp: (1 - N) (default = 1)
cpu个数。请使用选项-sockets代替。

sockets: (1 - N) (default = 1)
CPU插槽数量。

spice_enhancements: [foldersharing=<1|0>][,videostreaming=]
为SPICE配置其他增强功能。

foldersharing= (default = 0)
通过SPICE启用文件夹共享。需要在VM中安装Spice-WebDAV守护进程。

videostreaming= (default = off)
使视频流。对检测到的视频流进行压缩。

sshkeys:
cloud-init:设置公共SSH密钥(每行一个密钥,OpenSSH格式)。

startdate: (now | YYYY-MM-DD | YYYY-MM-DDTHH:MM:SS) (default = now)
设置实时时钟的初始日期。date的有效格式是:’ now ‘或2006-06-17 t16:01:21或2006-06-17。

startup: [[order=]\d+] [,up=\d+] [,down=\d+]
启动和关闭行为。Order是一个非负数,定义了一般启动顺序。用倒序完成关机。此外,您还可以设置以秒为单位的启动或关闭延迟时间,即在下一个虚拟机启动或停止前的等待时间。

tablet: (default = 1)
启用/禁用USB平板设备。该设备通常需要允许使用VNC进行绝对鼠标定位。否则鼠标与普通VNC客户端不同步。如果您在一台主机上运行许多仅限控制台的客户机,您可以考虑禁用该功能以保存一些上下文切换。如果你使用spice (qm set —vga qxl),这个默认是关闭的。

tags:
虚拟机标签。这只是元信息。

tdf: (default = 0)
启用/禁用时间漂移修复。

template: (default = 0)
启用/禁用模板。

unused[n]: [file=]
引用未使用的卷。这是内部使用的,不应该手动修改。

file=
驱动器的备份卷。

usb[n]: [host=] [,usb3=<1|0>]
配置USB设备(n = 0 ~ 4)。

host=
主机USB设备或端口或值spice。HOSTUSBDEVICE语法是:
’bus-port(.port)*’ (decimal numbers) or
’vendor_id:product_id’ (hexadeciaml numbers) or
’spice’
可以使用lsusb -t命令列出现有的usb设备。

  1. 请注意
  2. 这个选项允许直接访问主机硬件。因此,迁移这样的机器不再是可能的——使用时要特别小心。

“spice”可用于为spice添加usb重定向设备。

usb3= (default = 0)
指定给定的主机选项是否是USB3设备或端口。

vcpus: (1 - N) (default = 0)
热插拔vcpu的个数。

vga: [[type=]] [,memory=]
配置VGA硬件。如果你想使用高分辨率模式(>= 1280x1024x16),你可能需要增加vga内存选项。自QEMU 2.9以来,默认的VGA显示类型是所有操作系统类型的std,除了一些使用cirrus的Windows版本(XP或更老版本)。qxl选项启用SPICE显示服务器。对于win* OS,你可以选择你想要的独立显示的数量,Linux客户可以自己添加显示。您也可以在没有任何图形卡的情况下运行,使用串行设备作为终端。

memory= (4 - 512)
设置VGA内存(在MiB中)。对串行显示没有影响。

type= (default = std)
选择VGA类型。

virtio[n]: [file=] [,aio=] [,backup=<1|0>]
[,bps=] [,bps_max_length=] [,bps_rd=]
[,bps_rd_max_length=] [,bps_wr=]
[,bps_wr_max_length=] [,cache=] [,cyls=]
[,detect_zeroes=<1|0>] [,discard=] [,format=]
[,heads=] [,iops=] [,iops_max=]
[,iops_max_length=] [,iops_rd=]
[,iops_rd_max=] [,iops_rd_max_length=]
[,iops_wr=] [,iops_wr_max=]
[,iops_wr_max_length=] [,iothread=<1|0>] [,mbps=]
[,mbps_max=] [,mbps_rd=] [,mbps_rd_max=]
[,mbps_wr=] [,mbps_wr_max=] [,media=]
[,replicate=<1|0>] [,rerror=] [,secs=]
[,serial=] [,shared=<1|0>] [,size=]
[,snapshot=<1|0>] [,trans=] [,werror=]
使用volume作为VIRTIO硬盘(n = 0 ~ 15)。

aio=
要使用的AIO类型

backup=**
在进行备份时是否应该包括该驱动器。

bps=
最大收发速度(以字节/秒为单位)。

bps_max_length=
最大I/O爆发长度,以秒为单位。

bps_rd=
最大读速度(单位为字节/秒)。

bps_rd_max_length=
最大读I/O爆发长度(以秒为单位)。

bps_wr=
最大写速度,以字节/秒为单位。

bps_wr_max_length=
最大写I/O爆发长度(秒)。

cache=
驱动器的缓存模式

cyls=
强制驱动器的物理几何形状具有特定的圆柱数。

detect_zeroes=
控制是否检测并尝试优化对零的写操作。

discard=
控制是否将丢弃/修剪请求传递给基础存储。

file=
驱动器的备份卷。

format=
硬盘备份文件的数据格式。

heads=
强制驱动器的物理几何有一个特定的人数。

iops=
每秒操作数的最大r/w I/O。

iops_max=
每秒操作数中未节流的最大读写I/O池。

iops_max_length=
最大I/O爆发长度,以秒为单位。

iops_rd=
每秒最大读I/O。

iops_rd_max=
每秒操作数中未调整的最大读I/O池。

iops_rd_max_length=
最大读I/O爆发长度(以秒为单位)。

iops_wr=
每秒最大写I/O。

iops_wr_max=
最大未调整的写I/O池(以每秒操作数计算)。

iops_wr_max_length=
最大写I/O爆发长度(秒)。

mbps=
最大收发速度,单位为兆字节/秒。

mbps_max=
最大未调整的读写池(单位为兆字节/秒)。

mbps_rd=
最大读取速度,单位为每秒兆字节。

mbps_rd_max=
最大未节流读池,单位为兆字节/秒。

mbps_wr=
最大写入速度,单位为每秒兆字节。

mbps_wr_max=
最大未限制的写池,单位为每秒兆字节。

media= (default = disk)
驱动器的媒体类型。

replicate= (default = 1)
该驱动器是否需要考虑用于复制任务。

rerror=
读取错误行动。

secs=
强制驱动器的物理几何图形具有特定的扇区计数。

serial=
驱动器报告的序列号,url编码,长达20字节。

shared= (default = 0)
将这个本地管理的卷标记为在所有节点上可用。

  1. Warning
  2. 这个选项不会自动共享卷,它假设卷已经被共享了!


size=**
磁盘大小。这纯粹是信息,没有任何影响。

snapshot=
控制qemu的快照模式功能。激活后,对磁盘的修改是临时的,在虚拟机关闭时将被丢弃。

trans=
强制磁盘几何bios转换模式。

werror=
写错误的行动。

vmgenid: (default = 1 (autogenerated))
vmgenid (virtual machine generation ID)设备向虚拟机操作系统公开128位的整数标识。这允许在虚拟机使用不同的配置(例如,快照执行或从模板创建)执行时通知来宾操作系统。客户操作系统注意到这个变化,然后能够通过将其分布式数据库的副本标记为dirty、重新初始化其随机数生成器等方式做出适当的反应。注意,自动创建仅在通过API/CLI创建或更新方法完成时有效,而在手动编辑配置文件时无效。

vmstatestorage:
虚拟机状态卷/文件的默认存储。

watchdog: [[model=]] [,action=]
创建虚拟硬件看门狗。一旦启用(由来宾操作),看门狗必须由来宾内部的代理定期轮询,否则看门狗将重置来宾(或执行指定的相应操作)。

action=
激活后,如果客户端未能及时轮询看门狗,则执行的动作。

model= (default = i6300esb)
要模仿的看门狗类型。

10.14、锁

在线迁移、快照和备份(vzdump)对受影响的虚拟机设置锁,防止并发操作不兼容。有时您需要手动移除这样的锁(例如,在电源故障后)。

qm unlock <vmid>

  1. 谨慎
  2. 只有当您确定设置锁的操作不再运行时才这样做。