深色模式
磁盘满排查
摘要:磁盘满分两种:容量满和 inode 满,排查方向完全不同。本文给出从挂载点定位到大目录、再到具体文件与"已删除未释放"句柄的完整路径,并说明 df 与 du 结果不一致时的处理办法。
适用环境
bash
df -hT
df -iT
mount | grep -E 'ext4|xfs|overlay'1
2
3
2
3
排障步骤
第 1 步:确认是哪个挂载点、满的是容量还是 inode
bash
df -hT | grep -v tmpfs
df -iT | grep -v tmpfs1
2
2
df -i 显示 IUse% 接近 100% 时,即使容量有大量剩余也无法新建文件。
第 2 步:定位大目录(不要跨文件系统)
bash
du -x -h --max-depth=1 / 2>/dev/null | sort -hr | head -201
-x 表示不跨文件系统,避免把 /proc、/dev、其它挂载点算进来,是提速和避免误判的关键。
第 3 步:逐层下钻到具体文件
bash
du -ah /var/log 2>/dev/null | sort -hr | head -20
find /var -type f -size +500M -printf '%s\t%p\n' 2>/dev/null | sort -rn | head -201
2
2
第 4 步:处理"已删除但仍占空间"的文件
这是 df 显示满但 du 统计很小的典型原因:文件被删除,但进程仍持有句柄。
bash
lsof +L1 2>/dev/null | head -20 # 列出链接数为 0 的已删除文件
lsof | grep -i deleted | head -201
2
2
处置方式优先重启或重载持有进程,让句柄释放;不要盲目删除其它文件。
不要试图用 echo > /proc/PID/fd/N 强行清空
对正在写的日志文件可能有效,但会破坏应用的写入偏移与状态,风险不可控。优先走进程重载。
第 5 步:清理可安全释放的空间
bash
# 日志:优先用自带轮转,而不是手删
journalctl --disk-usage
journalctl --vacuum-size=1G
logrotate -d /etc/logrotate.conf # -d 是演练,确认无误后再去掉
# 包管理缓存
apt-get clean || yum clean all1
2
3
4
5
6
7
2
3
4
5
6
7
第 6 步:确认根因是否会复发
bash
ls -l /var/log/ | head -20
find /var/log -name '*.log' -mtime -1 -size +100M1
2
2
清理只是止血,必须找到产生大文件的来源(日志级别、core dump、临时文件未清理)。
验证
bash
df -hT | grep -v tmpfs
df -iT | grep -v tmpfs
touch /tmp/.write_test && echo writable && rm -f /tmp/.write_test1
2
3
2
3
常见坑
df 与 du 数值不一致
通常是已删除未释放的句柄,或容器 overlay 层、挂载点遮挡(在挂载点之前写入的文件被隐藏)。
目录被挂载点遮挡
如果 /data 挂载后,之前写入 /data 的文件并未消失而是被遮住,需卸载或用绑定挂载才能看到。
只清理不治本
日志级别开成 DEBUG、core dump 未限制、临时目录从不清理,几小时后必然再次告警。
直接 rm -rf 不熟悉的大目录
先确认目录归属与服务影响面,rm -rf 无回收站。可先 mv 到临时位置观察一段时间再删。