一、快速定位大文件

当系统提示磁盘空间不足时,第一步就是要找出哪些文件占用了大量空间。Linux提供了几个强大的命令来帮助我们快速定位这些"空间杀手"。

最常用的命令是du(disk usage),配合一些参数可以很直观地查看文件大小分布。比如:

# 查看当前目录下各文件和子目录的大小(人类可读格式)
du -sh *

# 查找当前目录下最大的10个文件或目录
du -ah | sort -rh | head -n 10

# 查找/var目录下大于100MB的文件
find /var -type f -size +100M -exec ls -lh {} \;

这里解释下这些命令:

  • du -sh *:-s表示汇总,-h表示人类可读格式
  • sort -rh:-r反向排序,-h按人类可读大小排序
  • find命令的-size参数:+100M表示大于100MB

二、清理日志文件

日志文件往往是占用空间的大户,特别是长期运行的服务器。我们可以用以下几种方式处理:

  1. 手动清理旧日志:
# 删除/var/log下7天前的日志文件
find /var/log -type f -name "*.log" -mtime +7 -delete
  1. 使用logrotate工具自动管理:
# 查看系统现有的logrotate配置
ls /etc/logrotate.d/

# 示例配置(/etc/logrotate.d/myapp):
"/var/log/myapp/*.log" {
    daily
    missingok
    rotate 30
    compress
    delaycompress
    notifempty
    create 644 root root
}

这个配置表示:

  • 每天轮转一次日志
  • 保留30个归档
  • 使用gzip压缩(compress)
  • 延迟一天压缩(delaycompress)
  • 如果日志为空则不轮转

三、清理软件包缓存

Linux的包管理器会缓存下载的软件包,时间久了会占用不少空间。

对于Debian/Ubuntu系统:

# 清理apt缓存
sudo apt-get clean
sudo apt-get autoclean

# 删除不再需要的依赖包
sudo apt-get autoremove

对于CentOS/RHEL系统:

# 清理yum缓存
sudo yum clean all

# 更彻底的清理
sudo rm -rf /var/cache/yum

四、处理Docker磁盘占用

如果你使用Docker,它的镜像、容器和卷可能会占用大量空间。以下是清理方法:

  1. 查看磁盘使用情况:
docker system df
  1. 清理无用资源:
# 删除所有停止的容器
docker container prune

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

# 删除所有未被使用的网络
docker network prune

# 一键清理所有无用资源
docker system prune -a
  1. 限制日志大小:
# 在docker-compose.yml中限制日志大小
services:
  myapp:
    logging:
      driver: "json-file"
      options:
        max-size: "10m"
        max-file: "3"

五、查找并删除重复文件

重复文件也是浪费空间的常见原因。我们可以使用fdupes工具来查找:

# 安装fdupes
sudo apt install fdupes  # Debian/Ubuntu
sudo yum install fdupes  # CentOS/RHEL

# 查找当前目录下的重复文件
fdupes -r .

# 查找并立即删除重复文件(保留第一个找到的文件)
fdupes -rd .

六、清理临时文件

系统临时目录和用户临时目录经常堆积无用文件:

# 清理系统临时文件
sudo rm -rf /tmp/*

# 清理用户缓存
rm -rf ~/.cache/*

# 清理旧的snap版本
sudo snap list --all | awk '/disabled/{print $1, $3}' | \
    xargs -rn1 sudo snap remove --revision

七、使用ncdu进行可视化分析

如果你更喜欢图形化界面,可以试试ncdu工具:

# 安装ncdu
sudo apt install ncdu  # Debian/Ubuntu
sudo yum install ncdu  # CentOS/RHEL

# 扫描当前目录
ncdu

# 扫描整个系统(需要root权限)
sudo ncdu /

使用方向键导航,d键删除选中的文件或目录,非常方便。

八、处理大文件的高级技巧

对于特别大的文件,我们可以使用稀疏文件技术:

# 检查文件是否是稀疏文件
filefrag -v largefile.iso

# 将普通文件转换为稀疏文件
cp --sparse=always largefile.iso largefile_sparse.iso

# 使用fallocate释放文件空间
fallocate -d largefile.iso

九、预防磁盘空间不足的建议

  1. 设置磁盘空间监控:
# 每天检查磁盘空间并发送邮件
df -h | mail -s "Disk Space Report" admin@example.com
  1. 使用cron定期清理:
# 编辑crontab
crontab -e

# 添加每周清理任务
0 3 * * 0 /usr/bin/find /tmp -type f -atime +7 -delete
  1. 考虑使用LVM管理磁盘,方便扩容。

十、总结与注意事项

通过以上方法,大多数磁盘空间问题都能得到解决。但在清理时要注意:

  1. 删除文件前先确认内容,特别是系统文件
  2. 不要直接删除正在被进程使用的日志文件
  3. 清理前最好先备份重要数据
  4. 对于生产环境,建议在非高峰期进行清理操作
  5. 考虑设置磁盘配额防止单个用户占用过多空间

记住,预防胜于治疗。定期监控磁盘使用情况,设置自动清理策略,才能从根本上避免空间不足的问题。