10.2 虚拟机配置

一般来说,Proxmox VE默认提供的虚拟机硬件配置就是最佳选择。当你确实需要改变Proxmox VE默认的虚拟机配置时,确保你确实清楚修改的原因及后果,否则可能会导致性能下降或者数据丢失风险。

10.2.1. 常规设置

虚拟机通用配置包括:

  • 节点:虚拟机所处的物理服务器名。

  • VM ID:Proxmox VE用于标识虚拟机的一个唯一编号。

  • 名称:虚拟机名称,用于描述虚拟机的字符串。

  • 资源池:虚拟机所处的逻辑组。

10.2.2 操作系统设置

在创建虚拟机时,设置合适的操作系统版本能够帮助Proxmox VE优化虚拟机底层配置。例如,Windows操作系统将期望BIOS时钟基于本地时间,而Unix类操作系统将期望BIOS时钟使用UTC时间。

10.2.3 系统设置

创建虚拟机时,可以修改虚拟机的部分系统配置。比如可以指定10.2.8节所述的显示类型。

此外,还可以改变10.2.4节所述SCSI控制器类型。如果计划安装QEMU Guset Agent,或选择使用ISO镜像自动安装系统,你可以勾选Qemu Agent复选框,以便Proxmox VE显示更多信息或自动完成某些操作(例如,关机或快照)。

Proxmox VE支持多种BIOS固件和机器类型,见10.2.10节关于SeaBIOS和OVMF相关内容。多数情况下,你可能希望使用OVMF而非传统SeaBIOS。除非你想使用10.9节所述的PCI直通技术。

机器类型决定了虚拟机主板的硬件布局,具体有Intel 440FX和Q35两种可选。Q35提供了虚拟PCIe总线,是进行PCIe直通的必备之选。

10.2.4 硬盘

磁盘控制器

Qemu能够模拟多种存储控制器:

  • IDE控制器最早可追溯到1984年的PC/AT硬盘控制器。尽管后来又出现了更多更新的控制器设计,但基本上你能想到的每种操作系统都会支持IDE控制器。当你的虚拟机使用2003年以前开发的操作系统时,使用IDE控制器将是最佳选择。该控制器上最多可挂载4个设备。

  • SATA控制器出现于2003年,采用了更为现代化的设计,不仅提供了更高的数据传输速率,并且支持挂载更多的设备。该控制器上最多可挂载6个设备。

  • SCSI控制器设计于1985年,通常用于服务器级硬件,最多可挂载14个设备。默认情况下Proxmox VE模拟的SCSI控制器型号为LSI 53C895A。

  • 如果你想追求更高的虚拟硬盘性能,可以选择使用VirtIO SCSI类型的SCSI控制器。事实上,Proxmox VE 4.3开始将该类型SCSI控制器用于Linux虚拟机的默认配置。Linux于2012年开始支持该控制器,而FreeBSD则于2014年开始支持。对于Windows类操作系统,你需要在安装操作系统时使用专门的驱动光盘安装驱动程序后才可以使用。如果你想追求最极致的性能,可以选用VirtIO SCSI single,并启用IO Thread选项。在选用VirtIO SCSI single时,Qemu将为每个虚拟磁盘创建一个专用控制器,而不是让所有磁盘共享一个控制器。

  • VirtIO Block控制器,通常简称为VirtIO或virtio-blk,是一种较旧的半虚拟化控制器。就功能而言,它已被VirtIO SCSI控制器所取代。

磁盘格式

以上每种控制器都支持同时挂载多个虚拟硬盘设备,虚拟硬盘可以基于一个文件,也可以基于某种存储服务提供的块存储设备。而所选择的存储服务类型决定了虚拟硬盘镜像能采用的数据格式。块存储服务(LVM,ZFS,Ceph)上只能保存raw格式虚拟硬盘,文件系统存储服务(Ext4,NFS,CIFS,GlusterFS)则允许你选择使用raw格式或QEMU镜像格式。

  • QEMU镜像格式是一种基于“写时复制”的虚拟硬盘格式,支持虚拟硬盘快照和薄模式存储。

  • Raw格式硬盘镜像是一种逐个bit存储数据的硬盘镜像格式,具体和你在Linux上用dd命令创建的镜像格式很像。这种镜像格式本身不具有创建快照或薄模式存储的功能,而需要下层存储服务支持才可以实现这些功能。但是其速度可能比QEMU镜像格式快10%。

  • VMware镜像格式仅供用于从其他类型虚拟机系统导入/导出硬盘镜像时使用。

