Linux df -h 磁盘空间满了怎么办?5分钟定位大文件并清理
- 2026年7月2日
- 153 次
前几天凌晨收到服务器告警,磁盘使用率飙到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,大概率是磁盘满了。
若非作者标注皆为李涛自留地原创文章,转载或复制请以超链接形式并注明出处。
- 轻量级前端框架pure介绍 使用pure实现网站自适应 2022-09-21
- PHP数据类型转换:字符串数据类型强制转换为整数数据类型 2022-06-10
- PHP数组常用函数之指针函数用法及实例代码 2022-10-26
- 前端实用插件推荐:Web前端助手插件 2022-10-20
- PHP array_flip() 和 array_key_exists() 详解:反转键值与键名判断 2026-07-02
- PHP常用字符串函数截取字符串substr()函数用法及实例 2022-10-24
