news 2026/9/26 16:02:30

VMware虚拟机磁盘爆满?从内部清理到宿主机回收的完整指南

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
VMware虚拟机磁盘爆满?从内部清理到宿主机回收的完整指南

1. 磁盘空间到底被谁吃掉了:先搞清楚虚拟磁盘的膨胀逻辑

很多人第一次遇到VMware虚拟机磁盘爆满,第一反应是进系统删文件,删完发现宿主机上的.vmdk文件纹丝不动,该占多少还是多少。这个现象背后是虚拟磁盘的工作机制在起作用,不理解它,后面所有清理操作都是瞎折腾。

VMware的虚拟磁盘本质上是一个或多个文件,存放在宿主机上。以最常用的**精简置备(Thin Provision)**模式为例,你创建一个100GB的虚拟磁盘,初始时它可能只占几GB,随着虚拟机内写入数据,这个文件才逐步增长。关键在于:虚拟机内删除文件,宿主机上的.vmdk文件不会自动缩小。因为虚拟机操作系统只知道自己在往“磁盘”上写数据,它不知道这背后是一个文件,更不知道宿主机需要回收空间。

这就好比你租了一个仓库,仓库管理员给你划了一块地,你往里堆货,堆多少占多少。你把货搬走了,但仓库管理员并不知道,那块地还是标记为“已使用”。虚拟磁盘文件就是这个仓库,宿主机是仓库管理员,虚拟机内的操作系统是租户。

所以清理磁盘要分两条线走:

  • 虚拟机内部清理:删除无用文件、清理缓存、卸载不用的软件,这是第一步,目的是让虚拟机内的文件系统有足够空间运行。
  • 宿主机层面回收:通过VMware提供的工具把已删除空间“归还”给宿主机,缩小.vmdk文件的实际占用。

只做第一步不做第二步,宿主机磁盘照样告急。只做第二步不做第一步,回收效果微乎其微。两条线必须配合。

还有一个容易被忽略的点:快照文件。快照不是备份,它记录的是虚拟机在某个时间点的状态差异。你拍了一个快照,之后所有写入操作都会记录在增量磁盘文件里,原始磁盘被锁定为只读。快照越多、存在时间越长,增量文件越大,磁盘占用越夸张。我见过一个案例,一台开发机拍了三个快照放了半年,宿主机上多出了80多GB的增量文件,而虚拟机内实际只用了30GB。

注意:清理磁盘前,先确认虚拟机内没有正在运行的关键业务,所有操作建议在关机或至少暂停业务后进行。

2. 虚拟机内部瘦身:从系统层面把空间腾出来

在动手回收宿主机空间之前,得先把虚拟机内部的空间释放出来。这一步的目标是让虚拟机文件系统中有尽可能多的“空闲块”,后续回收工具才能识别并归还这些块。

2.1 Linux虚拟机:包管理器缓存是大头

Linux系统用久了,/var/cache目录下的包管理器缓存能占几个GB。以Ubuntu/Debian系为例,apt下载的.deb包默认会保留在/var/cache/apt/archives/下,时间一长就是一座小山。

# 查看当前缓存占用 du -sh /var/cache/apt/archives/ # 清理所有已下载的包缓存 sudo apt clean # 或者只清理过期的包缓存(更保守) sudo apt autoclean

CentOS/RHEL/Fedora系用yum或dnf,清理命令类似:

# 查看缓存占用 du -sh /var/cache/dnf/ # 清理缓存 sudo dnf clean all

除了包缓存,还有几个常见的空间黑洞:

  • 日志文件:/var/log/下的日志长期不轮转能涨到几个GB。用journalctl --disk-usage查看systemd日志占用,用journalctl --vacuum-size=200M限制日志总量。
  • 旧内核:每次系统更新内核,旧版本不会自动删除。/boot分区被塞满导致无法更新是经典故障。用dpkg --list | grep linux-image查看已安装内核,保留当前和上一个版本即可,其余用apt purge卸载。
  • Docker相关:如果虚拟机里跑了Docker,/var/lib/docker/下的镜像层、容器日志、悬空卷都是空间杀手。docker system prune -a能清理未使用的镜像、容器、网络和构建缓存,但执行前确认没有正在运行的重要容器。
  • 临时文件:/tmp和/var/tmp下的残留文件,重启后通常会自动清理,但有些程序会留下大量临时数据。

