
1. 磁盘空间管理的重要性与基础命令在Linux系统管理中磁盘空间监控是每个运维人员和开发者必须掌握的核心技能。想象一下当你正在部署关键服务时突然遇到No space left on device错误或者生产环境日志疯狂增长导致分区爆满这时候快速定位空间占用源头就显得尤为重要。dudisk usage命令是Linux自带的磁盘分析利器而du -ah组合则是其中使用频率最高的参数搭配之一。这个看似简单的命令背后其实蕴含着不少实用技巧和注意事项。我在多年的服务器运维经历中曾靠这个命令解决过无数次磁盘危机今天就把这些实战经验系统性地分享给大家。2. du命令核心参数解析2.1 基础参数组合-ah的妙用du -ah实际上是两个参数的组合-a显示所有文件和目录的占用情况默认只显示目录-h以人类可读格式显示大小自动转换为KB/MB/GB典型输出示例4.0K ./config 8.0M ./logs/access.log 12K ./scripts/backup.sh 1.2G .注意不加-h参数时默认显示的是以KB为单位的块数对现代大容量磁盘很不友好。我强烈建议养成加-h的习惯。2.2 进阶参数搭配技巧在实际排查问题时我通常会组合更多参数--max-depth1只显示一级子目录大小-c最后显示总计--time显示文件修改时间我的常用命令模板du -ah --max-depth1 /var | sort -h这个组合可以快速找出/var目录下最大的子目录并按大小排序显示。其中sort -h是关键它能正确识别人类可读的大小单位进行排序。3. 实战场景与排查流程3.1 典型问题排查步骤当收到磁盘空间告警时我的标准排查流程是先用df -h确认各分区使用情况定位问题分区后用du深入分析结合ls -lht查看大文件修改时间使用ncdu工具进行交互式分析需安装例如排查/根目录空间不足# 查看各挂载点使用率 df -h # 分析根目录下各文件夹大小 sudo du -ah --max-depth1 / | sort -h # 针对占用大的目录继续深入 sudo du -ah --max-depth1 /var/log | sort -h3.2 容器环境特殊处理在Docker环境中常规的du命令可能无法准确统计容器内占用。这时候需要进入容器内部检查docker exec -it container bash df -h或者使用docker system命令docker system df -v4. 性能优化与注意事项4.1 大目录扫描优化扫描包含数百万文件的目录时du可能会非常慢。这时可以使用--exclude跳过已知目录通过ionice降低IO优先级ionice -c3 du -ah / du.log考虑使用更快的替代工具如ncdu4.2 常见陷阱与解决方案跨文件系统统计默认du会统计挂载点下的所有文件包括挂载的子文件系统。使用-x参数可限制在当前文件系统。硬链接重复计算du会统计硬链接文件的每个实例可能导致总和不准确。-l参数可以禁用此行为。权限不足问题扫描系统目录时建议用sudo但要注意可能遗漏无权限目录。我的做法是sudo du -ah 2/dev/null | sort -h5. 自动化监控方案对于生产环境我建议设置自动化监控通过crontab定期记录0 * * * * /usr/bin/du -ah --max-depth1 / /var/log/du/$(date \%Y\%m\%d-\%H).log使用Prometheus的node_exporter采集指标配置告警规则示例- alert: DiskSpaceCritical expr: node_filesystem_avail_bytes{mountpoint/} / node_filesystem_size_bytes{mountpoint/} 0.1 for: 10m6. 替代工具横向对比除了du还有其他值得了解的工具工具名称特点适用场景ncdu交互式界面支持删除操作手动排查df查看挂载点使用情况快速概览ls配合-S参数按大小排序找最大文件baobab图形化分析工具桌面环境我个人最常用的是ncdu它的安装和使用非常简单sudo apt install ncdu # Debian/Ubuntu ncdu /path/to/scan7. 日志文件专项处理日志文件是磁盘空间的最大杀手之一。我的处理方案是配置logrotate自动轮转对开发环境添加大小限制示例Nginx配置access_log /var/log/nginx/access.log combined buffer32k flush1m;定期清理旧日志的脚本find /var/log -type f -name *.log -mtime 30 -delete8. 特殊文件系统注意事项对于不同的文件系统类型du的表现可能有差异ZFS建议使用zfs list查看空间占用Btrfsdu可能不准确需要用btrfs filesystem usageNFS远程统计可能有延迟建议直接在存储服务器检查9. 性能调优实战案例曾经处理过一个MySQL服务器磁盘爆满的案例分享我的排查过程先用df -h确认是/var分区占用98%运行sudo du -ah --max-depth1 /var | sort -h发现mysql目录占用了90%进入mysql目录后发现是binlog文件过大ls -lh /var/lib/mysql/mysql-bin.*通过purge binary logs命令清理旧日志最终在my.cnf中添加配置限制binlog大小[mysqld] expire_logs_days 7 max_binlog_size 100M这个案例让我养成了定期检查数据库日志的好习惯。现在我会在Ansible部署模板中就预先配置好这些参数。