virt-report虚拟化社区动态

虚拟化基础:资源隔离、执行与系统分工

本文由 OpenAI Codex (GPT-6-Astra) 辅助编写。

一、虚拟机与资源隔离

系统虚拟化在一台物理机器上提供多套独立的运行环境,每套环境具有自己的 CPU 状态、内存地址空间和设备视图,可以分别启动操作系统。一台服务器由此能够同时承载数据库、测试环境和旧版应用,兼顾资源共享与系统隔离。相较于共用一个操作系统,虚拟机可以分别选择内核、驱动和系统配置;相较于每项业务独占服务器,它又能减少空闲资源。

运行虚拟机的系统称为宿主,虚拟机里的系统称为客户机。客户机内核仍要调度进程、管理页表和驱动设备;虚拟化层则控制这些动作最终能使用哪些真实资源。本文以 x86 Linux 上两台各有 2 个虚拟 CPU(vCPU)、4 GiB 内存的 QEMU/KVM 虚拟机 A、B 为例,介绍资源视图的建立、组件分工与运行过程。

客户机看到的“独立”指独立的状态和访问范围,不代表每台虚拟机都独占对应硬件。两台客户机可以使用不同内核,却仍共享宿主 CPU 时间与内存带宽;一台负载升高,另一台即使没有被越权访问,也可能因为资源争用而变慢。

源码版本:QEMU 10.2.0、Linux 6.18。

二、CPU、内存与设备的虚拟化

1. CPU:受控执行与状态隔离

如果只把客户机内核当普通程序运行,它操作控制寄存器、页表或中断时,会受到宿主的权限限制;若直接赋予它宿主权限,又会破坏隔离。硬件虚拟化为客户机提供受控的执行环境,保存独立的寄存器与控制状态,并让宿主设置哪些行为需要接管。

普通运算通常直接在物理 CPU 上完成。命中需要接管的条件时,处理器离开客户机,这个边界叫 VM Exit。在 QEMU/KVM 路径中,退出先由 KVM 处理,必要时再返回 QEMU,完成后恢复客户机执行。客户机看到的 2 个 vCPU 是两份可被调度的执行状态,未必独占两个物理核;宿主可以让 A、B 分时共享,也可以在资源充足时并行运行。

2. 内存:客户机的物理地址仍需要转换

A、B 都可以认为自己拥有从零开始的物理内存。例如,它们都访问客户机物理地址 0x2000,宿主却把它们分别映射到不同的物理页。客户机只能修改自己的地址转换,不能任意选择宿主的物理页。x86 的 EPT/NPT 由宿主控制,承担第二级转换和权限检查。

两台客户机使用相同地址而互不覆盖
示例采用独立后备页。客户机自己的页表先得到客户机物理地址,宿主维护的二级映射再选择真实物理页;两套转换分别由不同一方管理。
示例采用独立后备页。客户机自己的页表先得到客户机物理地址,宿主维护的二级映射再选择真实物理页;两套转换分别由不同一方管理。 打开原图
Mermaid 源码
flowchart TB
    accTitle: 两台虚拟机的独立内存映射
    accDescr: 虚拟机 A 和 B 的客户机页表都可得到客户机物理地址 0x2000,但各自的 EPT 或 NPT 将其转换到不同宿主物理页;客户机不能自行指定第二级映射。
    subgraph A["虚拟机 A"]
        AV["应用的虚拟地址"] -->|"A 的客户机页表"| AP["客户机物理地址<br/>0x2000"]
    end
    subgraph B["虚拟机 B"]
        BV["应用的虚拟地址"] -->|"B 的客户机页表"| BP["客户机物理地址<br/>0x2000"]
    end
    AP -->|"宿主管理 A 的 EPT / NPT"| AH["宿主物理页 A<br/>示例页基址 0x9a000"]
    BP -->|"宿主管理 B 的 EPT / NPT"| BH["宿主物理页 B<br/>示例页基址 0xb7000"]
    classDef guest fill:#e4f1ec,stroke:#438575,color:#173e34
    classDef host fill:#eaf0f6,stroke:#8198ac,color:#263c4c
    class AV,AP,BV,BP guest
    class AH,BH host

因此,A 的应用写坏一段已获准访问的内存,通常影响 A 内部;访问未授权的宿主页则会受映射和权限限制。设备还可以直接读写内存,这称为 DMA,其地址转换和访问权限由 IOMMU 等机制约束。CPU 与设备的访问范围需要分别控制,隔离也仍受软硬件漏洞和共享资源干扰的影响。

3. 设备:客户机接口与宿主后端

客户机需要磁盘、网卡和时钟,但无需每项资源都独占一块硬件。虚拟磁盘可以连接一个宿主文件,虚拟网卡可以连接宿主网络;客户机驱动按约定提交请求,后端完成真实 I/O。兼容旧驱动时可模拟已有网卡,使用专门驱动时可采用 virtio 共享队列,也可以把可隔离的设备功能直接分配给客户机。

三、QEMU、KVM 与 Libvirt 的分工

这些能力分布在多个组件中。QEMU 负责组装客户机可见的机器,KVM 把硬件辅助执行与内存映射能力接入 Linux,Libvirt 则负责把配置转成可管理的运行实例。宿主调度器和内存管理器仍参与实际资源分配。

