磁盘空间:都去哪了
如何找出是什么占满了磁盘,为什么已删除但仍打开的文件很危险,什么可以安全清理,以及为什么控制面板中的使用率圆环可能显示错误。
更新于 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 df | docker image prune、docker builder prune |
| 系统日志 | journalctl --disk-usage | journalctl --vacuum-size=200M |
/boot 中的旧内核 | df -h /boot | apt autoremove --purge |
| 软件包缓存 | du -sh /var/cache/apt | apt 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%:磁盘满时,某些服务甚至无法写下发生了什么事的日志。
如果完全没有空间了
- 用快速手段释放几个 GB:
journalctl --vacuum-size=100M、apt clean、docker builder prune -f。 - 用上面的命令找出真正的原因——否则一周后一切都会重演。
- 如果数据确实增长了,您需要通过升级到更高配置来扩容磁盘。不支持降级:磁盘无法缩小。