虚拟机磁盘满了,先别急着重启或重建实例:多数情况下可以先用 df、du 定位占用,清掉日志、容器残留和“已删除但被进程占用”的文件把空间救回来;清理解决不了再走扩容,最后才是迁移数据。
虚拟机磁盘满了会怎样?先看症状再动手
磁盘满不是“突然发生”的,它通常有一串可观察的前兆,搞清症状,能省掉大量瞎猜的时间。
三类典型症状
- 登录就开始卡:SSH 能连上但命令响应极慢,执行任何写操作都返回
No space left on device。 - 服务静默降级:Nginx 写不了 access.log,MySQL 直接进入只读模式,应用日志里堆满
write failed。 - 面板显示正常但业务 502:云控制台看 CPU、内存都平稳,实际是临时目录写满导致进程崩溃。
业内专家指出,生产环境中相当一部分“应用无故挂掉”的工单,最终都追到了磁盘占用这一层,所以排障顺序上,先确认磁盘状态,再怀疑代码。
第一步永远是这两个命令
df -h # 看容量 df -i # 看 inode
两个结果指向完全不同的病因:
| 现象 | 判断 | 处理方向 |
|---|---|---|
Use% 接近 100%,inode 正常 |
空间真的被占满 | 删文件、清日志、扩容 |
空间还有余量,IUse% 接近 100% |
inode 耗尽 | 找大量小文件(缓存、session、邮件队列) |
刚删完大文件,df 不降 |
文件句柄仍被进程持有 | 重启对应服务或 truncate |
inode 这一项经常被漏掉,一个几十 GB 的盘,可能只用了 20% 容量,却因为几十万个小文件把 inode 吃干净,症状和磁盘满一模一样。
Linux虚拟机磁盘空间不足怎么清理?按目录从大到小排
用 du 和 ncdu 快速定位占用
命令行逐层下钻,是最稳的办法:
du -sh / 2>/dev/null | sort -rh | head -20 du -sh /var/ 2>/dev/null | sort -rh | head -10
如果机器上有交互界面,装个 ncdu 会舒服很多,方向键直接浏览,不用反复敲命令,注意扫描根目录时加上 -x 参数,避免跨挂载点把整个 NFS 也扫一遍。
五类最常见的“吃盘大户”
- 系统日志:
/var/log下的 messages、syslog、应用日志,先用journalctl --disk-usage看 journal 占了多少,再journalctl --vacuum-size=500M收缩。 - 容器残留:
docker system df一眼看清镜像、容器、卷、构建缓存各占多少,docker system prune -a清理未使用项,生产环境执行前确认没有依赖悬空镜像的容器。 - 被删除却未释放的文件:
lsof +L1能列出deleted状态仍被进程持有的文件,这是“删了没效果”的头号原因。 - 包管理缓存:
yum clean all、apt-get clean、pip cache purge,这类缓存往往几个 GB 起。 - 数据库附属文件:MySQL 的 binlog、PostgreSQL 的 WAL、临时表空间,这类文件不能直接
rm,要走PURGE BINARY LOGS之类的官方命令。
清理时最容易踩的三个坑
- 别用
rm处理正在被写的日志:服务持有句柄,空间不会释放,还可能写进空洞文件,正确姿势是truncate -s 0 文件名或> 文件名。 - 别删不清楚用途的目录:
/var/lib/mysql、/var/lib/docker里的文件删错一个,恢复成本远高于扩容成本。 - 注意软链接:
du统计的是链接本身,不是目标文件,排查时用du -L或先ls -l确认。
云服务器磁盘满了不关机怎么扩容?三条路径先选对
清理只是止血,业务在长,容量终究要加,选路径比执行命令更重要。
| 方案 | 停机需求 | 风险 | 适用场景 |
|---|---|---|---|
| 扩容系统盘 | 多数云厂商支持在线扩容,文件系统需在线扩 | 中,操作失误影响系统盘 | 系统盘被日志、应用占满 |
| 新挂数据盘 | 无需停机 | 低 | 数据可迁移,想长期分离系统与数据 |
| 迁移到对象存储 | 无需停机 | 低 | 大量冷数据、备份、图片视频 |
行业共识认为,系统盘和数据盘分离是长期运维的基本盘:系统盘只放操作系统和应用,数据盘单独挂载,扩容时互不牵连。
Linux LVM 扩容的标准动作
云主机扩完磁盘规格后,系统内还需要一串操作,顺序不能乱:
lsblk # 确认新容量已被识别 growpart /dev/vda 1 # 扩展分区(非 LVM 场景) pvresize /dev/vda1 # 刷新物理卷 lvextend -l +100%FREE /dev/mapper/centos-root resize2fs /dev/mapper/centos-root # ext4 xfs_growfs / # xfs 用这个 df -h # 验证
ext4 用 resize2fs,xfs 用 xfs_growfs,用错命令会直接报错,不会损坏数据,但也扩不上去。
虚拟机磁盘扩容后文件系统没变化怎么办
这是搜索量很高的一类问题,原因通常就三个:
- 分区表没刷新:执行
partprobe或partx -u /dev/vda后重试。 - 只扩了分区,没扩文件系统:
lsblk看到分区变大了,但df -h没变,说明还差最后一步resize2fs/xfs_growfs。 - 存在快照:VMware 场景下,虚拟机若有未合并的快照,磁盘扩展选项会被限制,需要先合并或删除快照。
VMware 的流程还要多一步:先在 vSphere 里编辑虚拟机设置扩展磁盘容量,再进系统扩分区和文件系统,Windows 虚拟机相对简单,磁盘管理里“扩展卷”即可,前提是扩展的分区后面有连续未分配空间。
临时救急的取巧办法
如果一时扩不了容,可以先把大目录软链到新挂载的盘上,或者把历史日志、备份文件搬到对象存储,这类操作能撑几天,但不该当作长期方案。
预防:把告警做在爆盘之前
清理和扩容都是被动应对,真正省心的是让它别满。
监控阈值与告警项
常见做法是把使用率 80% 设为预警、90% 设为严重,用 Prometheus 的 node_exporter 采集时,关注 node_filesystem_avail_bytes 和 node_filesystem_files_free,后者就是 inode 指标,别只盯容量,Zabbix 用户可以直接套用文件系统模板,把触发器按挂载点分开配。
日志与临时文件的自动化治理
- 给
/etc/logrotate.d/下的应用日志配daily、rotate 7、compress,别让单个日志无限增长。 - 在
journald.conf里设置SystemMaxUse=1G,给 journal 一个硬上限。 - 用 cron 定期执行容器清理,比如每周一次
docker system prune -f --filter "until=168h"。 - 临时目录用
tmpwatch或tmpreaper清理超过 N 天未访问的文件。
架构层面的几个习惯
- 系统盘小、数据盘大,扩容时只动数据盘。
- LVM 预留空间,方便后续在线扩。
- 快照和备份不要放在同一块盘上,否则盘满时备份也一起丢。
- 容器日志驱动加限制,
json-file配上max-size=100m、max-file=3,这一条能挡掉大量容器场景的爆盘。
虚拟机磁盘满常见问题解答
虚拟机磁盘满会导致什么后果?
轻则应用日志写入失败、上传功能报错,重则数据库切只读、服务进程异常退出,甚至系统无法正常登录,部分文件系统在空间耗尽时还会产生元数据不一致,恢复时需要 fsck,所以磁盘告警应该和 CPU、内存同级对待,而不是等出事再查。
虚拟机磁盘扩容后为什么 df 看不到变化?
核心是“三层要逐层扩”:块设备层、分区层、文件系统层,云厂商控制台扩完只是第一层,系统内还要 growpart 扩分区、resize2fs 或 xfs_growfs 扩文件系统,三层缺任何一层,df -h 都不会变,中间若存在快照,扩容还会被阻止。
删掉大文件但空间没释放,怎么处理?
文件被进程打开时,删除只是移除了目录项,inode 和数据块仍被占用,用 lsof +L1 找到持有该文件的进程,重启对应服务即可释放;不方便重启时,用 truncate -s 0 清空文件内容,效果等同于释放空间,据近年来的运维实践总结,这一现象在日志和数据库临时文件上出现频率最高。
磁盘这件事,本质是“资源有上限、增长无感知”,把监控阈值、日志轮转和扩容预案三件事提前配好,比任何一次深夜救火都划算。
图片来源于AI模型,如侵权请联系管理员。作者:酷小编,如若转载,请注明出处:https://www.kufanyun.com/ask/929061.html


评论列表(2条)
这篇文章写得非常好,内容丰富,观点清晰,让我受益匪浅。特别是关于接近的部分,分析得很到位,给了我很多新的启发和思考。感谢作者的精心创作和分享,期待看到更多这样高质量的内容!
这篇文章的内容非常有价值,我从中学习到了很多新的知识和观点。作者的写作风格简洁明了,却又不失深度,让人读起来很舒服。特别是接近部分,给了我很多新的思路。感谢分享这么好的内容!