☰
VMware虚拟磁盘空间回收:原理、方法与避坑指南
2026/10/14 16:00:31 网站建设 项目流程

简介:在虚拟化环境中,虚拟磁盘的空间管理是运维日常的高频痛点。许多管理员发现客户机内清理了海量文件,但vmdk文件依然保持不变——这源于精简置备机制:删除文件仅释放元数据,物理块需清零后才能被宿主机回收。正确的路径是先清零(如sdelete -z或fstrim),再通过VMware Tools收缩或离线迁移释放空白块。掌握磁盘类型识别、快照处理与接口选择,可将数百GB的vmdk压缩至真实数据量,为存储减压。本文从清零与收缩原理切入,梳理三条可落地的回收路径,并剖析回收无效的常见原因,适合虚拟化运维人员参考。

1. 精简磁盘空间这件事,为什么值得单独研究

虚拟机跑了大半年,宿主机磁盘就被 vmdk 文件吃掉了上百 GB,明明客户机里删了十几个 GB 的临时文件、日志和旧安装包,回到宿主机一看,vmdk 的大小动都没动。这不是产品缺陷,而是虚拟磁盘的块分配机制决定的:客户机里“删除文件”只是把文件系统的元数据标记为可复用,底层块并不会自动变回未分配。vmware 精简磁盘空间回收,要解决的就是这么一个问题——把客户机文件系统里已经释放的块,在虚拟磁盘层面真正清掉,让宿主机能把这部分空间重新拿回去用。常见做法是先做块清零,再触发压缩或收缩。这篇文章会从原理讲到三条可落地的回收路径,再把最坑的几种翻车情况列出来。适合被磁盘占满折磨过的虚拟化运维、测试环境管理员,以及单机跑一堆虚拟机的开发者。

2. 理解虚拟磁盘的类型与空间回收原理

2.1 固定大小与动态增长磁盘:回收空间的前提不一样

先分清虚拟磁盘的三种常见形态。固定大小(Fixed)的 vmdk 在创建时就占满分配的上限,比如你给它 100 GB,它就立刻在宿主机上占用 100 GB,回收对它几乎没有意义,顶多是让已用空间变干净,宿主机文件系统那一层不会瘦身。动态增长(Thin)的 vmdk 是按需分配,初始只有几 MB,客户机写入多少就增长多少,这种磁盘在清零之后进行收缩,能把 vmdk 的物理大小压回真实数据量。第三种是厚置备延迟置零,它也属于固定分配,回收逻辑和固定大小基本一致。

所以在动手之前,先打开虚拟机设置确认磁盘类型。路径是:虚拟机右键 → 编辑设置 → 硬盘 → 磁盘文件。这里能看到是精简置备还是厚置备。如果是厚置备,后续的回收操作走不通是很正常的,不属于故障,而是初始选型问题。绝大多数人在网上搜到的手法,默认都是针对动态增长磁盘的。

2.2 厚置备与精简置备:为什么删了文件磁盘却不缩小

精简置备磁盘不是不回收,而是它的回收依赖两个条件。第一,客户机操作系统要把数据块真正清零,而不是只删文件;第二,虚拟化层提供的收缩操作要在清零完成后执行。Windows 的 NTFS 删除文件时不会主动清零数据,Linux 的 ext4 在多数情况下也一样,只有像 fstrim 这一类 discard 操作,或者专门的清零工具,才会把未分配块写成零。

厚置备磁盘则是反向逻辑:空间在创建时就已经一次性分配并置零,它不会因为数据变少而自动缩回。所以如果你发现自己的磁盘是厚置备,期待一个命令能让它变小,那多半会落空。真正适合厚置备的场景是数据库这类对写入延迟敏感的工作负载——避免写入时临时扩盘的开销。日常开发测试虚拟机,直接选精简置备就好,省心得多。

2.3 在客户机里做清零:让文件系统释放的块真正变空

