虚拟机的内部结构可以概括为“宿主物理资源之上的一层虚拟化抽象层”,它通过模拟CPU、内存、存储和网络设备,让多个操作系统像运行在独立硬件上一样并行工作,核心组件包括VMM(虚拟机监视器)、虚拟CPU、虚拟内存、虚拟设备与前端后端驱动。
虚拟机之所以能接管物理机并“分身”出多个系统,关键在于它把硬件资源转换成了可分配的软件资源,下面从底层原理出发,拆解虚拟机的真实构造和运转逻辑。
核心组件拆解:一台虚拟机由什么拼装而成
一台虚拟机在用户眼中是一个完整的“电脑”,但从底层看,它是一组数据结构和资源映射的集合,按层次划分,主要包含以下部分。
VMM(虚拟机监视器)/Hypervisor:资源的“总调度官”
VMM是虚拟机系统的灵魂,它运行在物理硬件与虚拟机操作系统之间,负责截获客户机的特权指令、管理物理内存分页、仲裁I/O请求,VMM主要分两类:
- Type-1裸机型:直接跑在物理硬件上,如VMware ESXi、微软Hyper-V、KVM(Linux内核模块),性能损耗小,常用于服务器生产环境。
- Type-2托管型:作为应用程序安装在宿主操作系统中,如VirtualBox、VMware Workstation,适合个人测试,性能受宿主系统影响较大。
无论哪种类型,VMM都必须实现三个核心能力:资源隔离(防止虚拟机越权访问)、资源调度(按权重分配CPU时间片和内存)、指令翻译(将客户机特权指令转换为物理硬件可接受的指令)。
虚拟CPU(vCPU):时间片上的“演员”
虚拟CPU并不是一块真实的处理器电路,而是VMM为每个虚拟机维护的一个逻辑执行上下文,它的核心运作机制依赖于CPU虚拟化技术:
- 操作系统在物理机上执行特权指令时,会触发“陷入”到内核态;在虚拟机里,客户机执行特权指令会陷入到VMM,由VMM模拟硬件行为并返回结果。
- Intel VT-x和AMD-V硬件辅助虚拟化提供了专门的VMX/ SVM指令,让VMM能以接近原生速度切换虚拟机上下文,多数情况下,vCPU数量越多,虚拟机并发计算能力越强,但vCPU总数不应超过物理机逻辑核心数,否则会引发频繁上下文切换,整体吞吐反而下降。
虚拟内存:两层地址转换的“翻译官”
虚拟机的内存管理比其他组件更复杂,因为它涉及三层模型:客户机虚拟地址 → 客户机物理地址(即伪物理地址) → 宿主物理地址,VMM为每个虚拟机维护一张影子页表(或利用EPT/NPT硬件页表),直接缓存从客户机虚拟地址到宿主物理地址的映射,省去额外的页表查找开销。
当虚拟机申请内存时,VMM会从宿主的物理内存池中划出固定大小的连续区域交给客户机,为了超量分配(Overcommit),VMM还会利用内存气球(Balloon)技术回收空闲页面通过安装在客户机里的驱动主动释放未使用内存页租借给其他虚拟机。
虚拟设备与前后端驱动:I/O路径的“接力赛”
虚拟机的磁盘、网卡、显卡都不是真实硬件,而是VMM模拟出来的逻辑设备,通常采用经典的前后端架构:
- 前端驱动(Frontend)运行在客户机内核中,如virtio-net、virtio-blk,它把系统调用转发给后端,无需模拟完整硬件,性能高。
- 后端驱动(Backend)运行在VMM或宿主中,真正访问物理设备,例如在KVM中,QEMU是用户态后端,负责将请求写入real硬盘或宿主机网络栈。
以网络传输为例:客户机发数据包 → virtio前端把数据放入共享环形队列 → 后端从队列取出并交给宿主机网卡 → 网卡发送到外部,整个路径比传统完全模拟(如QEMU的e1000网卡模拟)减少大量指令翻译开销,这也是为何生产环境强烈推荐virtio半虚拟化驱动的根本原因。
虚拟机内部工作原理:一次数学运算的完整旅程
为了更直观理解“内部结构如何工作”,我们追踪一次简单的加法运算在虚拟机里的流转路径。
- 客户机里的应用执行
a = b + c,CPU执行指令,此时vCPU正在运行,上下文被加载到物理CPU核上。 - 指令读取内存地址,经过影子页表翻译,命中TLB(转译后备缓冲器),直接访问到宿主物理内存中的对应区域。
- 指令将结果写回内存,然后操作系统的时钟中断触发,vCPU上下文被VMM保存。
- VMM调度器根据时间片算法,挑出下一个需要运行的vCPU,把它的寄存器状态加载到物理Core上,继续执行。
整个过程只经历少量VMM介入,其余时间内虚拟机“独占”了物理处理器,这就是虚拟化如此高效的原因,但如果遇到磁盘读写或网络包处理,则要经过前后端驱动和共享队列,此时上下文切换次数会显著增加。
虚拟机与容器对比:底层结构差异决定适用场景
很多人在挑选虚拟化方案时会纠结:虚拟机与容器对比究竟谁更胜一筹?清楚两者内部结构差异后,答案就变得清晰了。
| 对比维度 | 虚拟机 | 容器(以Docker为例) |
|---|---|---|
| 抽象层级 | 硬件级虚拟化,完整模拟一台机器 | 操作系统级虚拟化,共享宿主内核 |
| 资源隔离 | 强隔离,独立内核、独立设备驱动 | 弱隔离(内核共享),使用Namespace和Cgroups |
| 启动速度 | 秒级到分钟级(取决于OS启动) | 毫秒级到秒级 |
| 镜像体积 | 几GB起步(含完整OS) | MB级到几百MB |
| 安全性 | 更高,恶意代码突破VMM极难 | 依赖宿主内核安全,逃逸漏洞时有发生 |
| 性能损耗 | 中等,CPU损耗约5%~10% | 极低,接近原生 |
行业共识认为,对于运行不同操作系统的环境(例如Windows与Linux并存),或对安全边界要求极高的多租户服务器虚拟化,虚拟机仍是唯一可靠的选择,而追求极致部署速度和资源利用率,且全部是基于Linux的应用,容器更具优势,最近两年流行的Kubernetes集群底层,很多节点仍然使用虚拟机承载,形成“虚拟机 + 容器”的混合架构这正好发挥了两者所长。
虚拟机内部分层架构:从设备到指令的完整视图
如果把一台虚拟机剖开来看,从最底层的物理硬件到最上层的应用程序,一共分为五层,这种分层结构也让虚拟机价格随资源规格的不同而产生巨大差异公有云厂商正是按这些层级组合来定价的。
第1层:物理硬件平台
裸机服务器,包含多核CPU、大容量内存、SSD/NVMe盘、万兆网卡,VMM直接管理和调度这部分资源,通常需要开启CPU虚拟化扩展和IOMMU(VT-d)来支持设备直通。
第2层:VMM核心
管理分区(Domain 0)运行管理工具,负责创建、销毁、迁移虚拟机,在KVM架构中,每个标准Linux进程被认为是一个虚拟机实例,QEMU负责设备模拟,KVM内核模块处理CPU和内存虚拟化。
第3层:客户机操作系统
它感知不到自己正运行在虚拟环境里(除非安装了增强驱动),当客户机尝试访问硬件时会陷入VMM,由VMM代为处理并返回结果。
第4层:驱动与库
客户机内的虚拟化驱动(如virtio)和系统调用接口,负责将应用请求转化为硬件操作指令序列。
第5层:应用程序
用户实际运行的服务或软件,对这一层来说,虚拟机内部结构是否复杂完全不重要,它只关心CPU速度和内存大小。
实际运维操作:查看虚拟机内部配置的路径
- 在私有云平台(OpenStack)中,可以通过
nova show <虚拟机ID>查看vCPU、内存和安全组配置。 - 在KVM宿主机上,用
virsh vcpuinfo <虚拟机域名>查看实时vCPU与物理CPU的绑定情况。 - 在VMware vSphere客户端里,编辑虚拟机设置能看到每个硬件设备的虚拟型号以及是否使用了预留(Reservation)、份额(Shares)和限制(Limit)。
常见故障与定位思路:虚拟机“卡顿”时该查哪些内部组件
虚拟机出现性能拉胯时,问题往往不在应用层,而是底层的资源竞争或驱动不兼容,按照以下顺序排查,能快速定位大多数问题。
检查CPU就绪时间(CPU Ready)
在vSphere中,%RDY 值持续高于 15%,说明vCPU在等待物理CPU调度,常见原因是vCPU总数超过物理核心数,或同物理机上虚拟机数量太多,解决方法:降低vCPU数量或迁移至新宿主机。
检查内存回收活动
基于内存气球机制,如果宿主机内存压力大,VMM会通过气球驱动回收客户机“闲置”内存,客户机内表现为可用内存突然下降、swap使用率升高,查看 perf 统计中的 memory_balloon 或 nr_reclaimed 可以确认是否发生频繁回收,进而考虑用大页内存(HugePages)减少开销。
检查磁盘队列长度和延迟
使用 iostat -x 1 观察 await 和 %util,若磁盘延迟持续高于 50ms,说明存储后端性能不足或底层网络存储抖动,开启 virtio-blk 多队列(每个vCPU对应一个队列)可显著提升吞吐量。
检查网络丢包
在客户机内执行
netstat -i,若 RX-ERR 或 TX-DRP 持续增长,大概率是宿主机网卡中断亲和性设置不合理或物理网络故障,尝试将虚拟网卡的中断绑定到不同物理核,并开启多队列网卡(virtio-net with mq=on)。
虚拟机使用中的几个真实场景问题与选择建议
结合多数用户的常见困惑,这里集中解答几个典型疑问。
为什么虚拟机比物理机反应“肉”?
因为虚拟化层的引入导致两种额外开销:指令翻译开销(约增加10%的CPU周期)和I/O路径开销,在非直通模式下,每次磁盘读写都要经过前端驱动、后端驱动、宿主机内核协议栈三层,使用低延迟NVMe直通(PCIe Passthrough)可以解决大部分I/O瓶颈,代价是该物理设备只能被这一个虚拟机独占。
虚拟机的系统盘分析该怎么处理?
虚拟机系统盘文件是放在宿主机上的一个镜像文件,比如常见的 qcow2 格式,它会随着写入逐渐膨胀,要对系统盘做扩容或压缩,推荐在客户机关机状态下使用 qemu-img resize 调整大小,再用 virtiofs 或 NBD 方式挂载至宿主机进行分区修复,避免直接编辑运行中的镜像文件造成数据损坏。
想租云服务器,虚拟机配置到底怎么选?
了解虚拟机内部结构后,选购时会更有针对性。如果你做网站并发不高,2核4G足够;跑大数据分析建议4核16G起步;深度学习训练则优先考虑GPU直通型实例,华东地区不少云厂商提供“抢占式实例”,价格只有按量付费的两折左右,适合可容忍中断的批处理任务。
Q&A:关于虚拟机内部结构的三个典型问题
问题1:虚拟机内存直接使用了物理内存,为什么还能同时运行多台且不冲突?
每台虚拟机在创建时由VMM分配一段独立的“伪物理地址”范围,并通过影子页表或EPT把这些地址映射到宿主不同的物理页框,VMM保证每一张页表都只指向本虚拟机有权访问的物理页面,任何越界地址都会被拦截,因此多虚拟机之间即使数据在物理层交错,逻辑上完全隔离。
问题2:为什么我的虚拟机文件删除了,宿主磁盘空间并没有立刻释放?
这取决于磁盘镜像类型,如果是稀疏文件(如qcow2),删除客户机内部文件并不会回收镜像占用的宿主磁盘块,因为VMM并不知道哪些块已“空闲”,需要执行 fstrim 将未使用块标记为丢弃,或在宿主机上运行 qemu-img convert 重新压缩镜像,才能释放空间。
问题3:虚拟机内部安装的杀毒软件能否检测到虚拟机环境?
部分安全软件会通过检测特定硬件信息(如VMware的I/O端口、KVM的CPUID叶子节点)来判断当前处于虚拟化环境,但现代虚拟机在指令集上高度模拟真实硬件,普通应用无法仅凭指令执行区分,要完全隐藏虚拟化痕迹,需在客户机的配置文件中关闭 hyperv 或 vpmc 标志,并对宿主CPU型号做相应隐藏,操作配置复杂度较高,但作用范围有限。
首发原创文章,作者:王坚,如若转载,请注明出处:https://idctop.com/article/619896.html