缓存模式

虚拟硬盘的Cache模式设置会影响Proxmox VE主机系统向虚拟机操作系统返回数据块写操作完成通知的时机。设置为No cache是指在所有数据块都已写入物理存储设备写队列后,再向虚拟机发出写操作完成通知,而忽略主机页缓存机制。该方式将能较好地平衡数据安全性和写入性能。

如果你希望在备份某个虚拟机时指定Proxmox VE备份管理器跳过某个虚拟硬盘,可以在该虚拟硬盘上启用No backup配置。

如果你在配置Proxmox VE存储复制时希望忽略某些磁盘,可以在该磁盘上启用忽略复制(Skip replication)选项。对于Proxmox VE 5.0,存储复制功能只能用于zfspool上的虚拟磁盘,所以在其他类型存储上为配置了复制任务的虚拟机新增虚拟磁盘时,需要启用忽略复制。

Trim/丢弃

如果存储服务支持薄模式存储(参见存储服务一章),可以启用丢弃配置。启用丢弃配置后,并且虚拟机操作系统支持TRIM功能,当在虚拟机中删除文件后,虚拟机文件系统会将对应磁盘扇区标识为未使用,磁盘控制器会根据该信息压缩磁盘镜像。

为了支持虚拟机发出的TRIM命令,必须使用VirtIO SCSI控制器(或VirtIO SCSI Single),或者在虚拟机磁盘上设置启用SSD emulation选项。注意,丢弃参数在VirtIO Block设备商是不能生效的。

如果希望虚拟机磁盘表现为固态硬盘而非传统磁盘,可以在相应虚拟磁盘上设置SSD emulation。该参数并不需要底层真的使用SSD盘,任何类型物理介质均可使用该参数。但在SSD emulation在VirtIO Block设备上是不能生效的。

IO Thread

当使用VirtIO SCSI single控制器时,对于启用Virtio控制器或Virtio SCSI控制器时的磁盘可以启用IO Thread。启用IO Thread后,Qemu将为每一个虚拟硬盘分配一个读写线程,与之前所有虚拟硬盘共享一个线程相比,能大大提高多硬盘虚拟机的性能。注意,IO Thread配置并不能提高虚拟机备份的速度。

10.2.5 CPU

CPU Socket指PC主板上的CPU芯片插槽。每个CPU可以有一个或多个核心(core),每个核心都是一个独立的处理单元。为虚拟机配置1个4核心虚拟CPU和配置2个2核心CPU在性能上区别不大。但某些软件是基于Socket授权,这时按照软件授权设置Socket数量就显得比较有意义了。

通常增加虚拟机的虚拟CPU数量都可以改善性能,但最终改善程度还依赖于虚拟机对CPU的使用方式。每增加1个虚拟CPU,Qemu都会在Proxmox VE主机上增加一个处理线程,从而改善多线程应用的性能。如果你不确定虚拟机的具体负载,可以先为虚拟机配置2个虚拟CPU,通常情况下这是比较安全的配置方法。

注意:

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

资源限制

除了可以设置虚拟CPU数量,还可以设置一个虚拟机能够占用的物理CPU时间比例,以及相对其他虚拟机占用CPU时间的比例。通过设置cpulimit(“主机CPU时间“)参数,可以限制虚拟机能占用的主机CPU时间。该参数是一个浮点数,1.0表示占用100%,2.5表示占用250%并以此类推。如果单进程充分利用一个CPU核心,就是达到100%的CPU时间占有率。对有4个虚拟CPU的虚拟机,在充分利用所有核心的情况下,可以达到的最大理论值为400%。由于Qemu还为虚拟外部设备启用其他线程,因此虚拟机真实的CPU占有率会更高一些。这个设置对于有多个虚拟vCPU的虚拟机最有用,因为可以有效避免同时运行多个进程的虚拟机vCPU利用率全部达到100%。举个极端的例子:对于有8个vCPU的虚拟机,任何时候都不能让其8个核心同时全速运行,因为这样会让服务器负载过大,导致服务器上其他虚拟机和容器无法正常运行。这时,可以设置cpulimit为4.0(=400%)。这时,所有核心同时运行重载任务时,最多占有为服务器CPU核心50%时间资源。但是,如果只有4个核心运行重载任务,仍然有可能导致4个物理CPU核心利用率达到100%。

注意:根据具体设置,虚拟机有可能启动其他线程,例如处理网络通信、IO操作、在线迁移等。因此,虚拟机的实际占用的CPU时间会比虚拟CPU所占用的要多。为确保虚拟机占用的CPU时间不超过所分配给虚拟CPU,可以设置cpulimit为所有核心数量总数。