清零这个动作,本质上是在客户机里把所有“已被文件系统标记为未使用”的块写成 0。Windows 虚拟机常用工具是 sdelete,参数 -z 表示清零空闲空间;Linux 这边则是 fstrim,或者直接在挂载参数里加 discard。清零之后,虚拟磁盘内部的大量块变成纯零,虚拟化层才能识别出这些块可以释放。

这里容易踩的一个点是:清零操作需要临时占用空间。比如你在一个还有 20 GB 空闲的动态磁盘里执行 sdelete -z,它首先要把这 20 GB 都写一遍零,期间磁盘可用空间会迅速下降。如果空闲空间太小,操作可能直接卡住或者失败。所以清理前先确认客户机里至少有目标空闲空间的两倍冗余,至少也要保留足够空间让清零工具写完整个空闲区。

3. 从 VMware Tools 到手工清零:三条可复现的回收路径

3.1 路径一:用虚拟机自带的工具触发置换与清理

最常见的做法是先在客户机里用系统自带的碎片整理或磁盘优化来“预压缩”,再配合虚拟化层的收缩能力。Windows 虚拟机上,先打开“优化驱动器”,选择 C 盘做一次优化。这个动作不完全是碎片整理,它会让文件系统把空闲块整理到磁盘后段,对后续清零更有利。

接着用 VMware Tools 里的 shrink 功能。在 Windows 客户机中,打开控制面板里的 VMware Tools,切到“缩减”页签,或者在 Linux 客户机中执行:

sudo vmware-toolbox-cmd disk shrink /

执行后工具会提示需要在重启后完成收缩,因为部分文件系统元数据在运行时无法安全搬运。照着提示重启即可。参数说明:最后一个参数指定要收缩的挂载点,这里是根分区;如果你的 Linux 虚拟机把数据盘单独挂在 /data,可以分别执行:

sudo vmware-toolbox-cmd disk shrink /data

逻辑说明:这个命令做的事是先调用客户机里的文件系统接口,把空闲块标记出来,再通知虚拟化层扫描并释放。它不是万能的,前提是客户机文件系统必须支持 discard,以及磁盘本身是精简置备。Windows 这边的 VMware Tools 图形界面本质上调用的是同一套机制,底层动作一样。

3.2 路径二:客户机里手动清零未用空间

手工清零的优势是可控、不依赖 VMware Tools 版本和虚拟机内服务状态。Windows 上通用的工具是微软的 sdelete,运行方式如下。

在管理员命令行中执行:

sdelete.exe -z C:

-z表示清零空闲空间,C:是目标盘符。如果你要多盘一起处理:

sdelete.exe -z C: D: E:

要注意的是,sdelete 在处理大容量磁盘时会花很长时间,而且写入量很大。曾经在一台只剩 8 GB 空闲的 Windows 虚拟机上跑 -z,结果因为空间不足直接报错退出。所以实践前务必确认可用空间足够,或者提前清理出余量。

Linux 这边简单很多,一个命令就能完成:

sudo fstrim -av

fstrim 会扫描所有已挂载且支持 discard 的文件系统,对空闲块执行 discard 操作。如果你的文件系统不支持自动判断,可以手动指定挂载点:

sudo fstrim /var/lib/docker

这个操作通常很快,几秒钟到几分钟不等,取决于磁盘尾部有多少块需要处理。对比 sdelete 的写入式清零,fstrim 是在线通知存储层哪些块没用了,不会产生大量写入,对 SSD 宿主机友好得多。

3.3 路径三:离线场景下的镜像级回收

客户机里的工具都失效时,比如 VMware Tools 装不上、客户机系统已经卡死,还有一条路:把虚拟机拆掉,只留磁盘,用虚拟化层的离线工具处理。常见做法是把虚拟机从磁盘上摘除挂载,或者克隆一份精简置备磁盘到新的位置。

