帮助中心

服务器、网络和账户的分步教程。

Linux 服务器

Linux 硬盘空间已满怎么办?VPS 找出并释放磁盘空间教程

Linux 硬盘空间已满怎么办?VPS 找出并释放磁盘空间教程

“No space left on device”几乎会让服务器上所有东西出问题:数据库无法写入、网站返回错误、软件包更新失败,有时甚至无法正常登录。本文一步步说明如何排除 Linux 硬盘空间已满:先确认是数据块还是 inode 用完,再用 du 与 ncdu 找出占用空间的元凶,最后从 systemd 日志、apt/dnf 缓存、Docker、过大的日志文件,以及已删除但仍被打开的文件中释放磁盘空间。命令涵盖 Debian、Ubuntu、CentOS 7 与 Rocky Linux / AlmaLinux 8、9。

步骤 1:用 df -hT 与 df -i 检查磁盘使用量

先找出是哪个文件系统满了。即使还有好几 GB 空间,只要 inode 用完,磁盘同样会显示“已满”——应用程序产生数百万个小文件时就会发生。

df -hT          # space per file system, with type
df -i           # inodes: IUse% at 100% also means "No space left on device"

若 Use% 达到 100%,请继续步骤 2;若只有 IUse% 偏高,请直接跳到步骤 9。

步骤 2:用 du 找出大型目录与文件

du 会统计每个目录的大小。-x 参数只计算同一个文件系统,避免挂载的硬盘与虚拟文件系统干扰结果。请一层一层往下追查。

# Largest top-level directories on the root file system
du -xh --max-depth=1 / 2>/dev/null | sort -h | tail -n 15
# Drill down into the biggest one, for example /var
du -xh --max-depth=1 /var 2>/dev/null | sort -h | tail -n 15

# Single files larger than 200 MB
find / -xdev -type f -size +200M -exec ls -lh {} + 2>/dev/null | sort -k5 -h

步骤 3:用 ncdu 交互式浏览磁盘使用量

ncdu 只扫描一次,就能用方向键浏览整个目录树,比反复运行 du 快得多。若磁盘完全满到无法安装,请先用步骤 4 或步骤 5 释放一点空间。

# Debian / Ubuntu
apt install -y ncdu
# Rocky Linux / AlmaLinux / CentOS (from EPEL)
dnf install -y epel-release && dnf install -y ncdu

ncdu -x /       # arrows to browse, d = delete, q = quit

步骤 4:缩减 systemd 日志(journalctl --vacuum)

启用持久化日志的系统,/var/log/journal 可能长到好几 GB。vacuum 会安全地删除最旧的归档日志,设置大小上限则能避免问题再次发生。

journalctl --disk-usage
journalctl --vacuum-size=200M      # or: journalctl --vacuum-time=14d

# Cap the journal permanently
mkdir -p /etc/systemd/journald.conf.d
cat > /etc/systemd/journald.conf.d/size.conf <<'EOF'
[Journal]
SystemMaxUse=200M
EOF
systemctl restart systemd-journald

步骤 5:清理 apt / dnf 缓存与旧内核

已下载的软件包与旧内核是最快见效的清理目标,在小容量的云服务器硬盘上尤其明显。

# Debian / Ubuntu
apt clean
apt autoremove --purge

# Rocky Linux / AlmaLinux 8, 9
dnf clean all
dnf remove $(dnf repoquery --installonly --latest-limit=-2 -q)   # keep 2 newest kernels

# CentOS 7
yum clean all
yum install -y yum-utils && package-cleanup --oldkernels --count=2

步骤 6:安全处理大型日志文件

/var/log 或网站目录中的应用程序日志,是硬盘被塞满的常见原因。不要直接 rm 仍在被服务写入的日志,空间并不会释放(见步骤 8)。请改用 truncate 清空,再修正日志轮转设置。

# Log files larger than 100 MB
find /var/log -type f -size +100M -exec ls -lh {} +

# Empty a live log WITHOUT deleting it (the service keeps writing)
truncate -s 0 /var/log/nginx/access.log

# Remove compressed rotated logs older than 14 days
find /var/log -type f -name '*.gz' -mtime +14 -delete

# Dry-run logrotate to see why a log is not rotating
logrotate -d /etc/logrotate.conf

步骤 7:清理 Docker 占用的空间(docker system prune)

旧镜像、已停止的容器与构建缓存会在 /var/lib/docker 快速累积。先检查,再清理。

docker system df                   # what Docker is using
docker system prune                 # stopped containers, unused networks,
                                    # dangling images and build cache
docker system prune -a              # also ALL images not used by a container

