Qemu(Quick Emulator 的缩写)是一种模拟物理计算机的开源虚拟机管理程序。从运行 Qemu 的主机系统的角度来看,Qemu 是一个用户程序,它可以访问许多本地资源,如分区、文件、网卡,然后将这些资源传递给模拟计算机,模拟计算机将它们视为真实设备.
在模拟计算机中运行的来宾操作系统访问这些设备,并像在真实硬件上运行一样运行。例如,您可以将 ISO 映像作为参数传递给 Qemu,在模拟计算机中运行的操作系统将看到插入 CD 驱动器的真实 CD-ROM。
Qemu 可以模拟从 ARM 到 Sparc 的多种硬件,但 Proxmox VE 只关注 32 位和 64 位 PC 克隆模拟,因为它代表了绝大多数服务器硬件。由于处理器扩展的可用性,当模拟架构与主机架构相同时,PC 克隆的仿真也是最快的之一。
您有时可能会遇到术语KVM(基于内核的虚拟机)。这意味着 Qemu 通过 Linux KVM 模块在虚拟化处理器扩展的支持下运行。在 Proxmox VE 的上下文中,Qemu和 KVM可以互换使用,因为 Proxmox VE 中的 Qemu 将始终尝试加载 KVM 模块。
Proxmox VE 中的 Qemu 作为根进程运行,因为这是访问块和 PCI 设备所必需的。
仿真设备和半虚拟化设备
Qemu 模拟的 PC 硬件包括主板、网络控制器、SCSI、IDE 和 SATA 控制器、串行端口(完整列表可以在kvm(1)手册页中看到),所有这些都在软件中进行了模拟。所有这些设备都是与现有硬件设备完全等效的软件,如果来宾中运行的操作系统具有适当的驱动程序,它将像在真实硬件上运行一样使用这些设备。这允许 Qemu 运行未经修改的操作系统。
然而,这会带来性能成本,因为在软件中运行本应在硬件中运行的内容涉及主机 CPU 的大量额外工作。为了缓解这种情况,Qemu 可以呈现给来宾操作系统半虚拟化设备,其中来宾操作系统识别出它在 Qemu 内部运行并与管理程序合作。
Qemu 依赖于 virtio 虚拟化标准,因此能够呈现半虚拟化 virtio 设备,其中包括半虚拟化通用磁盘控制器、半虚拟化网卡、半虚拟化串口、半虚拟化 SCSI 控制器等……
强烈建议您尽可能使用 virtio 设备,因为它们提供了很大的性能改进。使用 virtio 通用磁盘控制器与模拟 IDE 控制器相比,顺序写入吞吐量将增加一倍,如使用bonnie++(8)测量的那样。使用 virtio 网络接口可提供高达模拟 Intel E1000 网卡吞吐量的三倍,如使用iperf(1)测量。
虚拟机设置
一般来说,Proxmox VE 尝试为虚拟机 (VM) 选择合理的默认值。确保您了解您更改的设置的含义,因为它可能会导致性能下降或将您的数据置于危险之中。
通用设置
虚拟机的一般设置包括:
-
节点:在此物理服务器上虚拟机将运行
-
VM ID:Proxmox VE中一个唯一的编号,用于识别您的VM
-
名称:可用于描述 VM 的*格式文本字符串
-
资源池:VM 的逻辑组
操作系统设置
在创建虚拟机 (VM) 时,设置适当的操作系统 (OS) 允许 Proxmox VE 优化一些低级参数。例如,Windows 操作系统期望 BIOS 时钟使用本地时间,而基于 Unix 的操作系统期望 BIOS 时钟具有 UTC 时间。
系统设置
创建 VM 时,您可以更改新 VM 的一些基本系统组件。您可以指定要使用的显示类型。
此外,可以更改SCSI 控制器。如果您打算安装 QEMU 访客代理,或者您选择的 ISO 映像已经提供并自动安装,您可能需要勾选Qemu 代理框,这让 Proxmox VE 知道它可以使用其功能来显示更多信息,并更智能地完成一些操作(例如,关机或快照)。
Proxmox VE 允许启动具有不同固件和机器类型的 VM,即 SeaBIOS 和 OVMF。在大多数情况下,只有当您计划使用 PCIe pass through 时,您才希望从默认的 SeaBIOS 切换到 OVMF 。VM机器类型定义了 VM 的虚拟主板的硬件布局。您可以选择默认的 Intel 440FX 或 Q35 芯片组,后者还提供虚拟 PCIe 总线,因此如果想要直通 PCIe 硬件,可能需要。
硬盘
总线/控制器
Qemu 可以模拟许多存储控制器:
-
IDE控制器,有一个设计可以追溯到1984年的PC/AT磁盘控制器。即使此控制器已被最近的设计所取代,您能想到的每个操作系统都支持它,如果您想运行 2003 年之前发布的操作系统,它是一个不错的选择。 您最多可以在此控制器上连接 4 个设备.
-
2003 年推出的 SATA(串行 ATA)控制器采用更现代的设计,允许更高的吞吐量和更多数量的设备连接。您最多可以在此控制器上连接 6 个设备。
-
SCSI 控制器,在1985年设计的,在服务器级硬件通常发现,并且最多可连接14个存储装置。 Proxmox VE 默认模拟 LSI 53C895A 控制器。
如果您的目标是性能,则推荐使用 VirtIO SCSI 类型的 SCSI 控制器,并且自 Proxmox VE 4.3 以来,它会自动为新创建的 Linux VM 选择。 Linux 发行版自 2012 年起支持此控制器,自 2014 年起支持 FreeBSD。 对于 Windows 操作系统,您需要在安装过程中提供包含驱动程序的额外iso。 如果您的目标是最高性能,您可以选择 VirtIO SCSI single 类型的 SCSI 控制器, 这将允许您选择 IO 线程选项。选择 Virtio SCSI single 时,单个 QEMU 将为每个磁盘创建一个新的控制器,而不是将所有磁盘添加到同一控制器。
- VirtIO Block 控制器,通常被叫做为 Virtio 或 virtio-BLK,都是老式的半虚拟化控制器。在功能方面,它已被 VirtIO SCSI 控制器取代。
镜像格式
在每个控制器上,您连接了许多模拟硬盘,这些硬盘由驻留在配置存储中的文件或块设备支持。存储类型的选择将决定硬盘映像的格式。呈现块设备的存储(LVM、ZFS、Ceph)将需要原始磁盘映像格式,而基于文件的存储(Ext4、NFS、CIFS、GlusterFS)将允许您选择原始磁盘映像格式或 QEMU 映像格式。
-
QEMU镜像格式(例如:qcow2)是写时复制的,其允许快照,以及磁盘映像的精简配置。
-
原始磁盘映像(例如:raw)是硬盘,类似于执行时,你会得到什么样的位,以位图像DD在Linux的块设备上的命令。此格式本身不支持自动精简配置或快照,需要存储层配合完成这些任务。然而,它可能比QEMU镜像格式快10%。
-
VMware的镜像格式(vmdk),如果要导入/导出磁盘映像到其他虚拟机管理程序才有意义。
缓存模式
设置硬盘驱动器的缓存模式将影响主机系统如何将块写入完成通知来宾系统。默认方式是没有高速缓存,客户系统会通知写入完成后,每个块到达物理存储写入队列,忽略主机页面缓存。这在安全性和速度之间提供了良好的平衡。
如果您希望 Proxmox VE 备份管理器在备份 VM 时跳过磁盘,您可以在该磁盘上设置无备份选项。默认设置是备份VM时同时备份磁盘。
如果您希望 Proxmox VE 存储复制机制在启动复制作业时跳过磁盘,您可以在该磁盘上设置跳过复制选项。从 Proxmox VE 5.0 开始,复制要求磁盘映像位于zfspool类型的存储上 ,因此当 VM 配置了复制时,将磁盘映像添加到其他存储需要跳过此磁盘映像的复制。默认设置是复制时不跳过磁盘。
修剪/丢弃
如果您的存储支持精简配置(请参阅 Proxmox VE 指南中的存储章节),您可以激活驱动器上的丢弃选项。使用Discard set 和启用TRIM 的来宾操作系统[ 30 ],当 VM 的文件系统在删除文件后将块标记为未使用时,控制器会将此信息转发到存储,然后存储将相应地缩小磁盘映像。为了让来宾能够发出TRIM命令,您必须在驱动器上启用Discard选项。某些客户操作系统可能还需要设置 SSD 仿真标志。需要注意的是丢弃的 VirtIO Block 只有使用 Linux 内核 5.0 或更高版本的来宾才支持驱动器。
如果您希望将驱动器作为固态驱动器而不是机械硬盘呈现给来宾,您可以在该驱动器上设置 SSD 仿真选项。不要求底层存储实际上由 SSD 支持;此功能可用于任何类型的物理媒介。请注意,VirtIO Block 驱动器不支持 SSD 仿真。
IO线程
选项 IO Thread 只能在将磁盘与VirtIO控制器或SCSI控制器一起使用时使用 ,当仿真控制器类型为 VirtIO SCSI single 时。启用此功能后,Qemu 会为每个存储控制器创建一个 I/O 线程,而不是为所有 I/O 创建一个线程。当使用多个磁盘并且每个磁盘都有自己的存储控制器时,这可以提高性能。
*处理器
一个CPU插座是PC主板,你可以插入一个CPU上的物理插槽。然后,该 CPU 可以包含一个或多个内核,这些内核是独立的处理单元。从性能的角度来看,无论您是拥有单个 4 核 CPU 插槽还是两个具有两个核心的 CPU 插槽,几乎都无关紧要。但是,某些软件许可证取决于机器拥有的插槽数,在这种情况下,将插槽数设置为许可证允许的数量是有意义的。
增加虚拟 CPU(核心和插槽)的数量通常会提高性能,尽管这在很大程度上取决于 VM 的使用。多线程应用程序当然会受益于大量的虚拟 CPU,对于您添加的每个虚拟 CPU,Qemu 将在主机系统上创建一个新的执行线程。如果您不确定 VM 的工作负载,通常将总内核数设置为 2 是一个安全的选择。
如果所有 VM的总内核数大于服务器上的内核数(例如,在只有 8 个内核的机器上有 4 个 VM,每 VM 4 个内核),这是完全安全的。在这种情况下,主机系统将平衡服务器内核之间的 Qemu 执行线程,就像您正在运行标准的多线程应用程序一样。但是,Proxmox VE 会阻止您启动虚拟 CPU 内核多于物理可用内核的 VM,因为这只会由于上下文切换的成本而降低性能。
资源限制
除了虚拟内核的数量之外,您还可以配置一个虚拟机可以获得多少与主机 CPU 时间以及其他虚拟机相关的资源。使用cpulimit(“主机 CPU 时间”)选项,您可以限制整个 VM 在主机上可以使用的 CPU 时间。它是一个浮点值,以百分比表示 CPU 时间,因此1.0等于100%,2.5到250%等等。如果单个进程将完全使用一个单核,则CPU 时间使用率为 100%。如果具有四个内核的 VM 充分利用其所有内核,则理论上将使用400%. 实际上,使用率甚至可能更高一些,因为除了 vCPU 核心线程之外,Qemu 还可以为 VM 外围设备提供额外的线程。如果 VM 应该有多个 vCPU,则此设置很有用,因为它并行运行几个进程,但整个 VM 不应能够同时 100% 运行所有 vCPU。举一个具体的例子:假设我们有一个虚拟机,它可以从拥有 8 个 vCPU 中受益,但是这 8 个核心在任何时候都不应全负载运行 - 因为这会使服务器超载,以至于其他虚拟机和 CT 将无法更少的 CPU。因此,我们将cpulimit限制设置为 4.0 (=400%)。如果所有内核都做同样繁重的工作,它们都将获得 50% 的真实主机内核 CPU 时间。但是,如果只有 4 个可以工作,他们每个人仍然可以获得几乎 100% 的真实内核。
VM 可以根据其配置使用额外的线程,例如用于网络或 IO 操作以及实时迁移。因此,VM 可能会使用比其虚拟 CPU 所能使用的更多的 CPU 时间。为确保 VM 使用的 CPU 时间永远不会超过分配的虚拟 CPU,请将cpulimit设置设置为与总内核数相同的值。
第二个 CPU 资源限制设置cpuunits(现在通常称为 CPU 份额或 CPU 权重)控制 VM 相对于其他正在运行的 VM 获得的 CPU 时间。这是一个相对权重,默认为1024,如果您为 VM 增加此值,调度程序将优先考虑与其他权重较低的 VM 相比。例如,如果 VM 100 已设置默认值 1024 并且 VM 200 更改为2048,则后一个 VM 200 将获得两倍于第一个 VM 100 的 CPU 带宽。
CPU类型
Qemu 可以模拟从 486 到最新的 Xeon 处理器的多种不同CPU 类型。每代新处理器都会增加新功能,例如硬件辅助 3D 渲染、随机数生成、内存保护等……功能(也称为CPU 标志)将在您的 VM 中可用。如果您想要完全匹配,您可以将 CPU 类型设置为 host,在这种情况下,VM 将具有与您的主机系统完全相同的 CPU 标志。
但这有一个缺点。如果您想在不同主机之间进行 VM 的实时迁移,您的 VM 可能会在具有不同 CPU 类型的新系统上结束。如果传递给来宾的 CPU 标志丢失,qemu 进程将停止。为了解决这个问题,Qemu 也有自己的 CPU 类型 kvm64,Proxmox VE 默认使用它。kvm64 看起来很像 Pentium 4 CPU 类型,它设置了减少的 CPU 标志,但保证可以在任何地方工作。
简而言之,如果您关心节点之间的实时迁移和移动虚拟机,请保留 kvm64 默认值。如果您不关心实时迁移或拥有所有节点都具有相同 CPU 的同构集群,请将 CPU 类型设置为 host,因为理论上这将为您的来宾提供最大性能。
内存
当将内存和最小内存设置为相同数量时,Proxmox VE 将简单地将您指定的内容分配给您的 VM。
为 VM 分配 RAM 时,一个好的经验法则是始终为主机留出 1GB 的 RAM。
网络设备
每个 VM 可以有许多网络接口控制器(NIC),有四种不同类型:
-
Intel E1000 是默认设置,模拟 Intel 千兆网卡。
-
Virtio 半虚拟化,如果你的目标是获得最大性能NIC应该使用此类型。像所有 VirtIO 设备一样,客户操作系统应该安装了正确的驱动程序。
-
在瑞昱8139模拟一个较旧的100 MB/s的网卡,只应模拟旧版操作系统时使用(2002年之前发布)
-
VMware VMXNET3是另一个半虚拟化设备,从另一个VMware管理程序导入VM时,才应使用。
Proxmox VE 将为每个 NIC 生成一个随机MAC 地址,以便您的 VM 可在以太网网络上寻址。
您添加到 VM 的 NIC 可以遵循以下两种不同模型之一:
-
在默认的桥接模式下,每个虚拟 NIC 都由一个Tap 设备(模拟以太网 NIC 的软件环回设备)支持在主机上 。这个 tap 设备被添加到一个网桥,默认情况下 Proxmox VE 中的 vmbr0。在这种模式下,VM 可以直接访问主机所在的以太网 LAN。
-
在备用NAT 模式下,每个虚拟 NIC 将仅与 Qemu 用户网络堆栈通信,其中内置路由器和 DHCP 服务器可以提供网络访问。此内置 DHCP 将为私有 10.0.2.0/24 范围内的地址提供服务。NAT 模式比桥接模式慢得多,只能用于测试。此模式仅可通过 CLI 或 API 使用,而不能通过 WebUI 使用。
您还可以通过选择 No network device 在创建 VM 时跳过添加网络设备。
Multiqueue
如果您使用的是 VirtIO 驱动程序,您可以选择激活 Multiqueue选项。此选项允许来宾操作系统使用多个虚拟 CPU 处理网络数据包,从而增加传输的数据包总数。
在 Proxmox VE 中使用 VirtIO 驱动程序时,每个 NIC 网络队列都被传递到主机内核,在那里队列将由 vhost 驱动程序产生的内核线程处理。激活此选项后,可以将多个 网络队列传递给每个 NIC 的主机内核。
使用 Multiqueue 时,建议将其设置为等于来宾的 Total Cores 数的值。您还需要使用 ethtool 命令在 VM 中设置每个 VirtIO NIC 上的多用途通道数:
ethtool -L ens1 combined X
其中 X 是 VM 的 vcpus 数量。
您应该注意,将 Multiqueue 参数设置为大于 1 的值会随着流量的增加而增加主机和来宾系统上的 CPU 负载。我们建议仅当 VM 必须处理大量传入连接时才设置此选项,例如当 VM 作为路由器、反向代理或繁忙的 HTTP 服务器执行长轮询时。
USB直通
USB 直通设备有两种不同类型:
- 主机 USB 直通
- SPICE USB 直通
主机 USB 直通通过为 VM 提供主机的 USB 设备来工作。这可以通过供应商和设备 ID 或通过主机总线和端口来完成。
供应商/设备 ID 如下所示:0123:abcd,其中0123是供应商的 id,abcd是设备的 id,这意味着同一 USB 设备的两个部分具有相同的 id。
总线/端口如下所示:1-2.3.4,其中1是总线,2.3.4是端口路径。这代表主机的物理端口(取决于 USB 控制器的内部顺序)。
如果 VM 启动时 VM 配置中存在设备,但主机中不存在该设备,则 VM 可以毫无问题地启动。一旦设备/端口在主机中可用,它就会通过。
使用这种 USB 直通意味着您无法将 VM 联机移动到另一台主机,因为硬件仅在 VM 当前所在的主机上可用。
第二种直通类型是 SPICE USB 直通。如果您使用支持它的 SPICE 客户端,这将非常有用。如果向 VM 添加 SPICE USB 端口,则可以将 SPICE 客户端所在的 USB 设备直接传递到 VM(例如输入设备或硬件加密狗)。