在 vCenter 里可以用 Storage vMotion 把磁盘迁移到另一个数据存储,迁移过程中勾选“精简置备”作为目标格式。这个过程不读取客户机内部文件系统,而是虚拟化层自己判断哪些块是零,哪些不是,从而生成一份更小的精简磁盘。这个操作不需要客户机做任何事,适合故障场景,代价是需要额外的存储空间作为迁移目标,以及一定的迁移窗口。

4. 回收后磁盘没有变小?先查这几处

4.1 现象一:清理工具跑了,vmdk 大小纹丝不动

最常遇到的就是清零做完了、收缩也执行了,回到宿主机看 vmdk 文件,大小还是原样。原因优先排查以下几点:磁盘是不是精简置备;vmdk 文件是否被快照锁定;当时的清理工具是否在 x86 架构上误选了 IDE 接口。

IDE 接口的虚拟磁盘不支持在线收缩,这是设计约束。把虚拟磁盘从 IDE 改为 SCSI 之后,同样操作能正常收缩。改法很简单:编辑虚拟机,移除磁盘,重新以 SCSI 方式添加,选择已有磁盘文件。但要注意,改动接口可能导致启动顺序变化,Windows 虚拟机改完可能需要修复引导,操作前建议先对 vmdk 做磁盘级备份。

4.2 现象二:瘦置备变成了厚置备

有的人创建虚拟机时明明选了精简置备,跑着跑着就发现磁盘文件大小等于虚拟磁盘上限了。原因多数是虚拟机做过克隆,克隆时源磁盘是精简置备,但目标选成了厚置备;或者做过 Storage vMotion,迁移过程中目标格式选错。

查证方式很简单:查看 vmdk 文件列表,如果存在 -flat.vmdk 且其大小等于配置上限,再看描述文件中的属性。即使它原本是精简置备,只要在物理层占满了,就只能按厚置备处理,回收无意义。此时若空间足够,把磁盘克隆一份为精简置备格式,替换掉旧磁盘,才是正确方向。

4.3 现象三:快照卡在中间,回收命令被锁定

执行回收的目标磁盘如果存在快照,那么磁盘文件是分层的——当前数据和快照 delta 文件是两套块。即使你清了当前层的空闲空间,快照 delta 里仍然保留着大量旧数据块,宿主机自然无法把整个磁盘的文件大小降下来。这时收缩命令要么直接报错说“设备忙”,要么运行完根本没效果。

解决步骤是:先删除全部快照并提交到当前磁盘,再执行清零和收缩。注意,删除快照本身也需要时间,且会生成大量写入,最好安排在维护窗口。有些人看到收缩没效果就反复执行清理工具,这是瞎折腾,真正的问题在快照没清。

4.4 现象四:回收后虚拟机变慢

做完清零和收缩后,虚拟机运行变慢,多见于机械硬盘宿主机。原因在于收缩会让 vmdk 内部的块重新排列,原本连续的文件块可能被搬运到不同位置,导致后续读取时磁头寻道增加。另一个常见原因是清零操作把大量零块写在磁盘前端,虽然这些块最终被释放,但释放过程改变了底层块的映射关系。

解决方式:给虚拟机做一次碎片整理。Windows 客户机用系统自带的碎片整理工具即可,Linux 可以用 e2fsck 加 defrag(只支持 ext4 且需要离线)。碎片整理会重新排列文件块,配合后续的读写缓存,慢的问题在几天内会逐渐缓解。如果是 SSD 宿主机,这个现象基本可以忽略。

5. 避坑指南:5 条最容易翻车的操作

5.1 别在驱动层清理时开机运行其他磁盘操作

在 Windows 客户机里跑 sdelete -z 的同时,如果有备份任务、杀毒扫描或者数据库备份在运行,清零过程和这些写入同时发生时,行为会变得混乱。现象往往是 sdelete 报错说磁盘空间不足,但实际上还有几个 GB 空闲;本质是并发写入导致可用空间在清零过程中被临时耗尽。

