磁盘满了怎么清理?先定位大文件再安全删除
磁盘满了先别急着删文件。
正确顺序是:用 df -h 确认哪个分区满,再用 du 逐层找出大目录,最后判断是日志、缓存、临时文件还是“已删除但被进程占用”的空间,确认后再清理或扩容。
先确认是哪个分区满了
登录服务器后执行:
df -h
看 Use% 达到 100% 或接近 100% 的那一行,记下挂载点,常见的是 / 或 /data。
如果根分区满,系统日志、软件安装都可能失败,需要优先处理。
接着看 inode 是否也满了,小文件过多时会出现磁盘有空间但无法创建新文件:
df -i
如果 IUse% 接近 100%,清理方向是删除大量小文件,而不是找大文件。
用 du 逐层找大目录
从根目录开始,按占用从大到小排序:
du -h --max-depth=1 / 2>/dev/null | sort -hr
找到最大的目录后,继续进入该目录重复执行,例如:
du -h --max-depth=1 /var 2>/dev/null | sort -hr
常见的大目录集中在 /var/log、/var/lib/docker、/tmp、网站上传目录和数据库数据目录。
不要看到大目录就直接 rm -rf,先确认它属于哪个服务。
常见占用场景与清理方法
日志文件过大:查看 /var/log 下的大日志,优先用 truncate 清空而不是直接删除正在写入的日志:
truncate -s 0 /var/log/nginx/access.log
如果日志由 journald 管理,可限制保留大小:
journalctl --vacuum-size=200M
Docker 占用空间:先看占用:
docker system df
确认无用的镜像、停止的容器和构建缓存后,再执行 docker system prune。
生产环境不要随意加 -a 删除所有未使用镜像。
已删除文件仍占空间:如果 du 统计的总量远小于 df 显示的已用空间,说明文件被删除但进程仍持有句柄。
用 lsof 查找:
lsof +L1
找到对应进程后,重启该服务即可释放空间,不要直接杀进程,先确认业务影响。
临时文件:/tmp 下的旧文件可按修改时间清理,例如删除 7 天前的普通文件:
find /tmp -type f -mtime +7 -delete
执行前确认没有程序依赖这些临时文件。
避坑与验证
清理前对重要数据做备份,尤其是数据库目录和网站上传目录。
删除操作先用 ls 确认路径,避免通配符误删。
清理后再次执行 df -h,确认 Use% 下降;
如果空间没有变化,回到 lsof +L1 检查是否还有被占用的已删除文件。
对于持续增长的日志,建议配置 logrotate 或日志保留策略,而不是反复手动清理。
如果磁盘长期接近上限,应评估扩容或迁移数据,清理只能解决短期问题。
常见疑问
删了文件为什么空间没释放? 文件可能仍被进程打开,用 lsof +L1 找到进程后重启对应服务。
能不能直接删除 /var/log 下的日志? 正在写入的日志直接删除后,进程仍持有句柄,空间不会立即释放,建议用 truncate 清空。
根分区满了还能操作吗? 可以尝试清理临时文件和旧日志,但部分命令可能因无法写临时文件而失败,优先释放少量空间再继续排查。