服务器磁盘空间告急,尤其是/var/log分区被日志文件塞满,是Ubuntu运维中最常见的紧急情况之一。面对这个问题,最直接有效的工具就是系统自带的du(disk usage)命令。它能快速定位占用空间最大的目录和文件。一个最常用的组合是du -h --max-depth=1 /var/log | sort -hr。这条命令会以人类可读的格式(-h)显示/var/log下第一级子目录的大小(--max-depth=1),并按从大到小的顺序排序(sort -hr),让你一眼锁定“罪魁祸首”。
深入分析:理解du命令的核心选项
du命令的强大之处在于其丰富的选项组合。除了基础的-h(人类可读)和-s(汇总总计),--exclude参数在排查时非常有用。例如,你想查看当前目录下所有文件的大小,但排除所有“.log”后缀的文件,可以使用du -h --exclude=‘*.log’。另一个关键选项是--time,它可以显示文件或目录的最后修改时间,帮助你判断哪些是陈年旧日志。结合find命令,你可以实现更精准的清理,例如找到并删除30天前的日志文件:find /var/log -name “*.log” -mtime +30 -exec rm {} \;。但务必谨慎,删除系统关键日志前最好先进行归档或确认。
交互式利器:ncdu的安装与高效使用
如果觉得命令行排序查看还不够直观,那么ncdu(NCurses Disk Usage)将是你的升级选择。它是一个基于文本界面的交互式工具,能让你像使用文件管理器一样浏览磁盘使用情况。在Ubuntu上安装非常简单:sudo apt install ncdu。安装完成后,直接在需要分析的目录(如/var)下运行sudo ncdu,它会先扫描磁盘,然后呈现一个清晰的树状界面。
在ncdu界面中,你可以使用方向键导航,按Enter键进入子目录,d键直接删除选中的文件或目录(有确认提示),r键重新扫描当前目录。其最大优势在于可视化:占用比例以条形图显示,占用空间大的项目排在最前面,让你无需记忆复杂命令就能快速定位和清理。对于不熟悉命令行的新手或追求效率的老手,ncdu都是不二之选。
实战演练:从发现到清理的完整流程
假设你收到磁盘使用率95%的报警,登录服务器后,首先用df -h确认是/var分区满了。然后,使用du进行初步定位:
sudo du -h --max-depth=2 /var | sort -hr | head -20
输出可能会显示/var/lib/docker/overlay2或/var/log/journal异常庞大。如果怀疑是Docker日志,可以进入该目录并使用ncdu进行详细分析:sudo ncdu /var/lib/docker。在ncdu中,你可能会发现某个容器的JSON日志文件巨大。此时,你可以选择在ncdu中直接删除它(按d),但更治本的方法是配置Docker日志轮转(log-rotation),限制单个日志文件大小。
进阶清理:处理系统日志(journald)与日志轮转配置
现代Ubuntu系统使用systemd-journald管理日志,其日志文件位于/var/log/journal。它们也会不断增长。你可以使用journalctl命令进行清理,例如sudo journalctl --vacuum-size=200M将日志总大小限制在200MB以内,或sudo journalctl --vacuum-time=7d删除7天前的日志。这是比直接删除.journal文件更安全的方法。
预防胜于治疗。配置系统的日志轮转(logrotate)是根本之道。例如,为Nginx配置日志轮转,创建文件/etc/logrotate.d/nginx:
/var/log/nginx/*.log {
daily
missingok
rotate 14
compress
delaycompress
notifempty
create 0640 www-data adm
sharedscripts
postrotate
[ -s /run/nginx.pid ] && kill -USR1 `cat /run/nginx.pid`
endscript
}这个配置会每天轮转日志,保留14份,并压缩旧日志。定期检查/etc/logrotate.conf和/etc/logrotate.d/下的配置,确保其正常运行。
自动化与监控:建立长效预防机制
手动清理只是应急,自动化监控才是可持续的运维策略。你可以编写一个简单的Shell脚本,定期检查磁盘使用率并在超过阈值时触发清理动作或发送报警。例如:
#!/bin/bash
THRESHOLD=90
USAGE=$(df /var | awk ‘NR==2 {sub(/%/, "", $5); print $5}’)
if [ $USAGE -gt $THRESHOLD ]; then
echo "磁盘使用率 $USAGE% 超过阈值 $THRESHOLD%,开始清理…" | mail -s "磁盘告警" admin@example.com
# 执行清理操作,如清理特定日志目录
sudo find /var/log -name "*.gz" -mtime +30 -delete
sudo journalctl --vacuum-time=7d
fi将此脚本加入crontab,即可实现每日自动检查。同时,建议部署更完善的监控系统(如Prometheus+Grafana),对磁盘空间进行持续可视化监控,变被动响应为主动预防。
总结:工具组合与最佳实践
在Ubuntu运维中,du和ncdu是清理日志、释放空间的黄金组合。du命令快速、脚本友好,适合集成到自动化流程中;ncdu交互直观、操作安全,适合手动深度分析和清理。记住,直接删除日志文件是最后手段,优先考虑归档、轮转和配置管理。将定期磁盘空间检查、日志轮转配置和自动化监控结合起来,才能从根本上避免“日志分区已满”的午夜告警电话,确保服务器稳定高效运行。