2.2 Windows虚拟机:休眠文件和系统还原是隐藏大户

Windows虚拟机里,有几个文件默认就占很大空间,而且很多人根本不知道它们的存在。

休眠文件(hiberfil.sys):如果你不用休眠功能,这个文件白白占用与内存等量的空间。一台分配了8GB内存的虚拟机,这个文件就是8GB。关闭方法:

powercfg -h off

执行后hiberfil.sys立即消失,空间释放。代价是失去休眠和快速启动功能,对虚拟机来说这两个功能意义不大。

系统还原点:Windows默认会为系统盘创建还原点,占用空间可达磁盘的10%。在虚拟机里这个功能基本没用,建议关闭。右键“此电脑”→属性→系统保护→配置→禁用系统保护。

Windows更新缓存:C:\Windows\SoftwareDistribution\Download目录下堆积的更新包,以及C:\Windows\Installer下的MSI安装缓存,都可以安全清理。用Windows自带的“磁盘清理”工具,选择“清理系统文件”,勾选“Windows更新清理”和“临时文件”。

页面文件(pagefile.sys):虚拟内存交换文件,默认也在系统盘。如果虚拟机有多个虚拟磁盘,可以把页面文件移到非系统盘。不过对于虚拟机来说,页面文件本身也是动态增长的,清理时不用太纠结。

2.3 通用清理手段:别漏了用户目录

不管什么系统,用户目录下的下载文件夹、浏览器缓存、开发工具的缓存目录都是空间消耗大户。Linux下~/.cache/经常能清出好几个GB,Windows下%LOCALAPPDATA%\Temp和浏览器的缓存目录也值得检查。

我个人的习惯是,在虚拟机里装一个磁盘占用分析工具。Linux用ncdu,Windows用WizTree或TreeSize Free,图形化界面一目了然,比用du命令一层层翻快得多。ncdu的用法很简单:

# 安装 sudo apt install ncdu # 扫描根目录 sudo ncdu /

扫描完成后按大小排序,直接就能看到哪个目录最占空间,按d键可以直接删除选中的文件或目录。

提示:虚拟机内部清理完成后,建议重启一次,确保所有临时文件和锁文件都被释放,再进行下一步的宿主机回收操作。

3. 宿主机回收:把已删除的空间真正还给硬盘

虚拟机内部清理干净了,接下来是最关键的一步——让宿主机上的.vmdk文件缩小。这一步分两种情况:有快照和没快照,处理方式完全不同。

3.1 先处理快照:不合并快照,回收无从谈起

如果虚拟机存在快照,所有回收操作都是徒劳的。因为快照机制下,原始磁盘是只读的,所有新数据都写在增量文件里。你回收的只是增量文件中的空闲空间,原始磁盘纹丝不动。

所以第一步是检查快照。在VMware Workstation中,右键虚拟机→快照→快照管理器,看看有没有快照存在。如果有,需要决定是删除还是合并。

  • 删除快照:丢弃该快照点之后的所有更改,回到快照时的状态。慎用,会丢数据。
  • 合并快照:把快照中的更改合并回原始磁盘,保留所有数据。这是推荐做法。

合并快照的过程可能很慢,取决于增量文件的大小。一个几十GB的增量文件合并可能需要十几分钟甚至更久,期间不要中断操作。合并完成后,虚拟机目录下会少掉那些增量文件,空间自然释放。

3.2 没有快照时的回收:VMware Tools是关键

确认没有快照后,回收操作依赖一个核心组件:VMware Tools(新版叫VMware Tools或open-vm-tools)。这个工具安装在虚拟机内部,负责宿主机和虚拟机之间的通信,其中就包括磁盘空间回收功能。

先确认VMware Tools是否已安装并运行:

  • Windows虚拟机:任务栏右下角应该有VMware Tools的图标,或者在“程序和功能”里能看到VMware Tools。
  • Linux虚拟机:运行systemctl status vmware-tools或systemctl status open-vm-tools查看服务状态。

如果没有安装,在VMware Workstation菜单栏选择“虚拟机”→“安装VMware Tools”,然后在虚拟机内挂载光驱安装。Linux系统更推荐直接用包管理器安装open-vm-tools:

