VPS磁盘100%但找不到大文件?从df、du、inode到已删未释放文件排查

容量、inode和目录文件是三套视角,先分清再释放空间
发布于
10

VPS磁盘显示100%,却用du找不到对应大文件,先不要盲目删除日志、数据库或容器目录。df观察文件系统整体已用空间,du统计当前目录树可见文件;已删除但仍被进程打开的文件、挂载边界、文件系统保留空间和inode耗尽,都可能让两者看起来矛盾。

先确认是容量满,还是inode满

df -h
df -i
结果 含义 下一步
Use%接近100% 文件系统数据块接近耗尽 定位目录、已删文件、保留空间和挂载
IUse%接近100% 小文件数量耗尽inode 定位缓存、会话、邮件、构建产物等小文件密集目录
两者都正常 故障可能不在当前挂载点 核对应用使用的卷、容器卷与实际路径

磁盘容量和inode是两种不同资源。还有可用GB却无法创建文件,常见原因就是inode耗尽;反过来,inode充足也不能解决数据块已满。

第一步:确定哪个文件系统真的满了

不要直接从根目录无边界扫描。先用df -h找到已满的挂载点,再在该文件系统内统计一级目录:

sudo du -x -h --max-depth=1 /目标挂载点 2>/dev/null

-x用于限制在同一文件系统内,避免把其他磁盘、网络存储或容器挂载混入结果。逐级缩小到异常目录后,再检查日志、备份、上传文件、包缓存、数据库、容器层和临时文件。

不要把du输出直接按名称猜测后删除。数据库数据目录、容器存储和系统日志都有各自的清理方式,绕过应用直接删除可能造成数据损坏。

第二步:检查已删未释放文件

Linux进程可以继续持有已经从目录中删除的文件。目录项消失后,du不再统计它,但只要进程仍打开该文件,文件系统空间就不会释放。可以只读检查:

sudo lsof +L1

重点看文件大小、进程名、PID和挂载点。常见情形是日志文件被删除后,Web服务、数据库或其他守护进程仍向旧文件描述符写入。

处理时不要直接杀死不明进程。先确认进程角色、服务影响和可用维护窗口;对支持日志重新打开的服务使用其正式轮转或重载方式,必要时安排受控重启。完成后再次运行df -h,确认空间是否释放,并检查服务是否恢复正常。

第三步:df和du是不是看了不同的边界

以下情况也会产生差异:

  • 目录下后来挂载了另一文件系统,原目录中的旧文件被挂载点遮住;
  • 容器使用独立层、命名空间、卷或日志驱动;
  • 快照、文件系统元数据或写时复制占用没有表现为普通文件;
  • 命令统计时文件仍在快速增长或删除;
  • du没有权限读取部分目录,错误又被忽略;
  • 文件系统为管理员或紧急操作保留了部分数据块。

先查看挂载关系和文件系统类型,再决定使用何种工具。不要为了让两个数字“看起来一样”而改文件系统保留比例;该空间可能用于防止根分区完全失控,修改前要理解文件系统和恢复需求。

第四步:日志、容器和数据库分别查

系统日志

journalctl --disk-usage

先查看日志总占用和轮转配置。清理前确认需要保留的审计周期,并使用日志系统支持的保留策略;直接删除正在使用的日志可能再次造成已删未释放文件。

容器存储

查看镜像、容器、卷和构建缓存各自占用,并核对业务是否仍引用。所谓“未使用”要由当前编排和恢复需求确认,不能在生产机上直接执行大范围自动清理。

数据库

数据库空间应从库表、日志、临时文件、归档和备份策略定位。不要在文件系统层直接删除数据文件或事务日志。先做一致性备份、确认保留规则,再通过数据库支持的方式处理。

一般的日志、Docker与数据库安全清理顺序,可继续参考VPS磁盘空间满后的分类定位方法。本文重点解决的是dfdu不一致的隐藏占用。

第五步:inode满时怎么找小文件来源

