适用于 Linux 主机出现 No space left on device、日志无法写入或磁盘使用率突增的场景。命令基线为 Linux 5.4+、coreutils 8.30+、util-linux 2.36+、systemd 245+;lsof、LVM 和配额工具为可选项。读取其他进程的文件描述符、系统日志及块设备信息通常需要 root。先保留告警窗口,不要一开始就删除日志、截断文件、卸载文件系统或清理容器运行时目录。
1. 先把路径映射到实际文件系统
date -u
df -hT
df -ih
findmnt -T /path/to/data -o TARGET,SOURCE,FSTYPE,OPTIONS
lsblk -o NAME,KNAME,TYPE,PKNAME,FSTYPE,SIZE,FSAVAIL,FSUSE%,MOUNTPOINTS
df -hT 看块空间,df -ih 看 inode。块空间有余量而 inode 为 100% 时,新建小文件同样会失败;反之,大文件增长通常先耗尽块空间。示例路径必须替换为报错程序实际写入的路径,因为 bind mount、独立挂载和容器挂载命名空间可能让同一路径字符串落到不同文件系统。还要保留挂载选项;只读重新挂载通常会报告不同错误,不能按容量问题处理。
2. 在同一文件系统内定位增长目录
GNU du 可限制在当前文件系统,避免把网络盘或其他挂载混入统计:
du -xhd1 /path/to/mount 2>/dev/null | sort -h
du -xhd1 /path/to/mount/large-dir 2>/dev/null | sort -h
find /path/to/mount -xdev -type f -size +1G -printf '%s %TY-%Tm-%TdT%TH:%TM:%TS %p\n' \
2>/dev/null | sort -n | tail -n 30
全盘扫描会产生额外 I/O,繁忙主机应从已知增长目录开始,并在低优先级或受控窗口执行。文件名可能包含换行,以上 find 输出只适合人工初筛,不应直接交给删除脚本。先确认文件的所有者、保留策略和是否仍在写入,再决定清理方式。
3. df 很高但 du 对不上时
最常见原因之一是文件已从目录树删除,但仍被进程打开。安装 lsof 后可检查链接计数小于 1 的打开文件:
lsof -nP +L1
重点记录进程、PID、文件描述符和大小。不要直接写 /proc/<PID>/fd/<FD> 来截断文件;应按应用支持的方式重新打开日志、滚动文件,或在评估影响后重启对应进程。操作后再次执行 lsof +L1 与 df -hT,确认引用释放且空间回收。
另一个原因是文件被后来挂载的文件系统遮住。先检查挂载层级:
findmnt --submounts /path/to/mount
findmnt -R /path/to/mount
不要为了查看被遮住的目录而在故障现场直接卸载生产挂载;应在维护窗口或隔离的挂载命名空间中核对。du 无法解释的空间也可能来自文件系统元数据、快照或保留块,需要继续看文件系统与存储层。
4. 分开检查日志、容器与底层卷
journalctl --disk-usage
du -xhd1 /var/log 2>/dev/null | sort -h
du -xhd1 /var/lib 2>/dev/null | sort -h
systemd-analyze cat-config systemd/journald.conf
日志占用高时先核对 journald 与 logrotate 的最终配置、轮转是否失败及应用是否异常放大日志。容器镜像层、可写层和日志必须通过实际运行时的只读统计命令确认;不要手工删除 /var/lib/docker、/var/lib/containerd 或 kubelet 管理的文件。路径大小只是线索,运行时引用关系才决定哪些对象可安全回收。
若路径位于 LVM thin pool,还要检查数据与元数据占用;以下通常需要 root,并且仅适用于 LVM:
lvs -o vg_name,lv_name,lv_size,segtype,data_percent,metadata_percent
文件系统内仍有余量,不代表 thin pool、云盘配额或存储后端仍有可分配空间。ext4 保留块、XFS 项目配额以及用户/组配额也可能使普通服务先于 root 收到容量错误,应根据实际文件系统和已启用的配额工具读取证据,不要直接降低保留比例或放宽配额。
5. 验证闭环
处置后重新对同一应用路径执行 findmnt -T、df -hT 和 df -ih,确认检查的是同一个文件系统;lsof +L1 不再显示目标进程持有的大型已删除文件;日志、容器和 LVM 指标没有继续增长;应用能在其原有用户、挂载命名空间和配额约束下恢复写入。
至少观察一个正常轮转或业务周期,并记录释放前后的块空间、inode、增长目录、持有进程以及底层卷指标。只看到使用率短暂下降不算闭环;还应确认增长来源、清理策略和告警阈值彼此一致。