第二个CPU资源限制参数是cpuunits(常称为CPU份额或CPU权重),可用于控制虚拟机占用CPU资源相对其他虚拟机的比例。这是一个相对的份额权重,默认值为1024,增加某个虚拟机的cpuunits,将导致调度器调低其他虚拟机的CPU分配权重。例如,虚拟机VM 100权重为默认值1024,虚拟机VM 200权重调整为2048后,分配给VM 200的CPU时间将是VM 100的两倍。 更多信息可查看man systemd.resource-control,文档中的CPUQuota对应于cpulimit,CUPShares对应于cpuunits。Notes小节中有具体的参考文档和实现细节。

CPU类型

Qemu可以模拟包括从486到最新Xeon处理器在内的多种CPU硬件。模拟更新的CPU意味着模拟更多功能特性,比如硬件3D渲染,随机数生成器,内存保护等等。通常,你应该选择和主机CPU最接近的虚拟机CPU类型,这可以让你的虚拟机访问使用主机CPU的功能特性(也称为CPU flags),你也可以将CPU类型设置为host,这样虚拟机的虚拟CPU就和主机物理CPU完全一致。

这种配置方法最大的问题在于,如果你需要将一个虚拟机在线迁移到另一台物理服务器,虚拟机可能会因为两台物理服务器的CPU类型不同而崩溃。如果CPU flag不一致,Qemu进程会直接停止运行。为避免该问题,Qemu专门提供了一种名为kvm64的虚拟CPU,这也是Proxmox VE默认使用的CPU。大致上kvm64是一种类似于Pentium 4的虚拟CPU,具有较少的CPU flag,但具有最好的兼容性。

简而言之,如果你需要确保虚拟机的在线迁移能力,最好使用默认的kvm64虚拟CPU。如果不在乎在线迁移,或者集群内所有节点硬件型号完全一样,可以设置虚拟CPU类型为host,以获得最好的性能。

自定义CPU类型

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

在 /nodes 上具有 Sys.Audit 特权的任何用户都可以选择指定的自定义类型。通过 CLI 或 API 为 VM 配置自定义 CPU 类型时,名称需要以 custom- 为前缀。

Meltdown / Spectre相关CPU标识

有几个CPU标识与Meltdown和Spectre脆弱性相关,除非虚拟机的CPU类型已经默认启用,否则需要进行手工设置以确保安全。 启用这两个CPU标识,需要满足以下先决条件: 主机CPU必须支持相关特性,并传递给客户虚拟机的虚拟CPU。 客户虚拟机操作系统已升级到最新版本,能够利用这两个标识缓解攻击。 否则,需要先在Web GUI调整虚拟CPU类型或修改虚拟机配置文件中的cpu选项flag属性,确保虚拟CPU支持相关CPU标识。 对于Spectre v1,v2,v4补丁,还需要升级从CPU制造商下载并升级CPU微码。

可以用root权限执行以下命令,检测你的Proxmox VE服务器是否存在漏洞:

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

也可以执行安全社区提供的脚本,检测主机安全性。

Intel处理器

  • pcid

pcid用于降低Meltdown(CVE-2017-5754)补丁Kernel Page Table Isolation(KPTI)对性能的影响。由于KPTI将内核空间与用户空间分离并隐藏,关闭PCID的情况下,KPTI将严重降低系统性能。

可以root权限执行如下命令,检测Promxox VE服务器是否支持PCID:

 grep  'pcid'  /proc/cpuinfo

如命令返回不为空,则证明主机CPU支持pcid。

  • spec-ctrl

spec-ctrl用于配合Spectre v1(CVE-2017-5753)和Spectre v2(CVE-2017-5755)补丁使用,以弥补retpoline的不足。对于带有-IBRS标识的Intel CPU,默认包含了该特性。对于没有-IBRS标识的Intel CPU,需要升级CPU微码(intel-microcode>=20180425),并显式开启该功能。

  • ssbd

Ssbd参数和Spectre V4(CVE-2018-3639)补丁配合使用。Intel CPU默认不启用该特性。必须升级CPU微码(intel-microcode>=20180703),并显式启用该功能。

