
缩小一个vhdx步骤
任何人试图从动态分配vhdx中回收已删除的文件所占的空间终将失败
对剩余空间填0(sdelete)、碎片整理(defrag /D )、Trim机制(defrag /L)均不生效
普遍的说法认为要对NTFS卷进行缩小,最后也证实了这点
在虚拟机的Windows系统中,磁盘管理器,缩小,往往会不可缩小,NTFS卷上有“不可移动的文件”
以下是一个确定可行的回收空间流程,已用空间55G,实际占用98G的vhdx缩小到了55G。
0. 有条件的话,添加第二个vhdx并且把虚拟内存页面文件从系统盘改放到新vhdx上,重新启动应用设置,这可以进一步缩小vhdx体积
- 准备一个运行Linux的虚拟机,比如Debian安装gparted或是使用gparted live CD那就不需要装系统
- Windows虚拟机关机前需要事先记住已用空间,在Linux工具中有时不能准确识别可以缩小到的最小大小,会导致缩小失败
如果客户机系统已经关机,可以只读挂载Mount-VHD "vhdx路径" -ReadOnly,在磁盘管理器里右键检查已用空间,再右键磁盘编号选分离 vhd取消挂载 - 关机后,启动Linux虚拟机,启动后在Linux虚拟机的SCSI控制器上新增一个vhdx,这会把要缩小的Windows虚拟机vhdx热插拔加入进Linux
- 启动gparted,对系统分区进行缩小,一般是中间那个最大的,两侧的Windows保留小分区不要动
- 为了系统稳定,在记住的已用空间基础上增加1GB进行缩小,为了方便操作在千位上增加1000MiB我认为也是可行的
- 缩小后在空白处创建一个新分区,分区格式选择
cleared,意思是不使用任何文件系统 - 点击应用让gparted执行提交的操作
- 对新分区写0,记住这个新创建的分区路径,比如
/dev/sdc5,执行sudo dd if=/dev/zero of=/dev/sdc5 bs=4096 status=progress
其中bs=4096是假设分区是4K对齐的,可以提高执行速度,不指定bs参数时默认512 dd执行完后回到gparted,将创建的新分区删除并点击应用再次提交- 关闭gparted,到Linux虚拟机设置,从SCSI控制器上删除这个vhdx,这会热插拔移除vhdx
- 按预先填0模式缩小vhdx,执行命令
Optimize-VHD "vhdx路径" -Mode Prezeroed - 结束后,vhdx应该确实缩小了,开机,右键分区,属性,工具,进行一次扫描检查错误
我发现即使提示需要修复,但我选择此时先不修复,再扫描不会再提示需要修复,重启后扫描也不会提示需要修复 - 使用虚拟机内的系统磁盘管理器增大空间
- 此时vhdx中有一定的文件系统碎片比如25%,如果需要进行碎片整理,整理后55G已用空间会产生65G的vhdx大小
在固态硬盘上,不需要这样做
编辑于 2026-07-12 · 著作权归作者所有