磁盘满了别慌:5步快速定位Linux磁盘告警
兄弟们,有没有遇到过这种情况:凌晨三点正睡得香,告警短信突然炸锅——"磁盘使用率98%!"你一个激灵爬起来,连上服务器一看,根分区确实红了。这时候千万别盲目删文件,删错了生产数据比磁盘满了还可怕。今天咱们聊聊磁盘满了的系统化排查思路,让你下次遇到这种事能淡定处理。
第一步:确认磁盘使用情况
先别急着找"谁占了空间",先用 df 看全局:
# 查看所有挂载点使用情况(-h 人类可读格式)
df -h
# 查看inode使用情况(有时候不是空间满,是inode满!)
df -i
# 只看本地磁盘,排除临时文件系统
df -hT | grep -v tmpfs | grep -v devtmpfs
这里有个坑:有时候 df 显示使用率100%,但 du 算出来没那么多。这种情况通常是文件被删除但句柄没释放。用这个命令找出来:
# 找出已被删除但仍被进程占用的文件
lsof | grep deleted
# 更精准的写法
lsof +L1
输出里会显示进程ID和占用的文件大小,重启对应进程或者 echo > /proc/PID/fd/FD_NUM 就能释放空间。
第二步:定位大文件和目录
找到哪个分区满了之后,用 du 逐层定位:
# 查看当前目录下各子目录大小,按大小排序
du -h --max-depth=1 | sort -hr | head -20
# 直接找大于1G的文件(全盘扫描,需要点时间)
find / -type f -size +1G 2>/dev/null | xargs du -h 2>/dev/null | sort -hr
du 和 df 结果不一致?除了上面说的句柄问题,还有一种情况是目录条目缓存——用 sync 同步一下再试。
第三步:排查日志文件
十次磁盘满,八次是日志。重点检查这些地方:
# 查看 /var/log 下各日志大小
du -sh /var/log/* | sort -hr
# 查看 journalctl 日志占用(systemd系统)
journalctl --disk-usage
# 清理旧日志(保留最近2天)
journalctl --vacuum-time=2d
| 日志类型 | 常见路径 | 清理方式 |
|---|
| 应用日志 | /var/log/app/ | logrotate 配置 |
| 系统日志 | /var/log/messages | journalctl vacuum |
| Nginx访问日志 | /var/log/nginx/ | 日志切割+压缩 |
| Docker日志 | /var/lib/docker/containers/ | docker system prune |
第四步:检查有没有"藏起来的空间"
有些空间占用是隐蔽的:
# 查看被挂载遮挡的目录(挂载点覆盖了原有文件)
mount | grep /data
# 查看docker overlay占用
docker system df
# 查看已删除但未释放的大文件
find /proc/*/fd -ls 2>/dev/null | grep '(deleted)'
Docker 环境特别容易踩这个坑——镜像、容器、volume 三层叠加,用 docker system prune -a 可以清理,但记得先确认没有重要数据。
第五步:建立预防机制
排查完不是结束,要建立长效机制:
# 设置磁盘告警脚本(添加到crontab)
cat > /usr/local/bin/disk_check.sh << 'EOF'
#!/bin/bash
THRESHOLD=85
df -h | awk '$5 > THRESHOLD {print $0}' | mail -s "Disk Alert on $(hostname)" admin@example.com
EOF
# 配置 logrotate(以nginx为例)
cat > /etc/logrotate.d/nginx << 'EOF'
/var/log/nginx/*.log {
daily
rotate 7
compress
delaycompress
missingok
notifempty
create 0640 www-data adm
sharedscripts
postrotate
systemctl reload nginx
endscript
}
EOF
互动话题:你遇到过最奇葩的磁盘满原因是什么?有人在 /tmp 里存了备份文件,有人是 Docker 镜像堆积了半年没清理。评论区聊聊你的踩坑经历!
推荐标签:#服务器运维 #Linux #磁盘管理 #故障排查 #运维实战 #系统监控
核心观点:磁盘满排查要系统化——先 df 确认,再 du 定位,别忘了检查已删除未释放的文件句柄,最后用 logrotate 和监控建立预防机制。