inode耗尽通常不是一个大文件,而是大量小文件。先在已满挂载点内按目录统计文件数量,逐级缩小到缓存、会话、邮件队列、解压目录、构建产物或异常任务。

定位过程中避免跨越其他挂载点,也不要在业务高峰启动无边界的全盘find扫描。大量目录遍历本身会消耗I/O。找到来源后,应修复生成策略、过期机制和轮转,而不是只清一次等它再次占满。

磁盘已满时的安全处置顺序

  1. 暂停会继续大量写入的非关键任务,避免故障扩大;
  2. 保存df、inode、挂载和服务状态等初始证据;
  3. 优先清理明确可再生成且不被业务使用的临时数据;
  4. 对日志、容器和数据库使用各自支持的清理方法;
  5. 处理已删未释放文件时,安排服务重载或受控重启;
  6. 释放少量空间后先确认系统、SSH和关键服务稳定;
  7. 再做完整清理、扩容或数据迁移,并设置告警。

如果系统已经无法写日志、登录或启动服务,应优先通过云控制台、救援环境或服务商支持恢复最小管理能力。不要在缺少备份时尝试文件系统修复或批量删除。

扩容完成为什么系统里还是原容量

云平台扩大虚拟磁盘,只是增加了块设备容量。操作系统可能仍需要扩展分区、LVM逻辑卷和文件系统。具体步骤取决于分区表、LVM、文件系统类型和根分区结构,不能把某一套命令通用于所有VPS。

扩容前应创建可恢复备份或快照,记录分区与挂载信息,并确认平台文档。快照与异地备份的恢复边界可参考VPS快照、文件备份和异地恢复的区别

故障恢复后补上三类告警

  • 容量阈值:监控已用百分比和可用空间趋势;
  • inode阈值:监控文件数量增长,尤其是缓存与会话目录;
  • 增长来源:监控日志、容器、数据库、备份和上传目录的日增长。

告警要留出排查时间,不应等到100%才通知。还要验证日志轮转、备份保留和临时文件清理是否真正执行,而不是只写了配置。

VPS磁盘100%而du找不到大文件时,正确顺序是先区分容量与inode,再锁定挂载点,检查已删未释放文件、挂载边界和专用存储,最后才决定清理或扩容。保留初始证据、一次只处理一个来源,比盲目删除更容易恢复,也能防止同类故障重复发生。

常见问题(FAQ)

为什么df显示磁盘满了,du却找不到大文件?
常见原因包括文件已删除但仍被进程打开、du跨越或漏掉挂载边界、权限不足、容器或快照占用、文件系统保留空间以及统计期间文件持续变化。
VPS还有磁盘空间为什么不能创建文件?
可能是inode已耗尽。使用df -i检查文件数量资源;大量缓存、会话、邮件或构建小文件可能用完inode,即使仍有可用GB也无法创建新文件。
已删除但未释放的文件怎么查?
可用sudo lsof +L1只读查看仍被进程打开的已删文件。处理前确认进程和业务影响,通过正式日志轮转、重载或受控重启释放,避免直接终止关键进程。
VPS磁盘满了可以直接删除Docker或数据库目录吗?
不可以。容器和数据库应使用各自支持的清理、备份和保留机制。直接删除数据目录可能造成不可恢复的数据损坏。

本文由作者原创/授权发布于极跃圈(jiyueip.com)未经许可,禁止转载。题图来自Unsplash,基于CC0协议。

声明:极跃圈(JIYUEIP.com)内网友所发表的所有内容及言论仅代表其本人,并不反映任何极跃圈(JIYUEIP.com)之意见及观点。

0 讨论
热门最新
总结
暂无总结
0 / 600

VPS磁盘满了最常见的表现:网站打不开(MySQL写不进去)、Docker容器启动失败(没空间写日志)、SSH登录巨慢。本文用du和ncdu两个命令找到谁在吃空间,再针对Docker日志、系统日志和旧备份三类大户下手清理。 第一步:确认磁盘