AMD处理器

  • ibpd ibpd用于配合Spectre v1(CVE-2017-5753)和Spectre v2(CVE-2017-5755)补丁使用,以弥补retpoline的不足。对于带有-IBRS标识的AMD CPU,默认包含了该特性。对于没有-IBRS标识的AMD CPU,需要升级CPU微码,并显式开启该功能。

  • virt-ssbd virt-ssbd参数和Spectre V4(CVE-2018-3639)补丁配合使用。AMD CPU默认不启用该特性。必须显式启用该功能。即使不启用amd-ssbd,也应当启用该功能并提供虚拟机使用,以便改善虚拟机兼容性。在虚拟机使用“host”类型cpu时,该功能必须显式启用。

  • amd-ssbd

amd-ssbd参数和Spectre V4(CVE-2018-3639)补丁配合使用。AMD CPU默认不启用该特性。必须显式启用该功能。启用amd-ssbd后,能在virt-ssbd基础上进一步改善虚拟机性能。因此,只要主机CPU支持,就应该启用该功能并提供给虚拟机使用。启用virt-ssbd能改善虚拟机兼容性,因为某些版本的内核只能识别virt-ssbd。

  • amd-no-ssb amd-no-ssb标识用于表示CPU不存在Spectre V4漏洞(CVE-2018-3639)。默认不包含在任何AMD CPU中。但在未来的CPU修补CVE-2018-3639漏洞后,可以通过设置启用amd-no-ssb标识通知虚拟机无需启用相关补丁。该参数不能和virt-ssbd和amd-ssbd同时使用。

NUMA

此外还可以选择在虚拟机上启用NUMA架构模拟功能。NUMA架构的基本设计是,抛弃了以往多个内核共同使用一个大内存池的设计,而将内存按照Socket分配个每个CPU插槽。NUMA能有效解决共用一个大内存池时的内存总线瓶颈问题,大大改善系统性能。如果你的物理服务器支持NUMA架构,我们推荐启用该配置,从而更合理地在物理服务器上分配虚拟机工作负载。此外,如果要使用虚拟机的CPU和内存热插拔,也需要启用该项配置。

如果启用了NUMA,建议为虚拟机分配和物理服务器一致的Socket数量。

vCPU热插拔

现代操作系统开始支持CPU热插入功能,并在一定程度上支持CPU热拔出。虚拟化环境下,CPU热插拔较真实物理服务器更为简单,因为无需考虑物理CPU插拔带来的各类硬件问题。但是,CPU热插拔仍然是一个复杂且不成熟的功能特性,所以除非绝对需要,应严格限制使用该功能。但10.2.5节介绍的其他大部分功能都经过充分测试,且相对简单,可以放心使用。

在Proxmox VE下,可热插拔的最大CPU数量为cores*sockets的乘积。对于一个虚拟CPU数量低于COU总数的虚拟机,可以启用vpus设置,以控制虚拟机启动时可启用的虚拟CPU数量。

目前,仅有Linux可以使用该特性,且Linux内核版本必须高于3.10,推荐使用4.7以上Linux内核。

可以在Linux中按以下示例配置udev规则,在虚拟机中完成CPU热插入自动检测:

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

将上面的配置保存在/etc/udev/rules.d下的配置文件中,配置文件后缀名为.rules即可生效。

注意:CPU热拔出依赖于设备硬件,并需要客户机操作系统的支持。CPU删除命令并不一定真正移除CPU,一般还需要将该CPU删除请求发送给虚拟机做进一步处理,CPU删除请求的发送机制因硬件平台而异,如x86/amd64下就是ACPI机制。

10.2.6 内存

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

分配固定容量内存

当设置内存容量和最小内存容量为相同值时,Proxmox VE将为虚拟机分配固定容量内存。

即使使用固定容量内存,也可以在虚拟机启用ballooning设备,以监控虚拟机的实际内存使用量。通常情况下,应该启用ballooning设备,如需禁用,可以取消ballooning设备的勾选,或者在虚拟机配置文件中进行如下设置 balloon: 0

自动分配内存

当设置的最小内存容量低于设置的内存容量值时,Proxmox VE将为虚拟机至少分配设置的最小容量内存,并在物理服务器内存占用率达到80%之前根据虚拟机需要动态分配内存,直到达到设置的最大内存分配量。

当物理服务器内存不足时,Proxmox VE将开始回收分配给虚拟机的内存,并在必要时启动SWAP分区,如果仍然不能满足需要,最终将启动oom进程杀掉部分进程以释放内存。物理服务器和虚拟机之间的内存分配和释放通过虚拟机内的balloon驱动完成,该驱动主要用于从主机抓取或向主机释放内存页面。

