Linux 磁盘空间没满但仍写不进去:inode 用尽的定位、清理与复测
有些 Linux 故障很容易被 df -h 误导:磁盘还剩几十 GB,应用却在创建临时文件时直接报 No space left on device。这通常是 inode 用完了——容量统计看的是字节,inode 统计的是文件、目录等文件系统对象的数量。
先用
df -i看 inode 使用率,再定位小文件最多的目录;确认无业务风险后清理,最后用同一组命令复测容量、inode 和服务写入。
df -h正常不代表还能创建文件,df -i才能确认 inode 是否耗尽。- 定位时先从挂载点和一级目录入手,不要直接对整个根目录执行高风险删除。
- 日志切割、缓存碎片和临时文件是小文件爆发的常见来源,清理策略要保留最近可用数据。
- 复测不能只看容量,至少还要检查 inode、应用写入和服务日志。
为什么磁盘还有空间,mkdir 仍然会失败
文件系统创建一个新文件时,需要同时分配数据块和 inode。前者存放文件内容,后者记录权限、所有者、时间和数据块位置。小文件很多时,数据块可能还没用尽,inode 却先到达上限。
先看两个指标,不要急着改日志配置:
df -hT /var
df -i /var
findmnt -T /var
如果 df -i 的 IUse% 接近 100%,而 df -h 仍有余量,方向就很明确了。findmnt 用来确认目标路径实际落在哪个挂载点,避免把清理范围误判成整个根分区。

用一组低风险命令找出小文件堆积点
排查的第一步是找“哪个挂载点满”,第二步才是找“哪个目录制造了大量对象”。下面的命令只统计,不删除:
df -iP | sort -k5 -h
sudo find /var -xdev -type f -printf '%h\n' 2>/dev/null | sort | uniq -c | sort -nr | head -20
-xdev 很关键,它让 find 不跨到其他文件系统;否则挂载在 /var 下的目录也可能被算进来,结果既慢又容易误导。第二条命令按文件所在目录计数,通常能很快暴露出某个缓存目录、临时目录或日志碎片目录。
如果需要知道目录体积,再单独检查候选路径:
sudo du -xhd1 /var 2>/dev/null | sort -h
sudo find /var/cache/my-service -xdev -type f | wc -l
sudo find /var/cache/my-service -xdev -type f -printf '%TY-%Tm-%Td %p\n' | sort | head -20
这里不要只盯着最大的目录。一个占用 2 GB 的目录可能只有几百个大文件,而另一个只有 800 MB 的目录可能塞了数百万个几 KB 的碎片文件,后者才是 inode 的主要消耗者。
清理顺序:先止住增长,再处理可重建数据
清理前先确认候选目录属于谁、是否仍在写入。对正在增长的日志或队列目录直接删除,可能导致应用句柄指向已删除文件,甚至丢掉仍未消费的任务。
更稳妥的顺序是:
- 先暂停制造碎片文件的定时任务或降低写入速率,并记录当前 inode 使用率。
- 优先处理明确可重建的缓存、过期临时文件和已经上传到集中日志系统的旧日志。
- 使用应用自带清理命令或日志轮转;必须手动删除时,限定绝对路径、文件类型和时间范围。
- 清理后立即复测,不要一次性扩大删除范围。
# 示例:只列出 14 天前的缓存文件,先看清单
sudo find /var/cache/my-service -xdev -type f -mtime +14 -print | head -50
# 确认清单无误后再删除;生产环境应配合维护窗口
sudo find /var/cache/my-service -xdev -type f -mtime +14 -delete
如果是日志问题,优先检查 logrotate 是否正常运行、轮转后的压缩文件是否仍然产生过多分片,以及应用是否持有已删除的大日志。后者可以通过 lsof +L1 发现:文件名已经消失,但进程仍占着空间;它主要影响容量,不一定解决 inode 问题,却经常和这类故障一起出现。

