Skip to content
VDS · 故障排查

磁盘空间用完了

如何快速找出是什么占满了磁盘,安全释放几个 GB,以及了解其中的陷阱:已删除但仍打开的文件和耗尽的 inode。

更新于 2026年8月23日

磁盘满了会同时引发一连串问题:数据库无法再写入,网站返回错误,journalctl 拒绝工作,有时甚至 SSH 都进不去,因为已经没有空间写入会话日志。您需要迅速、按顺序处理。

检查

df -h
df -i

第一条命令显示空间,第二条显示 inode。即使还有几十 GB 可用,inode 耗尽也会产生同样的 “No space left on device” 错误:当某个目录累积了数百万个小文件(PHP 会话、缓存、队列)时就会这样。

您也可以在控制面板的 /hosting/vds/m/<id> 页面查看已用空间——“概览”标签页上的圆环。它根据 qemu-guest-agent 上报的数据填充;如果 agent 已被移除,圆环会保持空白,面板则改为显示安装命令。

找出元凶

du -xh --max-depth=1 / 2>/dev/null | sort -h | tail -15
du -xh --max-depth=1 /var 2>/dev/null | sort -h | tail -15
ncdu -x /                     # apt install ncdu, interactive
find / -xdev -type f -size +500M -exec ls -lh {} \; 2>/dev/null

-x 参数让搜索限制在单个文件系统内,避免进入 /proc 和已挂载的目录。

常见的占用大户:/var/log 中的日志、/var/cache 中的软件包缓存、/var/lib/docker 中的 Docker 镜像和卷、数据库导出文件、/root 和 /tmp 中被遗忘的归档文件、旧版本应用的文件。

释放空间

journalctl --vacuum-size=200M
apt clean                                   # Debian, Ubuntu
dnf clean all                               # AlmaLinux, CentOS Stream
docker system prune -af --volumes           # careful: will remove unused volumes
find /tmp -type f -mtime +7 -delete

要永久限制 journal 的大小,请编辑 /etc/systemd/journald.conf(SystemMaxUse=300M);详情请参阅文章 systemd 日志。对于应用文件,请配置 logrotate:没有轮转,单个 app.log 很容易增长到几十 GB。

陷阱:已删除但仍被打开的文件

您删除了一个巨大的日志,但 df 显示的数字没变。只要还有进程持有该文件,空间就不会被释放。

lsof +L1 | head -20

正确的做法是重启持有该文件的服务(systemctl restart nginx),或者在不删除文件的情况下将其截断:

: > /var/log/nginx/access.log

陷阱:inode 耗尽

df -i
find /var/www -xdev -type d -printf '%h\n' | sort | uniq -c | sort -rn | head

找出包含数十万个文件的目录,并分批清理,以免把机器搞垮:

find /var/lib/php/sessions -type f -mtime +2 -delete

如果完全没有空间

当磁盘 100% 占满、系统几乎无法运行时,请通过控制面板的“控制台”标签页登录,至少释放一百兆字节(journalctl --vacuum-size=50M 几乎总是有效),然后继续正常排查。如果情况非常糟糕,救援磁盘会帮上忙:机器会启动进入 SystemRescue,您的磁盘会显示为 /dev/sda,您挂载它并从外部清理。

防止再次发生

  • 在 85% 阈值处设置告警——请参阅网站宕机告警。
  • 轮转所有应用日志,而不仅仅是系统日志。
  • 立即将数据库导出文件和归档文件发送到服务器之外,而不是留在 /root 中。
  • 如果已经没有可清理的内容而数据仍在增长,请升级到磁盘更大的档位:40、80、120、160、200 和 250 GB。仅支持升级:磁盘无法缩小,也不提供降级。

不要随意删除 /var/lib 和 /usr 中的文件:数据库数据和系统软件包就在那里。先弄清楚某个目录属于什么,然后再清理。