Linux 磁盘空间排查:5个常见目录与日志文件清理实战
服务器磁盘空间告急是运维工作中最常见的问题之一。当系统提示"No space left on device"时,如何快速定位并清理占用空间的文件成为关键。本文将聚焦Linux系统中5个最容易产生大文件的目录,提供针对性的排查方法和清理策略。
1. 快速定位磁盘空间问题的工具组合
在深入具体目录前,我们需要掌握几个基础命令组合,它们能帮助我们快速定位问题所在。
查看整体磁盘使用情况:
df -h这个命令会显示所有挂载点的使用情况,-h参数让输出以人类可读的格式显示(GB/MB/KB)。
查找大目录的黄金组合:
du -h --max-depth=1 / | sort -hr | head -10这个管道命令的执行流程:
du计算根目录下各子目录大小sort按人类可读数值逆序排序head只显示前10个结果
查找大文件的利器:
find / -type f -size +500M -exec ls -lh {} + 2>/dev/null | sort -k5 -hr这个命令会查找系统中所有大于500MB的文件,并按大小排序显示。2>/dev/null是为了屏蔽权限不足的报错信息。
2. /var/log:日志文件的聚集地
系统和服务日志默认存储在/var/log目录,这是磁盘空间问题的重灾区。以下是几个需要特别关注的日志文件:
| 日志文件 | 描述 | 常见问题 |
|---|---|---|
| messages | 系统主日志 | 长期运行可能体积庞大 |
| secure | 安全相关日志 | 高频认证会产生大量记录 |
| journal/ | systemd日志目录 | 默认不限制大小 |
| nginx/ | Nginx访问日志 | 高流量网站日志增长快 |
| mysql/ | MySQL错误日志 | 配置不当可能无限增长 |
journal日志清理:对于systemd系统的journal日志,可以使用以下命令:
# 查看当前日志占用空间 journalctl --disk-usage # 保留最近2天的日志 journalctl --vacuum-time=2d # 或者限制总大小不超过500MB journalctl --vacuum-size=500MNginx日志轮转配置示例:在/etc/logrotate.d/nginx中添加:
/var/log/nginx/*.log { daily missingok rotate 14 compress delaycompress notifempty create 0640 www-data adm sharedscripts postrotate [ -f /var/run/nginx.pid ] && kill -USR1 `cat /var/run/nginx.pid` endscript }3. /tmp:临时文件的温床
/tmp目录是系统和应用程序存放临时文件的地方,理论上重启后会自动清空,但在长期运行的服务器上可能积累大量文件。
安全清理/tmp的注意事项:
- 不要直接
rm -rf /tmp/*,可能影响正在运行的应用程序 - 使用find命令清理旧文件更安全:
find /tmp -type f -atime +7 -delete这个命令会删除7天内未被访问的文件。
特殊文件处理:
- 对于socket文件等特殊类型,应先确认是否可以删除
- 某些应用程序(如MySQL)可能在/tmp创建重要临时表
4. /var/lib/docker:容器存储的潜在风险
对于使用Docker的环境,/var/lib/docker是默认的存储位置,可能占用大量空间。
Docker空间清理命令:
# 查看Docker磁盘使用情况 docker system df # 清理无用资源 docker system prune -a --volumes # 清理特定容器的日志文件 truncate -s 0 $(docker inspect --format='{{.LogPath}}' 容器名)关键目录说明:
- overlay2/:容器分层文件系统
- containers/:容器日志和元数据
- volumes/:持久化卷数据
5. 用户目录和应用程序日志
除了系统目录,用户主目录和应用程序特定目录也经常是空间占用大户。
常见问题点:
- .cache/:应用程序缓存
- .npm/, .m2/:开发工具缓存
- 应用程序日志目录(如Tomcat的logs/)
Tomcat日志清理脚本示例:
#!/bin/bash TOMCAT_LOG_DIR="/opt/tomcat/logs" MAX_SIZE="500M" # 清理catalina.out if [ -f "${TOMCAT_LOG_DIR}/catalina.out" ]; then size=$(du -m "${TOMCAT_LOG_DIR}/catalina.out" | cut -f1) if [ "$size" -gt "${MAX_SIZE/M/}" ]; then echo "清空catalina.out (当前大小: ${size}MB)" > "${TOMCAT_LOG_DIR}/catalina.out" fi fi # 删除30天前的日志文件 find "${TOMCAT_LOG_DIR}" -name "*.log" -mtime +30 -delete6. 自动化清理策略
手动清理只是临时解决方案,建立自动化机制才能从根本上解决问题。
logrotate配置要点:
- 为每个重要服务配置独立的日志轮转
- 设置合理的保留周期和压缩选项
- 考虑日志的监控和分析需求
cron定时任务示例:
# 每天凌晨清理临时文件 0 2 * * * find /tmp -type f -atime +7 -delete # 每周日清理Docker无用资源 0 3 * * 0 docker system prune -f # 每月1号检查大文件并发送报告 0 4 1 * * df -h > /var/log/disk-report.log && du -h --max-depth=1 / | sort -hr >> /var/log/disk-report.log7. 预防优于治疗:监控与告警
建立完善的监控体系可以在问题发生前预警:
推荐监控指标:
- 各分区使用率(超过80%告警)
- 关键日志文件大小
- inode使用情况(特别是小文件多的系统)
Prometheus监控示例:
- job_name: 'node_disk' static_configs: - targets: ['localhost:9100'] metrics_path: '/metrics'结合Grafana可以创建直观的磁盘使用情况看板,及时发现潜在问题。