Linux 上 df 显示磁盘还有空间,写入却报 No space left on device
【摘要】 df 显示还有几个 G,但 echo 一个文件就报 No space left on device。这个现象基本只有两个原因:inode 用光了,或者被删掉的文件还占着空间没释放。一、inode 耗尽df -h 看的是块(block),df -i 才是 inode。小文件特别多(日志、缓存、session 文件、容器层)时,块还剩很多,inode 先满。判断方法一行:df -i /path如...
df 显示还有几个 G,但 echo 一个文件就报 No space left on device。这个现象基本只有两个原因:inode 用光了,或者被删掉的文件还占着空间没释放。
一、inode 耗尽
df -h 看的是块(block),df -i 才是 inode。小文件特别多(日志、缓存、session 文件、容器层)时,块还剩很多,inode 先满。判断方法一行:
df -i /path
如果 IUse% 到 100%,就是这个问题。清理方向是找小文件密集的目录:
find / -xdev -type d -size +100M 2>/dev/null | head
更直接的是 du --inodes -d1 /var 这类按目录统计 inode 数。
二、文件被删但句柄没关
进程还开着某个大文件的 fd,文件被 rm 后空间不释放(deleted 状态)。df 会显示满,du 却看不到这块占用。经典排查:
lsof +L1
或
lsof | grep deleted
找到对应进程后重启它,或者用 > /proc/<pid>/fd/<n> 清空。这条在生产上很常见:日志被人工 rm,但写日志的进程没重启,空间一直不回。
三、还有两个干扰项
- 挂载点问题:数据写到了另一个挂载的小分区(比如 /var/lib/docker 单独挂载)。用 df 对应路径确认,别只看根分区。
- - 磁盘配额:ext4/xfs 开了 quota 时,用户级配额满了,df 看起来正常,写入也会失败。用 quota -u <user> 或 xfs_quota -x -c 'report -h' 查。
排查顺序建议:df -i 先排除 inode → lsof +L1 排除 deleted → 再看是不是写到了别的挂载点 → 最后看配额。
【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)