解决建议:清理窗口内停掉计划任务,至少停掉备份和日志轮转服务。这是最容易被忽略的一个坑,但也是翻车频率最高的一个。

5.2 清零工具与快照必须分开执行

一定不要在有快照的状态下做收缩。正确顺序是:先删快照、再清理、最后收缩。如果虚拟机是每天自动打快照的,清理前先禁掉当天的快照任务。

有人会想“快照量不大,先收缩再删”,这个思路有问题。删除快照时,虚拟化层要把所有 delta 数据合并到基础磁盘,如果基础磁盘刚做完清零和收缩,合并过程可能重新分配大量块,把刚降下来的空间又撑回去。先删快照,再清零,再收缩,顺序反了等于白做。

5.3 别对厚置备磁盘做无谓的回收

厚置备磁盘的物理学大小就是上限,不管你怎么清零,宿主机看到的文件大小都不会变。有人不信邪,在厚置备磁盘上反复跑 sdelete 和 shrink,最后发现时间花了、空间没回来,还消耗了大量 SSD 寿命。

处理方式很明确:如果目标是回收宿主机磁盘空间,只能做格式转换。把厚置备磁盘克隆为精简置备,再替换原磁盘,才能达到效果。这个操作需要的临时空间和虚拟机本身一样大,准备好再开跑。

5.4 预留临时空间

不管哪条回收路径,都需要临时空间。Windows 的 sdelete -z 要把空闲区整个写一遍,Linux 的 fstrim 虽然不写数据,但如果文件系统是 ext4,建议预留一部分未分配空间给元数据移动。宿主机这边也一样,收缩前确保数据存储的可用空间大于虚拟磁盘上限的 10% 以上,否则收缩过程可能因为空间不足中断,留下一个只能手动修复的磁盘状态。

5.5 清理前核对自动启动策略

回收操作涉及 VMware Tools 重启,如果虚机所在宿主机同时运行着其他关键服务,重启虚机时可能触发资源竞争,导致其他虚拟机卡顿或 OOM。这类问题的现象是清理后宿主机变得不稳定,原因不是清理本身,而是清理发生在错误的时间点。

我会建议先检查虚机是否设置了随宿主机自动启动,以及是否有数据库等会因强制重启而损坏的应用。如果有,在维护窗口做,或者先手动挂起其他非必要虚拟机,给清理腾出资源。

6. 收尾技巧:用一条命令验证回收是否成功

清理完成后,不要只看 GUI 里的文件大小,那里有缓存延迟,容易误判。直接到宿主机命令行确认 vmdk 实际占用的块数。esxi 环境下:

ls -lh /vmfs/volumes/datastore1/your-vm/your-vm-flat.vmdk

如果你习惯看更精确的字节数,用:

stat -c '%s %n' /vmfs/volumes/datastore1/your-vm/your-vm-flat.vmdk

对比清理前后两次的输出,如果 -flat.vmdk 的文件大小明显下降,说明回收成功。在 Linux 宿主机上用 KVM 配合 vmware 磁盘格式时,也可以用 qemu-img 来查看实际占用:

qemu-img info /path/to/your-vm-flat.vmdk

输出里的 disk size 字段,就是这个 vmdk 真实的物理占用,比文件管理器里的逻辑大小可靠得多。

工作习惯上,我每次做回收前会在虚拟机的描述信息里写下当前磁盘的逻辑大小和物理大小,回收后再次更新。下次再遇到磁盘膨胀问题,翻描述就能一眼看出是不是做过了,不用重新排查。另外,把 sdelete -z、fstrim -av 这类操作写进季度维护清单,比每次临到头再去到处查命令靠谱得多。Vmware 磁盘回收本身不复杂,但顺序、类型、快照状态三个点错一个,效果都天差地别。按这套流程做下来,几百 GB 的 vmdk 压回几十 GB 是常态,希望帮到你。

本文还有配套的精品资源,点击获取

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询