如何分析Windows下VHDX动态盘实际空间占用
日常维护Hyper-V虚拟机或者Native Boot VHDX系统时,经常会碰到VHDX动态盘逻辑容量远大于宿主文件实际大小,或是删除内部大量文件后,宿主文件占用空间没有下降,不知道该怎么准确分析真实的空间占用情况。以下内容基于Windows 10 21H2及以上、Windows Server 2019及以上环境,纯长差分链VHDX的多文件级空间分析不在本文讨论范围,所有操作都针对单动态VHDX文件本身展开,讲清如何区分三个容易混淆的容量指标,获取准确的占用数据。
分析Windows下单VHDX动态盘实际空间占用,优先用PowerShell Get-VHD命令区分三类容量指标,排除宿主压缩、VSS快照干扰即可得到准确结果。
与此相关的另一个话题,《VHDX磁盘性能优化:空间回收与碎片整理指南 (Windows)》里有进一步讨论。
VHDX动态盘的三个容量指标

VHDX动态盘是微软VHDX格式支持的按需分配类型虚拟磁盘,仅当内部写入数据时,才会向宿主文件系统申请实际空间,和固定VHDX一开始就分配满最大容量的机制完全不同,分析占用前要先区分三个不同的容量概念。
与此相关的另一个话题,《Windows BitLocker 加密 VHD/VHDX 虚拟磁盘实战》里有进一步讨论。
下表整理了三个指标的定义和对应查询位置:
| 指标名称 | 定义 | 常规查询位置 |
|---|---|---|
| 逻辑大小 | VHDX创建时设定的最大可扩展容量,也就是客操作系统看到的虚拟磁盘总容量 | PowerShell Get-VHD 的 Size 字段、磁盘管理的虚拟磁盘属性 |
| 实际文件大小 | VHDX文件本身在宿主物理磁盘上占用的存储空间,包含已分配数据块和元数据 | PowerShell Get-VHD 的 FileSize 字段、宿主文件属性的「大小占用」 |
| 已分配块大小 | VHDX已经标记为已使用的块总大小,排除未分配的稀疏空间,是真实反映VHDX内部数据的占用值 | Optimize-VHD 分析结果、Get-VHD输出的实际分配值 |
问:为什么刚创建的空VHDX动态盘,逻辑大小几十TB,实际文件只有几MB?
答:这是动态VHDX稀疏分配的正常行为,空块不会提前占用宿主物理空间,只有写入数据后才会逐步扩大文件。
用PowerShell获取VHDX动态盘准确占用数据
图形界面的磁盘管理只能查看挂载后虚拟磁盘内部的容量使用情况,无法获取VHDX文件本身在宿主端的实际已分配空间,最准确的分析方式是使用Hyper-V模块的PowerShell命令,哪怕不运行Hyper-V虚拟机,也可以单独安装Hyper-V管理工具获取这个模块。
挂载或未挂载的VHDX都可以直接查询,不需要提前挂载,命令示例:Get-VHD -Path "D:\VirtualDisks\test.vhdx"
不同查询方式的准确性差异可以参考下表:
| 查询方式 | 是否需要Hyper-V模块 | 能否识别已分配空块 | 准确性 |
|---|---|---|---|
| PowerShell Get-VHD | 是 | 能 | 高 |
| 宿主文件属性「大小占用」 | 否 | 不能 | 中等,易受VSS快照、NTFS压缩干扰 |
| 挂载后磁盘管理(客内) | 否 | 不能 | 低,仅反映虚拟磁盘内部使用,看不到VHDX文件本身占用 |
如果VHDX存放在SMB共享或者集群CSV卷上,需要在文件服务器节点执行查询,客户端拿到的大小统计通常存在偏差。
宿主环境对占用统计的干扰
VHDX本身是宿主文件系统上的一个普通文件,宿主的各类特性会改变实际物理占用的统计结果,分析时要单独区分。
如果VHDX所在的NTFS或ReFS卷开启了文件压缩,VHDX文件的实际物理占用会低于VHDX本身的已分配块大小,但这种压缩会带来明显的性能损耗,统计空间时要注意区分压缩节省的空间和VHDX本身的实际占用。
如果VHDX所在卷开启了系统保护或者VSS卷影副本,旧版本的VHDX数据会被快照保留,这部分空间占用不计入当前VHDX文件的大小,但实际会占用物理磁盘,排查磁盘空间不足问题时要单独统计快照占用。
分析注意事项与行动建议

问:删除VHDX内部所有文件后,为什么VHDX文件大小没缩小?
答:动态VHDX不会自动释放已经分配的空块,删除内部文件只是在VHDX的块分配表将块标记为空闲,VHDX文件本身仍然保留着已分配的空间,需要运行Optimize-VHD -Path "你的VHDX路径" -Mode Full执行紧凑操作,才能把空块释放回宿主文件系统。操作前需要卸载VHDX或者关闭虚拟机,建议先备份VHDX再操作。
- 分析单VHDX动态盘占用,优先用
Get-VHD获取数据,不要直接看宿主文件属性。 - 逻辑大小是VHDX的最大可扩展容量,不代表当前实际占用,不要把逻辑大小当成真实占用。
- VHDX差分盘的总占用是所有链上文件的占用之和,单份子盘的大小不能代表整个虚拟磁盘的总占用。
- 碰到VHDX文件远大于内部数据占用的情况,先检查是否有未释放的空块,再排查宿主VSS快照的占用。
分析陌生VHDX动态盘的空间占用,先查询Get-VHD的两个核心字段,再比对虚拟磁盘内部的已用容量,就能快速定位空间异常的原因。