1. 当磁盘空间告急时,先做这些关键检查
那天我正在午休,突然收到服务器告警短信——磁盘使用率超过95%。这种场景对于运维人员来说就像半夜被火警铃吵醒一样刺激。我立刻打开终端连上服务器,开始了这场与磁盘空间的较量。
首先用df -h快速查看整体情况。这个命令就像医院的X光机,能一眼看出哪个分区"病入膏肓":
$ df -h Filesystem Size Used Avail Use% Mounted on /dev/vda1 50G 48G 1.2G 98% /看到根目录只剩1.2G可用空间,我马上想到几个常见"嫌疑犯":日志文件、缓存数据、残留的安装包。但盲目猜测不如科学排查,这时候就该请出我们的黄金搭档——du和find命令。
2. 用du命令快速定位"空间大胃王"
du(disk usage)就像个精明的仓库管理员,能准确统计每个目录占用的空间。我最常用的组合拳是:
$ du -h --max-depth=1 / | sort -hr | head -10 48G / 23G /var 12G /home 8.5G /usr 1.2G /opt这个命令分解来看:
-h:人类可读格式(GB/MB/KB)--max-depth=1:只显示一级子目录sort -hr:按人类可读数值逆序排序head -10:只显示前10条结果
发现/var目录异常庞大后,我继续深入调查:
$ du -h --max-depth=1 /var | sort -hr | head -5 23G /var 18G /var/log 4.5G /var/lib 800M /var/cache3. find命令精准打击大文件
定位到/var/log这个"嫌犯"后,就该find上场了。它像探雷器一样能精确找出具体的大文件:
$ find /var/log -type f -size +100M -exec ls -lh {} \; -rw-r--r-- 1 root root 2.3G Jun 15 10:23 /var/log/syslog.1 -rw-r--r-- 1 root root 1.8G Jun 14 09:12 /var/log/kern.log.2这里的关键参数:
-type f:只查找文件-size +100M:大于100MB的文件-exec ls -lh {} \;:对找到的文件执行ls -lh命令
更高级的用法是结合xargs处理大量文件:
$ find /var/log -type f -size +500M | xargs ls -lhS4. 实战中的组合技与避坑指南
在实际工作中,我总结出几个高效组合技:
组合技一:快速定位并删除过期日志
# 查找7天前且大于100M的日志文件 $ find /var/log -name "*.log" -mtime +7 -size +100M -exec rm -v {} \;组合技二:统计目录下各类文件的空间占用
$ find /var/log -type f -name "*log*" -exec du -h {} + | sort -hr踩过的坑也不少:
- 权限问题:系统目录需要sudo权限,但谨慎使用
sudo rm - 硬链接陷阱:用
ls -i查看inode号,避免删除被多个硬链接引用的文件 - 服务锁定文件:删除前用
lsof | grep filename检查是否有进程正在使用
5. 进阶技巧:自动化监控与清理
对于经常爆满的服务器,我通常会设置自动化脚本。比如这个每日检查的cron job:
#!/bin/bash THRESHOLD=90 CURRENT=$(df / | awk '{print $5}' | tail -1 | sed 's/%//') if [ $CURRENT -gt $THRESHOLD ]; then LOG_FILE="/tmp/disk_cleanup_$(date +%Y%m%d).log" echo "【$(date)】磁盘使用率${CURRENT}%,开始清理..." >> $LOG_FILE find /var/log -name "*.gz" -mtime +30 -delete >> $LOG_FILE journalctl --vacuum-size=200M >> $LOG_FILE docker system prune -f >> $LOG_FILE fi6. 特殊情况处理:那些年遇到的奇葩案例
曾经有台服务器/var目录占用异常,但用常规方法找不到大文件。最后发现是某个docker容器的日志文件被误配置为直接写入主机系统,而且文件被删除后空间仍未释放——因为进程还在持有文件描述符。解决方法:
# 找出持有已删除文件的进程 $ lsof +L1 # 然后重启相关服务 $ systemctl restart service_name另一个案例是某次/tmp目录被占满,发现是某个Python脚本不断生成临时文件却未清理。这种时候可以用find /tmp -type f -user username快速定位用户文件。
7. 预防胜于治疗:日常维护建议
根据多年运维经验,我总结出这些预防措施:
- 日志轮转:配置logrotate对关键日志进行自动切割和压缩
- 监控预警:设置Prometheus或Zabbix监控磁盘空间
- 定期清理:对/tmp、缓存目录设置自动清理策略
- 容器管理:docker和k8s环境要特别注意日志和临时文件
比如配置logrotate示例:
# /etc/logrotate.d/nginx /var/log/nginx/*.log { daily rotate 30 compress missingok notifempty sharedscripts postrotate /usr/bin/systemctl reload nginx > /dev/null endscript }8. 当常规方法失效时的终极武器
如果上述方法都无效,可能需要使用更底层的工具:
- 检查隐藏空间:
df和du结果不一致时,可能是文件被删除但未释放# 查看已删除但未释放的文件 $ lsof | grep deleted - 检查inode耗尽:有时空间足够但inode用尽
$ df -i - 使用ncdu可视化工具:交互式查看磁盘使用情况
$ ncdu /var