管理请求与客户机运行路径
管理通道建立和改变运行条件;CPU 执行与设备请求随后沿各自路径推进。Libvirt 不转发每条客户机指令或每个网络报文。
管理通道建立和改变运行条件;CPU 执行与设备请求随后沿各自路径推进。Libvirt 不转发每条客户机指令或每个网络报文。 打开原图
Mermaid 源码
flowchart TB
    accTitle: QEMU KVM 与 Libvirt 的分工
    accDescr: 管理请求从 Libvirt 经 QMP 进入 QEMU。QEMU 建立内存和设备并用 KVM_RUN 执行客户机;设备队列送到后端。管理通道与运行数据路径分别标示。
    L["Libvirt<br/>配置与生命周期"] -. "QMP 管理" .-> Q["QEMU<br/>机器 · RAM · 设备模型"]
    Q -->|创建并进入 vCPU| K["KVM 与硬件<br/>CPU 执行 · EPT/NPT"]
    K --> G["客户机<br/>应用 · 内核 · 驱动"]
    G -->|发布 virtqueue| M["客户机 RAM<br/>描述符与数据缓冲区"]
    M --> B["队列后端<br/>QEMU / vhost / 独立进程"]
    B --> H["宿主网络或存储<br/>物理设备"]
    Q -. "初始化和配置" .-> M
    Q -. "建立后端连接" .-> B
组件运行位置本例中的职责
Libvirt客户端库与宿主用户态守护进程保存 A、B 的定义,准备网络和磁盘,启动 QEMU,处理启动、停止与迁移请求
QEMU宿主用户态,本例每台虚拟机各一个进程创建 RAM、CPU 和设备对象,把虚拟网卡连接到选定后端,通过 QMP 管理协议接收命令
KVM宿主 Linux 内核保存 vCPU 内核状态,建立二级映射,进入客户机并处理需要内核接管的退出
客户机内核与驱动A、B 各自的虚拟机内调度客户机进程、管理客户机页表,通过虚拟设备接口发起 I/O
宿主调度器、内存与 I/O 子系统宿主 Linux 内核,连接物理硬件分配 CPU 时间和物理页,完成宿主存储与网络操作

因此有两层操作系统同时工作:客户机内核决定哪个应用使用 vCPU,宿主内核决定这个 vCPU 线程何时获得物理 CPU。虚拟磁盘也对应两层请求——客户机驱动提交设备请求,宿主后端再访问镜像文件或块设备。后续各专题沿这些交接点展开。

四、虚拟机启动与网络发送示例

1. 从配置定义到客户机执行

启动 A 时,Libvirt 准备资源并拉起 QEMU。QEMU 创建机器和设备,向 KVM 注册 RAM 范围、创建 vCPU。配置完成后,执行线程调用 KVM_RUN,客户机开始运行固件和操作系统。4 GiB 是客户机可见的容量;普通按需分配配置下,宿主页可以随访问逐渐建立,预分配或设备 DMA 映射则会改变资源占用方式。KVM 对象接口

2. 从客户机缓冲区到宿主网络

A 内的程序发送一条消息,客户机网络栈先形成报文。virtio 驱动把报文所在缓冲区的地址与长度交给共享队列,再按通知条件提醒后端。选用 QEMU+TAP 时,QEMU 从客户机内存读取报文,经宿主的虚拟网络端点 TAP 提交网络;后端不再需要该缓冲区后发布完成记录,客户机驱动回收资源。

这里有四件事:CPU 执行网络代码,内存转换找到缓冲区,设备协议交接报文,中断或轮询通知完成。把后端换成内核 vhost-net,可以改变队列处理位置,但这四项责任仍然存在。发送完成通常表示缓冲区可以复用,远端收到数据则是另一层协议确认的问题。

五、软件模拟、硬件辅助与半虚拟化的演进

软件可以逐条解释客户机指令,也可以把一段指令翻译为宿主代码并重复执行。这样容易控制客户机行为,还能跨指令集运行,代价是翻译和状态维护。硬件虚拟化让兼容架构的大量指令直接执行,减少软件介入;QEMU 的 TCG 与 KVM 因而服务于不同需求,前者并未失去用途。

内存也经历了类似变化:软件维护影子映射,需要跟踪客户机页表变化;EPT/NPT 允许硬件组合两级转换,但仍有页表遍历、TLB 缓存与映射失效成本。设备方面,virtio 把虚拟化环境中的请求交接规范化,vhost 和硬件卸载再改变处理位置。演变通常消除了某种重复工作,同时带来新的同步和状态管理要求。

六、资源利用、隔离与可管理性的取舍

虚拟机让多套系统共享服务器,也增加客户机内核、虚拟设备和管理状态的开销。超分 vCPU 可以利用负载错峰,宿主繁忙时却会增加调度等待;直通可缩短 I/O 路径,但能否迁移,还取决于设备状态能否导出、恢复及停止 DMA。

评价一个方案,应先固定业务和资源预算,再同时看吞吐、尾延迟、宿主 CPU 与内存消耗,并检查启动、迁移和故障恢复是否满足要求。退出少不必然更快,分配的 vCPU 多也不必然吞吐更高。虚拟化需要持续维护客户机可见的资源、访问权限和运行状态,并控制这部分管理开销。

七、沿资源与操作继续阅读

八、参考资料