用前后指标确认修复真的生效
清理完成后,至少保存下面四项结果。单看 df -h 变绿,只能说明数据块释放了,不能证明 inode 或业务写入已经恢复。
| 检查项 | 修复前关注 | 修复后应看到 |
|---|---|---|
| 挂载点 | findmnt -T /var 结果 | 路径和文件系统没有误判 |
| inode | IUse% 接近 100% | 有明显余量,且不再持续上升 |
| 文件创建 | mkdir 或临时文件报错 | 测试目录可创建、删除 |
| 服务状态 | 日志出现 No space left on device | 新请求能写日志或落盘 |
test_dir=/var/tmp/inode-recheck-$$
mkdir "$test_dir" && touch "$test_dir/probe" && rm -f "$test_dir/probe" && rmdir "$test_dir"
df -iP /var
tail -n 50 /var/log/my-service/app.log
如果 inode 很快再次上涨,问题不是“还没删干净”,而是增长源仍在运行。把刚才的目录计数命令加入短时间观察,结合 find 输出的文件名模式,回到日志轮转、缓存过期或临时文件清理策略上处理根因。
几个容易把故障越修越大的误区
把 rm -rf /var/* 当作快速修复
这种做法无法区分缓存、队列、配置和运行时目录,风险远高于 inode 故障本身。先确定挂载点和具体目录,再用时间、后缀或文件名模式收窄范围。
只看目录大小,不看文件数量
du -sh 适合找容量大户,不能替代 inode 统计。文件数量要用 find ... | wc -l 或按目录聚合的计数命令确认。
删除日志后立刻重启所有服务
重启可能释放被删除文件占用的容量,却不能修复仍在持续生成小文件的配置。先找到增长源,再决定是否需要重启或滚动重载。
相关问题
inode 用完一定是小文件太多吗?
通常是,但也可能是某个程序反复创建临时文件却没有及时清理。用目录级文件计数和文件名模式确认,不要只凭目录体积猜测。
清理 inode 后 df -h 为什么变化不大?
因为你释放的主要是 inode,不一定释放了很多数据块。只要 df -i 恢复且业务可以创建文件,容量变化小并不代表清理失败。
能不能通过扩容解决 inode 不够?
单纯扩大虚拟磁盘未必增加当前文件系统的 inode 数量。应先确认文件系统类型和扩容方式;短期先止住小文件增长,长期再调整存储设计。
总结:把容量和对象数量分开看
Linux 写不进文件时,df -h 只是一个入口。先用 df -i 判断 inode,再用不跨挂载点的统计命令锁定小文件目录,按可重建数据、时间范围和业务状态逐步清理,最后用创建文件、inode 和服务日志做闭环验证。这套顺序比“看到报错就删目录”慢不了多少,却能显著降低误删风险。
2026年立秋是几月几号?交节后天气会马上转凉吗
- 上一篇
- 2026年立秋是几月几号?交节后天气会马上转凉吗
- 下一篇
- CSS 容器查询实现响应式卡片:container-type 与 @container 的最小配方
-
- 文章 · linux | 1天前 | [] · []
- Linux inotify 监听数量不够怎么查:max_user_watches、进程占用与持久化配置
- 382浏览 收藏
-
- 文章 · linux | 1天前 |
- Ubuntu 22.04 升级 24.04 后 Linux 服务环境变量失效:旧 unit 的迁移与回滚
- 429浏览 收藏
-
- 文章 · linux | 3天前 |
- Linux journalctl 重启后日志不见怎么办:--list-boots、持久化目录与核对方法
- 292浏览 收藏
-
- 文章 · linux | 1星期前 | Linux · 运维 · 服务管理 · Linux path EnvironmentFile
- Linux 服务重启后找不到 PATH 怎么办:EnvironmentFile、登录 Shell 和启动日志排查
- 187浏览 收藏
-
- 文章 · linux | 1星期前 | Linux · ssh · 运维 · 安全加固 · Linux SSH sshd_config 密钥登录 AllowUsers
- Linux SSH 仅允许密钥登录怎么做:账户白名单、配置检查和可回退发布
- 257浏览 收藏
-
- 文章 · linux | 1星期前 | Linux · 安全 · 运维 · 服务加固 · Linux服务单元 PrivateTmp NoNewPrivileges ReadWritePaths 服务加固
- Linux 服务单元怎么加固:只读根、私有临时与可写路径白名单
- 259浏览 收藏
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 543次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 516次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 500次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 485次学习
-
- ljg-skills
- ljg-skills 是李继刚开源的 AI 技能与提示词集合,面向大模型使用者整理了一批可复用的 prompt、角色设定和任务技能模板,适合用于学习提示词设计、搭建个人 AI 工作流和沉淀团队常用智能体能力。
- 4719次使用
-
- MELO音乐
- MELO音乐是一站式AI视频与音乐制作助手,对标suno, udio的高品质体验。提供伴奏生成、原创写词、无损导出、哼唱识曲、混音变声等全套音频与短视频编辑工具。无论是流行Kpop、电音说唱、民谣古风、摇滚儿歌还是商用轻音乐,MELO为你免费谱曲,轻松做同款!
- 4321次使用
-
- UniScribe
- UniScribe 是一款 AI 音视频转文字与内容整理工具,支持上传音频、视频文件或粘贴 YouTube 链接,自动生成转写文本、摘要、思维导图和关键问题,并支持多格式导出,适合会议记录、课程学习、访谈整理和内容创作复盘。
- 4270次使用
-
- 剧云
- 剧云是专业中文剧本创作平台,安全稳定运行十余年,集成AI编剧、剧本医生审核、人物小传、剧情关系图、大纲编写、多人协作、Word导入导出、版权管控功能,数据安全防护,轻松高效创作剧本。
- 4496次使用
-
- 万象有声
- 万象有声,一个专为有声创作者打造的新一代智能有声内容创作平台。平台提供专业的智能拆章、智能画本编辑、AI配音、AI生成音效、后期制作、智能对轨、智能审听等有声创作全流程工具,可以帮助创作者高效、低成本创作出引人入胜的有声作品。立即体验,让有声书制作更简单!
- 4453次使用
-
- Linux搭建vsftpdFTP服务器教程
- 2026-04-30 501浏览
-
- Shell脚本安装教程:.sh一键安装指南
- 2026-03-16 501浏览
-
- Linux清空文件内容的几种方法
- 2025-12-01 501浏览
-
- Linux命令行下载文件技巧
- 2025-11-23 501浏览
-
- Linuxapt与yum配置技巧全解析
- 2025-09-23 501浏览

