“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 技术支持团队会协助您处理。