df -h先定位高占用分区,du -sh再逐级精确定位大目录;二者结合才能既知“哪块盘满”,又明“谁占的空间”。

直接看 df -h 就能知道哪块盘快满了,但光靠它找不到是谁占的——得配合 du 定位具体目录。
df -h:一眼看出哪个挂载点快爆了
这是排查磁盘告警的第一步,输出字段直白:Filesystem 是设备名,Size 是总容量,Use% 超过 90% 就该动手了,Mounted on 告诉你这个空间挂在哪(比如 / 或 /home)。
-
df -h默认只显示已挂载的分区,不显示未挂载或伪文件系统(如/proc),想看全用df -ah -
df -hT多一列Type,能确认是ext4还是xfs,某些清理操作依赖文件系统类型 -
df -i查 inode 使用率,Use%没满但写不了文件?很可能是Inodes耗尽了 - 注意
Avail不等于剩余可用空间:它预留了 5% 给 root 用户,普通用户看到的可用值会更小
du -sh * | sort -h:在指定目录下揪出“吃空间大户”
df 告诉你“哪栋楼快塌了”,du 帮你冲进楼里查是哪间房堆满了杂物。常用组合就是先 cd 进高危挂载点(比如 /var),再执行:
-
du -sh *统计当前目录下所有一级子项大小,-s不展开子目录,-h可读单位 -
du -sh * | sort -h把结果按大小排序,最大的排最底下(sort -h支持 K/M/G 单位自动识别) - 别直接
du -sh /:会遍历整个根文件系统,耗时长且可能因权限失败中断;应逐级缩小范围,比如先/var,再/var/log -
du -sh /path/to/dir | grep -E "G|M$"快速过滤出 GB/MB 级别的目录,跳过一堆 KB 级噪音
lsblk 和 fdisk -l:区分“物理盘”和“逻辑分区”
当 df 显示某个挂载点空间异常,但不确定背后是 SSD、机械盘还是 LVM 逻辑卷时,这两个命令补全底层视图:
-
lsblk输出树状结构,一眼看清sda → sda1(主分区)、sda2(LVM PV)等层级关系,MOUNTPOINT列对应df的Mounted on -
fdisk -l需要 root 权限,显示原始分区表:起始扇区、结束扇区、Id类型(如83 Linux)、是否为扩展分区。特别适合确认有没有未挂载但已存在的分区(比如/dev/sdb1没mount,df就看不到它) - 注意:云服务器常见
/dev/vda1这类虚拟盘名,lsblk会同时显示其RO(只读)状态,避免误操作 -
fdisk -l中的Blocks单位是字节,换算成 GB 要除以 1024³,不是 1000³ —— 这和硬盘厂商标称容量不一致的根源
为什么 du 和 df 结果对不上?
这是最常被问到的坑:明明 du -sh /var 加起来才 5G,df -h 却显示 /var 所在分区用了 20G。原因通常就三个:
- 已删除但进程还在占用的文件:
lsof +L1能列出这类“幽灵文件”,kill对应进程或重启服务释放空间 - 隐藏目录或权限受限目录:比如
/var/lib/docker下容器层,普通用户du进不去,但实际占大量空间;加sudo再试 - 文件系统预留空间:
df的Avail已扣除 5% 预留,而du统计的是用户可见数据,两者基准不同
真正麻烦的是第一种情况——空间不会随 rm 立即释放,得盯住 lsof 输出里 deleted 标记的行。











