当前位置:首页>Linux>Linux inode 详解:磁盘还有空间,却写不了文件是怎么回事

Linux inode 详解:磁盘还有空间,却写不了文件是怎么回事

  • 2026-10-11 06:09:33
Linux inode 详解:磁盘还有空间,却写不了文件是怎么回事

inode 是什么,和磁盘空间什么关系,满了怎么清


一、一个经典场景

你有没有遇到过这种情况:

服务器的 df -h 显示磁盘还剩 50GB,但你 touch test.txt 的时候,系统告诉你:

touch: cannot touch 'test.txt': No space left on device

磁盘有空间,但写不了文件——那到底是谁把空间"占"了?

答案是:磁盘空间没占满,但 inode 占满了。

今天就把这个东西聊透。


二、inode 是什么

inode = index node(索引节点)。

当你创建一个文件时,Linux 文件系统做两件事:

  1. 分配一个 inode — 用来存文件的元数据(权限、所有者、大小、时间戳、数据块指针等)
  2. 分配 data block — 用来存文件的实际内容
文件名 → inode → data block             ↓         元数据(权限、大小、时间...)

每个文件/目录都有一个 inode。注意目录本身也是文件,也占一个 inode。


三、inode 和磁盘空间的关系

这是最常被混淆的地方。拿出两个命令来看:

df -h   → 看磁盘空间(data block 使用率)df -i   → 看 inode 使用率

它们是完全独立的指标。inode 满不会影响现有文件的读写,但任何创建新文件/目录的操作都会失败。


四、inode 满了会有什么影响

真实故障场景:

  1. 系统服务崩溃 — syslog/rsyslog 写不了新日志
  2. 应用部署失败 — CI/CD 无法创建临时文件
  3. 邮件队列崩了 — Postfix/Exim 无法创建新队列文件
  4. Docker 容器起不来 — overlay 层创建失败
  5. 数据库异常 — 某些数据库需要先写临时文件再 rename

识别方法:当 df -h 显示有余量但系统报 No space left on device 时,第一时间跑 df -i。


五、什么场景会耗尽 inode

inode 撑爆的常见元凶:

  1. 邮件队列表象 - /var/spool/postfix/maildrop/ 未送达邮件积压数百万个几字节的小文件
  2. Docker overlay2 - /var/lib/docker/overlay2/ 每层镜像产生大量元数据
  3. node_modules - 前端项目动辄数万个文件
  4. 日志切割但没清理 - /var/log/*.gz 长期累积
  5. 临时文件没清理 - /tmp/ /var/tmp/ 年久日深
  6. 回收站 .Trash - GUI 系统下累积海量文件

六、怎么检查 inode

df -i

输出示例:

Filesystem     Inodes  IUsed   IFree IUse% Mounted on/dev/sda1      655360  655360      0  100% /

IUse% = 100% 就是问题所在。

统计各目录文件数:

for d in /*; do echo "$(find $d -xdev -type f | wc -l) $d"; done | sort -rn | head -10

七、怎么清理 inode

清理 inode = 删除大量小文件。

# 最常用find /path/to/dir -type f -delete# 按时间筛选find /path/to/dir -type f -mtime +30 -delete# 清理邮件队列systemctl stop postfixfind /var/spool/postfix/maildrop -type f -deletesystemctl start postfix# 清理 Dockerdocker system prune -af# 终极手段 - rsync 重建目录mkdir /tmp/emptydirrsync -a --delete /tmp/emptydir/ /var/spool/problem-dir/

八、如何预防 inode 耗尽

  1. 监控 df -i,inode 使用率超过 80% 报警
  2. 分区规划:将 /var /tmp 单独分区,格式化时用 mkfs.ext4 -i 16384 调大 inode 数量
  3. 配置 logrotate 定期清理旧日志
  4. 部署前评估应用对小文件分区的 inode 需求

九、总结

一句话记住 inode:

df -h 看数据块(内容能不能写),df -i 看 inode(文件能不能建)。

日常记住了:遇到 No space left 时,先跑 df -h,再看 df -i,double check 不会错。


本文为 Linux 基础概念科普。文中所用命令适用于 ext4/xfs 文件系统,其他文件系统可能略有差异。

封面图为本公众号调用AI 工具生成

问羊知马

我们一起探究这个世界

最新文章

随机文章