Linux 磁盘写满、权限报错?排查与清理实战
服务器突然写不了日志、程序报错『No space left on device』,但 df 显示还有空间——这类矛盾现象,往往隐藏在 inode 耗尽或权限错乱之中。本文给出从空间到权限的完整排查路径。
一、先用 df 看整体
- 执行
df -h查看各挂载点使用率,定位是哪块盘满了。 - 若使用率 100% 却仍能创建小文件,执行
df -i检查 inode 是否耗尽。 - 注意
df显示的是文件系统视角,包含被进程占用的已删文件,不一定与目录总和一致。
二、用 du 找出占用大户
- 进入根目录执行
du -h --max-depth=1 /逐级下钻。 - 针对大目录,用
du -sh * | sort -rh | head排序前几名。 - 日志与缓存是重灾区,常见在
/var/log、/var/cache。 - Docker 与 snap 也会悄悄占用数 GB,记得检查
/var/lib/docker与/var/lib/snapd。
三、处理 inode 耗尽
- 大量小文件(如邮件队列、会话文件)会吃光 inode。
- 用
find /path -type f | wc -l统计文件数,定位目录后清理。 - 若要释放已删却被进程占用的空间,可用
lsof | grep deleted找到持有句柄的进程并重启它。
四、权限拒绝的常见原因
- 执行
ls -l检查目标文件的所有者与权限位。 - Permission denied 常因当前用户非属主且组无权限。
- 跨用户共享目录忘加写权限,或脚本缺执行位
x。
五、用 chown/chmod 修正
- 改属主:
sudo chown -R user:group /path。 - 补权限:
chmod 755 目录、chmod 644 文件。 - 谨慎对待
/、/etc等系统路径,避免递归改坏。
六、用轮转与定时清理防复发
- 配置
logrotate,让日志按大小切割并压缩,避免单文件无限增长。 - 对临时目录设配额,或用
tmpfiles.d定期回收。 - 把清理写成定时任务,每月自动扫描超大目录。
技术总结:磁盘类故障要先区分『空间满了』还是『inode 满了』,再决定清理策略;权限问题则用 ls -l 看清属主与权限位,精准修正而非盲目 chmod 777。配合日志轮转,可从根源减少复发。