No space left on device 的五张脸
一句话总结
ENOSPC 不只表示数据块耗尽,也可能是 inode、保留块、挂载遮挡或 inotify 资源不足。
诊断顺序
先确认失败路径实际属于哪个文件系统。随后检查 inode 使用率、已删除但仍打开的文件、root 保留块、被新挂载隐藏的旧文件,以及 inotify watch 上限。
df 统计已分配块,du 只遍历有名称的路径,因此两者差距很大时常是删除后仍打开的日志。此时应找链接数为零的打开文件,并让应用重新打开日志或重启。直接截断文件只适合作为应急措施。
根用户成功而服务用户失败可能是保留块;磁盘仍有空间却无法增加 watch 则与存储无关。诊断时不要在已经饱和的文件系统上盲目全盘扫描,应限制文件系统边界并逐步缩小范围。
原文命令与标识符
lsof +L1 # 링크 수가 0인, 즉 지워졌는데 열려 있는 파일
ls -l /proc/<pid>/fd | grep deleted
df -i # 사용률이 100%인 파일 시스템
find /var -xdev -type f | cut -d/ -f1-4 | sort | uniq -c | sort -rn | head
mkdir /mnt/root && mount --bind / /mnt/root
du -shx /mnt/root/data
ENOSPC
df -h /var
touch /var/log/test
No space left on device
/
/var
findmnt -T /var/log/app.log
/tmp
df -i
IUse%
rm
du
du
inotify_add_watch
lsof -nP +L1
NLINK
SIZE
/proc/*/fd
(deleted)
truncate -s 0 /proc/PID/fd/N
ls -l
kill -USR1
find /
-xdev
df
du
du
rm
du
df
: > /proc/<pid>/fd/3
rm
truncate
copytruncate
No space left on device
-xdev
imaxpct
/data
df
tune2fs -m 1
/proc