PVE 专栏

1.5虚拟机梗概

2025/10/09·14 分钟阅读

虚拟机 pve使用基于内核的虚拟机KVM(Kernel-based Virtual Machine)。KVM直接通过加载相应的模块将Linux内核转换为Hypervisor,然后通过QEMU(Quick EMUlator)将虚拟硬件提供给虚拟机使用 QEMU QEMU是一个开源的虚拟机管理软件,主要…

虚拟机

pve使用基于内核的虚拟机KVM(Kernel-based Virtual Machine)。KVM直接通过加载相应的模块将Linux内核转换为Hypervisor,然后通过QEMU(Quick EMUlator)将虚拟硬件提供给虚拟机使用

QEMU

QEMU是一个开源的虚拟机管理软件,主要功能是提供虚拟物理设备。对于QEMU主机,这就是个普通用户进程,将物理主机拥有的硬盘分区、文件、网卡等本地资源虚拟成物理硬件设备并映射给虚拟机。在pve中,QEMU进程以root权限运行。对于虚拟机,像是访问一个真实的物理设备。pve只使用了QEMU中的
32位和64位PC平台硬件,QEMU模拟相同架构硬件环境的速度可以大大提高。
QEMU模拟的硬件是以软件模拟方式实现的。也就是说,这些虚拟硬件和对应的物理硬件完全相同(大抵是能装相同的驱动的)这样它就可以直接运行客户机而无需修改主机操作系统。这样的虚拟化方式性能损耗较大,为提高性能,QEMU还提供了半虚拟化硬件,这样客户机操作系统就能感知到半虚拟化的硬盘控制器、网卡串口、SCSI控制器…鉴于其提供的高性能,优先选择VirtIO半虚拟化硬件。(VirtIO半虚拟化硬盘控制器的性能的模拟IDE控制器的2倍,VirtIO半虚拟化网卡的性能是模拟Intel E1000虚拟网卡的3倍!!在兼容性符合的情况下,优先选择半虚拟化模型!!

虚拟机硬件介绍

一般地,pve默认给你的虚拟机硬件配置就是最佳选择!
虚拟机通用配置
节点:虚拟机所在物理服务器名
ID:虚拟机的唯一编号
名称:自己取
资源池:虚拟机所在的逻辑组
虚拟机操作系统选择——为了让pve针对选择的操作系统的底层配置做优化
(根据实际需求修改部分系统配置)
BIOS选择
BIOS固件以及机器类型决定的虚拟机的硬件布局,主流的有Intel 440FX(i440fx)和Q35两种,区别在于对PCIE设备的支持
i440fx:
老旧平台,类似于早期的 Intel 440FX 芯片组。它支持较老的硬件和设备模型,兼容性较强,适合运行较旧的操作系统或软件(比如 Windows XP、Windows 7 等)。适合需要较低兼容性要求的系统。
q35:
较新的平台,模拟的是 Intel 的 Q35 芯片组,支持更多现代特性。提供更好的硬件虚拟化支持,例如更好的 PCIe 设备支持、SATA 和更高效的内存管理。支持 UEFI 启动,适合运行现代操作系统,尤其是 Windows 10、Windows 11 或 Linux 现代发行版。
如果你要运行较旧的操作系统或不需要特殊硬件支持,i440fx 是一个更安全的选择,因为它兼容性更好。如果你要运行较新的操作系统或需要现代硬件特性(如 PCIe 支持、UEFI 启动等),q35 更适合。一般来说,现代的虚拟化需求推荐选择 q35,尤其是在需要支持 64 位 UEFI 引导或现代硬件功能时。
(老系统/兼容性需求高——i440fx,新系统/特殊需求(uefi启动,硬件直通)——Q35)
CPU
首先你得知道:进程 != 线程,并发 != 并行
*下面的部分功能需要打开虚拟机cpu配置中的高级选项,或者是更改”cpu类别“这一选项

基本设置

选择插槽数量与核心数量——其实就是CPU数量与每个CPU给的线程数量
(我们一般用的是家用主板,通常只有一个CPU插槽,所以可以直接将核心数作为分给虚拟机的线程数,注意,超线程也算一个核心,你可以在”核心总数“这一栏看到总线程数量 )

资源限制

在配置时pve允许所有虚拟机的核心数量大于总核心数量
(不同于分配的虚拟磁盘卷,cpu于内存等等虚拟化资源是从资源池中取的,而非实际分割了cpu,因此虚拟机未运行就不会占用内存和cpu而且即使计算的是所有运行中的cpu核心数量,也是可以大于实际总数的,因为虚拟机主机是以进程的方式模拟的,所以理论上只要所有核心都没有达到100%占用所有的业务仍然是可以正常运行的!而且在超出时pve还能根据cpu权重对不那么重要的虚拟机的进程进行限制
而在运行时不允许所有虚拟机的总占用量大于或等于总量,最好留出余量
至于书中的”主机cpu时间“我并没有看到我的pve中有这个选项,反正这个指的是虚拟机占用主机cpu的时间,填1.0表示100%,指占用一个线程时,占用其100%的时间资源,若有2个核心就是各占用其50%的时间。
cpu权重——pve在调度时控制各个虚拟机占用cpu资源的比例,A的权重为200,B的权重为100,A所分配到的cpu占用时间就是B的两倍
补充:CPU的超线程是将同一个时钟内的空闲单元进行充分利用,它复制了架构状态,因此从硬件上看,这就成了两个逻辑核心,在虚拟机中,超线程大致地可以看作是两个核心(线程)(也就是并行的两个线程)。然而单个线程CPU仍然可以打开多任务,这是因为在一个cpu时钟中,cpu可以轮询计算每一个任务(进程),速度之快以至于让你看起来在并行(并发),因此核心越多,同任务下占用率越高。我们的任务管理器中的百分比就是cpu工作与总时间的比率!
由此可见——在虚拟机中:
分配核心数 = 虚拟机的任务可以调用的线程数(以利用多核优化)
虚拟机占用cpu时间比 = 虚拟机任务在虚拟机主机中的cpu占用率(就是你看任务管理器里显示的那个百分比)

CPU类别

QEMU可以模拟从486到最新的至强等等硬件,在创建虚拟机选择cpu时,选择与主机cpu最接近的类别。但是这样在迁移时可能会因为2台服务器的cpu不一样而导致迁移失败。而pve提供了一种虚拟cpu类型——”KVM64“这是其默认使用的cpu类型,有最高的兼容性。若无需迁移,直接选择”host“类型,这样虚拟的cpu就与主机物理cpu一致
**
#自定义cpu类型pve支持使用一组可配置的功能自定义cpu类别,与/etc/pve/virtual-guest/cpu-models.conf维护

非一致性内存访问架构

即NUMA,其抛弃了内存共用一个内存池的设计,将内存按照插槽分配(我的理解是相当于将内存绑定给单个cpu)可以有效解决大内存池的总线瓶颈。民用主板就tm一个cpu插槽,用不着!

CPU热插拔

别用

内存配置

分配固定容量
当设置内存容量和最小内存容量相同时,pve分配固定容量内存。此时仍然可启用ballooning设备,以监控虚拟机的实际内存用量。也可禁用之。
自动分配
当设置内存容量大于最小内存容量时,pve为其分配最小内存容量并在物理服务器内存占用率达到%80之前根据虚拟机的需要动态分配内存直到打到设定容量
物理服务器内存不足时,pve将开始回收分配给虚拟机的内存,在必要时启动SWAP分区。如果仍然不足最终将启动OOM进程关闭部分进程以释放内存。内存的分配于释放由虚拟机内的balloon驱动完成,其主要用于从主机抓取或向主机释放内存页面。
有多台虚拟机时,通过配置shares参数(即设置权重)
#Linux所有发行版都默认安装了balloon驱动,Windows则需手动安装,会导致性能降低,不建议在win上使用

磁盘配置

总线/设备

IDE:虚拟机使用2003年前的系统IDE控制器最佳,最多可挂载4个设备
SATA:虚拟机使用2003年后的系统SATA控制器较佳,更现代,更快,最多可挂载6个设备
SCSI:通常用于服务器级硬件,最多可挂载14个设备(pve默认的SCSI控制器型号为LSI 53C895A)
VirtIO Block:通常简称为VirtIO或Virtio-blk,一种较旧的半虚拟化的控制器
若追求高性能,使用VirtIO SCSI类型的SCSI控制器。pve将SCSI控制器用于Linux虚拟机的默认配置,Windows需要在安装系统时使用VirtIO驱动iso文件安装驱动。若追求极致性能,选用VirtIO SCSI single,并启用IO Thread选项,此时QEMU将为每个虚拟磁盘创建一个专用控制器,而非让所有磁盘共享一个。

磁盘格式

每种控制器都支持同时挂载多个虚拟磁盘设备,虚拟磁盘可以基于一个文件(如nfs共享的文件),也可以基于某种存储服务提供的块存储设备(ISCSI)
块存储:
只能保存RAW格式虚拟磁盘
文件系统存储:
能使用RAW格式或QEMU镜像格式
磁盘镜像格式类型:
1.RAW:逐位存储,不能创建磁盘快照或精简模式存储,需要下层存储服务才能支持,速度可能比QEMU更快
2.QEMU:基于“写时复制”,支持磁盘快照和精简模式存储
3.VMware:仅仅供从其它类型虚拟机系统导入/导出

缓存模式

无缓存更佳,平衡了安全性和写入性能

TRIM/丢弃

*必须使用VirtIO SCSI控制器(或VirtIO SCSI single控制器)或者开启SSD仿真,而且VirtIO Block上不生效
启用且虚拟机系统支持时,在虚拟机中删除文件后,虚拟机文件系统会将对应的磁盘扇区标识为未使用,磁盘控制器会根据该信息压缩磁盘镜像
若希望虚拟磁盘表现未固态硬盘而非传统磁盘,也可以选上,这与物理介质无关

IO Thread

pve默认对虚拟磁盘的读写由QEMU主线程负责处理但是有以下问题
1.虚拟机I/O请求都由一个QEMU主线程处理,单线程CPU利用率对虚拟机I/O造成性能瓶颈
2.虚拟机I/O请求由QEMU主线程处理时会有Qemu全局锁,I/O处理耗时长时,这会时虚拟机CPU无需正常调度
#IO Thread不能提高虚拟机备份速度
因此可为VirtIO Block控制器配置IO Thread,与QEMU后端单独开启IO Thread线程处理磁盘请求,减少影响
也可为VirtIO SCSI single控制器配置IO Thread,此时QEMU将为每个虚拟磁盘创建一个专用控制器,而非让所有磁盘共享一个。

网卡

网卡类型

Intel E100:默认虚拟网卡,模拟英特尔千兆网卡
VirtIO网卡:半虚拟化网卡,性能较高,与其它VirtIO虚拟设备相同,虚拟机必须安装VirtIO驱动
Realtek 8139:模拟旧的百兆网卡,适用于旧的系统
VMXNET3网卡:VMware高性能网卡,可用于从其它类型虚拟化平台导入虚拟机
pve支持VirtIO网卡使用Multiqueue功能,它可以让虚拟机同时使用多个虚拟cpu处理网络数据包,民用无意义。

虚拟网卡工作类型

#(pve会为每一块虚拟网卡生成一个随机的MAC)
桥接模式:每个虚拟网卡的底层都使用物理服务器的tap设备(软件实现的loopback物理网卡设备)该设备被添加到虚拟交换机里,以便虚拟机之间访问物理服务器所在的局域网
NAT模式:虚拟网卡只能和QEMU的网络协议栈通信,并在内嵌的路由服务和DHCP服务的帮助下进行网络通信,内嵌的DHCP在10.0.2.0/24范围分配ip。NAT模式性能远低于桥接,仅做测试用,且仅支持通过CLI或API使用,无法在WebUI中编辑,不用

虚拟显示器

1.STD默认显卡,基于Bochs VBE拓展的显卡
2.CIRRUS:模拟较老的显卡,毛病多,一般用在winxp上
3.VMware:模拟VMware的SVGA-II类显卡
4.QXL模拟半虚拟化显卡,选择该类型将同时为虚拟机启用SPICE显示器

USB直通

1.基于主机的USB直通

将主机的USB分配给虚拟机,通过指定厂商ID和设备ID分配,也可指定主机总线号和端口号分配
即使虚拟机配置中的USB直通设备没用连接到物理服务器,虚拟机也能启动,在主机上指定设备不可访问时,虚拟机会跳过(我认为直通的是USB接口或者总线)
厂商/设备ID:0123:abcd 0123为厂商ID,abcd为设备ID 。同厂同型号设备ID相同
总线/端口号格式为:1-2.3.4。1为总线号,2.3.4为端口路径。标识了主机的一个物理端口(取决于USB控制器内部顺序)

2.基于SPCIE协议的USB直通

需要SPCIE客户端支持(一般直通如输入设备或硬件加密狗)一般我不用

BIOS和UEFI
QEMU使用固件(物理机的BIOS或(U)EFI)用于虚拟机初始启动,完成硬件初始化,为操作系统推荐给硬件和固件访问接口。QEMU默认使用且大多数情况下都使用x86 BIOS固件SeaBIOS

QEMU代理

这是一种在虚拟机内部运行的服务,于主机和虚拟机间提高通信通道。用于交换信息,并允许主机向虚拟机发送命令。例如虚拟机“摘要”面板中的ip地址是通过它获取的。Linux来宾代理软件包名为qemu-guest-agent。Windows的可从VirtIO驱动iso中安装。