一、先搞清楚磁盘被谁吃掉了

咱们平时用Linux系统,最烦的就是突然弹出来个"磁盘空间不足"的警告。这时候别急着删文件,先得像个侦探一样找出到底是谁在偷偷占用空间。我给大家介绍几个超级好用的侦查工具:

首先祭出df -h这个老伙计,它能一目了然地告诉你各个分区还剩多少空间:

df -h
# 输出示例:
# Filesystem      Size  Used Avail Use% Mounted on
# /dev/sda1        50G   47G  1.2G  98% /
# /dev/sdb1       100G   20G   80G  20% /home

看到没?根目录已经用了98%!这时候再用du -sh *深入调查具体目录:

cd /
du -sh * | sort -rh | head -n 10
# 输出示例:
# 15G    var
# 12G    usr
# 8.4G   home
# 1.2G   opt

这样就能快速定位到/var目录是罪魁祸首。如果想看更详细的子目录情况:

du -ah /var | sort -rh | head -n 20

二、清理日志文件的正确姿势

日志文件绝对是磁盘空间的隐形杀手。咱们分几种情况来处理:

  1. 常规日志清理
# 清理超过7天的旧日志
find /var/log -type f -name "*.log" -mtime +7 -delete

# 清空当前日志(注意服务可能需重启)
echo "" > /var/log/syslog
  1. 针对journal日志(systemd系统专用)
# 查看journal日志占用空间
journalctl --disk-usage
# 只保留最近500MB日志
journalctl --vacuum-size=500M
# 或者只保留最近2周的日志
journalctl --vacuum-time=2weeks
  1. 处理那些疯狂增长的应用程序日志
# 比如nginx日志轮转配置示例
cat /etc/logrotate.d/nginx
# 内容应该包含:
# /var/log/nginx/*.log {
#   daily
#   rotate 14
#   missingok
#   notifempty
#   compress
#   delaycompress
#   sharedscripts
#   postrotate
#       /usr/bin/systemctl reload nginx
#   endscript
# }

三、处理那些顽固的缓存文件

缓存文件有时候能占好几个G,但清理它们需要特别注意:

  1. 包管理器缓存
# 对于apt系统
apt-get clean
# 清理旧的安装包
apt-get autoremove --purge

# 对于yum系统
yum clean all
# 清理旧的kernel包
package-cleanup --oldkernels --count=2
  1. 应用程序缓存
# 清理Docker的垃圾
docker system prune -f

# 清理npm缓存
npm cache clean --force

# 清理pip缓存
rm -rf ~/.cache/pip
  1. 系统级缓存
# 清理内存缓存(不会影响运行中的程序)
sync; echo 3 > /proc/sys/vm/drop_caches

四、查找并处理大文件的技巧

有时候几个大文件就能把磁盘塞满,这里有几个找大文件的绝招:

  1. 快速查找大于100M的文件
find / -type f -size +100M -exec ls -lh {} \;
  1. 更智能的查找方式
# 查找前10大文件(排除特殊目录)
find / -path /proc -prune -o -path /sys -prune -o -type f -printf '%s %p\n' | sort -nr | head -10 | awk '{print $1/1024/1024 "MB " $2}'
  1. 处理常见的"大文件嫌疑人"
# 检查core dump文件
find / -name "core.*" -size +100M

# 检查旧的备份文件
find / -name "*.tar.gz" -mtime +30

# 检查邮件队列
ls -lh /var/spool/mail/

五、预防胜于治疗的维护建议

与其等磁盘满了再手忙脚乱,不如平时做好预防:

  1. 设置磁盘监控
# 简单的磁盘监控脚本
#!/bin/bash
THRESHOLD=90
CURRENT=$(df / | grep / | awk '{ print $5}' | sed 's/%//g')
if [ "$CURRENT" -gt "$THRESHOLD" ]; then
    echo "Warning: 根分区使用率已达 ${CURRENT}%" | mail -s "磁盘警报" admin@example.com
fi
  1. 自动化清理任务
# 在crontab中添加定期清理任务
0 3 * * * /usr/bin/find /tmp -type f -mtime +7 -delete
0 4 * * 1 /usr/bin/apt-get autoremove -y
  1. 合理的分区方案
# 建议的分区方案示例:
# /     50G
# /home 100G
# /var  50G
# /tmp  10G

六、特殊场景的应对策略

有些特殊情况需要特殊处理:

  1. 处理已删除但未释放空间的文件
# 当df显示空间不足但du统计不出来时:
lsof | grep deleted
# 然后重启占用这些文件的进程
  1. 处理磁盘inode耗尽的情况
# 检查inode使用情况
df -i
# 查找小文件最多的目录
find / -xdev -type f | cut -d "/" -f 2 | sort | uniq -c | sort -n
  1. 处理Docker占用的磁盘空间
# 查看Docker磁盘使用详情
docker system df
# 彻底清理
docker system prune -a --volumes

七、终极武器:当所有方法都无效时

如果试了所有方法还是不够用,那就得考虑这些终极大招:

  1. 扩展磁盘空间(LVM环境下)
# 查看当前VG空间
vgs
# 扩展逻辑卷
lvextend -L +20G /dev/mapper/vg-root
# 调整文件系统大小
resize2fs /dev/mapper/vg-root
  1. 迁移数据到其他分区
# 比如把/var/log迁移到/home空间
mkdir /home/var_log
rsync -avz /var/log/ /home/var_log/
mount --bind /home/var_log /var/log
# 记得在/etc/fstab添加:
# /home/var_log /var/log none bind 0 0
  1. 最后的绝招 - 重装系统
# 备份重要数据
rsync -avz /home /backup/
rsync -avz /etc /backup/
# 然后...你知道该怎么做

应用场景与技术分析

这些清理方法适用于各种Linux环境,从个人电脑到生产服务器都适用。特别是:

  • Web服务器(Nginx/Apache日志清理)
  • 数据库服务器(日志和临时文件)
  • 开发环境(各种缓存和依赖包)
  • CI/CD服务器(构建缓存和制品)

技术优缺点: 优点:

  • 大部分操作无需停机
  • 使用系统自带工具,无需额外安装
  • 即时见效,快速释放空间

缺点:

  • 有些操作需要root权限
  • 不当操作可能误删重要文件
  • 临时解决方案,不能替代合理的容量规划

注意事项:

  1. 删除前务必确认文件重要性
  2. 生产环境建议先在测试环境验证
  3. 关键操作前做好备份
  4. 注意某些服务可能需要重启才能释放空间

总结

磁盘空间管理是Linux系统维护的基本功。通过本文介绍的各种方法,从快速定位问题到彻底解决方案,你应该能够应对绝大多数磁盘空间不足的情况。记住,定期维护比紧急抢救更重要,合理的分区方案和监控机制能让你事半功倍。最后提醒一句:rm -rf 很危险,操作需谨慎!