# Ubuntu/Debian sudo apt install open-vm-tools open-vm-tools-desktop # CentOS/RHEL sudo yum install open-vm-tools open-vm-tools-desktop

安装完成后重启虚拟机,确保服务正常运行。

3.3 执行回收:图形界面和命令行两种方式

图形界面方式(VMware Workstation Pro):

  1. 关闭虚拟机(必须完全关机,不是挂起)。
  2. 右键虚拟机→设置→硬盘→磁盘实用工具→压缩。
  3. 等待压缩完成,观察宿主机上.vmdk文件的大小变化。

这个“压缩”操作就是触发VMware Tools把虚拟机内标记为空闲的块归还给宿主机。压缩时间取决于磁盘大小和碎片程度,100GB的磁盘可能需要20-40分钟。

命令行方式(适合批量操作或自动化场景):

VMware Workstation自带一个命令行工具vmware-vdiskmanager,位于VMware安装目录下。用法如下:

# Windows下(在VMware安装目录执行) vmware-vdiskmanager.exe -k "D:\VMs\Ubuntu\Ubuntu.vmdk" # Linux下 vmware-vdiskmanager -k /path/to/Ubuntu.vmdk

-k参数表示收缩磁盘。执行前虚拟机必须关机,且不能有快照。

对于ESXi环境,回收方式略有不同。ESXi上用的是vmkfstools命令:

# 在ESXi Shell中执行 vmkfstools -K /vmfs/volumes/datastore1/Ubuntu/Ubuntu.vmdk

-K参数触发UNMAP操作,把空闲块归还给存储。ESXi 6.5及以上版本还支持自动UNMAP,可以在主机设置中开启,但自动回收对存储性能有一定影响,建议在业务低峰期配置。

3.4 回收效果验证:对比操作前后的文件大小

回收完成后,怎么确认真的生效了?最直接的方法是看宿主机上.vmdk文件的大小变化。在Windows资源管理器或Linux的ls -lh中查看,对比操作前后的数值。

另一个方法是在虚拟机内用df -h查看文件系统使用率,然后在宿主机上看.vmdk文件大小。两者之间的差距就是“已删除但未回收”的空间。回收后这个差距应该明显缩小。

不过要注意,精简置备磁盘的回收效果受文件系统对齐和碎片影响,不一定能100%回收所有空闲空间。如果虚拟机内文件碎片严重,回收效果会打折扣。定期做磁盘碎片整理(Windows)或fstrim(Linux)能改善回收效果。

Linux下执行fstrim:

# 对所有挂载的文件系统执行TRIM sudo fstrim -av

这个命令告诉底层存储哪些块已经不再使用,配合VMware Tools能提升回收效率。建议加到定时任务里,每周执行一次。

4. 那些年我踩过的磁盘清理坑:真实故障复盘

磁盘清理这件事,看教程觉得简单,实际操作中坑一个接一个。下面这几个是我自己或身边同事真实遇到过的,每一个都值得单独拿出来说。

4.1 快照合并到一半断电,虚拟机直接报废

这是最惨烈的一种情况。同事在一台跑了两年多的开发虚拟机上做快照合并,增量文件有60多GB,合并过程预计要半小时。他觉得无聊,中途去开了个会,结果办公室电路检修跳闸,宿主机断电。来电后虚拟机无法启动,报错“无法打开磁盘文件,父磁盘不存在”。

原因在于快照合并过程中,VMware会创建一个临时的合并文件,把原始磁盘和增量磁盘的数据往里面写。断电导致合并中断,临时文件不完整,原始磁盘和增量磁盘的链式关系被破坏。最后只能从备份恢复,丢了两天的代码。

教训很直接:合并快照前,确保宿主机不会断电,最好接UPS。合并过程中不要操作宿主机,不要运行其他重型任务。如果增量文件特别大,考虑先克隆一份虚拟机再做合并,给自己留条后路。

4.2 磁盘压缩后虚拟机启动蓝屏

另一个案例来自Windows虚拟机。压缩磁盘后重启,系统直接蓝屏,报INACCESSIBLE_BOOT_DEVICE。排查后发现,压缩操作把磁盘的某个关键扇区标记为空闲并回收了,但那个扇区实际上存着引导配置数据(BCD)。VMware Tools在标记空闲块时,依赖的是虚拟机文件系统报告的“空闲”状态,如果文件系统本身有错误,报告的信息就不准。