当有多台虚拟机使用自动内存分配方式时,可以通过配置“shares”参数,在多个虚拟机之间分配可用内存份额。比如,假定现在有4台虚拟机,其中3台为HTTP服务器,1台为数据库服务器。为了让数据库服务器能够使用更多内存缓存数据库数据,你会希望能优先给数据库服务器分配更多内存。为达此目的,可以设置数据库虚拟机的Shares为3000,并设置其他3个HTTP虚拟机的Shares为默认值1000。如果物理服务器有32GB内存,且目前已使用16GB,那么可以提供给这4台虚拟机分配使用的物理内存有3280/100-16=9GB。数据库虚拟机能获得的内存容量为93000/(3000+ 1000+1000+1000)=4.5GB,而每个HTTP虚拟机能获得1.5GB。

2010年以后,所有的Linux发行版默认都安装了balloon驱动。对于Windows系统,则需要手工安装balloon驱动,并且可能会导致系统性能降低,所以我们不建议在重要的Windows系统上安装balloon驱动。

当为虚拟机分配内存时,至少要为主机保留1GB可用内存。

10.2.7 网卡

虚拟机可以配置多个网卡,共有以下四种类型虚拟网卡可以选择使用:

  • Intel E1000是默认配置的网卡类型,模拟了Intel千兆网卡设备。

  • VirtIO是半虚拟化网卡,具有较高的性能。但和其他VirtIO虚拟设备一样,虚拟机必须安装virtio驱动程序。

  • Realtek 8139模拟了旧的100Mb/s的网卡。当虚拟机使用旧版操作系统(2002年以前发行)时,可以使用该类型虚拟网卡。

  • Vmxnet3是另一种半虚拟化网卡。可用于从其他类型虚拟化平台导入的虚拟机。

Proxmox VE会为每一块虚拟网卡生成一个随机的MAC地址,以便虚拟机网络通信使用。

虚拟网卡的工作模式分为以下两种:

  • 桥接模式下,每个虚拟网卡的底层都使用物理服务器上的tap设备(软件实现的loopback物理网卡设备)实现。该tap设备被添加到虚拟交换机上,如Proxmox VE默认的vmbr0,以便虚拟机直接访问物理服务器所连接的局域网LAN。

  • NAT模式下,虚拟网卡将只能和Qemu的网络协议栈通信,并在内嵌的路由服务和DHCP服务的帮助下进行网络通信。内嵌的DHCP服务会在10.0.2.0/24范围内分配IP地址。由于NAT模式的性能远低于桥接模式,所以一般仅用于测试环境。该模式仅支持通过CLI或API使用,不能直接在WebUI编辑配置。

你可以在创建虚拟机时通过选择No network device跳过网络设备添加环节。

Multiqueue

如果你配置了VirtIO网卡,可以同时配置使用Multiqueue功能。启用Multiqueue可以让虚拟机同时使用多个虚拟CPU处理网络数据包,从而提高整体网络数据包处理能力。

在Proxmox VE下使用VirtIO网卡时,每个虚拟网卡的收发队列都传递给内核处理,每个收发队列的数据包都由虚拟主机驱动创建的一个内核线程负责处理。当启用Multiqueue后,可以为每个虚拟网卡创建多个收发队列交由主机内核处理。

使用Multiqueue时,推荐设置虚拟机收发队列数量和虚拟CPU数量一致。此外,还需要为每个虚拟VirtIO网卡设置多功能通道数量,命令如下:

ethtool -L eth0 combined X

其中X指虚拟机的虚拟CPU数量。

需要注意,当设置multiqueue参数值大于1时,网络流量增大会引发主机CPU和虚拟机CPU负载的升高。我们推荐仅在虚拟机需要处理大量网络数据包时启用该配置,例如用作路由器、反向代理或高负载HTTP服务器时。

虚拟显示器

QEMU支持多种的虚拟化VGA硬件。如下:

  • std,默认显卡,模拟基于Bochs VBE扩展的显卡。

  • cirrus,以前的默认显卡,模拟一种非常古老的显卡硬件,缺陷较多。建议只在万不得已时再考虑使用该类型显卡,例如在使用Windows XP或更老版本操作系统时。

  • vmware,模拟VMWare的SVGA-II类显卡。

  • qxl,模拟QXL半虚拟化显卡。选择该类型显卡将同时为虚拟机启用SPICE显示器。

可以设置memory参数,调整虚拟GPU显存容量。设置更大显存能够帮助提高虚拟机所能达到的分辨率,特别在使用SPICE/QXL时。

