agedu磁盘分析工具实战:快照索引轻松揪出Linux大文件与空间占用 服务器磁盘又满了这条告警短信我这半年已经收过不下十次。每次的剧情几乎一样先df -h看到某个分区红了再用du -sh一层层往里翻运气好几分钟能定位到目标运气不好遇到那种上百个嵌套目录、里面全是很零碎的大文件能把人活活耗到下班。后来同事丢给我一个工具说你自己试试名字叫agedu我当时还以为是某种抓包工具结果一试就回不去了。agedu是Linux下一款磁盘空间分析工具它能快速扫描指定目录并把整棵目录树的空间占用情况落盘成一个数据文件之后不管是终端里查还是起Web服务在浏览器里点都不用重新扫磁盘。这篇文章就以KeyarchOS系统为例从安装到实战完整拆一遍agedu的用法教你怎么又快又准地揪出大文件和空间杀手。适合那些跟我一样每天都在处理磁盘告警的运维、系统管理员还有偶尔被测试环境磁盘打满逼疯的开发同学。1. 磁盘分析工具怎么选我为什么盯上 agedu1.1 du、ncdu、agedu 三者的定位先坦诚讲最开始我是不太信任花了里胡哨的分析工具的因为Linux下最朴素的du和find其实已经能解决问题只是效率难看。du -sh *这个命令大家应该都敲过它能把当前目录下每个子目录占用的空间大小列出来但有两个硬伤第一每次执行都是全量重扫目录一深文件一多等输出等到怀疑人生第二输出结果只做了目录级别的聚合没法快速地以交互方式下钻到最深的那个“罪魁祸首”。你最多只能顺着输出结果不断敲cd进子目录再执行du操作很机械。后来我短暂用过ncdu这工具在终端里跑起来确实爽支持方向键选中目录、回车下钻、d删除给人感觉像一个终端版的磁盘空间管理器。但它有一个让我始终不安的点扫描结果不落盘。你把窗口一关再想查同一个目录还得再从头扫一遍。对那种需要周期性观察目录增长趋势的场景来说体验就有点不够用了。agedu和上面两个不一样。它由ATT实验室设计实现全称是ATT Advanced Disk Usage Utility核心思路不是“当场扫完当场看”而是先做一次快照扫描把目录结构、文件大小等内容压缩成一个索引文件之后所有查询都走这个索引不碰原始磁盘数据。我用一个类比来解释du就像每次都要翻开整本相册从头找到尾ncdu是让你现场把相册仔细翻一遍agedu则是先把相册的所有照片位置和规格拍成一张目录卡片之后你每次要找某张照片都不用再翻原相册只看卡片就行。1.2 agedu 的核心设计为什么“先扫描再查询”这么香agedu内部基于trie字典树结构来组织目录路径和空间占用信息。trie这名字听着唬人实际上就是一棵多叉树树根对应文件系统根路径每个节点对应一个目录节点里保存着该目录下所有内容的累计大小。这样设计的直接好处是任意子目录的占用大小都能沿着树快速查到不需要像du那样对每个子目录反复做IO统计。这带来了几个对其他工具来说很奢侈的能力。第一查询和扫描解耦。全量扫描可以安排在夜深人静的时候跑跑完生成快照文件白天任何时间点都能毫秒级查询第二支持定向分析。你可以单独查看某个子目录的占用情况也支持筛选最小文件大小甚至按文件修改时间过滤这些在原始du命令里做起来很笨重第三迭代更新成本低。重新执行一次快照扫描时agedu会尝试在原有数据基础上做合并更新而不是完全从零开始。agedu还提供了两套查询入口终端文本模式和HTTP Web模式。文本模式适合在Shell里快速查数、配脚本Web模式则会启动一个本地HTTP服务在浏览器里以目录树的可视化方式展示用户体验相当直观。有点要提醒的是Web模式的默认监听策略只绑定本机回环地址127.0.0.1这在我看来是好事因为agedu本身并不是专业Web服务器没必要把端口暴露到公网上。后面我会专门讲怎么用SSH隧道的方式远程访问。2. KeyarchOS 安装 agedu 的两种靠谱姿势2.1 用系统包管理直接装KeyarchOS目前在服务端场景的适配已经相当成熟包管理体系走的是Debian系那一套所以安装agedu最直接的办法就是用apt。先更新软件源索引然后装上包apt update apt install -y agedu整个安装过程非常安静agedu是个体积很小的独立工具几乎不带额外依赖在精简镜像上装也不会拉进来一堆用不上的东西。装完验证一下版本agedu -V能输出版本号就是成了。我踩过一个小坑有些基础镜像默认没有启用完整的软件源列表直接apt install会报“Unable to locate package”。这种情况先apt update大概率能解决实在不行检查一下/etc/apt/sources.list里是不是被精简到只剩极少数源了。反正我在KeyarchOS上执行apt install -y agedu基本一次就过速度也快。这里顺便多说一句如果你用的是RHEL系构建的KeyarchOS版本包管理命令会变成yum或dnf安装思路完全一致只是软件包名可能需要自己确认有的RHEL源里不一定会收录agedu这时候就走下一节的源码编译方案。2.2 源码编译安装兜底方案源里没有、或者版本太老想用新特性的情况下源码编译也就三条命令的事。先确认基础编译工具在不在apt install -y gcc make autoconf然后从agedu官方发布页拉源码包解压、配置、编译、安装wget https://www.chiark.greenend.org.uk/~sgtatham/agedu/agedu-20231025.6b7228a.tar.gz tar zxvf agedu-*.tar.gz cd agedu-*/ ./configure make make install建议先./configure --help看一眼可配置项默认情况下二进制会装到/usr/local/bin/agedu随后在终端直接敲agedu如果提示not found八成是PATH环境变量里没包含/usr/local/bin执行一下export PATH/usr/local/bin:$PATH或者写进~/.bashrc做持久化。源码安装有个小坑我得强调一下市面上很多教程直接复制./configure make make install但没提醒你检查autoconf版本。我遇到过一次编译器报错提示某个宏找不到最后发现是autoconf版本太旧升级到新版本后一切正常。如果你在编译阶段卡住优先怀疑构建环境而不是源码本身。编译安装还有一个好处就是能拿到比发行版软件源更新的版本新版本对Web模式的监听参数、文本模式的输出格式支持得更完善后面用到的高级功能也都能跑通。装完照例跑一次agedu -V确认。3. 实战扫描磁盘并在浏览器里快速定位大文件3.1 目录快照把“磁盘地图”先拍下来工具装好了别急着扫描整块硬盘。我的习惯是先用df -h看清楚哪个分区告警再有针对性地扫描。比如现在/home分区已经用到92%那就扫描它agedu -s /home -o /var/lib/agedu-home.dat这里-s表示走snapshot模式-o指定数据文件输出路径。如果不写-oagedu默认会在当前目录下生成一个叫agedu.dat的文件。扫描过程中终端会逐行打印正在统计的路径普通几GB的目录十多秒就能跑完如果目录里堆了几百万个小文件时间会明显拉长但比起du一层层翻已经快不少了。扫描范围的选择有个小经验宁可多扫几个子目录、存多个快照文件也别偷懒把整个根分区一次扫完。我一般习惯把/home、/var、/data这类业务高频目录各自保存一份快照文件文件名里带上扫描日期。这样后面做趋势分析时每个文件对应一个明确范围不会混成一坨。而且增量扫描时路径保持一致也很重要否则agedu没法复用旧索引又会变成全量重扫那就亏大了。扫描完先别急着开Web用文本模式快速断言一下扫描结果是否合理agedu -t -f /var/lib/agedu-home.dat --print-size | sort -k2 -n | tail -20这行命令的意思是把快照文件里的目录树以文本格式打出来按第二列数字排个序然后看占用最大的后20行。如果输出结果跟你看到的实际磁盘使用对不上检查是不是扫错目录或者快照文件过期了。确认没问题再进下一步。3.2 启动 Web 报告服务在浏览器里点开看快照文件在手Web服务随时可以起。最常见的命令是这样agedu -w -f /var/lib/agedu-home.dat --auth none --listen 127.0.0.1:18080浏览器访问http://127.0.0.1:18080就能看到一棵按大小排列的目录树。每个目录节点都显示占用空间点击可以继续下钻一直到文件级别。我最喜欢的一点是它默认会把空间占用的大头顶在最上面一眼扫过去就能锁定“嫌疑犯”不用再像以前那样一层层点开目录猜。有些版本的agedu Web模式需要明确指定端口和地址比如--address 127.0.0.1 --port 18080如果你敲了命令报参数不认识跑一下agedu --help看看当前版本支持哪些选项再调整。我自己的服务器上不同发行版的agedu版本差异还挺大命令参数真的是跟着版本走的别死记。端口随便选一个没被占用的就行8000、8088、18080都可以。--auth none表示关闭认证只接受本机访问。这里划个重点如果你图省事把监听地址写成0.0.0.0这意味着局域网内任何人都可能打开你的目录报告一台磁盘问题诊断服务器瞬间变成内部敏感信息泄露源。我的建议是无论如何保持127.0.0.1远程查看走SSH端口转发解决。当你在机房外面需要远程访问这台服务器上的agedu报告时最佳姿势是SSH隧道而不是直接改监听地址ssh -L 18080:127.0.0.1:18080 userserver_ip执行完这条命令本机浏览器照常访问http://127.0.0.1:18080数据通过SSH加密通道传输不经过任何公网明文端口。这个方式非常稳我用了很久都没出过问题。有个常见的误判是服务器上服务明明起了但用浏览器访问服务器IP的18080端口始终连不上其实不是agedu坏了而是它只监听了回环地址本机之外的网络请求自然到不了。所以先确认监听策略再怀疑程序本身。3.3 命令行模式定位大文件的高效率姿势Web界面看着舒服但真要跑脚本、做自动化巡检命令行才是主力。agedu文本模式可以做到“只输出我想看的那部分数据”而不是把整个目录树全打出来。比如只看某个子目录的占用情况agedu -t -f /var/lib/agedu-home.dat --print-size /home/user/downloads这会显示/home/user/downloads子树下的目录和文件信息配合管道和awk就能做很多自动化判断。例如找出工程目录里大于1GB的文件并把结果按大小排序agedu -t -f /var/lib/agedu-home.dat --print-size --min-size1M | awk $2 1000 | sort -k2 -n注意agedu文本输出的字段顺序不同版本可能存在差异。我建议先在目标环境上跑一次不带过滤的命令看下输出长什么样再决定awk取第几列别照着网上的脚本硬套。这块只要字段取错了后面的排序统统白搭。文本模式还有一个很好用的场景是分析“很久没访问过的大文件”。搭配mtime相关信息可以筛出半年、一年都没动过的老古董这类文件最适合归档到冷存储或直接压缩。比如你想找出那些占用大但已经很久没更新的文件agedu -t -f /var/lib/agedu-home.dat --print-size --min-size100M | while read path size; do # 按路径继续检查mtime或者直接交给后续清理脚本 echo $path $size done这类需求用原始du和find配合也能做但组合命令写得很长而且每次都要重新扫目录。agedu因为有了快照索引查询路径更短、性能更稳。我把这条命令顺手做成了一个五分钟级的巡检脚本每天定时跑一次并输出Top占用列表效果非常理想。4. 常见问题与排查技巧实录4.1 Web服务起不来端口占用是先查这一步Web模式启动失败最常见的元凶就是端口被占用。检查代码一行搞定ss -tlnp | grep 18080如果看到其他进程坐在这个端口上换个端口再启动即可。听起来像废话但实际操作里很多人绕过这个问题直奔重新编译浪费不少时间。要是ss查出来端口没被占用服务还是起不来再看监听地址格式对不对很多版本要求--listen 127.0.0.1:18080这样完整的“地址端口”少写了IP段就会报错。4.2 报告和实际占用对不上快照过期了agedu报告的并不是实时数据而是你上次执行-s扫描时的静态快照。如果一个目录白天被删了一大堆临时文件而你手上的快照文件还是前一天生成的Web界面上的数字自然不会有变化。这不算bug是设计如此。解决办法也很简单重新执行一次agedu -s用新快照覆盖旧文件。这里有个值得养成的习惯就是每次重扫时的路径和数据文件路径要保持一致这样agedu可以在旧索引基础上做增量更新速度更快。如果你换了扫描路径旧数据无法复用就会触发全量重扫大分区等起来确实磨人。4.3 扫描太慢用ionice和分片扫描遇到几TB的大分区agedu全量扫描确实会花上几分钟甚至更久而且扫描过程会大量读磁盘多少会对正常业务产生一点IO影响。我建议把扫描进程的优先级降下来ionice -c3 nice -n 19 agedu -s /data -o /var/lib/agedu-data.dationice -c3是把IO调度等级设为idle让agedu只在磁盘空闲时抢带宽nice -n 19则是把CPU优先级也压到最低。这样就算在业务高峰期跑扫描也不用担心把线上服务拖垮。另一个思路是分片扫描。比如/data下面有/data/app、/data/log、/data/backup别一次扫整个/data而是分成三份分别做成快照。每次查询对应一个独立范围某一片数据过期了就只重扫那一片其他快照完全不受影响。这种做法在目录特别大、文件特别多的时候能把日常维护成本压得很低。4.4 --auth none 与权限问题--auth none确实省事但它的含义是“随便谁访问都放行”。如果你把agedu端口用SSH隧道拉到本地无认证完全没问题但如果某天图省事把监听地址改成了0.0.0.0这一步就会变成隐患。真到了需要让远端同事临时看一眼报告的场景我建议开启basic认证agedu -w -f /var/lib/agedu-home.dat --auth basic --auth-file /etc/agedu-auth --listen 127.0.0.1:18080认证文件的权限要收好至少执行chmod 600并确保只有root能读写。如果文件权限放得太宽agedu会拒绝使用这个认证文件启动时直接报错。说白了agedu不是专业Web服务器它只是临时干一下“把磁盘数据可视化出来”的活我们在使用时别指望它提供多完善的安全能力该做的监听限制和认证还是得自己上心。最后放一张我在现场排查时常用的速查表帮助快速定位问题现象常见原因处理建议Web服务端口连不上监听地址是127.0.0.1跨机访问不了用SSH隧道或确认局域网地址策略端口已被占用其他服务抢先监听用ss查占用进程换端口报告数据跟实际对不上快照文件未重新扫描重新执行agedu -s覆盖扫描期间业务变卡I/O优先级太高加ionice -c3和nice -n 19auth认证文件报错权限过宽或路径不对chmod 600、确认路径可读命令找不到agedu源码安装后PATH没加检查/usr/local/bin是否在PATH我在实际使用中最大的体会是agedu不会让磁盘空间凭空多出来但它的确能把“空间去哪了”这个问题从半小时的体力活变成几分钟的点选操作。现在我的定位流程很固定收到磁盘告警先df -h确定分区再用agedu -s做快照接着起Web界面几分钟内锁定重点最后去清理或迁移。如果你之前一直靠du和find硬扛真心建议把agedu加进工具箱在KeyarchOS这类系统上安装基本无痛语义化命令也容易上手。最后分享一个小技巧快照文件记得统一放在固定目录配合cron定期扫描时间久了还能积累出一套目录增长趋势的数据排查问题时参考价值极大。