摘要:当linux服务器的根分区使用率达到100%时,系统运行将变得异常缓慢甚至崩溃。本文提供一套完整的磁盘空间排查方案,从快速定位大文件、分析常见占用源到安全清理方法,手把手教你解决磁盘空间危机。无论你是系统管理员还是开发人员,这些命令都能成为你工具箱中的利器。
当磁盘告急时,你首先应该做什么?
看到 df -h 输出中刺眼的 100% 使用率,很多人的第一反应是慌乱删除文件。但请先冷静!盲目的删除可能导致系统损坏或数据丢失。正确的做法是:先诊断,后治疗。
第一步:快速定位问题根源
1.1 查看磁盘整体使用情况
# 查看所有挂载点的使用情况 df -h # 重点关注根分区 df -h /
如果发现根分区使用率超过90%,就该立即行动了。
1.2 找出占用空间最大的目录
# 一级目录分析(最常用) du -h --max-depth=1 / 2>/dev/null | sort -rh | head -20 # 输出示例: # 23g /var # 16g /home # 5.5g /usr # 1.2g /opt # ...其他目录
技巧:2>/dev/null 用于屏蔽权限错误信息,让输出更干净。
1.3 深入分析具体目录
# 如果发现/var很大,继续深入 du -h --max-depth=2 /var 2>/dev/null | sort -rh | head -20 # 输出可能显示: # 22g /var/lib/docker # 500m /var/log # 200m /var/cache/apt
第二步:针对性排查常见"空间杀手"
2.1 docker - 最常见的占用源
# 查看docker整体使用情况 docker system df # 检查docker存储目录 du -h --max-depth=2 /var/lib/docker/ 2>/dev/null | sort -rh # 检查容器日志(容易忽略的大文件) find /var/lib/docker/containers -name "*.log" -size +100m 2>/dev/null
2.2 系统日志 - 沉默的空间吞噬者
# 查看日志目录大小 du -h /var/log/ 2>/dev/null | sort -rh | head -10 # 查看journal日志大小 journalctl --disk-usage # 查找大日志文件 find /var/log -type f -size +100m 2>/dev/null | xargs ls -lh
2.3 软件包缓存 - 容易被遗忘的积累
# 查看apt缓存大小 du -sh /var/cache/apt/archives/ # 查看snap缓存 du -sh /var/lib/snapd/cache/
2.4 用户目录 - 隐藏的大文件
# 查找所有大于1gb的文件 find /home -type f -size +1g 2>/dev/null | xargs ls -lh # 查找所有大于100mb的日志文件 find / -type f -name "*.log" -size +100m 2>/dev/null
第三步:使用高级工具进行可视化分析
3.1 安装并使用ncdu(强烈推荐)
# 安装ncdu sudo apt-get install ncdu # debian/ubuntu sudo yum install ncdu # centos/rhel # 扫描根目录 ncdu / # 扫描特定目录 ncdu /var
ncdu优势:
- 交互式界面,支持键盘导航
- 实时显示目录大小百分比
- 可以直接删除文件(按d键)
- 比命令行更直观
3.2 使用find命令进行复杂搜索
# 查找7天前修改的大于100m的文件 find / -type f -size +100m -mtime +7 2>/dev/null # 查找空目录 find / -type d -empty 2>/dev/null # 查找最近3天修改的大文件 find / -type f -size +50m -mtime -3 2>/dev/null
第四步:安全清理策略
4.1 docker清理(按需选择)
# 温和清理:删除未使用的资源 docker system prune # 强力清理:删除所有未使用的镜像、容器、卷等 docker system prune -a --volumes # 选择性清理 docker container prune # 只清理停止的容器 docker image prune # 只清理悬空镜像 docker volume prune # 只清理未使用的卷
4.2 日志文件清理
# 清理系统日志(保留最近7天) journalctl --vacuum-time=7d # 或者限制总大小(保留200m) journalctl --vacuum-size=200m # 清理应用日志文件(示例:清空nginx日志) > /var/log/nginx/access.log > /var/log/nginx/error.log # 清理旧的日志归档 find /var/log -name "*.gz" -o -name "*.1" -o -name "*.bz2" -delete
4.3 包管理器缓存清理
# apt清理(debian/ubuntu) sudo apt-get autoclean # 删除旧版本包 sudo apt-get clean # 删除所有已下载包 sudo apt-get autoremove # 删除不需要的依赖 # yum清理(centos/rhel) sudo yum clean all # 清理pip缓存 pip cache purge
4.4 临时文件清理
# 清理系统临时目录 sudo rm -rf /tmp/* # 清理用户临时目录 rm -rf ~/.cache/* rm -rf ~/.local/share/trash/*
第五步:预防措施与监控
5.1 设置磁盘使用监控
# 添加到crontab,每天检查一次
echo "0 2 * * * df -h >> /var/log/disk_usage.log" | crontab -
# 或者使用监控脚本
cat > /usr/local/bin/check_disk.sh << 'eof'
#!/bin/bash
threshold=90
usage=$(df / | tail -1 | awk '{print $5}' | sed 's/%//')
if [ $usage -gt $threshold ]; then
echo "警告:根分区使用率 ${usage}% 超过阈值 ${threshold}%" | mail -s "磁盘空间告警" admin@example.com
fi
eof
chmod +x /usr/local/bin/check_disk.sh
5.2 docker配置优化
# 限制docker日志大小
sudo mkdir -p /etc/docker
sudo cat > /etc/docker/daemon.json << eof
{
"log-driver": "json-file",
"log-opts": {
"max-size": "10m",
"max-file": "3"
}
}
eof
sudo systemctl restart docker
5.3 日志轮转配置
# 检查并配置logrotate cat /etc/logrotate.conf # 确保有合理的配置,如: # weekly # 每周轮转 # rotate 4 # 保留4个备份 # compress # 压缩旧日志
实用小贴士
- 黄金法则:永远不要删除你不了解的文件
- 备份优先:重要数据清理前先备份
- 循序渐进:清理后观察效果,不要一次性删除太多
- 定期维护:将清理任务加入日常维护计划
- 使用lvm:如果可能,使用lvm以便动态调整分区大小
常见问题快速诊断表
| 症状 | 可能原因 | 检查命令 |
|---|---|---|
| 空间突然爆满 | 日志文件暴增 | find /var/log -size +100m |
| 空间缓慢增长 | docker积累 | docker system df |
| 空间持续不足 | 用户文件过多 | du -h --max-depth=2 /home |
| 空间异常波动 | 临时文件未清理 | ls -la /tmp/ |
写在最后
磁盘空间管理是每个linux用户和系统管理员的必修课。记住,预防胜于治疗。建立定期的磁盘检查习惯,配置合理的日志轮转策略,监控关键目录的使用情况,这些都能帮助你避免"磁盘爆满"的紧急情况。
当问题真的出现时,不要慌张。按照本文的步骤:诊断 → 定位 → 清理 → 预防,你就能从容应对。
到此这篇关于linux提示根分区爆满的常用排查命令整理的文章就介绍到这了,更多相关linux根分区爆满排查内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论