2026年Linux系统清理完全指南:如何高效管理磁盘空间(2026)

一、Linux磁盘空间管理基础

1.1 理解Linux磁盘空间

Linux系统将所有内容组织在根目录”/”下的文件系统中。磁盘空间是服务器运行的基础资源,当磁盘空间不足时,系统会出现各种问题,如无法创建新文件、应用运行缓慢甚至崩溃。因此,定期清理Linux系统磁盘空间是运维人员的基本技能。

1.2 查看磁盘使用情况

# 查看总体磁盘使用情况
df -h

# 查看当前目录各子目录大小
du -sh *

# 查看指定目录大小
du -sh /var/log

# 查看最大的10个文件或目录
du -ah / | sort -rh | head -n 10

# 查看磁盘 inode 使用情况
df -i

1.3 常见磁盘空间消耗来源

  • 日志文件:系统日志、应用日志持续增长
  • 软件包缓存:apt/yum/dnf的缓存文件
  • 旧内核:多次更新后积累的老旧内核
  • 临时文件:/tmp目录下的临时文件
  • 邮件队列:Postfix等邮件服务器的邮件存储
  • 数据库文件:MySQL、PostgreSQL等的数据库文件
  • 容器镜像:Docker等容器平台存储的镜像

二、日志文件清理

2.1 系统日志清理

Linux系统日志通常位于/var/log目录下:

# 查看日志目录大小
du -sh /var/log

# 查看各类日志文件大小
ls -lhS /var/log/

# 清理旧的日志文件
sudo find /var/log -name "*.gz" -mtime +30 -delete
sudo find /var/log -name "*.[0-9]" -mtime +30 -delete

# 截断日志文件(保留文件但清空内容)
sudo truncate -s 0 /var/log/syslog

# 使用logrotate自动管理日志
sudo nano /etc/logrotate.conf

2.2 logrotate配置示例