由于显存是为显卡设备专门预留的,在SPICE下启用多显示器模式(例如,qx12双显示器)时,需要注意以下事项:

  • Windows需要为每个显示器配置一个显卡,如果ostype设置为Windows,Proxmox VE将为虚拟机的每个显示器分配一个额外的显卡。每个显卡都会分配指定容量的显存。

  • Linux虚拟机默认可以拥有多个虚拟显示器,选择启用多显示器模式时,会根据显示器数量自动为显卡分配多份显存。

选择使用serialX类型显卡时,会自动禁用VGA输出,并将Web控制台输出重定向到指定的串口。此时memory参数设置将不再生效。

10.2.9 USB直通

Proxmox VE支持两种USB直通方法:

  • 基于主机的USB直通

  • 基于SPICE协议的USB直通

基于主机的USB直通是将主机上的一个USB设备分配给虚拟机使用。具体可以通过指定厂商ID和设备ID分配,也可以通过指定主机总线号和端口号分配。 厂商/设备ID格式为:0123:abcd。其中0123为厂商ID,abcd为设备ID,这意味着同样型号的USB设备将具有同样的ID。

总线/端口编号格式为:1-2.3.4。其中1为总线号,2.3.4为端口路径。合起来标识了主机上的一个物理端口(取决于USB控制器的内部顺序)。

即使虚拟机配置中的USB直通设备并未连接到物理服务器,虚拟机也可以顺利启动。在主机上指定的直通设备不可访问时,虚拟机会做跳过处理。

  • 警告

  • 由于USB直通设备只在当前主机上具备,所以使用USB直通的虚拟机将无法在线迁移到其他物理服务器。

第二种直通方式基于SPICE协议。这种直通方式需要SPICE客户端的支持。如果你给虚拟机添加了SPICE USB端口,那么就可以直接将SPICE客户端上的USB设备直通给虚拟机使用(例如输入设备或硬件加密狗)。

10.2.10. BIOS 和 UEFI

为了完美模拟计算机硬件,QEMU使用了固件。也就是传统PC中的BIOS或(U)EFI,用于虚拟机的初始启动,完成基本的硬件初始化,并为操作系统提供硬件和固件访问接口。QEMU默认使用开源x86 BIOS固件SeaBIOS。大多数情况下,SeaBIOS都是不错的选择。

当然,也有BIOS不能正常引导启动测场景。比如,在配置VGA直通时。此时,使用开源UEFI固件OVMF更好。

使用OVMF有以下几点需要注意:

为了保存启动顺序等配置,需要为虚拟机添加一个EFI硬盘,并纳入备份和快照管理范围,并且只能有一块EFI硬盘。

EFI硬盘添加命令如下:

qm set <vmid> -efidisk0 <storage>:1,format=<format>,efitype=4m,pre-enrolled-keys=1

其中<storage>是Proxmox VE存储服务名,<format>是存储格式。你也可以在Web控制台提供的虚拟机硬件配置界面通过添加EFI硬盘来完成该操作。

efitype 选项指定应使用哪个版本的 OVMF 固件。对于新 VM,此值应始终为 4m,因为它支持安全启动,并且分配了更多空间来支持将来的开发(这是 GUI 中的默认设置)。

预注册密钥指定电子硬盘是否应预加载特定于分发的密钥和 Microsoft 标准安全启动密钥。默认情况下,它还启用安全启动(可以在 VM 内的 OVMF 菜单中禁用它)。

  • 提示:

    • 如果要开始在现有 VM(仍使用 2m 电子硬盘)中使用安全启动,则需要重新创建电子硬盘。为此,请删除旧的(qm set <vmid> -delete efidisk0)并添加一个新,如上所述。这将重置您在OVMF菜单中所做的任何自定义配置!

在OVMF下使用虚拟显示器时(而非通过VGA直通),你需要在OVMF菜单(在虚拟机启动时按ESC键可调出该菜单)中配置终端显示器的分辨率,或者选择使用SPICE显示器。

10.2.11 可信平台模块 (TPM)

受信任的平台模块是一种设备,它安全地存储机密数据(例如加密密钥),并提供用于验证系统启动的防篡改功能。

某些操作系统(例如Windows 11)要求将此类设备连接到计算机(无论是物理还是虚拟)。

通过指定 tpm 状态卷来添加 TPM。这类似于电子硬盘,因为一旦创建,就无法更改(只能删除)。您可以通过以下命令添加一个:

 qm set <vmid> -tpmstate0 <storage>:1,version=<version>

其中<storage>是要将状态置于其上的存储,<version>为 v1.2 或 v2.0。还可以通过 Web 界面添加一个,方法是在 VM 的硬件部分中选择“添加→ TPM 状态”。

