遇到磁盘写不进去、日志报 No space left on device,但 df -h 明明还有几个 G 空闲,基本可以判定是 inode 耗尽,不是块耗尽。这是两种完全不同的容量,df -h 只看块,df -i 才看 inode。
先确认
df -i
看 IUse% 这一列,如果接近 100%,结论就成立。inode 数量在文件系统创建时就固定了,mkfs.ext4 默认按每 16KB 一个 inode 分配,所以一个 50G 的分区大约 320 万个 inode。
找出是谁占的
最常见的是海量小文件:session 文件、缓存碎片、邮件队列、日志轮转的旧文件。
- 按目录统计文件数:
find /var -type f | wc -l,但大目录会很慢,优先从/var/spool、/var/lib/php/sessions、/tmp开始。 - 按子目录数量排序:
du --inodes -S /var | sort -rn | head -20,这一条最直接。 - 找单个文件极多的目录:
find / -type d -exec sh -c 'echo $(ls -A "$1" | wc -l) $1' _ {} \; 2>/dev/null | sort -rn | head,慢但准确。
清理时要注意的三件事
第一,rm 一个正在被进程打开的文件,inode 不会立刻释放,要等进程关闭句柄。典型现象是删完 df -i 数字纹丝不动,用 lsof +L1 能看到标记为 deleted 的占用文件。
第二,别直接用 rm -rf /var/lib/php/sessions/* 这种写法,参数过多会报 Argument list too long,改用 find /var/lib/php/sessions -type f -mtime +1 -delete。
第三,PHP session 目录设一个自动清理的 cron,比事后救火省心:find /var/lib/php/sessions -type f -mmin +1440 -delete,一天一次即可。
长期方案
如果海量小文件是业务本身产生的,重构文件系统更实在:把这些碎文件从 ext4 换成对象存储,或者调整目录分片(按 ID 取模分到 256 个子目录),单目录文件数控制在 1 万以内。inode 数量也可以在 mkfs.ext4 -N 时手动调高,但这只能缓解,不能解决持续增长。
本文首发于 izzsj.com,作者保留全部权利。未经书面授权,禁止任何形式采集、转载与镜像;转载请注明来源并保留原文链接。
- 使用IMG2KVM快捷为Proxmox导入IMG镜像img2kvm是一个在PVE下导入IMG文件到虚拟机的工具,可以将img文件(含gz的压缩格
- 最新WIN10镜像下载.文件名 cn_windows_10_business_edition
- fail2ban 防暴力破解实战:让扫描器无处下手
- VPS 怎么选?国内外主机、线路与配置全解析(2025版)




还没有评论,来说两句吧...