恒美微站 Logo 恒美微站
  • 首页
  • 关于我们
  • 建站服务
  • 主题模板
  • 案例展示
  • 资讯中心
  • 联系我们

Linux磁盘排查利器du命令:从基础参数到实战故障定位

  • 首页
  • 资讯中心
  • /
  • Linux磁盘排查利器du命令:从基础参数到实战故障定位

相关资讯

F´ 框架 Utils::Hash 哈希工具详解:通用接口、SHA256/CRC32 实现与自定义算法接入指南 2026/9/25 15:50:34
使用 torch.backends.xeon.run_cpu 脚本优化 Intel® Xeon® 上的 PyTorch CPU 推理性能 2026/9/25 15:45:34
Atlas 300V Pro部署YOLO实战:环境配置、模型转换与推理优化全攻略 2026/9/25 15:45:34

最新资讯

HarmonyOS ArkTS 中 AVPlayer 与 XComponent 视频播放封装实战
XSS漏洞深度解析:原理、类型、实战与防御指南
OpenClaw 语音控制实战:用 TaoToken 统一 Key 打通 TTS 语音反馈链路
STM32调试核心:BOOT0与NRST硬件级故障排查指南
从零实现 C++ Json-Rpc(五):公共字段与网络抽象层设计
华为杯数学建模实战:36小时备战流程与工具链工程化指南

今日推荐

AI元人文:从工具使用到思维重构的深度探索
Python+CNN车牌识别实战:从数据预处理到模型训练与部署
Vim基础操作全攻略:保存退出、模式切换与高频命令实战

本周热门

BrewUI:给Homebrew套上图形界面,让macOS软件包管理更简单
BrewUI:让Homebrew包管理变得可视化与高效
公式与文本对齐全攻略:从Word到LaTeX的实用技巧

本月精选

自研推理加速器Redwood:两周内实现PyTorch模型高效部署的实战教程
V4L2摄像头采集实战:从camera_client.rar到出图全流程解析
从“谁发明了钢琴键”到知识问答智能体:RAG与记忆工程实践

Linux磁盘排查利器du命令:从基础参数到实战故障定位