v2.0 TPM 规范更新且受更好的支持,因此,除非你必须要使用 v1.2 TPM ,否则建议首选v2.0。

  • 注意

    • 与物理 TPM 相比,模拟 TPM 不提供任何真正的安全优势。TPM 的要点是,除非通过指定为 TPM 规范一部分的命令,否则无法轻松修改其上的数据。由于使用模拟设备时,数据存储发生在常规卷上,因此任何有权访问它的人都可以对其进行编辑。

10.2.11 内部虚拟机共享内存

您可以添加 VM 间共享内存设备 (ivshmem),该设备允许在主机和来宾之间共享内存,也可以在多个来宾之间共享内存。

要添加此类设备,可以使用 qm:

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

其中大小以 MiB 为单位。该文件将位于 /dev/shm/pve-shm-$name 下(默认名称为 vmid)。

  • 注意:

    • 虚拟机关闭或停止时,该设备会自动删除。已有的打开会被保持,但新打开请求将会被拒绝。

该设备的一个应用场景是Looking Glass项目,用于在主机和客户机之间实现高性能、低延时的镜像显示功能。

10.2.12 音频设备

10.2.12音频设备

要添加音频设备,请运行以下命令:

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

支持的音频设备包括:

  • ich9-intel-hda: Intel HD Audio Controller, emulates ICH9

  • intel-hda: Intel HD Audio Controller, emulates ICH6

  • AC97: Audio Codec ’97, 对较旧的操作系统(如Windows XP)非常有用

  • 注意

    • 音频设备只能与SPICE结合使用。像微软的RDP这样的远程协议可以选择播放声音。要使用主机的物理音频设备,请使用Device Passthrough(参见第10.9节PCI Passthrough和第10.2.9节USB Passthrough)。

10.2.13 VirtIO RNG

RNG(随机数生成器)是向系统提供熵(随机性)的设备。虚拟硬件-RNG可用于将这种熵从主机系统提供给客户VM。这有助于避免来宾中出现熵匮乏问题(没有足够的熵可用,系统可能会变慢或遇到问题),特别是在来宾引导过程中。 要添加基于VirtIO的模拟RNG,请运行以下命令:

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

source指定熵在主机上的读取位置,必须为以下值之一:

  • /dev/urandom:非阻塞内核熵池(首选)

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

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

可以通过max_bytes和Period参数指定限制,它们以毫秒为单位读取为每个周期的max_bytes。但是,它不代表线性关系:1024B/1000ms意味着在1秒计时器上最多有1 KiB的数据可用,而不是在1秒的过程中将1 KiB的数据流式传输到来宾。因此,可以使用减少周期来以更快的速率向客户注入熵。

默认情况下,该限制设置为每1000毫秒(1 KiB/s)1024字节。建议始终使用限制器,以避免来宾使用过多的主机资源。如果需要,max_bytes的值0可用于禁用所有限制。

10.2.15. 设备启动顺序

QEMU 可以设置虚拟机应该从哪些设备启动,以及以什么顺序启动。这可以通过引导属性在配置中指定,例如:

boot: order=scsi0;net0;hostpci0

如上配置,虚拟机将首先尝试从磁盘 scsi0 引导,如果失败,它将继续尝试从 net0 引导网络,如果这也失败了,最后尝试从通过 PCIe 的设备引导(在 NVMe 的情况下被视为磁盘,否则尝试启动到选项 ROM)。

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

  • 注意:

  • 如果您的客户机使用多个磁盘来引导操作系统或加载引导加载程序,则必须将它们全部标记为可引导(即,它们必须启用复选框或出现在配置的列表中),客户机才能引导。这是因为最近的 SeaBIOS 和 OVMF 版本仅在磁盘标记为可引导时才初始化磁盘。

在任何情况下,即使设备未出现在列表中或禁用了复选标记,只要操作系统已启动并初始化它们,在虚拟机中依旧可用。可引导标志仅影响虚拟机的 BIOS 和引导程序,并不会影响系统使用他们。

10.2.16. 自动启动和关闭虚拟机

创建虚拟机后,如果需要虚拟机在Proxmox VE物理服务器开机后自动运行,需要在Web控制台的虚拟机Option选项卡中选择“Start at boot“,或者运行以下命令:

qm set <vmid> -onboot 1

开机顺序和关机顺序

