df -i 用于检查 inode 使用率,而非磁盘容量;当 IUse% 接近 100% 时,即使磁盘空间充足也会因 inode 耗尽导致“No space left on device”错误。

MacOS系统中,df -i 是排查“磁盘空间充足却无法写入文件”问题的关键命令——它显示的是索引节点(inode)的使用情况,而非磁盘容量。当 inode 耗尽时,即使还有大量空闲空间,系统也会报错 No space left on device。
为什么 inode 会耗尽?
每个文件(包括空文件)、目录、符号链接在 macOS(基于 APFS 或 HFS+)中都占用一个 inode。常见高 inode 消耗场景:
- 大量小文件:如日志缓存、npm/node_modules、git 仓库中的对象、邮件临时文件
- 被删除但未释放的文件:进程仍打开已删文件(
lsof +L1可查) - Time Machine 本地快照残留(尤其在 SSD 空间紧张时可能积累大量元数据)
- 容器或虚拟机镜像内部产生海量小文件(如 Docker 构建缓存)
用 df -i 快速定位问题
在终端运行:
df -i
重点关注 IUse% 列。若某挂载点(如 / 或 /System/Volumes/Data)达到 95% 以上,即存在风险。APFS 卷通常不单独显示 inode 总数(因动态分配),但 macOS 仍会报告使用率,数值接近 100% 即需干预。
可加 -h 提高可读性:df -ih;对根卷重点检查:df -ih /
清理高 inode 占用源
确认高占用后,进入对应路径排查小文件密集区:
- 清理 npm 缓存:
npm cache clean --force,再删~/Library/Caches/npm - 清空 Trash 并重启 Finder:
rm -rf ~/.Trash/*(确保无重要文件) - 查找并清理超多小文件的目录:
find . -type f | cut -d'/' -f2 | sort | uniq -c | sort -nr | head -10(在可疑目录下运行) - 检查 Time Machine 本地快照:
tmutil listlocalsnapshots /,必要时删除:sudo tmutil deletelocalsnapshots [snapshot_name] - 查看被删除但未释放的文件:
lsof +L1,重启相关进程或机器释放 inode
预防 inode 过度消耗
日常维护建议:
- 避免在桌面或用户主目录下解压/生成大量临时小文件(如 zip 包、编译中间产物)
- 定期清理开发工具缓存(yarn、pip、cargo、Xcode DerivedData)
- 监控习惯:
watch -n 60 'df -ih | grep -E "(IUse%|Data)"'(每分钟刷新查看) - 对长期运行的服务(如 Web 服务器日志),配置 logrotate 或按大小轮转,防止单个日志膨胀为百万级小切片
inode 不是磁盘空间,但它的枯竭同样会让系统“卡住”。养成用 df -i 辅助 df -h 的习惯,能更快揪出看似奇怪的写入失败根源。