发布时间:2026/9/25 15:50:34
Linux磁盘排查利器du命令:从基础参数到实战故障定位 du命令是我在Linux服务器上排查磁盘占用时几乎条件反射会敲的第一条命令。不管你接手的是一台云主机、物理服务器还是自己折腾的虚拟机迟早会遇到“磁盘满了”这类告警而du命令就是定位“谁把磁盘吃掉了”的最趁手工具之一。这篇博文把我这些年用du排查磁盘的经验系统整理一遍从基础参数到底层逻辑、从常用组合到故障排查既有命令示范也有踩坑记录适合刚入门Linux的读者也适合处理过几次磁盘告警但还没真正把du用透的运维朋友。1. du命令到底是什么为什么排查磁盘先看它1.1 df和du的分工别搞混了很多新手容易把df和du当成同一类命令实际两者统计维度完全不同。dfdisk free看的是文件系统层面——某个挂载点总共多大、用了多少、还剩多少它直接读取文件系统的超级块和块分配信息。dudisk usage则从文件系统底层开始递归统计每个目录和文件实际占用的磁盘块数量最终汇总成每个目录的大小。举个生活化例子df相当于看一个小区的水表总表告诉你整个小区今天用了多少吨水du相当于挨家挨户敲门查水表统计每家每户分别用了多少。排查磁盘满时第一步用df确认是哪个分区满了第二步就要靠du钻进目录里找到底是谁在占空间。两个命令配合使用才是完整排查链路。1.2 du的工作原理和第一次运行的疑问du的统计方式很直接从你指定的路径开始递归遍历其下所有子目录和文件针对每个文件调用stat获取占用块数然后乘以文件系统块大小逐级向上累加。这也解释了为什么在大目录上第一次执行du会卡一会儿——它不是查元数据就完事而是真的把整个目录树走一遍。很多人第一次跑du会碰到一个经典困惑直接把某个目录大小加总发现和du给出来的结果对不上。原因在于文件系统按块分配空间一个4KB的块只能属于一个文件小文件也要占满整个块。du统计的是“块占用”而非“字节数”一个1字节的文件占4KB一个4KB的文件也占4KB两者在du眼里大小相同。这个逻辑贯穿du所有参数的使用理解它后续看输出就不会觉得奇怪。1.3 核心参数速览先混个脸熟du参数不算多但组合起来能覆盖绝大多数场景。我先给一张常用参数对照表后面每个参数的细节再展开讲。参数作用典型场景-h以人类可读格式输出K、M、G几乎必带否则满屏字节数毫无可读性-s只显示总计不列子目录快速确认某目录整体多大-a同时显示目录和文件需要定位目录下的大文件时用-d NUM限制递归深度为NUM层逐层排查目录占用时用--max-depthNUM同-d NUM另一种写法同样用于分层排查--excludePATTERN排除匹配文件或目录跳过日志、缓存等已知大目录-x只在当前文件系统内统计避免统计到挂载在其他目录的额外分区-c最后显示总计统计多个路径时用-B/--block-sizeSIZE指定输出块大小需要脚本按固定单位解析时用2. 最常用的几种du用法直接抄作业2.1 快速看目录整体大小du -sh先给目录做总体检用du -sh是最快的。s代表只汇总summarizeh是人类可读human-readable组合起来就是“只看总和给我个像样的单位”。执行效果大概是这样$ du -sh /var/log 3.2G /var/log想看多个目录各自的总大小把路径全部扔在后面就行$ du -sh /var/log /var/tmp /home 3.2G /var/log 56M /var/tmp 18G /home这个用法最简单也最实用。我接手服务器第一件事就是先对/、/var、/home、/opt这几个常用目录分别跑一遍du -sh心里先有个盘子再决定从哪里下手。2.2 一层层往下钻du -h --max-depth1确认/var占了3.2G后就要搞清楚这3.2G具体分布在哪里。这时候不加-s改用--max-depth1让du只列一层子目录的大小$ du -h --max-depth1 /var/log 2/dev/null 1.4G /var/log/nginx 900M /var/log/messages 680M /var/log/journal 120M /var/log/anaconda 76M /var/log/tuned--max-depth1的意思是只统计“下一级目录”整体大小不再继续展开。这一层看完哪个目录大就再把路径换成那个目录继续往下钻一层一层逼近罪魁祸首。这个过程类似点外卖时先看“品类”再看“店铺”再看“单品”边界清晰不会把自己绕晕。这里有个细节值得说du默认不带参数时会把所有层级目录全部列出来输出巨大且难以定位。绝大多数人实际排查时都不会直接裸跑du而是用--max-depth锁定层级。新版coreutils也支持-d 1这种简写效果一样。2.3 查找特定目录下的大文件du -ah有时候问题不在“目录大”而在“某几个文件特别大”。比如日志目录里一个access.log撑到了几十GB这时候就要用-a参数让du同时输出文件大小$ du -ah /var/log/nginx 2/dev/null | sort -rh | head -20 32G /var/log/nginx/access.log 1.2G /var/log/nginx/error.log 28M /var/log/nginx/access.log.20231215.gz-a会把目录和文件全部列出来配合sort -rh按人类可读数字倒序排序再取前20行大文件一目了然。注意sort -rh里的h要对应du -h输出里的单位否则按字母序排会把“1G”排在“900M”前面。更稳妥的姿势是du -a不接-h直接输出字节数再用sort -nr按数字倒序然后取前几条。2.4 排除不想统计的目录--exclude实际服务器里总有些目录是你明知道很大但不想统计的比如/mnt下的备份盘、/proc这类伪文件系统。du提供了--exclude参数支持通配符还支持重复使用排除多个目录$ du -h --max-depth1 --exclude/opt/backup --exclude*/cache / 2/dev/null很多人在根目录跑du时被/proc、/sys这类虚拟文件系统干扰过其实它们根本不该被du统计。用-x参数可以只统计当前文件系统范围内的数据自动跳过挂载在子路径下的其他文件系统$ du -xh --max-depth1 /-x配合--exclude一起用排查根目录占用时可以少看很多垃圾信息。这个组合我几乎每次都会加既省时间又防误判。3. 磁盘满的完整排查流程从告警到定位3.1 一条龙排查五步走真遇到磁盘满告警时我的排查顺序基本是固定的直接给你参考第一步df -h确认哪个分区满了记住使用率数字和挂载点。第二步du -xh --max-depth1从该挂载点根目录开始统计定位到占用最大的子目录。第三步进入该目录重复上一步一层层缩小范围直到文件或目录级别。第四步对定位到的文件用ls -lh确认大小、修改时间、属主判断是否可清理。第五步确认无误后清理再df -h复查使用率是否回落。这套流程最快的时候几分钟就能解决一次告警。比起装监控面板或者翻各种可视化报表命令行一条条敲下来反而更有掌控感因为每一步你都清楚数据是怎么算出来的。3.2 df和du结果对不上不是bug排查中经常碰到一个诡异现象df显示根分区用了85%但du -sh /统计出来的总大小只有一半数值对不上。这个问题我调试过好多次原因基本逃不出下面三个。文件被删除但仍有进程持有这是最常见的。进程打开文件后写了几百GB文件被rm删除但进程没退出空间并不会释放。df依然显示占用du在目录里遍历时却找不到这个文件。这种场景排查方法是lsof | grep deleted找到持有文件的进程重启或让进程释放文件句柄。文件系统元数据异常或存在隐藏的保留块不太常见但确实存在。比如某些文件系统有保留空间比例df会把这部分算进useddu则不会。另外断电或异常重启后也可能出现孤儿文件占空间但不在目录树里。还有一种情况是统计视角本身的差异df基于块设备使用率计算du基于目录树累加根目录下一些点挂目录mount point内部的占用在裸du里不体现所以-x是很关键的补充。3.3 权限不足引发的误判sudo du普通用户跑du经常收到一堆Permission denied然后目录大小被严重低估。比如一个目录下大部分文件属于root普通用户du进去什么都读不到输出会缩水一大截。我在排查问题时如果sudo权限可用会直接用$ sudo du -xh --max-depth1 /切换到root再统计还有一个额外好处能读到更多隐藏文件避免遗漏点开头的目录比如.docker、.cache这些它们常常是磁盘占用大户但容易被忽略。3.4 inode耗尽磁盘空间却还剩一半最后提一个很多人忽视的场景——df -h显示空间没满但df -i显示inode使用率100%这时候同样会出现“无法创建文件”的故障。du在这里同样能帮上忙先找出哪个目录下的文件数量爆炸通常是邮件队列、临时文件目录或者小文件堆积的缓存目录再用du或配合find统计文件数量定位具体位置$ df -i $ find /var -type f | wc -l $ find /var -type f | awk -F/ {print $2} | sort | uniq -c | sort -rh | head磁盘空间和inode两个维度都可能成为瓶颈排查告警时最好一并检查别单看一边。4. 让du更好用的进阶技巧4.1 结合sort找出Top N大目录一个很实用的组合就是du配合sort、head做排行榜。先列一级子目录大小再按数值从大到小排序取前20名$ du -xh --max-depth1 /data 2/dev/null | sort -rh | head -20多台服务器巡检时我会把这个输出重定向到文件统一汇总对比哪台机器哪里长得快一眼就能看到。再进一步可以把命令放到cron里定期跑输出历史趋势结合du的--time参数还能看目录内文件的最新修改时间判断哪个目录还在持续写数据。4.2 定制输出单位与精度有些场景du -h的G、M后缀反而碍事比如脚本里想拿数值做阈值判断。用--block-size指定固定块大小输出就会变成整洁的数字$ du -s --block-size1M /var/log 3277 /var/log $ du -s --block-size1G /var/log 4 /var/log这里可以看出块大小对结果的取整影响1M下3277M在1G下显示成4G是上取整的结果。脚本要做阈值判断就用--block-size1M数值语义直观也不会被单位弄晕。另外du还有个--apparent-size参数显示文件“表现出的大小”而不是实际占块大小在比较压缩文件或稀疏文件时各有用途但日常排查还是默认的块占用更贴近磁盘真实消耗。4.3 软链接与硬链接的处理逻辑du对软链接默认不跟随只统计链接文件自身那一点点大小避免循环引用和重复统计。硬链接则比较特殊默认情况下多个硬链接指向同一inodedu会把每个链接路径都算一次导致总和虚高。用-L参数可以强制du跟随软链接统计目标实际大小但要注意可能重复计入同一数据。处理硬链接场景我习惯先用ls -l确认nlink列数值如果发现同一文件被硬链接到多个目录再决定是否需要按实际唯一inode统计。这种情况在备份目录、快照目录里比较常见盲目按目录加总容易产生误判。4.4 ncdu比du更直观的交互替代品du输出是静态的如果要不断上下钻取还有一个更舒服的工具叫ncduNCurses Disk Usage。它不是替代du而是把du的统计结果做成可交互的界面进入某个目录按回车就能钻取按d标记删除按q退出比一条条敲du快不少。$ ncdu -x /大多数发行版源里都有这个包Debian/Ubuntu直接apt install ncduCentOS/RHEL用yum install ncdu。首次扫描会花一些时间之后浏览浏览体验很好。如果需要给客户或者同事展示排查结果ncdu的界面也比纯终端输出直观得多。5. 常见故障与避坑实录5.1 du跑起来半天没动静大目录、慢磁盘、海量小文件叠加时du需要遍历所有条目耗时很长。我第一次在几TB的数据目录上跑du愣是以为机器卡死了。解决办法是把统计范围缩小、用--max-depth控制层数、配合-x跳过其他文件系统也可以在低峰期执行。更稳的方式是先对已知的大分区用du -sh快速总览别一上来就全盘扫。5.2 明明进去了目录Permission denied却刷屏普通用户du某个目录时如果对其子目录没有读权限就会出现大量报错输出的数据还不全。这不仅是体验问题数值也不可信。要么sudo提升权限要么对特定目录用--exclude临时跳过。另外还可以用2/dev/null把错误信息屏蔽让输出干净一点但要清楚屏蔽之后统计结果可能偏小。5.3 空间显示满了但du怎么也找不到大文件这种情况十有八九是文件被进程占用后删除或者文件在某个挂载点内部而du统计时没加-x跳过了又或者数据属于其他用户导致权限遮蔽。按前面说的先lsof | grep deleted再看挂载关系最后用sudo重跑du。这三板斧基本能解决90%的“空间凭空消失”案件。5.4 关于临时文件与日志轮转日志是最常见的磁盘杀手但很多日志文件虽然看起来很大其实已经被logrotate轮转处理过du统计出来的access.log可能并不是“可清理”的重点。判断一个日志能不能清要结合进程是否还持有句柄、日志策略是否允许truncate、以及是否有合规保留要求。我一般先看lsof确认进程状态再决定truncate还是rm避免把正在写的日志删了导致服务异常。我把这些年在排查磁盘占用时du命令的用法沉淀成了一套固定打法面对任何一个分区告警df确认范围du配合-x和--max-depth做逐层下钻必要时加--exclude跳过干扰项最后结合sort排序、lsof查deleted文件、df -i检查inode形成闭环。刚开始用du时我也被各种参数组合和数值对不上的问题困扰过次数多了才摸索出这些规律。如果你现在正被磁盘告警折腾不妨照着我上面的顺序跑一遍相信能省下不少时间。

关于恒美微站

恒美微站专注于为个体商户、工作室提供极简自助建站服务,让每个人都能轻松拥有专业网站。

快速链接

  • 关于我们
  • 建站服务
  • 主题模板
  • 案例展示
  • 资讯中心

服务项目

  • 可视化建站
  • 拖拽编辑
  • 主题定制
  • SEO 优化
  • 网站托管

联系方式

  • 📍 地址:北京市朝阳区建国路 88 号
  • 📞 电话:400-888-8888
  • ✉️ 邮箱:info@hmyw.cn
  • 🕐 时间:周一至周日 9:00-18:00

© 2024 恒美微站 hmyw.cn 版权所有 | 京 ICP 备 12345678 号