Linux磁盘空间:实用清理与维护技巧

在 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)是终端可视化工具,支持交互式浏览目录大小:
  1. 安装(Debian/Ubuntu/RHEL/CentOS):
    # Debian/Ubuntu
    sudo apt install ncdu
    # RHEL/CentOS
    sudo dnf install ncdu
  2. 运行(扫描根目录,按 ? 查看帮助):
    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 点清理)。

示例:创建自动清理脚本

  1. 创建脚本 /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
    
  2. 赋予执行权限:
    sudo chmod +x /usr/local/bin/disk-clean.sh
    
  3. 加入 crontab(每天 3 点执行):
    sudo crontab -e
    # 在文件末尾添加:
    0 3 * * * /usr/local/bin/disk-clean.sh
    

2. 磁盘空间监控(及时告警)

当磁盘使用率超过阈值(如 85%)时,自动发送邮件告警,避免发现时已满盘。

示例:简单监控脚本(结合邮件)

  1. 安装邮件工具(如 mailutils):
    sudo apt install mailutils
  2. 创建监控脚本 /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
    
  3. 加入 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) 内存不足时作为临时内存

四、清理注意事项(避免系统故障)

  1. 禁止盲目删除系统目录:如 /bin/sbin/lib/usr(核心文件,删除即崩溃)。
  2. 不删除正在使用的文件:如正在写入的日志(rm 后空间不释放,需用 truncate 清空)、数据库文件(如 /var/lib/mysql/*)。
  3. 重要文件先备份:如配置文件、用户数据,删除前可先压缩备份(tar -czf backup.tar.gz 目标文件)。
  4. 清理后验证空间:执行 df -h 确认空间已释放,避免操作无效。
通过以上步骤,可高效清理 Linux 磁盘空间,并建立长期维护机制,确保系统稳定运行。根据实际场景(个人主机 / 服务器、Debian/RHEL 系)调整命令,核心原则是 “先定位、再清理、后监控”。
阅读剩余
THE END