一、先搞清楚:磁盘空间被谁占用了?
在动手清理之前,我们得先知道是哪个“家伙”吃掉了我们的硬盘空间。这里有两个黄金命令:df 和 du。
df 命令就像系统的“总览仪表盘”,一眼就能看出各个分区用了多少,还剩多少。而 du 命令则是“侦探”,专门深入文件夹内部,计算每个文件和目录的大小。
技术栈:Linux Shell
我们先看看整体情况:
# 查看磁盘整体使用情况,-h 参数让数字以人类易读的方式显示(如G、M)
df -h
输出可能类似这样:
文件系统 容量 已用 可用 已用% 挂载点
/dev/sda1 50G 45G 2.0G 96% /
看,根分区 / 已经用了96%,只剩2G了,情况危急!
知道哪个分区满了之后,我们就用 du 进去“破案”。最常用的组合拳是:
# 1. 找出当前目录下所有目录和文件的大小,并排序,显示最大的10个
# -h: 人类可读格式
# -s: 只显示总计大小
# --max-depth=1: 只深入到第1层子目录
# sort -hr: 按人类可读的数字进行反向排序(从大到小)
# head -10: 只显示前10行结果
du -h --max-depth=1 / | sort -hr | head -10
这个命令会列出根目录下所有一级子目录的大小,帮你快速定位到是 /home(用户数据)、/var(系统日志、缓存)还是 /usr(安装的软件)占用了主要空间。
二、进阶侦查:用du精准定位“大块头”文件
找到可疑的大目录后,我们需要进一步深入,找出具体的“罪魁祸首”——那些巨大的文件。比如,我们发现 /var 目录很大。
技术栈:Linux Shell
# 2. 在/var目录下,查找最大的前20个文件或目录
# -a: 显示文件而不仅仅是目录
# -h: 同上
# --max-depth=10: 可以设置得深一些,以便找到深层的文件
# 2>/dev/null: 忽略可能出现的“权限不足”等错误信息,让输出更干净
sudo du -ah /var --max-depth=10 2>/dev/null | sort -hr | head -20
这个命令可能需要 sudo 权限,因为 /var 下有些文件普通用户无权查看。执行后,你可能会看到像 /var/log/syslog.1(几百兆的日志)、/var/lib/docker/overlay2/...(Docker的镜像和容器层)或者 /var/cache/apt/archives/(软件包缓存)这样的“大块头”。
一个更强大的查找命令是 find 配合 du:
# 3. 使用find直接查找大于100M的文件,并显示其大小
# -type f: 只查找文件类型
# -size +100M: 大小超过100兆字节
# -exec du -h {} \;: 对找到的每个文件执行`du -h`命令来查看大小
sudo find /var -type f -size +100M -exec du -h {} \; 2>/dev/null | sort -hr
这种方法更直接,能快速列出所有超过指定大小的文件。
三、开始清理:针对不同“嫌犯”的处置方案
定位到具体的目标后,我们就可以开始清理了。但请注意,删除系统文件前务必确认其用途!
场景1:清理过期的日志文件
日志文件(通常在 /var/log)是常见的空间杀手。
技术栈:Linux Shell
# 4. 查看并清理旧的系统日志(例如,保留最近7天的核心日志)
# 首先,看看有哪些大的日志文件
sudo ls -lh /var/log/syslog* /var/log/kern.log* 2>/dev/null
# 方法A: 清空当前正在写的日志文件(系统服务会重新打开它)
# 这是一个安全的方法,不会删除文件本身,只是把内容清空
sudo truncate -s 0 /var/log/syslog
sudo truncate -s 0 /var/log/kern.log
# 方法B: 使用logrotate工具(这是更规范的做法)
# 系统通常已配置logrotate,你可以手动触发它来压缩和轮转日志
sudo logrotate -f /etc/logrotate.conf
# 方法C: 删除压缩过的旧日志(比如30天前的)
find /var/log -name "*.gz" -mtime +30 -delete
find /var/log -name "*.log.*" -mtime +7 -delete # 删除7天前的轮转日志
场景2:清理软件包缓存
如果你使用 apt(Debian/Ubuntu)或 yum/dnf(RHEL/CentOS/Fedora),下载的软件包安装后并不会自动删除。
技术栈:Linux Shell (以APT为例)
# 5. 清理APT软件包缓存
# 查看缓存占用空间
sudo du -sh /var/cache/apt/archives
# 安全地清理已安装软件的旧版本包(不会删除当前正在使用的)
sudo apt-get autoclean
# 更彻底地清理所有已下载的软件包(即使是当前版本,下次安装需要重新下载)
# 使用前请确保网络通畅
sudo apt-get clean
对于 yum/dnf,可以使用 sudo yum clean all 或 sudo dnf clean all。
场景3:清理Docker资源
如果你的服务器上跑着Docker,它可能是隐藏的“空间吞噬者”。
技术栈:Linux Shell (Docker CLI)
# 6. 查看Docker磁盘使用情况
docker system df
# 清理所有未被使用的镜像、容器、网络和构建缓存(非常有用!)
# --all: 删除所有未使用的镜像,而不仅仅是悬空镜像
# --volumes: **谨慎使用**,这会删除未被任何容器引用的数据卷
docker system prune --all --volumes
# 更安全的做法是分步清理:
# 删除所有停止的容器
docker container prune
# 删除所有未被容器使用的镜像(悬空镜像)
docker image prune
# 删除所有未被使用的数据卷(在确认数据已备份或不需要后)
docker volume prune
场景4:清理用户目录下的“垃圾”
检查 /home 目录下的用户,看看是否有下载的大视频、废弃的虚拟机镜像、IDE的历史缓存等。
技术栈:Linux Shell
# 7. 在用户家目录下查找大文件(例如找大于500M的)
# 注意:这个命令可能需要在该用户下执行,或由root执行并指定路径
find /home -type f -size +500M -exec ls -lh {} \; 2>/dev/null
# 常见的可清理目标:
# - `~/Downloads/` 下载目录
# - `~/.cache/` 各种应用的缓存(如浏览器缓存,但清理需谨慎)
# - IDE项目目录下的 `node_modules/`, `target/`, `.idea/system/` 等
# - 旧的压缩包、安装包等
四、应用场景、优缺点与重要注意事项
应用场景:
- 服务器告警:监控系统发出磁盘空间不足(如使用率>90%)的告警时。
- 日常维护:作为周期性系统维护任务的一部分,预防空间被占满。
- 故障排查:当系统因磁盘满而出现服务异常、无法写入日志、数据库崩溃等问题时。
- 资源优化:在部署新应用或服务前,清理出必要的空间。
技术优缺点:
- 优点:
- 效果立竿见影:快速释放空间,解决燃眉之急。
- 工具简单强大:仅需几个核心命令(
du,df,find),无需安装额外软件。 - 灵活性高:可以根据具体需求组合命令,精准定位和清理。
- 缺点/局限:
- 治标不治本:清理只是临时解决方案,需要找到数据增长过快的根本原因(如日志无限增长、程序Bug产生垃圾文件等)。
- 存在风险:误删系统关键文件可能导致服务不可用或系统崩溃。
- 手动操作:大规模、多服务器环境下,手动操作效率低下,需结合自动化脚本或配置管理工具(如Ansible)。
至关重要的注意事项(血泪教训!):
- 备份!备份!备份!:在删除任何你不完全确定的文件之前,尤其是日志和数据库相关文件,最好先进行备份或移动到一个临时位置观察一段时间。
- 不要直接删除正在被写入的日志文件:使用
truncate或> filename清空,而不是rm。直接删除可能导致持有文件句柄的程序无法继续写入日志。 - 理解文件用途:删除
/var或/usr下的文件时要格外小心。不确定时,用搜索引擎查一下文件名。 - 使用
-i交互模式:对于rm命令,可以加上-i参数,删除前会逐一确认。对于重要操作,这是一个好习惯。 - 关注数据卷和数据库:Docker数据卷、数据库的数据文件(如MySQL的ibdata1)通常很大,清理它们需要遵循特定的、安全的流程,切忌直接删除。
- 建立长效机制:配置
logrotate管理日志,设置cron定时任务定期清理缓存(如/tmp),从源头控制空间增长。
五、总结
Linux磁盘空间清理是一项基础但至关重要的运维技能。其核心思路可以概括为“先侦察,后行动”:
- 侦察:使用
df -h看全局,再用du和find组合拳定位具体的大目录和大文件。 - 行动:针对不同的“空间大户”采取安全措施:
- 日志:用
logrotate或truncate管理。 - 包缓存:用
apt-get clean/yum clean all清理。 - 容器:用
docker system prune清理。 - 用户文件:手动检查并清理下载、缓存目录。
- 日志:用
记住,清理只是手段,优化和预防才是目的。养成良好的习惯,比如为日志配置合理的轮转策略、为缓存目录设置大小限制、定期检查存储使用趋势,才能让你的Linux系统始终保持健康、轻盈的状态,避免在深夜被磁盘空间告警电话叫醒。
评论