李涛自留地
回到顶部
首页 > 建站 > Linux df -h 磁盘空间满了怎么办?5分钟定位大文件并清理

Linux df -h 磁盘空间满了怎么办?5分钟定位大文件并清理

文章目录

前几天凌晨收到服务器告警,磁盘使用率飙到98%,后台网站直接打不开了。赶紧登录服务器一顿排查,30分钟搞定。今天把这个排查流程写下来,下次遇到直接照着做。

第一步:确认是哪块磁盘满了

登录服务器后,先跑这条命令:

df -h

输出大概长这样:

Filesystem      Size  Used Avail Use% Mounted on
/dev/vda1        40G   38G  1.2G  98% /
tmpfs           7.8G     0  7.8G   0% /dev/shm
/dev/vdb1       100G   72G   24G  74% /data

重点关注 Use% 那一列,98% 那个就是问题磁盘。Mounted on 列告诉你挂载点路径。

注意: 很多新手只看 df -h 第一行,但有时候根目录 / 没满,是某个子目录满了。比如 /var/log 或者 /home 单独挂载的情况。所以要看清楚是哪个挂载点。

第二步:找出哪个目录占的磁盘最多

磁盘空间不够用的时候,需要定位"罪魁祸首"。用这条命令进入问题目录,逐层排查:

# 假设根目录 / 满了,进入 / 目录
cd /

# 查看当前目录下各子目录的磁盘占用(按大小排序) du -sh */ | sort -hr | head -20

输出类似:

12G   var
8.5G  home
3.2G  opt
1.5G  usr

看到 var 目录占了12G,继续往里看:

cd var
du -sh */ | sort -hr | head -10

一般会发现 log 目录占得最多。继续:

cd log
du -sh */ | sort -hr | head -10

第三步:定位大文件

如果上面目录级别排查后还没找到具体是哪个文件,可以直接搜索大文件:

# 在根目录下找大于100M的文件
find / -type f -size +100M -exec ls -lh {} \; 2>/dev/null | sort -k5 -hr

# 或者用 du 命令查找大文件 find / -type f -size +50M -exec du -sh {} \; 2>/dev/null | sort -hr | head -20

-size +100M 表示查找大于100M的文件,可以根据需要调整阈值。

第四步:常见的磁盘杀手

排查下来,服务器磁盘空间被占满的原因一般有以下几类:

### 1. 日志文件膨胀

这是最常见的情况。尤其是 nginx、php-fpm 或者应用日志没有做轮转(logrotate)。

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

# 如果日志文件很大,直接清空(不是删除!) cat /dev/null > /var/log/nginx/access.log

# 或者用 truncate 命令 truncate -s 0 /var/log/nginx/access.log

为什么用 > 而不是 rm? 因为有些进程(比如nginx)持有文件描述符,直接删除文件后磁盘空间不会释放,需要重启服务才能回收。用 > 清空文件内容是最安全的做法。

### 2. Docker 镜像和容器

如果你用了Docker,它可能偷偷吃掉大量磁盘:

# 查看Docker磁盘使用情况
docker system df

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

# 清理Docker构建缓存 docker builder prune -a

小心: docker system prune -a 会删除所有未运行的容器和未使用的镜像,生产环境建议先 docker system df 看看占用情况再决定。

### 3. 数据库文件

MySQL的binlog、ibdata1等文件可能占几十G:

# 查看MySQL数据目录大小
du -sh /var/lib/mysql/

# 清理binlog(谨慎操作) mysql -e "PURGE BINARY LOGS BEFORE DATE_SUB(NOW(), INTERVAL 7 DAY)"

# 或者在my.cnf中配置自动清理 # expire_logs_days = 7

### 4. 临时文件和下载

# 清理临时文件
rm -rf /tmp/*
rm -rf /var/tmp/*

# 清理apt缓存(Debian/Ubuntu) apt-get clean

# 清理yum缓存(CentOS/RHEL) yum clean all

第五步:清理后验证

清理完成后,再跑一次 df -h 确认空间是否释放:

df -h

如果还是没变化,检查是否有进程占用了已删除的文件描述符:

# 查看已删除但被进程占用的文件
lsof | grep deleted

# 重启对应服务释放文件描述符 systemctl restart nginx systemctl restart php-fpm

第六步:防止再满——设置logrotate

最靠谱的做法是让系统自动轮转日志文件,别等满了再清理:

# 编辑nginx的logrotate配置
nano /etc/logrotate.d/nginx

确保内容类似这样:

/var/log/nginx/*.log {
    daily
    rotate 7
    compress
    delaycompress
    missingok
    notifempty
    create 0640 www-data adm
    sharedscripts
    postrotate
        [ -f /var/run/nginx.pid ] && kill -USR1 $(cat /var/run/nginx.pid)
    endscript
}

参数说明: daily 每天轮转,rotate 7 保留7份,compress 压缩旧日志。这样7天的日志也就几百M,不会一次占满磁盘。

实用小工具推荐

如果你经常需要监控磁盘,可以写个简单的监控脚本放到crontab里:

#!/bin/bash
# disk_monitor.sh - 磁盘监控告警脚本

THRESHOLD=85

# 检查所有挂载点 df -h | awk 'NR>1 {gsub(/%/,"",$5); if($5+0 > '$THRESHOLD') print "警告: "$6" 使用率 "$5"%"}' | while read line; do echo "$(date): $line" >> /var/log/disk_monitor.log # 这里可以加邮件或钉钉告警 done

保存后加到crontab:

crontab -e
# 每2小时执行一次
0 /2    /path/to/disk_monitor.sh

总结

排查磁盘满的问题,核心思路就三句话:

1. 先看 df -h 确定哪个磁盘满了
2. 再用 du 逐层定位到具体文件
3. 最后分类清理 + 配置logrotate防止再满

记住几个关键命令:df -h、du -sh、find -size、lsof,基本能搞定90%的磁盘问题。

下次如果你的网站突然打不开了,别慌,先跑 df -h,大概率是磁盘满了。


若非作者标注皆为李涛自留地原创文章,转载或复制请以超链接形式并注明出处。