解决办法是用Windows安装盘启动,进入修复模式,执行bootrec /fixmbr和bootrec /rebuildbcd重建引导记录。但更根本的预防措施是:压缩前先在虚拟机内运行磁盘检查。Windows下用chkdsk /f,Linux下用fsck,确保文件系统没有错误。

:: Windows下检查并修复系统盘 chkdsk C: /f /r
# Linux下检查文件系统(需要先卸载或从Live CD启动) sudo fsck -f /dev/sda1

4.3 精简置备磁盘越用越大,回收也救不回来

精简置备磁盘有个特性:它只会增长,不会自动缩小。即使你删了文件、做了回收,如果虚拟机内曾经写入过大量数据,.vmdk文件可能已经膨胀到接近置备大小,回收只能归还“当前空闲”的块,已经写过的块即使后来被删除,回收效果也有限。

我遇到过一台虚拟机,置备100GB,实际使用30GB,但.vmdk文件已经涨到85GB。回收后只降到了75GB,效果很差。原因是磁盘碎片严重,空闲块分散在各处,回收工具只能归还连续的大块空闲区域。

这种情况下,更彻底的方案是磁盘整理后回收,或者干脆迁移到新磁盘。VMware Workstation支持“管理”→“清理磁盘”功能,但效果同样受碎片影响。最彻底的办法是创建一个新的精简磁盘,用dd或rsync把数据复制过去,然后替换旧磁盘。虽然麻烦,但能让.vmdk文件回到与实际使用量匹配的大小。

4.4 Linux虚拟机回收后df和du结果不一致

Linux下有个经典现象:df -h显示磁盘用了80%,但du -sh /统计出来只有30GB。这中间的差距通常是已删除但被进程占用的文件。某个进程打开了一个大文件,然后文件被删除了,但进程还在运行,文件句柄没释放,空间就不会被回收。

用lsof | grep deleted可以找到这类文件:

sudo lsof | grep deleted | head -20

输出中会显示哪些进程占用了已删除的文件。解决办法是重启对应进程,或者用> /proc/<pid>/fd/<fd>清空文件内容。找到罪魁祸首后,再执行磁盘回收,效果会好很多。

5. 让磁盘不再反复爆满:日常维护的几条硬规矩

清理是补救,预防才是根本。虚拟机磁盘管理如果平时不注意,每隔几个月就要折腾一次,费时费力。下面这几条是我在长期使用中总结出来的习惯,坚持下来能省很多事。

5.1 给虚拟机磁盘留足余量,别卡着用

创建虚拟机时,虚拟磁盘大小要留出至少30%的余量。比如你预计系统加软件需要50GB,那就分配80GB。精简置备模式下,多分配不会立即占用宿主机空间,但能避免后期频繁扩容。扩容虽然可以在VMware设置里直接调大磁盘容量,但扩容后还需要在虚拟机内扩展分区和文件系统,步骤繁琐且有风险。

宿主机层面同样要留余量。存放虚拟机的分区至少保留20%的空闲空间,否则VMware在合并快照、压缩磁盘时可能因为空间不足而失败。我见过宿主机磁盘只剩5GB,结果快照合并到一半报“磁盘空间不足”,进退两难。

5.2 快照用完就删,别当备份用

快照是临时状态保存工具,不是备份方案。正确的用法是:做危险操作前拍一个快照,操作完成后确认没问题,立即删除快照。快照存在时间不要超过24小时,增量文件超过10GB就要警惕。

如果需要备份,用VMware的克隆功能或者直接复制虚拟机目录。克隆是完整复制,不依赖原始磁盘,可以独立运行。复制虚拟机目录时,确保虚拟机已关机,复制完成后在新位置打开.vmx文件即可。

5.3 定期执行fstrim和磁盘检查

Linux虚拟机建议配置定时fstrim,每周执行一次。大多数现代Linux发行版已经默认启用了fstrim.timer,用systemctl status fstrim.timer确认一下。如果没有启用,手动开启:

sudo systemctl enable fstrim.timer sudo systemctl start fstrim.timer

Windows虚拟机则建议每月做一次磁盘检查和碎片整理。Windows 10及以上版本会自动进行优化,但在虚拟机环境下,自动优化可能被禁用,需要手动触发。在“此电脑”中右键磁盘→属性→工具→优化。