# Container logs live here and can grow without limit
du -sh /var/lib/docker/containers/*/*-json.log | sort -h | tail
除非非常确定,否则不要加上 --volumes:它会永久删除未使用的 Docker volume,里面常常存放着数据库数据。

为了避免容器日志再次塞满硬盘,请设置大小上限:

# /etc/docker/daemon.json - limit future container logs
{
  "log-driver": "json-file",
  "log-opts": { "max-size": "50m", "max-file": "3" }
}
# then: systemctl restart docker  (applies to newly created containers)

步骤 8:用 lsof +L1 找出已删除但仍打开的文件

当 df 显示硬盘已满,du 却找不到空间去哪里时,通常是某个程序仍开着一个已被删除的文件。要等该程序关闭文件,空间才会释放。

# Debian / Ubuntu: apt install -y lsof   |   Rocky / AlmaLinux: dnf install -y lsof
lsof +L1
# COMMAND  PID  ...  SIZE/OFF  NLINK  NAME
# php-fpm  1234 ...  4.2G      0      /var/log/app/debug.log (deleted)

# Fix 1: restart the service holding the file
systemctl restart php-fpm
# Fix 2: truncate it through /proc (PID 1234, file descriptor 7 from "ls -l /proc/1234/fd")
: > /proc/1234/fd/7

步骤 9:处理 inode 用尽造成的“No space left”

当 df -i 显示 100% 时,请找出含有大量小文件的目录,例如 PHP session 文件夹、邮件队列、缓存目录或临时上传文件。

# Directories that contain the most files
find / -xdev -type f 2>/dev/null | cut -d/ -f2-4 | sort | uniq -c | sort -n | tail -n 10

清理对应的目录,并设置应用程序自动清除旧文件。

常见问题

为什么 df 与 du 显示的数字不同?

多半是已删除但仍被打开的文件(步骤 8)。此外,被挂载点遮住的文件,以及 ext4 为 root 保留的空间(默认 5%)也会造成差异。

可以把 /var/log 里的东西全部删掉吗?

不建议。请删除旧的 .gz 轮转文件、清空过大的使用中日志,但保留目录结构;部分服务在日志目录不存在时会无法启动。

硬盘一直被塞满,可以加大空间吗?

请先依上述步骤找出根本原因。若数据确实需要更多空间,可以在客户中心的服务详情页把 JUSTG 云服务器升级到 SSD 更大的套餐。

如 Linux 服务器的硬盘空间问题仍未解决,请至 https://www.justg.com/submitticket.php 提交工单,JUSTG 技术支持团队会协助您处理。

这篇文章有帮助吗?
帮助中心
Linux 服务器 Linux SSH 密钥登录教程:设置 ed25519 密钥并禁用密码登录 只要服务器有公网 IPv4,上线几分钟内就会遇到 SSH 暴力破解机器人,而密码登录正是它们的首要目标。本文说明如何用较新的 ed25519 密钥完成 Linux SSH 密钥登录,再禁用 SSH 密码登录,全程避免把自己锁在门外。步骤适用于 Debian… Linux 服务器 Linux VPS 修改 SSH 端口与 root 密码教程(安全不断线) 把 SSH 从 22 端口移走虽然挡不住有心的攻击者,却能让日志里大部分自动扫描消失;而任何新服务器的第一件事,就是换一组新的 root 密码。本文说明如何在 Linux VPS 修改 SSH 端口与 root 密码且不断线:修改 sshd_config、在 Rocky… Linux 服务器 Linux 防火墙设置教程:VPS 使用 UFW 与 firewalld(含 IPv6) 新安装的 Linux 服务器,任何服务打开的端口都会直接对外响应,因此主机防火墙是最先要设置的项目之一。本文说明如何在 Debian / Ubuntu 用 UFW 设置 Linux 防火墙,以及在 CentOS、Rocky Linux、AlmaLinux 使用… Linux 服务器 Linux VPS 添加 Swap 交换空间教程(适合 512MB / 1GB 小内存套餐) 在 512 MB 或 1 GB 的云服务器上,数据库、PHP-FPM 加上一次软件包更新,很容易在同一时间用光内存。这时内核的 OOM killer 会强制终止进程,最常被牺牲的就是 MySQL 或 MariaDB。在 Linux VPS 添加 Swap… Linux 服务器 VPS 安装 aaPanel 教程:aaPanel(宝塔国际版)安装与安全设置 aaPanel 是宝塔面板的国际版,通过网页界面即可管理网站、数据库、PHP 版本、SSL 证书与备份。本文说明如何在 JUSTG VPS 安装 aaPanel(东京、首尔、莫斯科的云服务器或 JUSTG 独立服务器,系统支持…
AlipayUnionPayVISAMastercardPayPalUSDTstripe