# /etc/logrotate.d/myapp 配置示例
/var/log/myapp/*.log {
    daily              # 每天轮转
    rotate 7           # 保留7个旧文件
    compress           # 压缩旧文件
    delaycompress      # 延迟压缩
    missingok          # 忽略文件不存在错误
    notifempty         # 空文件不轮转
    create 0640 www-data www-data  # 创建新文件权限
    postrotate
        systemctl reload myapp > /dev/null 2>&1 || true
    endscript
}

2.3 应用日志清理

# Nginx日志清理
sudo truncate -s 0 /var/log/nginx/access.log
sudo truncate -s 0 /var/log/nginx/error.log
sudo systemctl reload nginx

# Apache日志清理
sudo truncate -s 0 /var/log/apache2/access.log
sudo truncate -s 0 /var/log/apache2/error.log
sudo systemctl reload apache2

# MySQL慢查询日志清理
sudo truncate -s 0 /var/log/mysql/slow-query.log
sudo mysqladmin flush-logs

三、软件包缓存清理

3.1 Debian/Ubuntu系统

# 清理apt缓存
sudo apt clean

# 清理不再需要的包
sudo apt autoremove -y

# 清理旧内核(保留当前和上一个版本)
sudo apt autoremove --purge -y

# 清理孤立的配置文件
sudo dpkg --purge $(dpkg -l | grep "^rc" | awk '{print $2}')

# 查看可清理的空间
apt-get check
du -sh /var/cache/apt/archives

3.2 CentOS/RHEL系统

# 清理yum缓存
sudo yum clean all

# 清理缓存目录
sudo yum erase -y $(rpm -qa | grep kernel | grep -v $(uname -r))

# 清理旧内核
sudo package-cleanup -y --oldkernels --count=1

# 查看缓存大小
du -sh /var/cache/yum

3.3 Fedora系统

# 清理dnf缓存
sudo dnf clean all

# 清理不再需要的依赖
sudo dnf autoremove -y

# 清理旧内核
sudo dnf remove -y $(dnf repoquery --installonly --latest-limit=-2 -q)

四、清理临时文件

4.1 /tmp目录清理

# 查看tmp目录大小
du -sh /tmp

# 查找tmp目录下的旧文件(7天以上)
find /tmp -type f -mtime +7

# 删除tmp目录下的旧文件
find /tmp -type f -atime +7 -delete

# 设置tmp目录自动清理(systemd)
sudo nano /etc/tmpfiles.d/tmp.conf

4.2 tmpfiles.d配置示例

# /etc/tmpfiles.d/tmp.conf
# 清理/tmp下10天未访问的文件
D /tmp 1777 root root 10d

# 清理/var/tmp下30天未访问的文件
D /var/tmp 1777 root root 30d

# 清理/run下已停止服务的PID文件
D /run 0755 root root -

4.3 清理其他临时目录

# 清理用户临时目录
rm -rf /home/*/tmp/*

# 清理浏览器缓存
rm -rf ~/.cache/*

# 清理缩略图缓存
rm -rf ~/.cache/thumbnails/*

# 清理旧下载文件
find ~/Downloads -type f -mtime +30 -delete

五、内核清理

5.1 列出当前和旧内核

# 查看当前内核版本
uname -r

# 列出已安装的内核
dpkg -l | grep linux-image

# 列出所有内核版本
ls -la /boot/vmlinuz-*

5.2 安全删除旧内核

# Ubuntu/Debian删除旧内核
sudo apt-get purge -y $(dpkg -l | grep linux-image | grep -v $(uname -r) | awk '{print $2}')

# CentOS删除旧内核
sudo package-cleanup -y --oldkernels

# 确认删除后的状态
dpkg -l | grep linux-image

5.3 防止内核自动更新

# 锁定当前内核版本
sudo apt-mark hold linux-image-$(uname -r)
sudo apt-mark hold linux-headers-$(uname -r)

# 查看已锁定的包
dpkg --get-selections | grep hold

六、大文件定位与清理

6.1 查找大文件

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

# 查找最大的目录
du -ah / | sort -rh | head -n 20

# 查找特定类型的大文件
find /var -type f -name "*.log" -size +100M

# 查找重复文件(需要安装fdupes)
sudo apt install -y fdupes
fdupes -r /home

6.2 常见大文件位置

位置 描述 清理建议
/var/log 系统和应用日志 配置logrotate
/var/cache 缓存文件 定期清理
/tmp 临时文件 设置自动清理
/opt 第三方软件 清理旧版本
/home/*/.local 用户缓存 定期清理
/var/lib/docker Docker数据 清理未使用镜像

6.3 Docker清理

# 查看Docker磁盘使用
docker system df

# 清理未使用的镜像、容器、网络
docker system prune -a

# 清理悬空镜像
docker image prune

# 清理未使用的卷
docker volume prune

# 清理构建缓存
docker builder prune

# 清理所有未使用的资源
docker system prune --volumes

七、邮件队列清理

7.1 Postfix邮件队列

# 查看邮件队列
sudo mailq

# 查看队列数量
sudo postqueue -p | tail -1

# 删除所有队列中的邮件
sudo postsuper -d ALL

# 删除发送失败的邮件
sudo postsuper -d ALL deferred