5.4 监控磁盘使用趋势,别等爆了才处理

在宿主机上装一个简单的监控脚本,定期检查虚拟机目录的大小和宿主机剩余空间。Linux下用du -sh配合cron,Windows下用PowerShell脚本配合任务计划程序。当剩余空间低于阈值时发邮件或弹窗提醒。

# Linux下简单的监控脚本示例 #!/bin/bash THRESHOLD=20 USAGE=$(df -h /vmfs/volumes/datastore1 | awk 'NR==2 {print $5}' | sed 's/%//') if [ $USAGE -gt $THRESHOLD ]; then echo "警告:虚拟机存储空间使用率已达 ${USAGE}%" | mail -s "存储空间告警" admin@example.com fi

这个脚本每小时跑一次,提前预警,避免临时抱佛脚。

5.5 虚拟机内也要养成清理习惯

最后一条,虚拟机内部的文件管理同样重要。下载目录定期清空,日志文件配置轮转策略,开发工具的缓存目录定期清理。这些习惯养成了,磁盘回收的频率和难度都会大幅降低。

以日志轮转为例子,Linux下配置logrotate,Windows下配置事件日志的最大大小和覆盖策略。别让日志无限增长,那是在给未来的自己挖坑。

提示:所有清理操作前,确认虚拟机没有正在运行的关键任务。生产环境的虚拟机建议先在测试环境验证清理流程,确认无误后再操作。

磁盘清理这件事,说到底就是理解虚拟磁盘的工作机制,然后按“内部清理→快照处理→宿主机回收→日常预防”这个顺序走。每一步都有坑,但踩过一次记住教训,后面就是例行公事了。我在实际使用中发现,最省事的做法还是从一开始就规划好磁盘容量和快照策略,别等到磁盘爆满才想起来清理,那时候往往已经积重难返了。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/26 15:59:20

用 Kaggle 币价时序回归项目入门价格预测实战

CiVilium Price Prediction 是一道很适合做时序建模入门的 Kaggle 练习题。数据字段极少,只有时间戳与成交量,目标却是预测高频交易窗口下的加权价格,这种设定能够把注意力集中到任务理解、时间验证、特征工程和误差控制这些真正影响结果的核心环节。 这类题目的价值不只在…

作者头像 李华
网站建设 2026/9/26 15:58:13

政企网络2.5G双光口网卡:安全与业务流量物理隔离实战指南

1. 政企网络里“看不见的堵点”&#xff1a;为什么2.5G双光口不是升级&#xff0c;而是重构你有没有遇到过这样的场景&#xff1a;某市政务云平台刚上线一套新审批系统&#xff0c;用户反馈“提交卡顿、附件上传超时”&#xff0c;运维日志里却找不到明显错误&#xff1b;或者某…

作者头像 李华
网站建设 2026/9/26 15:57:12

毕业论文写作工具红黑榜:2026实测避雷指南

三月底交初稿&#xff0c;四月初被导师批注糊满页边距&#xff0c;五月底查重飘红——这是绝大多数26届毕业生正在经历的循环。毕业论文写作工具这两年冒出来几十个&#xff0c;宣传话术一个比一个唬人&#xff0c;实际用起来却参差不齐。这篇红黑榜基于26届毕业生实际使用反馈…

作者头像 李华
网站建设 2026/9/26 15:57:10

V1项目封装式复盘:从请求层到AI流式交互的工程实践

V1项目交付那天&#xff0c;我在发布验证通过后做的第一件事&#xff0c;不是开香槟&#xff0c;而是把半年的代码从头翻了一遍&#xff0c;边看边记。这个动作看起来很笨&#xff0c;但后来证明它比加班写新功能更值钱——因为它产出了一套可以被V2直接使用的“封装”。这篇文…

作者头像 李华
网站建设 2026/9/26 15:57:02

Mac刘海屏的交互革命:Atoll如何激活黄金交互带

1. 为什么Mac的刘海屏不是“缺陷”&#xff0c;而是被低估的交互新大陆&#xff1f;你第一次看到MacBook Pro的刘海屏时&#xff0c;是不是也下意识皱了眉头&#xff1f;——“苹果怎么把笔记本做成手机了&#xff1f;”“这黑条挡不挡内容&#xff1f;”“视频会议时脸被切掉一…

作者头像 李华