虚拟机磁盘空间异常耗尽,优先用 df -h 或资源监视器确认哪个分区满了,再用 du、find、lsof 定位大文件和已删除未释放句柄,结合日志切割、缓存清理和快照删除,多数情况能快速恢复。 真正需要立即扩容的场景并不多,盲目加盘反而掩盖了根因。
业内专家指出,磁盘空间告警是虚拟化环境最高频的运维事件之一,但相当一部分案例通过清理和配置优化就能解决,下面按排查顺序拆解,每个步骤都给出可验证的命令和操作路径。
虚拟机磁盘空间异常耗尽怎么排查?先看这五个方向
第一步:快速确认磁盘使用率与分区挂载情况
登录虚拟机后,第一件事不是急着删文件,而是看清全局,Linux 下执行:
df -h:查看各分区使用率,确认是哪个挂载点满了。df -i:检查 inode 使用率,inode 耗尽时,df -h可能显示有空间,但无法创建新文件。lsblk:查看块设备与分区对应关系,避免误判 LVM 逻辑卷。vgs、lvs:如果使用 LVM,确认卷组剩余空间和逻辑卷分布。
Windows 虚拟机则打开“资源监视器”的磁盘选项卡,或“磁盘管理”查看各卷剩余空间,注意页面文件、卷影副本和 WinSxS 目录可能占用大量空间。
第二步:定位具体大文件与目录
确认根分区或数据分区满了之后,逐层下钻,常用命令:
du -sh / 2>/dev/null | sort -rh | head -10:列出根目录下最大的十个目录。- 进入最大目录后继续
du -sh | sort -rh | head -10,直到找到具体文件。 find / -type f -size +1G -exec ls -lh {} ; 2>/dev/null:查找大于 1GB 的文件。- 安装
ncdu工具交互式浏览,效率更高。
需要排除 /proc、/sys、/dev 等虚拟文件系统,它们不占实际磁盘。
第三步:检查被删除但未释放的文件
这是最隐蔽的陷阱,文件被 rm 删除后,如果仍有进程持有句柄,磁盘空间不会释放,用:

lsof | grep deleted或lsof +L1:列出已删除但打开的文件。- 找到对应进程后,重启该服务即可释放,若不能重启,可尝试
echo > /proc/PID/fd/FD清空文件描述符。
常见于日志文件被手动删除,但 syslog、nginx、java 进程仍写入原 inode。
第四步:排查日志与临时文件
日志是磁盘增长的头号嫌疑,检查:
/var/log/下messages、secure、journal等大文件。journalctl --disk-usage查看 systemd journal 占用,用journalctl --vacuum-size=100M收缩。- 检查
/tmp、/var/tmp是否有残留大文件。 - 确认
logrotate配置是否生效,避免单个日志无限增长。
第五步:检查快照与虚拟磁盘膨胀
虚拟机快照会持续占用存储,且删除快照前增量文件不断增长,在 VMware 中打开“快照管理器”,KVM 环境用 qemu-img info 查看 qcow2 实际占用与虚拟大小差异,行业共识认为,长期保留快照是磁盘空间异常耗尽的常见原因之一,建议快照保留不超过 72 小时。
云服务器磁盘空间满了如何清理?实战操作路径
日志文件清理与轮转策略
不要直接 rm 正在写入的日志,正确做法:
- 清空文件内容:
> /var/log/nginx/access.log。 - 配置
logrotate,按天或按大小轮转,保留 7 到 14 份。 - 对 systemd journal 设置
SystemMaxUse=500M并重启服务。
容器与缓存目录清理
Docker 环境重点检查:
docker system df查看镜像、容器、卷占用。docker system prune -a清理未使用资源,注意确认无运行容器依赖。/var/lib/docker/overlay2可能因日志驱动配置不当而膨胀,检查daemon.json中log-opts的max-size和max-file。
数据库与应用程序日志
MySQL 的 binlog、慢查询日志、错误日志容易失控,设置

