df -h定位满分区后,用ncdu -x交互扫描可快速精准找出磁盘空间占用元凶,比手动du高效准确;需注意挂载点、inode检查、删除确认及lsof验证句柄释放。

磁盘快满了,直接跑 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单独挂载的服务器,避开/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确认它到底在读哪个已删文件
真正卡住人的不是不会命令,而是扫错范围、删错路径、或者删完忘了检查句柄——这三步漏掉任何一环,清理就等于白干。