磁盘空间异常排查
约 655 字大约 2 分钟
2026-08-29
磁盘类问题有三种典型"怪象":文件删了空间不释放、df 与 du 统计对不上、磁盘没满却报 No space left on device。本文逐一给出定位与处理方法。
前置
先确认到底是哪种"满":
df -h # 磁盘容量(Inodes 用 df -i)
df -i # inode(可创建的文件数量)
du -h --max-depth=1 / 2>/dev/null | sort -rh | head # 实际文件占用文件删除后空间未释放
现象:删除了几十 GB 的大日志,df -h 显示占用没变。
原因:进程仍持有该文件的句柄,删除只移除了文件名,数据要等进程关闭句柄才真正释放。
定位:
sudo lsof | grep deleted | sort -k7 -rn | head处理(二选一):
重启持有该文件的进程(如
systemctl restart nginx)。不方便重启的,清空文件而不是删除,立即释放空间:
sudo truncate -s 0 /var/log/nginx/access.log # 或 : > /var/log/nginx/access.log
警告
清空/删除日志前确认业务不再需要;关键日志先压缩归档(参见Cron定时任务做定期归档)。
df 与 du 统计不一致
现象:df -h 显示 90%,du -sh /* 加起来只有 30%。
常见两个原因:
被删除但仍被占用的文件(同上,du 统计不到已删除的文件名,df 统计块占用):按第一节处理。
挂载点遮盖:文件曾写入
/data目录,之后有磁盘挂载到了/data,旧文件被"盖住",du 扫描不到但占着根分区。# 通过挂载点下的可用空间反查:把分区挂到临时目录查看真实内容 sudo mkdir /mnt/check && sudo mount --bind / /mnt/check sudo du -h --max-depth=1 /mnt/check | sort -rh | head sudo umount /mnt/check
磁盘没满却无法创建文件
No space left on device 但 df -h 有余量,是 inode(文件数量)耗尽:
df -i
sudo du --inodes -s /var/* 2>/dev/null | sort -rn | head典型大户:PHP session 文件、邮件队列、日志碎片、缓存目录。定位后批量清理,例如删除 7 天前的会话文件:
sudo find /var/lib/php/sessions -type f -mtime +7 -delete磁盘快满时的应急清理清单
sudo journalctl --vacuum-size=200M # 收缩系统日志
sudo apt clean && sudo dnf clean all # 软件包缓存
sudo find /var/log -type f -name "*.gz" -delete # 轮转旧日志
sudo truncate -s 0 /var/log/大日志文件 # 清空仍在写入的日志根治思路
应急之后要建立长效机制:日志轮转(logrotate)、Cron 定时清理、df -h 纳入日常巡检(参见Linux资源查看基础命令),或配置告警。
