尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

Linux磁盘空间排查:从du命令到自动化监控的完整指南

Linux磁盘空间排查:从du命令到自动化监控的完整指南 1. 从一次磁盘告警说起为什么你需要掌握查看文件夹大小的技能那天下午我正在调试一个服务突然收到监控系统的告警邮件“服务器磁盘使用率超过85%”。登录服务器一看/var分区已经飘红。问题来了是哪个应用、哪个目录在疯狂吞噬磁盘空间是日志文件膨胀了还是临时文件没有清理如果找不到“罪魁祸首”盲目删除文件可能会误删关键数据甚至导致服务崩溃。这时一个最基础但至关重要的Linux命令——du就成了我的救命稻草。对于任何一位Linux系统管理员、运维工程师甚至是日常在服务器上部署应用的开发者来说能够快速、准确地定位磁盘空间的使用分布是一项必备的核心技能。无论是排查服务异常、规划存储扩容还是日常的服务器维护查看文件和文件夹大小都是第一步。网上虽然有很多命令大全但往往只罗列命令缺乏场景化的解读和避坑指南。今天我就结合自己多年的运维经验从最常用的du命令讲起带你彻底搞懂Linux下查看文件目录大小的各种姿势并分享那些只有踩过坑才知道的实用技巧。2. 核心利器du命令不只是du -sh *duDisk Usage命令是查看磁盘使用情况的瑞士军刀。很多人止步于du -sh *但这只是冰山一角。理解它的参数和输出逻辑才能在各种复杂场景下游刃有余。2.1du命令的基本原理与输出解读首先我们要明白du命令统计的是什么。它统计的是文件在磁盘上实际占用的“块”block数量。默认情况下一个块通常是512字节或1KB取决于系统设置和-k、-m等参数。这与ls -l命令显示的“文件大小”有本质区别。ls -l显示的是文件的“逻辑大小”即文件内容的实际字节数。而du报告的是“物理占用”它包含了文件在磁盘上占用的所有空间这通常会大于或等于逻辑大小原因包括块大小即使一个文件只有1字节它也会占用整整一个块如4KB。稀疏文件对于稀疏文件du报告的实际占用可能远小于ls显示的大小。硬链接du会统计每个硬链接文件所占的空间但如果多个硬链接指向同一个inode它们共享同一份数据块du默认不会重复计算除非使用-l参数。执行一个最简单的命令du。它会递归地列出当前目录下每个子目录和文件占用的磁盘块数通常以KB为单位。输出结果的第一列是占用空间第二列是路径。但这样输出往往冗长且不直观。2.2 常用参数组合与场景化应用下面这些组合是我每天都会用到的它们解决了不同的问题du -sh查看当前目录总大小-ssummarize参数是关键它只显示指定目录的总计而不列出其内容。-hhuman-readable参数让输出以K、M、G为单位方便阅读。这是最快速了解一个目录规模的命令。du -sh /home/appuser/logs注意-h参数有时会与-s或其他参数结合时因为单位换算1024 vs 1000和舍入可能导致多个目录的-sh值相加不等于父目录的-sh值这是正常的精确比较时应使用-kKB或-mMB等固定单位。du -sh *快速扫描当前目录下所有项的大小这是定位大文件的入门级操作。它会列出当前目录下所有文件和文件夹的大小。但要注意它不会递归显示子目录内部详情并且如果文件/文件夹名包含空格或特殊字符可能会被错误解析。du -h --max-depth1控制遍历深度清晰呈现层级这比du -sh *更健壮、更清晰。--max-depth1表示只深入到第一级子目录。你可以将1改为2或0等同于-s来获得不同粒度的视图。这对于分析像/var这样结构复杂的目录非常有用。cd /var sudo du -h --max-depth1 | sort -hr这里我管道|连接了sort -hr命令-h参数让sort能正确理解人类可读的单位K, M, G-r是反向排序这样最大的目录就排在最前面一眼就能找到“元凶”。du -ah查看每个文件的大小-aall参数会列出所有文件和目录。在需要定位到具体是哪个大文件时比如某个巨大的日志文件或缓存文件这个命令非常管用。通常结合sort和head使用sudo du -ah /var/log | sort -hr | head -20du -c最后得到总计-ctotal参数会在列出所有条目后额外输出一行总计。这在脚本中处理du输出时特别有用。du -x避免跨越文件系统边界这是一个极易被忽略但极其重要的参数。-xone-file-system告诉du只统计当前文件系统上的空间使用情况。如果你在/根目录下执行du -sh而没有-x它可能会尝试去统计已挂载的/home、/boot等独立分区这可能导致统计速度极慢甚至因为权限或网络文件系统NFS挂载问题而失败。在统计根目录或可能包含挂载点的目录时务必养成使用du -shx的习惯。2.3 权限问题与sudo的使用当你尝试统计/root、/var/lib/docker或其他属于root用户的目录时可能会遇到“Permission denied”错误。du命令在遍历目录时如果对某个子目录没有读权限它会报错并跳过该目录这可能导致统计结果不准确。正确的做法是使用sudo提升权限sudo du -sh /var/lib/docker但是直接对/根目录使用sudo du -shx也要小心因为某些特定的虚拟文件系统如/proc,/sys包含的是内核信息du尝试读取它们可能会导致挂起或输出异常数据。通常-x参数会自动排除这些不同类型的文件系统但情况复杂时更安全的做法是指定明确的路径进行统计。3. 进阶技巧与组合拳精准定位与高效分析掌握了基础命令我们可以玩一些更高级的操作将多个命令组合起来形成高效的问题定位工作流。3.1 排序、过滤与可视化找到真正的“空间吞噬者”单纯的du输出是杂乱无章的我们必须对其进行加工。经典组合du | sort | head如前所述sort -hr是du的最佳搭档。head用于只看前N个结果。# 找出 /opt 下最大的5个目录 sudo du -h --max-depth1 /opt | sort -hr | head -6 # head -6 因为第一行可能是 /opt 本身使用find命令过滤后再统计有时我们只关心特定类型的文件。例如想找出所有超过100MB的.log文件find /var -type f -name *.log -size 100M -exec du -h {} \; | sort -hr这里find命令做了过滤-exec对找到的每个文件执行du -h。注意对于大量文件-exec为每个文件启动一个du进程效率较低。更高效的方式是find /var -type f -name *.log -size 100M -print0 | xargs -0 du -h | sort -hr-print0和xargs -0可以正确处理包含空格的文件名。使用ncdu工具进行交互式可视化分析如果觉得命令行不够直观强烈推荐安装ncduNCurses Disk Usage。它是一个基于终端的交互式工具可以快速扫描目录并以图形化方式浏览。# 安装CentOS/RHEL sudo yum install ncdu # 安装Ubuntu/Debian sudo apt install ncdu # 使用 sudo ncdu /var进入界面后你可以用方向键导航按d删除文件需确认i显示文件信息它比反复执行du命令要高效和直观得多。3.2 排除特定目录或文件让统计更聚焦在统计时我们经常需要排除一些已知的、无关的或会干扰统计的目录比如版本控制目录.git、node_modules或者缓存目录。使用--exclude参数du命令本身支持--exclude模式来排除文件或目录。# 排除所有 .git 目录 du -sh --exclude.git /path/to/project # 排除多个模式可以使用多个 --exclude du -sh --exclude*.log --exclude*.tmp /var # 或者使用花括号扩展在支持它的shell中如bash du -sh --exclude{*.log,*.tmp,*.cache} /var结合find进行复杂过滤对于更复杂的排除逻辑可以先用find生成文件列表再交给du。例如统计除了node_modules和所有隐藏文件以外的空间find /path/to/project -type f ! -path */node_modules/* ! -name .* -print0 | xargs -0 du -ch | tail -1这个命令有点复杂解释一下find找到所有文件-type f但排除路径中包含node_modules的! -path */node_modules/*也排除以点开头的隐藏文件! -name .*然后用xargs传给du -c统计最后tail -1只显示总计行。3.3 追踪空间变化是谁在悄悄增长磁盘空间被缓慢占满是最棘手的问题之一。我们需要一种方法来比较不同时间点的空间使用情况。快照对比法在时间点A将du的详细输出保存到文件sudo du -ah /data /tmp/disk_usage_snapshot_A.txt过一段时间比如几小时后在时间点B保存另一个快照sudo du -ah /data /tmp/disk_usage_snapshot_B.txt使用diff工具比较两个文件找出新增或变大的文件diff -u /tmp/disk_usage_snapshot_A.txt /tmp/disk_usage_snapshot_B.txt | grep -E ^\[0-9]这能帮你定位到在此期间发生变化的文件。对于大型目录快照文件本身会很大比较起来可能较慢。使用inotifywait进行实时监控高级对于关键目录你可以使用inotifywait工具属于inotify-tools包来实时监控文件系统的变化事件创建、修改、删除等。但这通常用于监控特定行为而非单纯的空间增长分析。4. 超越du其他查看空间信息的命令与工具虽然du是主力但了解整个工具箱能让你应对更全面的场景。4.1df查看文件系统级别的磁盘使用情况dfDisk Free命令用于查看文件系统的整体磁盘空间使用情况显示的是挂载点、总容量、已用空间、可用空间和使用百分比。它回答的问题是“我的硬盘或分区还剩多少空间”。df -h最常用的命令人类可读格式。df -i查看inode使用情况。有时磁盘空间还有剩余但系统却报“No space left on device”很可能是因为inode耗尽了常见于存在大量小文件的系统。这个命令能帮你诊断这个问题。df -T显示文件系统类型ext4, xfs, nfs等。du和df的统计角度不同结果也常有差异。df从文件系统层面统计更宏观du从文件层面累加更微观。导致差异的原因包括已删除但被进程占用的文件lsof | grep deleted、文件系统预留空间、以及du和df统计方式的根本不同。4.2ls查看单个文件的逻辑大小对于单个文件ls -lh是最快的查看方式。-l显示详情-h人类可读。ls -l显示的第二列是“硬链接数”第五列是“文件大小字节”。记住这是逻辑大小。4.3 图形化工具对于桌面版Linux用户有更直观的工具baobab(Disk Usage Analyzer)GNOME桌面环境下的图形化工具提供饼图和树状图。kdirstat/qdirstatKDE桌面环境下的类似工具功能强大。filelight另一种以旭日图sunburst形式展示磁盘使用的工具。5. 实战排查案例快速解决磁盘空间不足问题让我们模拟一个真实的场景将上面的命令串联起来使用。场景监控报警服务器/根目录使用率超过90%。排查步骤宏观确认首先用df -h确认是哪个分区满了。假设确认是/。df -h /定位大目录进入根目录使用du快速找出最大的几个一级目录。务必加上-xcd / sudo du -shx * | sort -hr | head -10假设发现/var异常巨大。深入分析进入/var目录继续深入。cd /var sudo du -h --max-depth1 | sort -hr假设发现/var/log和/var/lib/docker都很大。分析日志目录检查/var/log可能是某个服务的日志未轮转rotate。sudo du -ah /var/log | sort -hr | head -20如果发现某个特定的.log文件巨大比如application.log可以使用truncate命令清空如果确定日志可清理或者配置日志轮转。分析Docker目录Docker经常是磁盘杀手尤其是未清理的镜像、容器和构建缓存。# 查看Docker磁盘使用概况 docker system df # 清理无用的资源谨慎操作确认无用后再执行 docker system prune -a检查已删除未释放的文件如果du发现的空间占用与df显示的对不上可能有进程占用了已删除的文件。lsof | grep deleted这条命令会列出所有已被删除但文件描述符仍被进程打开的文件。重启对应的进程可以释放这些空间。使用ncdu进行最终确认如果上述步骤还无法定位或者目录结构复杂使用ncdu进行交互式检查是最佳选择。sudo ncdu /通过这样一套组合拳绝大多数磁盘空间异常问题都能在几分钟内定位到根源。关键在于有条理地层层深入从文件系统(df)到顶级目录(du -shx *)再到子目录(du --max-depth)最后到具体文件(du -ah)。6. 脚本化与自动化将空间监控融入日常工作流手动排查毕竟是被动的。我们可以将一些检查工作自动化定期运行。简单的磁盘检查脚本#!/bin/bash # check_disk_usage.sh THRESHOLD80 # 使用率告警阈值 OUTPUT_FILE/tmp/disk_report_$(date %Y%m%d).txt echo Disk Usage Report $(date) $OUTPUT_FILE echo $OUTPUT_FILE # 1. 检查各分区使用率 echo 1. Filesystem Usage (df -h): $OUTPUT_FILE df -h | grep -v tmpfs $OUTPUT_FILE echo $OUTPUT_FILE # 2. 检查使用率超过阈值的分区 echo 2. Partitions above ${THRESHOLD}%: $OUTPUT_FILE df -h | awk -v th$THRESHOLD 0$5 th {print $0} | grep -v Filesystem $OUTPUT_FILE echo $OUTPUT_FILE # 3. 如果 /var 使用率高分析其子目录 VAR_USAGE$(df -h /var | awk NR2 {print $5} | sed s/%//) if [ $VAR_USAGE -ge $THRESHOLD ]; then echo 3. /var is high usage ($VAR_USAGE%). Top subdirectories: $OUTPUT_FILE sudo du -h --max-depth1 /var 2/dev/null | sort -hr | head -10 $OUTPUT_FILE fi # 4. 检查根目录下的大目录排除其他挂载点 echo $OUTPUT_FILE echo 4. Top directories in / (excluding other filesystems): $OUTPUT_FILE sudo du -h --max-depth1 -x / 2/dev/null | sort -hr | head -15 $OUTPUT_FILE cat $OUTPUT_FILE # 可以将此报告通过邮件发送或接入监控系统如Zabbix, Prometheus这个脚本提供了基础的检查框架你可以根据实际环境扩展比如加入Docker、特定应用日志目录的检查。集成到定时任务将脚本加入crontab每天运行一次。# 编辑当前用户的crontab crontab -e # 添加一行每天凌晨2点运行 0 2 * * * /path/to/check_disk_usage.sh使用专业监控工具对于企业环境更推荐使用像Prometheusnode_exporter或Zabbix这样的监控系统。node_exporter会收集包括filesystem在内的众多系统指标你可以在Grafana中设置仪表盘当磁盘使用率超过阈值时自动告警实现真正的主动运维。掌握从基础命令到进阶分析再到自动化监控的全套方法你就能从容应对Linux服务器上的任何磁盘空间挑战。记住du -shx是你的起点而清晰的排查思路和合适的工具组合才是解决问题的关键。下次再遇到磁盘告警希望你能淡定地打开终端开始一场高效的“空间狩猎”。
返回列表