expire_logs_days 或 binlog_expire_logs_seconds,Redis 的 AOF 和 RDB 文件也要定期检查,应用侧日志建议输出到独立分区,避免撑爆根目录。
系统包管理器缓存
- CentOS/RHEL:
yum clean all或dnf clean all。 - Ubuntu/Debian:
apt clean、apt autoremove。 - 清理
/var/cache/apt/archives和/var/cache/yum。
操作后再次执行 df -h 确认释放效果,据统计,通过上述清理,较大比例的空间告警可立即缓解。
Windows与Linux虚拟机磁盘空间不足排查差异对比
Windows虚拟机排查路径
- 资源监视器定位写入频繁的进程。
- 磁盘清理工具清理系统临时文件、回收站、Windows 更新缓存。
- 检查
C:WindowsWinSxS是否异常膨胀,用DISM /Online /Cleanup-Image /StartComponentCleanup清理。 - 卷影副本占用:
vssadmin list shadowstorage,必要时调整存储上限。 - 页面文件
pagefile.sys可能占用数十 GB,确认是否合理。
Linux虚拟机排查路径
- 核心命令
df、du、lsof、find。 - 关注 inode 使用率,而非仅看块设备使用率。
- 检查
/var/log、/var/lib/docker、/home等目录。
两者共性陷阱
删除文件未释放句柄、快照长期保留、日志无限增长,无论 Windows 还是 Linux,都应建立磁盘使用率监控,在达到 80% 时提前介入,而不是等到 100% 告警。
北京地区虚拟机磁盘扩容价格与成本考量
什么情况需要扩容而非清理
如果数据持续增长,且清理后几天内再次告警,说明原始容量规划不足,例如数据库数据目录、视频存储、日志归档等场景,扩容是合理选择,反之,若清理后使用率长期低于 70%,则优先优化配置。
北京地区云厂商扩容价格参考
北京地域的云服务器扩容通常按云盘类型计费:
| 云盘类型 | 计费方式 | 价格参考(北京地域) |
|---|---|---|
| 高效云盘 | 按量付费 | 约 0.35 元/GB/月 |
| SSD 云盘 | 包年包月 | 约 1 元/GB/月 |
| ESSD 云盘 | 按量付费 | 约 1.2 元/GB/月 |
具体价格随厂商活动和折扣变化,以控制台为准,扩容前确认实例是否支持在线扩容,以及文件系统是否支持 resize2fs 或 xfs_growfs。
扩容操作步骤与风险
以 Linux 为例:
- 控制台扩容云盘容量。
- 登录实例执行
growpart /dev/vda 1扩展分区。 - 执行
resize2fs /dev/vda1或xfs_growfs /扩展文件系统。 df -h确认新容量。
Windows 则在磁盘管理中右键“扩展卷”,注意:扩容不可逆,且部分实例类型需要重启,操作前务必创建快照备份。
结尾自然收束:虚拟机磁盘空间异常耗尽,排查顺序永远是先定位、再清理、最后扩容。 建立日志轮转和监控告警,比事后救火更有效。
关于虚拟机磁盘空间异常耗尽的常见问答
虚拟机磁盘空间突然满了,重启能解决吗?
重启只能释放被删除但未释放的文件句柄,以及清理部分临时文件,如果是日志持续写入或数据增长导致,重启后很快会再次占满,重启不是通用方案,应先用 lsof 和 du 定位根因。
清理后磁盘空间没有释放是什么原因?
最常见是进程仍持有已删除文件的句柄,用 lsof | grep deleted 确认,其次是文件系统保留了预留空间,或快照文件未删除,LVM 逻辑卷也可能因 thin pool 元数据占用而显示未释放。
虚拟机磁盘空间不足会影响业务运行吗?
会,根分区写满后,系统无法创建新进程、写入日志或建立临时文件,数据库可能拒绝写入,应用直接报错,即使数据分区未满,根分区满也会导致 SSH 登录失败或服务崩溃,监控使用率并设置阈值告警是基础运维要求。
