在 Linux 系统中,磁盘空间不足会导致服务异常、系统卡顿甚至崩溃。高效的磁盘清理与维护需遵循 “先定位问题→再精准清理→最后长期监控” 的逻辑,以下是从基础检查到进阶维护的完整实用技巧。
一、第一步:定位磁盘空间占用问题
在清理前,必须先明确哪些分区满了、哪些目录 / 文件占用空间最大,避免盲目删除导致系统故障。以下是核心工具与命令:
1. 查看整体分区使用情况(df)
df(disk free)用于查看所有挂载分区的空间使用状态,推荐带 -h(人类可读格式)参数:df -h
输出示例(关键列说明):
| Filesystem(文件系统) | Size(总大小) | Used(已用) | Avail(可用) | Use%(使用率) | Mounted on(挂载点) |
|---|---|---|---|---|---|
| /dev/sda1 | 50G | 45G | 2.3G | 96% | /(根分区,风险高) |
| /dev/sda3 | 100G | 30G | 70G | 30% | /home(用户分区) |
| /dev/sda4 | 20G | 5G | 15G | 25% | /var(日志 / 缓存分区) |
重点关注:
Use% > 85% 的分区(尤其是 / 根分区),需优先处理。2. 查看目录 / 文件占用详情(du)
du(disk usage)用于查看指定目录或文件的空间占用,搭配参数可精准定位大文件:- 查看当前目录下所有子目录的大小(
-s汇总,-h可读):du -sh * - 查看根目录下各一级目录的大小(定位大目录,
--max-depth=1限制深度):du -h --max-depth=1 / - 查找全系统大于 100MB 的文件(按大小排序,
-exec执行du显示详情):find / -type f -size +100M -exec du -sh {} \; | sort -rh - 查找 **/var/log 目录下修改时间超过 30 天的日志文件 **(旧日志优先清理):
find /var/log -type f -mtime +30 -name "*.log*" -exec ls -lh {} \;
3. 可视化工具(适合新手:ncdu)
du 命令输出较繁琐,ncdu(NCurses Disk Usage)是终端可视化工具,支持交互式浏览目录大小:- 安装(Debian/Ubuntu/RHEL/CentOS):
# Debian/Ubuntu sudo apt install ncdu # RHEL/CentOS sudo dnf install ncdu - 运行(扫描根目录,按
?查看帮助):sudo ncdu /
界面直观显示目录大小,可按
d 直接删除无用文件,降低操作门槛。二、第二步:精准清理磁盘空间(按类别优先级)
磁盘占用主要来自日志、缓存、无用软件、大文件 / 冗余文件,按 “安全优先级” 从高到低清理(先清理无风险的临时 / 冗余文件)。
1. 优先级 1:清理日志文件(/var/log)
Linux 系统日志(如系统日志、应用日志)默认存放在
/var/log,会持续累积(尤其是高并发服务如 Nginx、MySQL),是最安全的清理对象之一。(1)手动清理旧日志
- 清理超过 30 天的.log 文件(避免删除正在写入的日志,用
-mtime +30筛选旧文件):sudo find /var/log -type f -mtime +30 -name "*.log*" -delete - 清空正在写入的日志(直接
rm会导致空间不释放,需用truncate或重定向空文件):# 安全清空syslog(系统日志) sudo truncate /var/log/syslog --size=0 # 或用重定向(效果相同) sudo cat /dev/null > /var/log/syslog
(2)自动管理日志(logrotate)
手动清理无法根治,
logrotate 是系统默认的日志轮转工具,可按时间 / 大小切割日志、压缩旧日志、自动删除过期日志。- 配置文件路径:
/etc/logrotate.conf(全局配置)、/etc/logrotate.d/(应用单独配置,如 nginx、mysql)。 - 示例:为 Nginx 日志配置轮转(
/etc/logrotate.d/nginx):/var/log/nginx/*.log { daily # 每天轮转1次 rotate 7 # 保留7天的日志 compress # 压缩旧日志(.gz格式) delaycompress # 延迟压缩(保留最新1个未压缩日志) missingok # 日志不存在时不报错 notifempty # 空日志不轮转 create 0640 www-data www-data # 新建日志的权限和归属 } - 手动触发轮转(测试配置是否生效):
sudo logrotate -f /etc/logrotate.d/nginx
2. 优先级 2:清理缓存文件
缓存文件是系统 / 应用临时生成的 “中间文件”,删除后不影响核心功能,主要分为系统缓存和用户缓存。
(1)系统缓存(/var/cache)
- APT 缓存(Debian/Ubuntu):
apt安装软件时会缓存.deb 包到/var/cache/apt/archives/,清理命令:sudo apt clean # 清理所有缓存包(彻底) sudo apt autoclean # 仅清理过期(无法再下载)的缓存包(温和) - YUM/DNF 缓存(RHEL/CentOS/Fedora):缓存存于
/var/cache/yum/或/var/cache/dnf/,清理命令:sudo yum clean all # YUM sudo dnf clean all # DNF(新版) - Docker 缓存(若使用 Docker):镜像、容器、卷会占用大量空间,清理无用资源:
# 清理停止的容器、无用镜像、未使用的网络(安全) sudo docker system prune -f # 额外清理未使用的卷(需确认卷无数据,谨慎) sudo docker system prune -a -f --volumes
(2)用户缓存(~/.cache)
每个用户的缓存(如浏览器缓存、IDE 缓存)存于
~/.cache,普通用户可直接删除:# 清理当前用户缓存(无需sudo)
rm -rf ~/.cache/*
3. 优先级 3:卸载无用软件与依赖
系统中会残留未使用的软件包、孤儿依赖(无软件依赖它),占用空间且增加安全风险。
(1)卸载无用软件
- Debian/Ubuntu:
# 查看已安装软件(按大小排序) dpkg-query -Wf '${Installed-Size}\t${Package}\n' | sort -rh | head -20 # 卸载软件(如卸载旧版Python) sudo apt remove python3.8 - RHEL/CentOS:
# 查看已安装软件(按大小排序) dnf repoquery -q -f --installed --sort=-size | head -20 # 卸载软件 sudo dnf remove python3.8
(2)清理孤儿依赖
- Debian/Ubuntu:用
deborphan查找孤儿依赖:sudo apt install deborphan deborphan # 列出孤儿依赖 sudo apt remove $(deborphan) # 卸载所有孤儿依赖 - RHEL/CentOS:
dnf自带清理功能:sudo dnf autoremove # 自动卸载无用依赖
4. 优先级 4:删除大文件与冗余文件
通过
du 或 ncdu 定位的超大文件(如旧备份、未使用的虚拟机镜像),需人工确认后删除(风险较高,需谨慎)。-
常见大文件位置:
- 备份文件:
/backup、~/*.tar.gz、~/*.bak(确认无用后删除)。 - 虚拟机镜像:
~/.VirtualBox/(VirtualBox)、/var/lib/libvirt/images/(KVM)。 - 数据库备份:
/var/lib/mysql/backup/(若已迁移到外部存储,可删除本地备份)。
- 备份文件:
-
示例:删除
/home/user/old_backup.tar.gz(确认无用后):# 先查看文件大小和修改时间 ls -lh /home/user/old_backup.tar.gz # 删除 rm -rf /home/user/old_backup.tar.gz
5. 优先级 5:清理临时文件(/tmp)
/tmp 是系统临时文件目录,默认重启后自动清空,但长期不重启会累积文件,可手动清理(避免删除正在使用的文件):# 清理/tmp下超过7天的文件(安全)
sudo find /tmp -type f -mtime +7 -delete
# 或清空所有临时文件(需确认无服务在使用,如数据库临时文件)
sudo rm -rf /tmp/*
三、第三步:长期维护策略(避免反复满盘)
清理只是临时解决方案,需通过自动化、监控、分区规划实现长期稳定。
1. 自动化清理(crontab 定时任务)
将常用清理命令写入脚本,用
crontab 定时执行(如每天凌晨 3 点清理)。示例:创建自动清理脚本
- 创建脚本
/usr/local/bin/disk-clean.sh:#!/bin/bash # 1. 清理APT缓存 sudo apt autoclean > /dev/null 2>&1 # 2. 清理/var/log超过30天的日志 sudo find /var/log -type f -mtime +30 -name "*.log*" -delete > /dev/null 2>&1 # 3. 清理/tmp超过7天的文件 sudo find /tmp -type f -mtime +7 -delete > /dev/null 2>&1 # 4. 清理Docker无用资源 if command -v docker &> /dev/null; then sudo docker system prune -f > /dev/null 2>&1 fi - 赋予执行权限:
sudo chmod +x /usr/local/bin/disk-clean.sh - 加入 crontab(每天 3 点执行):
sudo crontab -e # 在文件末尾添加: 0 3 * * * /usr/local/bin/disk-clean.sh
2. 磁盘空间监控(及时告警)
当磁盘使用率超过阈值(如 85%)时,自动发送邮件告警,避免发现时已满盘。
示例:简单监控脚本(结合邮件)
- 安装邮件工具(如
mailutils):sudo apt install mailutils - 创建监控脚本
/usr/local/bin/disk-monitor.sh:#!/bin/bash # 监控根分区(/),阈值85% THRESHOLD=85 USAGE=$(df -h / | grep / | awk '{print $5}' | sed 's/%//g') if [ $USAGE -ge $THRESHOLD ]; then # 发送邮件告警(替换your@email.com) echo "警告:根分区(/)使用率已达${USAGE}%,请及时清理!" | mail -s "Linux磁盘告警" your@email.com fi - 加入 crontab(每小时检查一次):
sudo crontab -e # 添加: 0 * * * * /usr/local/bin/disk-monitor.sh
进阶监控:使用 Zabbix/Nagios
对于多服务器场景,推荐用 Zabbix、Nagios 等工具,支持图形化展示、多维度告警(短信 / 邮件),适合企业级维护。
3. 合理规划分区(从源头避免问题)
新安装系统时,合理分区可避免单个分区满盘影响整个系统,推荐分区方案:
| 分区 | 用途 | 建议大小(根据总磁盘) | 原因 |
|---|---|---|---|
/ |
根分区(系统核心文件) | 50-100G | 避免核心文件被其他分区占用 |
/var |
日志、缓存、数据库 | 单独分区(如 100-200G) | 日志暴涨时不影响根分区 |
/home |
用户数据 | 最大分区(剩余空间) | 用户文件多,独立分区方便重装 |
/tmp |
临时文件 | 20-50G | 避免临时文件占满根分区 |
swap |
交换分区 | 内存的 1-2 倍(如 16G) | 内存不足时作为临时内存 |
四、清理注意事项(避免系统故障)
- 禁止盲目删除系统目录:如
/bin、/sbin、/lib、/usr(核心文件,删除即崩溃)。 - 不删除正在使用的文件:如正在写入的日志(
rm后空间不释放,需用truncate清空)、数据库文件(如/var/lib/mysql/*)。 - 重要文件先备份:如配置文件、用户数据,删除前可先压缩备份(
tar -czf backup.tar.gz 目标文件)。 - 清理后验证空间:执行
df -h确认空间已释放,避免操作无效。
通过以上步骤,可高效清理 Linux 磁盘空间,并建立长期维护机制,确保系统稳定运行。根据实际场景(个人主机 / 服务器、Debian/RHEL 系)调整命令,核心原则是 “先定位、再清理、后监控”。