Skip to content
VDS · 备份与磁盘

磁盘空间:都去哪了

如何找出是什么占满了磁盘,为什么已删除但仍打开的文件很危险,什么可以安全清理,以及为什么控制面板中的使用率圆环可能显示错误。

更新于 2026年8月23日

磁盘空间耗尽会以各种形式表现为服务中断:数据库无法写入、网站返回错误、容器反复重启。VDS 磁盘从入门配置的 40 GB 到顶配的 250 GB,而它几乎总是被同样的几类东西占满。

首先执行的命令

df -h
df -i
sudo du -x -h -d1 / | sort -h | tail -15

不要跳过 df -i:您可能还有空间,但 inode 已经用尽——这时明明还有几个 GB 的可用空间,却会提示“磁盘已满”。罪魁祸首通常是数以百万计的小缓存文件。

然后深入查看最大的目录:

sudo du -x -h -d1 /var | sort -h | tail
sudo du -x -h -d1 /var/lib | sort -h | tail

-x 参数会把统计限制在单个文件系统内,不会进入已挂载的目录。

常见元凶

项目如何检查如何处理
容器日志du -sh /var/lib/docker/containers/*/*-json.log限制大小,参见日志
镜像与构建缓存docker system dfdocker image prune、docker builder prune
系统日志journalctl --disk-usagejournalctl --vacuum-size=200M
/boot 中的旧内核df -h /bootapt autoremove --purge
软件包缓存du -sh /var/cache/aptapt clean
留在原地的副本du -sh /backup迁移到异地,参见异地存储
用户上传文件du -sh /var/www/uploads使用外部存储或更大的磁盘

已删除却仍占用空间的文件

一个经典难题:du 显示 5 GB,df 却显示已用 30 GB。这说明文件已被删除,但某个进程仍持有它的句柄,在重启之前空间不会被释放。

sudo lsof +L1 | head -20

输出会列出进程和大小。解决办法是重启罪魁祸首:

sudo systemctl restart <service>
docker compose restart <service>

千万不要用 rm 删除正在被使用的日志文件来释放空间。正确的做法是截断它:sudo truncate -s 0 /var/log/big.log。删除文件会让空间继续被占用,还会让您丢失日志。

控制面板中的使用率圆环

在“概览”标签页中有一个磁盘使用率圆环。它通过客户机代理 qemu-guest-agent 计算得出。如果代理被移除或未运行,数据就不会更新——面板会显示安装命令。要在机器内部检查:

systemctl status qemu-guest-agent

代理的读数和 df -h 应当一致。出现差异通常意味着有一部分空间被单独挂载的分区占用——参见分区与文件系统。

预防

设置一个带清理和告警的计划任务:

#!/bin/bash
USED=$(df --output=pcent / | tail -1 | tr -dc '0-9')
if [ "$USED" -gt 85 ]; then
  journalctl --vacuum-size=200M
  apt clean
  docker image prune -f
  echo "Disk is ${USED}% full" | mail -s "VDS: low disk space" you@example.com
fi

85% 的阈值能给您留出反应时间。不能等到 100%:磁盘满时,某些服务甚至无法写下发生了什么事的日志。

如果完全没有空间了

  1. 用快速手段释放几个 GB:journalctl --vacuum-size=100M、apt clean、docker builder prune -f。
  2. 用上面的命令找出真正的原因——否则一周后一切都会重演。
  3. 如果数据确实增长了,您需要通过升级到更高配置来扩容磁盘。不支持降级:磁盘无法缩小。