Linux du/find 命令实战:3步定位磁盘空间占用超90%的根因

发布时间:2026/7/6 12:08:04
Linux du/find 命令实战:3步定位磁盘空间占用超90%的根因 Linux磁盘空间告急三步精准定位空间占用元凶当服务器突然发出磁盘空间不足的警报运维人员常常会陷入手忙脚乱的排查过程。盲目删除文件不仅效率低下还可能误删关键数据。本文将分享一套经过实战检验的三步排查法结合du、find和sort命令的强大功能帮助您快速定位磁盘空间占用的真正元凶。1. 全局扫描快速锁定问题区域面对磁盘空间告警第一步应该是全面了解当前磁盘使用情况。df -h命令能直观显示各挂载点的空间使用率$ df -h 文件系统 容量 已用 可用 已用% 挂载点 /dev/vda1 50G 48G 1.1G 98% /当发现根目录接近满载时使用du命令进行初步排查$ sudo du -h --max-depth1 / | sort -hr | head -10 48G / 23G /var 15G /home 5.4G /usr 1.2G /opt关键技巧--max-depth1限制只显示一级子目录sort -hr按人类可读格式逆序排序head -10仅显示前10个结果这个组合能立即揭示空间占用最大的几个目录为后续深入排查指明方向。在我的实践中/var目录往往是首要嫌疑对象特别是日志和数据库文件。2. 精确制导深入问题目录排查锁定问题目录后需要更精细的分析工具。ncduNCurses Disk Usage是交互式磁盘分析利器$ sudo apt install ncdu # Debian/Ubuntu $ sudo yum install ncdu # CentOS/RHEL $ ncdu /varncdu会生成可视化分析界面支持按大小排序文件和目录实时导航文件系统树直接删除不需要的文件对于没有ncdu的环境可以用find命令实现类似功能$ sudo find /var -type f -exec du -h {} | sort -hr | head -20 15G /var/lib/mysql/ibdata1 3.2G /var/log/apache2/access.log 1.8G /var/log/nginx/error.log特别注意数据库文件(如ibdata1)需要专业维护不可直接删除日志文件应先清空而非删除使用truncate或操作3. 专业处理安全释放磁盘空间找到大文件后需根据文件类型采取不同处理策略日志文件处理对于持续写入的日志文件推荐使用日志轮转工具# 查看当前日志轮转配置 $ ls /etc/logrotate.d/ # 手动执行轮转并清理旧日志 $ sudo logrotate -f /etc/logrotate.d/nginx数据库维护MySQL等数据库文件需要专业维护命令-- 优化InnoDB表空间 OPTIMIZE TABLE large_table; -- 清理二进制日志 PURGE BINARY LOGS BEFORE 2023-01-01;容器清理Docker环境会产生大量缓存和镜像# 清理无用容器、镜像和卷 $ docker system prune -af # 查看详细磁盘使用 $ docker system df终极解决方案对于特别顽固的空间占用可考虑以下组合拳# 1. 清空日志文件 $ sudo truncate -s 0 /var/log/oversized.log # 2. 重启相关服务释放文件句柄 $ sudo systemctl restart nginx # 3. 确认空间已释放 $ df -h实战案例一次真实的空间救援最近处理的一起案例中某服务器根目录突然爆满。通过上述方法快速定位到是MySQL的临时文件$ sudo lsof L1 | grep deleted mysql 1234 root 10u REG 8,1 1073741824 0 /tmp/ibtmp1 (deleted)解决方案是安全重启MySQL服务并配置合理的临时文件大小[mysqld] tmp_table_size64M max_heap_table_size64M这套方法不仅解决了当务之急还通过配置优化预防了问题复发。记住专业的运维不是简单的找大文件删删删而是建立系统的排查思路和规范的维护流程。