在 Linux 系统中,磁盘空间不足会导致服务异常、系统卡顿甚至崩溃。高效的磁盘清理与维护需遵循 “先定位问题→再精准清理→最后长期监控” 的逻辑,以下是从基础检查到进阶维护的完整实用技巧。
在清理前,必须先明确哪些分区满了、哪些目录 / 文件占用空间最大,避免盲目删除导致系统故障。以下是核心工具与命令:
df
(disk free)用于查看所有挂载分区的空间使用状态,推荐带 -h
(人类可读格式)参数:
输出示例(关键列说明):
重点关注:Use% > 85%
的分区(尤其是 /
根分区),需优先处理。
du
(disk usage)用于查看指定目录或文件的空间占用,搭配参数可精准定位大文件:
- 查看当前目录下所有子目录的大小(
-s
汇总,-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 {} \;
du
命令输出较繁琐,ncdu
(NCurses Disk Usage)是终端可视化工具,支持交互式浏览目录大小:
- 安装(Debian/Ubuntu/RHEL/CentOS):
sudo apt install ncdu
sudo dnf install ncdu
- 运行(扫描根目录,按
?
查看帮助):
界面直观显示目录大小,可按 d
直接删除无用文件,降低操作门槛。
磁盘占用主要来自日志、缓存、无用软件、大文件 / 冗余文件,按 “安全优先级” 从高到低清理(先清理无风险的临时 / 冗余文件)。
Linux 系统日志(如系统日志、应用日志)默认存放在 /var/log
,会持续累积(尤其是高并发服务如 Nginx、MySQL),是最安全的清理对象之一。
- 清理超过 30 天的.log 文件(避免删除正在写入的日志,用
-mtime +30
筛选旧文件):
sudo find /var/log -type f -mtime +30 -name "*.log*" -delete
- 清空正在写入的日志(直接
rm
会导致空间不释放,需用 truncate
或重定向空文件):
sudo truncate /var/log/syslog --size=0
sudo cat /dev/null > /var/log/syslog
手动清理无法根治,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
缓存文件是系统 / 应用临时生成的 “中间文件”,删除后不影响核心功能,主要分为系统缓存和用户缓存。
- 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
sudo dnf clean all
- Docker 缓存(若使用 Docker):镜像、容器、卷会占用大量空间,清理无用资源:
sudo docker system prune -f
sudo docker system prune -a -f --volumes
每个用户的缓存(如浏览器缓存、IDE 缓存)存于 ~/.cache
,普通用户可直接删除:
系统中会残留未使用的软件包、孤儿依赖(无软件依赖它),占用空间且增加安全风险。
- Debian/Ubuntu:
dpkg-query -Wf '${Installed-Size}\t${Package}\n' | sort -rh | head -20
sudo apt remove python3.8
- RHEL/CentOS:
dnf repoquery -q -f --installed --sort=-size | head -20
sudo dnf remove python3.8
- Debian/Ubuntu:用
deborphan
查找孤儿依赖:
sudo apt install deborphan
deborphan
sudo apt remove $(deborphan)
- RHEL/CentOS:
dnf
自带清理功能:
通过 du
或 ncdu
定位的超大文件(如旧备份、未使用的虚拟机镜像),需人工确认后删除(风险较高,需谨慎)。
/tmp
是系统临时文件目录,默认重启后自动清空,但长期不重启会累积文件,可手动清理(避免删除正在使用的文件):
sudo find /tmp -type f -mtime +7 -delete
sudo rm -rf /tmp/*
清理只是临时解决方案,需通过自动化、监控、分区规划实现长期稳定。
将常用清理命令写入脚本,用 crontab
定时执行(如每天凌晨 3 点清理)。
- 创建脚本
/usr/local/bin/disk-clean.sh
:
#!/bin/bash
sudo apt autoclean > /dev/null 2>&1
sudo find /var/log -type f -mtime +30 -name "*.log*" -delete > /dev/null 2>&1
sudo find /tmp -type f -mtime +7 -delete > /dev/null 2>&1
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
当磁盘使用率超过阈值(如 85%)时,自动发送邮件告警,避免发现时已满盘。
- 安装邮件工具(如
mailutils
):
sudo apt install mailutils
- 创建监控脚本
/usr/local/bin/disk-monitor.sh
:
#!/bin/bash
THRESHOLD=85
USAGE=$(df -h / | grep / | awk '{print $5}' | sed 's/%//g')
if [ $USAGE -ge $THRESHOLD ]; then
echo "警告:根分区(/)使用率已达${USAGE}%,请及时清理!" | mail -s "Linux磁盘告警" your@email.com
fi
- 加入 crontab(每小时检查一次):
sudo crontab -e
0 * * * * /usr/local/bin/disk-monitor.sh
对于多服务器场景,推荐用 Zabbix、Nagios 等工具,支持图形化展示、多维度告警(短信 / 邮件),适合企业级维护。
新安装系统时,合理分区可避免单个分区满盘影响整个系统,推荐分区方案:
- 禁止盲目删除系统目录:如
/bin
、/sbin
、/lib
、/usr
(核心文件,删除即崩溃)。
- 不删除正在使用的文件:如正在写入的日志(
rm
后空间不释放,需用 truncate
清空)、数据库文件(如 /var/lib/mysql/*
)。
- 重要文件先备份:如配置文件、用户数据,删除前可先压缩备份(
tar -czf backup.tar.gz 目标文件
)。
- 清理后验证空间:执行
df -h
确认空间已释放,避免操作无效。
通过以上步骤,可高效清理 Linux 磁盘空间,并建立长期维护机制,确保系统稳定运行。根据实际场景(个人主机 / 服务器、Debian/RHEL 系)调整命令,核心原则是 “先定位、再清理、后监控”。