某些场景下,你可能需要仔细调整各个虚拟机的启动顺序,比如为其他虚拟机提供防火墙或DHCP服务的虚拟机应该先启动。可以设置以下参数调整开关机顺序。

  • Start/Shutdown order:用于设置开机优先级。例如,设置为1表示该虚拟机需要第一个被启动(关机顺序和开机顺序相反,所以设置为1的虚拟机会最后被关闭)。如果同一物理服务器上的多个虚拟机设置相同优先级,将按照其VMID升序依次启动。

  • Startup delay:用于设置当前虚拟机开机后到下一个虚拟机开机前的时间间隔。例如,设置为240表示时间间隔为240秒。

  • Shutdown timeout:用于设置关机命令发出后Proxmox VE等待虚拟机关机的时间间隔。该参数默认值为180,也就是说Proxmox VE发出关机命令后会花180秒时间等待虚拟机完成关机操作,如果180秒后虚拟机仍未完成关机,Proxmox VE会强制关机。

  • 注意

    • 启用HA管理的虚拟机,其开机自启动以及启动顺序设置将不再生效。开机关机算法自动忽略这些虚拟机,而由HA管理器负责开机关机操作。

需要注意,未设置Start/Shutdown order参数的虚拟机总是在设置了该参数的虚拟机之后启动,而且该参数仅能影响同一Proxmox VE服务器上虚拟机的启动顺序,其作用域局限于单一Proxmox VE服务器内部,而非整个集群。

如果需要在主机引导和引导第一个虚拟机之间有一个延迟,请参阅 Proxmox VE 节点管理部分。

10.2.17. Qemu 代理

Qemu 代理是一种在 VM 内部运行的服务,在主机和虚拟机之间提供通信通道。它用于交换信息,并允许主机向虚拟机发出命令。

例如,VM 摘要面板中的 IP 地址是通过Qemu代理获取的。

或者在启动备份时,虚拟机通过Qemu代理被告知需要使用 fs-freeze 和 fs-thaw 命令同步未完成的写入。

要使Qemu代理正常工作,必须执行以下步骤:

  • 在虚拟机中安装代理并确保它正在运行

  • 在 Proxmox VE 中的启用代理

安装Qemu代理

对于大多数 Linux 发行版,来宾代理可用在官方软件仓库中。该软件包通常被命名为qemu-guest-agent。

对于Windows,它可以从Fedora VirtIO驱动程序ISO安装。

启用来宾代理通信

可以在虚拟机的“选项”面板中勾选 QEMU Guest Agent。要使更改生效,必须冷启动虚拟机。

可以启用guest-trim选项。启用此功能后,Proxmox VE将在下面操作后,向虚拟机发出TRIM命令。

  • 将磁盘移动到另一个存储

  • 将VM实时迁移到具有本地存储的另一个节点

在精简置备的存储上,这有助于释放未使用的空间。

故障排除

虚拟机无法关闭

确保Qemu代理已经在虚拟机中安装并运行。

启用Qemu代理后,Proxmox VE 将通过Qemu代理向虚拟机发送电源命令,如关机。

如果Qemu代理未运行,则命令无法正确执行,并且 shutdown 命令将超时。

10.2.18 SPICE增强

SPICE增强可以改善远程查看器体验的可选功能。

要通过界面启用,请转到虚拟机的Options面板。运行以下命令以通过CLI启用它们:

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

  • 要使用这些功能,虚拟机的显示必须设置为SPICE(Qxl)。

文件夹共享

与来宾共享本地文件夹。需要在来宾系统中安装SPICE-webdavd守护进程。使共享文件夹可通过位于http://localhost:9843的本地WebDAV服务器访问。 对于Windows客户,可以从SPICE官方网站下载Spice WebDAV守护程序的安装程序。

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

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

  • 注意

  • 文件夹共享目前仅在Linux版本的Virt-Viewer中有效。

  • 警告

  • 实验性的!该功能目前工作不可靠。

视频流

快速刷新区域会被编码到视频流中,下面有2个设置选项:

  • all: 任何快速刷新区域都编码到视频流中

  • filter: SPICE服务器添加了额外的过滤器来决定是否应该激活视频流(目前,只跳过小窗口表面)

  • off: 不执行视频检测

无法给出此选项的相关建议,请从当前环境出发。

故障排除

共享文件夹不显示

确保 WebDAV 服务已启用并在客户机中运行。在Windows上,它被称为Spice webdav代理。在Linux中,名称是spice-webdavd,但可以根据发行版的不同而有所不同。

如果服务正在运行,请通过在来宾的浏览器中打开 http://localhost:9843 来检查 WebDAV 服务器。

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