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

咱们平时用Linux系统,最怕的就是突然弹出来个"no space left on device"的错误。就像家里的衣柜莫名其妙被塞满一样,让人一头雾水。这时候别急着删东西,先得找到"罪魁祸首"。

最常用的侦查工具就是dfdu这对黄金搭档。先来个快速检查:

# 查看各分区使用情况(-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深入调查:

# 找出/目录下占用空间最大的前10个目录
sudo du -h --max-depth=1 / | sort -hr | head -n 10

输出可能长这样:

45G    /var
1.5G   /usr
800M   /home
...

如果发现是/var这个"大胃王",那咱们就得重点排查日志、缓存这些常见"嫌犯"了。

二、清理临时文件和缓存

就像我们电脑用久了会产生一堆临时文件一样,Linux系统也会积累各种"垃圾"。这些往往是最好清理的。

  1. 清理apt缓存(适合Debian/Ubuntu系):
# 查看缓存大小
sudo du -sh /var/cache/apt/archives

# 清理已下载的安装包
sudo apt clean

# 更彻底的清理(包括旧版本的包)
sudo apt autoclean
  1. 清理系统日志:
# 查看日志目录大小
sudo du -sh /var/log

# 清空特定日志文件(比如syslog)
sudo truncate -s 0 /var/log/syslog

# 或者用logrotate管理日志
sudo logrotate -f /etc/logrotate.conf
  1. 清理临时目录:
# /tmp目录清理(注意别误删正在使用的文件)
sudo find /tmp -type f -atime +7 -delete

三、处理大文件和重复文件

有时候系统里会藏着一些"巨无霸"文件,可能是日志、崩溃转储或者下载的安装包。

  1. 查找大文件:
# 查找大于100MB的文件
sudo find / -type f -size +100M -exec ls -lh {} \; 2>/dev/null | awk '{ print $9 ": " $5 }'
  1. 处理core dump文件:
# 禁用core dump(临时生效)
ulimit -c 0

# 永久禁用需要修改/etc/security/limits.conf
  1. 查找重复文件(需要先安装fdupes):
# 安装工具
sudo apt install fdupes

# 查找指定目录下的重复文件
fdupes -r /home

四、清理Docker的磁盘占用

如果你在用Docker,它可是个隐藏的"磁盘杀手"。特别是长时间使用后,会积累大量镜像、容器和卷数据。

  1. 查看Docker磁盘使用:
docker system df
  1. 清理无用对象:
# 删除所有停止的容器
docker container prune

# 删除所有未被使用的镜像
docker image prune -a

# 更彻底的清理(包括builder缓存)
docker system prune -a --volumes
  1. 限制日志大小(在docker-compose.yml中):
services:
  myservice:
    logging:
      driver: "json-file"
      options:
        max-size: "10m"
        max-file: "3"

五、处理邮件和打印队列

这两个服务经常被忽略,但它们也可能占用大量空间。

  1. 清理邮件队列:
# 查看邮件队列大小
sudo du -sh /var/mail /var/spool/mail

# 清空特定用户的邮件
sudo cp /dev/null /var/mail/username
  1. 清理打印队列:
# 取消所有打印任务
sudo lprm -

# 或者直接清空打印队列
sudo rm -rf /var/spool/cups/*

六、高级技巧:使用LVM扩容

如果清理后空间还是不够,可以考虑使用LVM(逻辑卷管理)来扩容。不过这个需要你有未分配的磁盘空间。

  1. 查看当前卷组空间:
sudo vgdisplay
  1. 扩展逻辑卷(假设我们要给根分区扩容):
# 先确认卷组有可用空间
sudo vgs

# 扩展逻辑卷(增加5G)
sudo lvextend -L +5G /dev/mapper/ubuntu--vg-root

# 调整文件系统大小(ext4为例)
sudo resize2fs /dev/mapper/ubuntu--vg-root

七、预防胜于治疗:建立监控

与其等磁盘满了手忙脚乱,不如提前建立监控。

  1. 设置磁盘空间告警(添加到crontab):
# 每天检查一次,超过90%就发邮件
df -h | awk '$5+0 >= 90 {print $1 " is " $5 " full!"}' | mail -s "Disk Space Alert" admin@example.com
  1. 使用logrotate自动管理日志:

/etc/logrotate.d/下创建自定义配置,比如:

/var/log/myapp/*.log {
    daily
    missingok
    rotate 7
    compress
    delaycompress
    notifempty
    create 644 root root
}

八、注意事项与总结

在清理过程中,有几点需要特别注意:

  1. 谨慎使用rm命令:特别是以root身份操作时,一个不小心就可能删掉系统关键文件。建议先用ls列出要删除的文件,确认无误后再执行删除。

  2. 不要随意清空/proc和/sys:这些是虚拟文件系统,里面的"文件"实际上并不占用磁盘空间。

  3. 保留足够的系统日志:虽然日志可能占用空间,但它们是排查系统问题的重要依据。建议保留最近7-10天的日志。

  4. 考虑使用tmpfs:对于频繁读写的临时文件,可以挂载为tmpfs(内存文件系统),既提高速度又减少磁盘写入。

总结一下,面对Linux磁盘空间不足的问题,我们应该:

  • 先诊断,后治疗:用dfdu找出问题所在
  • 从易到难:先清理临时文件和缓存这类"软柿子"
  • 重点突破:针对占用空间大的目录专项清理
  • 建立长效机制:设置监控和自动清理策略
  • 必要时扩容:考虑LVM等高级方案

记住,定期维护比紧急抢救要轻松得多。养成定期检查磁盘使用情况的习惯,就能避免很多突发状况。