当 Linux 磁盘空间告急时,先用df -h快速定位已满分区,再配合ncdu -x进行交互式扫描,通常能更快、更准确地找出磁盘占用的真正来源;同时还要留意挂载点、inode 使用情况、删除前确认路径,以及通过lsof检查文件句柄是否真正释放。

Linux 磁盘快满时,先直接执行 df -h 看看到底是哪块分区被占满,再使用 ncdu 做交互式扫描,相比 du -sh /* 这种手动逐层排查的方法,效率更高,定位也更精准。
df -h 先判断到底是哪块磁盘分区满了
这一步一定不要省略。很多人在看到“根目录满了”后,就立刻去排查 /,但实际很可能一开始方向就错了。真实场景里,往往是 /var、/home 这类独立挂载的子分区先被写满。真正需要重点关注的是 df -h 输出中 Use% 超过 90% 的分区,同时再看清楚 Mounted on 列:如果这里明确显示 /var 已经达到 98%,那就不要继续扫描 /,而是直接排查 /var,这样才能更快找到磁盘空间不足的根因。
df -h /只能查看根分区,容易造成误判;更推荐先用df -h全局检查所有挂载点- 如果发现
/dev/sdb1挂载在/data且空间已满,就不要再查/,直接执行sudo ncdu /data - 建议同时运行
df -i,因为 inode 耗尽也会表现为“磁盘已满”,这种情况在大量小文件场景中尤其常见
ncdu 扫描时一定要加 -x 参数
如果不加 -x,执行 ncdu / 时就可能跨挂载点进入 /proc、/sys、/run,甚至扫到外接硬盘、NFS 网络挂载目录,不仅结果容易混乱,扫描速度也会变慢,还增加误删风险。加上 -x 后,才能确保扫描范围只限制在当前文件系统内。
sudo ncdu -x /:只扫描根文件系统,不会进入/boot、/home等独立挂载分区ncdu -x /var:适合/var单独挂载的 Linux 服务器,能减少/var/lib/docker之外目录带来的干扰- 扫描过程中如果按
d删除文件,务必再次确认路径——像/var/log/journal这类日志目录通常可以清理,但/var/lib/dpkg这类系统关键目录绝不能随意删除
大文件和重复文件要分别排查
ncdu 在查找“大目录”或高占用目录时非常好用,但对于那些分散在不同位置的单个大文件,例如 /tmp/core.xxx,或者用户家目录中随手保存的 ISO 镜像,排查效率就没那么高;至于重复文件,更不适合靠人工肉眼对比,最好交给专门的磁盘清理工具处理。
- 查找单个大于 500MB 的文件:
find / -type f -size +500M 2>/dev/null -exec ls -lh {} + | sort -k5 -hr | head -10 - 排查重复文件可使用
fdupes(更轻量)或rdfind(支持跨目录排序),不要直接用rm -rf删除,建议先通过-dry-run预览结果列表 fdupes -r /home比fdupes /home更实用,支持递归扫描,同时不会轻易遗漏子目录中的重复文件
删除后空间没释放?先用 lsof 检查
如果文件已经删除,但 df 显示磁盘空间仍然没有恢复,那么大概率是某个进程依然占用了被删除文件的句柄。此时 rm 只是执行了 unlink 操作,底层磁盘块并没有真正回收。
lsof +L1可以直接列出所有“已删除但仍被进程打开”的文件,其中+L1是关键参数- 常见占用进程包括
rsyslogd、dockerd、ja va进程,通常重启对应服务或结束相关进程后,空间才会真正释放 - 不要盲目执行
kill -9,应先用lsof -p PID确认该进程具体占用的是哪个已删除文件
Linux 磁盘清理真正容易出问题的地方,并不是不会用命令,而是扫描范围选错、删除路径判断错误,或者删除后忘记检查句柄是否释放——这几个关键步骤只要漏掉任意一个,排查和清理效果都可能大打折扣。