# 清理邮件占用的空间
sudo rm -rf /var/spool/postfix/*
sudo rm -rf /var/mail/*
sudo postfix start

7.2 Sendmail邮件队列

# 查看邮件队列
sudo mailq

# 删除所有邮件
sudo rm -rf /var/spool/mqueue/*

# 查看队列统计
sudo sendmail -bp

八、数据库清理

8.1 MySQL/MariaDB

# 登录MySQL
mysql -u root -p

# 查看数据库大小
SELECT table_schema AS 'Database',
       ROUND(SUM(data_length + index_length) / 1024 / 1024, 2) AS 'Size (MB)'
FROM information_schema.tables
GROUP BY table_schema;

# 清理二进制日志
PURGE BINARY LOGS BEFORE '2026-01-01';

# 清理慢查询日志
SET GLOBAL slow_query_log = 'OFF';
TRUNCATE TABLE mysql.slow_log;
SET GLOBAL slow_query_log = 'ON';

# 优化数据库表
OPTIMIZE TABLE table_name;

8.2 PostgreSQL

# 清理VACUUM
psql -U postgres -c "VACUUM FULL;"

# 清理分析缓存
psql -U postgres -c "ANALYZE;"

# 清理WAL日志
pg_archieve cleanup

# 查看数据库大小
psql -U postgres -c "SELECT pg_database.datname, pg_size_pretty(pg_database_size(pg_database.datname)) FROM pg_database;"

九、自动清理脚本

9.1 编写清理脚本

#!/bin/bash
# /usr/local/bin/disk-cleanup.sh

LOGFILE="/var/log/disk-cleanup.log"
DATE=$(date '+%Y-%m-%d %H:%M:%S')

log() {
    echo "[$DATE] $1" | tee -a $LOGFILE
}

log "开始磁盘清理..."

# 清理临时文件
log "清理临时文件..."
find /tmp -type f -atime +7 -delete 2>/dev/null

# 清理日志
log "清理旧日志..."
find /var/log -name "*.gz" -mtime +30 -delete 2>/dev/null
find /var/log -name "*.[0-9]" -mtime +30 -delete 2>/dev/null

# 清理apt缓存
log "清理apt缓存..."
apt-get clean -y 2>/dev/null
apt-get autoremove -y 2>/dev/null

# 清理Docker(谨慎使用)
# log "清理Docker未使用资源..."
# docker system prune -f 2>/dev/null

# 显示清理后的磁盘使用情况
log "清理完成,当前磁盘使用情况:"
df -h / | tee -a $LOGFILE

log "磁盘清理任务完成"

9.2 设置定时任务

# 设置脚本可执行权限
sudo chmod +x /usr/local/bin/disk-cleanup.sh

# 添加到crontab(每周日凌晨2点执行)
sudo crontab -e

# 添加以下行:
# 0 2 * * 0 /usr/local/bin/disk-cleanup.sh >> /var/log/disk-cleanup-cron.log 2>&1

十、监控与预警

10.1 磁盘空间监控脚本

#!/bin/bash
# /usr/local/bin/disk-alert.sh

THRESHOLD=85  # 阈值百分比

USAGE=$(df -h / | tail -1 | awk '{print $5}' | sed 's/%//')

if [ $USAGE -gt $THRESHOLD ]; then
    echo "警告:磁盘空间使用率已达${USAGE}%,请及时清理!" | mail -s "磁盘空间告警" admin@example.com

    # 发送钉钉/企业微信通知(可选)
    # curl -H "Content-Type: application/json" -d '{"msgtype":"text","text":{"content":"磁盘告警:使用率'$USAGE'%"}}' https://oapi.dingtalk.com/robot/send?access_token=YOUR_TOKEN
fi

10.2 添加监控到crontab

# 每小时检查一次磁盘空间
sudo crontab -e

# 添加以下行:
# 0 * * * * /usr/local/bin/disk-alert.sh

总结

Linux系统磁盘空间管理需要综合运用多种方法:

  1. 定期清理:建立定期清理机制,使用cron任务自动化执行
  2. 日志管理:配置logrotate,合理设置日志轮转策略
  3. 缓存清理:定期清理apt/yum/dnf缓存
  4. 内核管理:及时删除旧内核,释放boot分区空间
  5. 监控预警:设置磁盘空间监控,及时发现潜在问题

通过本文介绍的方法和最佳实践,可以有效管理Linux系统的磁盘空间,确保服务器稳定运行。建议根据实际情况制定清理计划,并定期执行清理任务。

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注