`No space left on device` 报错怎么处理?磁盘和 inode 都要看
No space left on device 可能是磁盘容量满,也可能是 inode 用尽。本文按容量、inode、小文件、日志和数据库场景说明如何判断与处理。
`No space left on device` 的字面意思是设备没有空间,但在 Linux 里它不只指磁盘容量。inode 用尽、临时目录满、日志分区满、容器卷满,都可能出现同样报错。处理前必须先确认是哪一种“没有空间”。
先做两个检查
df -h
看容量是否用满。
df -i
看 inode 是否用满。inode 是文件数量资源,大量小文件会把它耗尽。
容量满和 inode 满的区别
| 检查结果 | 说明 | 常见来源 |
|---|---|---|
| `Use%` 100% | 容量满 | 大日志、备份包、数据库、上传文件 |
| `IUse%` 100% | inode 满 | session、缓存、小图、邮件队列、临时文件 |
| 容量和 inode 都正常 | 可能是特定挂载点或权限问题 | 临时目录、容器卷、只读文件系统 |
找出大量小文件
不要一开始扫全盘,可以先从 `/var`、网站目录或缓存目录查:
find /var -xdev -type f | awk -F/ '{print "/"$2"/"$3}' | sort | uniq -c | sort -nr | head
这条命令用于粗略定位文件数量最多的目录。生产服务器上大范围 find 会产生 IO 压力,建议缩小范围,必要时放到业务低峰期执行。
不同场景的处理方式
日志过大,可以确认后截断或轮转;缓存过多,应优先使用应用自带清理机制;session 文件过多,要考虑在线用户;数据库写入失败,不能直接删除数据库文件。
普通日志截断示例:
truncate -s 0 /path/to/logfile
如果是大量旧 session 或缓存文件,要尽量按时间条件清理,而不是无差别删除。例如只清理多天前的临时文件,避免影响当前请求。
日志里会看到什么
系统或应用日志可能出现无法创建临时文件、无法写入日志、数据库写入失败、上传失败等信息:
journalctl -n 100 --no-pager
Web 服务和数据库日志也要一起看,因为报错可能先在应用层出现。比如 PHP 上传失败、Nginx 无法写临时文件、MySQL 无法写 binlog,都可能最终指向空间问题。
错误操作提醒
不要看到这个报错就删除整个 `/var/log` 或数据库目录。不要忽略 inode。不要在没有备份的情况下清理上传目录和业务数据。不要把可疑大文件全部归类为垃圾文件,先确认来源。
如果空间不足已经导致数据库异常,先减少写入压力,保留日志,再评估恢复。用户能处理普通日志、缓存和旧备份;涉及数据库损坏、文件系统只读或系统无法启动时,应让服务商协助。