EXT4 文件系统 inode 耗尽导致无法写入文件怎么清理和排查?

文章导读
当系统提示磁盘空间不足但 df -h 显示仍有剩余时,大概率是 inode 耗尽,建议优先使用 df -i 确认使用率,再通过 find 命令清理海量小文件,非必要不重装系统。
📋 目录
  1. 命令速用版
  2. 为什么会这样
  3. 分步处理
  4. 怎么验证是否生效
  5. 常见坑
  6. 参考文档
A A

当系统提示磁盘空间不足但 df -h 显示仍有剩余时,大概率是 inode 耗尽,建议优先使用 df -i 确认使用率,再通过 find 命令清理海量小文件,非必要不重装系统。

先说结论:这是典型的索引节点耗尽问题,磁盘块未满但文件数量超限,需清理小文件而非扩容磁盘。

  • 先确认:运行 df -i 查看 IUse% 是否接近 100%
  • 先处理:定位高占用目录后使用 find 批量删除无用小文件
  • 再验证:再次执行 df -i 确认使用率下降且能新建文件

命令速用版

# 查看 inode 使用率
df -i

# 查找哪个目录文件最多 (注意去掉命令内的反引号)
du `--inodes` -s /var/* 2>/dev/null | sort -n

# 安全删除某目录下所有文件 (先预览再删除)
find /path/to/dir -maxdepth 1 -type f -print
find /path/to/dir -maxdepth 1 -type f -delete

预期输出示例:

Filesystem     Inodes IUse% IFree IInode Mounted on
/dev/vda1      131072 100%      0  131072 /

为什么会这样

Linux 文件系统中,每个文件、目录或软链接都对应一个 inode,用于存储元数据。EXT4 文件系统在格式化时会预设 inode 总数。当系统产生大量小文件(如日志碎片、缓存、邮件队列)时,即使磁盘存储空间(Block)未用完,inode 数量也可能先耗尽,导致无法创建新文件,报错"No space left on device"。

分步处理

1. 确认 inode 使用情况
执行 df -i 命令,重点关注 IUse% 列。若某分区(如/或/var)达到 95% 以上甚至 100%,即可判定为 inode 瓶颈。若 df -h 显示磁盘使用率远低于 inode 使用率,问题定位更明确。

EXT4 文件系统 inode 耗尽导致无法写入文件怎么清理和排查?

2. 定位高占用目录
使用 du `--inodes` 命令逐级排查。例如查看/var 下各子目录的 inode 占用:

du `--inodes` -s /var/* 2>/dev/null | sort -n

常见高占用目录包括/tmp(会话文件)、/var/spool(邮件队列)、/var/log(未轮转日志)等。

3. 操作前备份(生产环境必做)
在执行删除操作前,建议对目标目录进行打包备份,以防误删关键文件。

tar -czf /backup/dir_backup_$(date +%F).tar.gz /path/to/dir

4. 安全清理文件
直接 rm * 可能因参数过长失败。建议使用 find 命令流式处理。务必先预览

# 先打印确认文件列表
find /tmp -name "sess_*" -print

# 确认无误后再删除
find /tmp -name "sess_*" -delete

或删除空文件:

EXT4 文件系统 inode 耗尽导致无法写入文件怎么清理和排查?
find /home -type f -size 0 -delete

5. 长期预防(可选)
若业务确实需要存储海量小文件,可考虑备份数据后重新格式化分区,使用 mkfs.ext4 -T small 或 -N 参数增加 inode 密度。此操作会清空数据,需谨慎。

怎么验证是否生效

清理完成后,再次运行 df -i 观察 IUse% 是否下降。尝试在对应分区执行 touch testfile 命令,若能成功创建且无报错,说明问题已解决。同时监控相关应用日志,确认无写入错误。

常见坑

1. 误删系统文件:清理前务必确认目录用途,避免删除/var/run 等关键目录下的进程文件。
2. 参数列表过长:文件过多时不要用 rm *,需用 find -delete 或 xargs。
3. 进程占用:已删除但未释放的文件句柄可能仍占用资源,必要时重启相关服务。
4. 格式化风险:调整 inode 密度需重新格式化,务必先备份数据,否则会导致数据丢失。
5. 命令语法错误:使用 du `--inodes` 时不要添加多余的反引号,否则命令无法执行。

参考文档

更多参数细节可查阅官方手册:man df, man find, man du。