Linux df/du 命令实战:5分钟定位磁盘空间占用95%的根因(附排查脚本)

📅 2026/7/6 12:15:27
Linux df/du 命令实战:5分钟定位磁盘空间占用95%的根因(附排查脚本)
Linux磁盘空间快速排查实战从基础命令到自动化脚本当服务器磁盘空间告急时系统管理员往往需要在最短时间内定位问题根源。本文将带你从基础命令开始逐步构建一套完整的磁盘空间排查体系最终形成一个自动化分析脚本帮助你在5分钟内快速定位磁盘占用95%的罪魁祸首。1. 磁盘空间排查基础df与du命令解析在Linux系统中df和du是磁盘空间分析的两把利剑它们各司其职却又相辅相成。df命令Disk Filesystem用于查看文件系统的整体磁盘使用情况。一个典型的用法是df -hT这里的参数组合会产生清晰易读的输出-h以人类可读格式显示KB、MB、GB-T显示文件系统类型典型输出示例Filesystem Type Size Used Avail Use% Mounted on /dev/vda1 ext4 50G 47G 1.2G 98% /du命令Disk Usage则用于分析具体目录和文件的磁盘占用情况。最常用的组合是du -sh /*这个命令会显示根目录下所有一级子目录的总大小-s只显示总计大小-h人类可读格式关键区别命令作用范围最佳使用场景df文件系统级别快速查看哪个分区空间不足du目录/文件级别定位具体占用空间的位置提示当df显示空间不足但du统计的总和远小于分区大小时可能存在文件已被删除但进程仍占用的情况下文会详细说明2. 进阶排查技巧定位大文件与特殊场景2.1 快速找出大文件组合使用find和sort命令可以高效定位大文件find / -type f -size 100M -exec ls -lh {} 2/dev/null | sort -k5 -rh这个命令的执行逻辑从根目录开始查找大于100MB的普通文件(-type f -size 100M)以易读格式列出文件详情(ls -lh)按文件大小降序排序(sort -k5 -rh)2.2 处理已删除但未释放的空间当发现df显示的已用空间远大于du统计结果时可能是被删除的文件仍被进程占用。使用lsof命令可以找出这些幽灵文件lsof | grep deleted | sort -k7 -rn输出示例COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME java 12345 root 1w REG 253,1 536870912 123456 /var/log/app.log (deleted)处理方案重启相关进程最彻底清空文件内容truncate -s 0 /proc/[pid]/fd/[fd]2.3 特殊目录分析某些目录需要特别关注/var/log系统日志目录/tmp临时文件Docker存储目录/var/lib/docker数据库数据目录如PostgreSQL的/var/lib/pgsql针对日志文件的快速分析du -ah /var/log | sort -rh | head -203. 自动化排查脚本开发将上述命令整合成一个自动化脚本disk_analyzer.sh#!/bin/bash # 磁盘空间分析工具 v1.2 THRESHOLD90 # 空间使用百分比阈值 TOP_N10 # 显示前N个大目录/文件 # 检查root权限 if [ $(id -u) -ne 0 ]; then echo 请使用root权限运行此脚本 2 exit 1 fi # 1. 检查各分区使用情况 echo -e \n\033[1;34m 分区空间使用情况 \033[0m df -hT | awk NR1 || $60$THRESHOLD # 2. 检查inode使用情况 echo -e \n\033[1;34m Inode使用情况 \033[0m df -i | awk NR1 || $50$THRESHOLD # 3. 分析根目录空间占用 echo -e \n\033[1;34m 根目录空间占用TOP $TOP_N \033[0m du -xh --max-depth1 / 2/dev/null | sort -rh | head -n $TOP_N | awk {printf %-10s %s\n, $1, $2} # 4. 查找大文件 echo -e \n\033[1;34m 大文件查找(100MB) \033[0m find / -type f -size 100M -exec du -h {} 2/dev/null | sort -rh | head -n $TOP_N # 5. 检查被删除未释放的文件 echo -e \n\033[1;34m 被删除但未释放的文件 \033[0m lsof -nP | grep -i deleted | sort -k7 -nr | head -n $TOP_N | awk {printf %-10s %-10s %s\n, $2, $3, $NF} # 6. 特殊目录检查 echo -e \n\033[1;34m 特殊目录检查 \033[0m for dir in /var/log /tmp /var/lib/docker; do [ -d $dir ] echo -e \n$dir: du -sh $dir/* done脚本功能说明分区空间检查突出显示使用率超过阈值的分区Inode检查防止大量小文件耗尽inode根目录分析快速定位占用最大的子目录大文件查找找出超过100MB的文件幽灵文件检测找出已删除但未释放空间的文件特殊目录检查重点分析常见问题目录注意运行此脚本需要root权限因为它需要访问系统所有目录4. PostgreSQL数据库空间专项排查数据库往往是磁盘空间的大户这里以PostgreSQL为例介绍专项排查方法4.1 数据库大小查询SELECT pg_database.datname, pg_size_pretty(pg_database_size(pg_database.datname)) as size FROM pg_database ORDER BY pg_database_size(pg_database.datname) DESC;4.2 表空间分析SELECT table_schema || . || table_name AS table_full_name, pg_size_pretty(pg_total_relation_size( || table_schema || . || table_name || )) as size FROM information_schema.tables ORDER BY pg_total_relation_size( || table_schema || . || table_name || ) DESC LIMIT 10;4.3 WAL日志管理PostgreSQL的WAL日志可能占用大量空间检查命令du -sh /var/lib/postgresql/12/main/pg_wal/调整WAL日志保留策略ALTER SYSTEM SET wal_keep_segments 32; -- 保留32个段文件 SELECT pg_reload_conf(); -- 重载配置5. 实用清理策略与注意事项5.1 安全清理原则日志文件使用logrotate管理而非直接删除临时文件确认不再使用后再清理数据库文件使用SQL命令清理而非直接删除文件5.2 常用清理命令日志文件轮转logrotate -f /etc/logrotate.conf清理旧内核CentOS/RHELpackage-cleanup --oldkernels --count2Docker系统清理docker system prune -af5.3 预防措施设置磁盘空间监控告警对重要分区保留10-20%的缓冲空间对大目录设置配额限制定期执行预防性维护# 添加cron任务定期检查 0 3 * * * /usr/local/bin/disk_analyzer.sh /var/log/disk_check.log通过本文介绍的方法和脚本你可以在磁盘空间告急时快速定位问题根源。记住预防胜于治疗建立完善的监控和维护机制才是解决磁盘空间问题的长久之计。