开始输入,可搜索发票、服务、域名、工单,以及 更多...
网站打不开、数据库写入失败、日志提示“No space left on device”,往往是磁盘被占满了。本文介绍 Linux 查看与清理磁盘空间的实用方法:用 df -h 和 du 定位占用,用 ncdu 交互式分析,用 find 查找大文件,再针对系统日志、软件缓存和 Docker 进行安全清理。命令适用于 Debian/Ubuntu 与 CentOS/Rocky/AlmaLinux,建议以 root 执行。
df -hT 显示每个文件系统的总容量、已用空间和使用率,先找出哪个挂载点接近 100%。同时用 df -i 检查 inode:如果小文件数量过多导致 inode 用尽,即使还有空间也会报磁盘已满,常见于大量缓存或 session 文件。
df -hT # space usage per filesystem
df -i # inode usage (100% also means "No space left on device")
从根目录开始统计各一级目录的大小,按大小排序后进入最大的目录继续查找。-x 参数保证只统计当前文件系统,避免把挂载的数据盘也算进去。常见的“空间大户”有 /var/log、/var/lib/docker、/var/lib/mysql、网站目录和备份目录。
# Size of each top-level directory on the root filesystem, largest last
du -xh --max-depth=1 / 2>/dev/null | sort -h
# Drill down, e.g. into /var
du -xh --max-depth=1 /var 2>/dev/null | sort -h
ncdu 是基于终端的磁盘分析工具,扫描后可以用方向键进入目录、按 d 删除文件,比反复执行 du 方便得多。
# Debian / Ubuntu
apt install -y ncdu
# CentOS / Rocky / AlmaLinux (ncdu is in EPEL)
dnf install -y epel-release && dnf install -y ncdu
ncdu -x /
直接列出超过 500 MB 的文件,通常能快速发现遗忘的备份包、导出的数据库或异常膨胀的日志。删除前请确认文件用途,不确定的文件可以先移动到其他磁盘。
# Files larger than 500 MB on the root filesystem
find / -xdev -type f -size +500M -exec ls -lh {} \; 2>/dev/null | sort -k5 -h
systemd 日志(journal)长期运行后可能占用数 GB,可以用 journalctl 按大小或时间清理。正在被程序写入的大日志不要直接 rm,而是用 truncate 清空,否则空间不会释放。软件包缓存也可以放心清理。
journalctl --disk-usage
journalctl --vacuum-size=200M
journalctl --vacuum-time=7d
# Empty a large log file that a running program still writes to (do not rm it)
truncate -s 0 /var/log/nginx/access.log
# Package manager caches
apt clean # Debian / Ubuntu
dnf clean all # CentOS / Rocky / AlmaLinux
为防止日志再次膨胀,可以给 journald 设置上限:
# Permanently cap the journal size
mkdir -p /etc/systemd/journald.conf.d
printf '[Journal]\nSystemMaxUse=500M\n' > /etc/systemd/journald.conf.d/size.conf
systemctl restart systemd-journald
使用 Docker 的服务器中,停止的容器、无用镜像和构建缓存会持续累积在 /var/lib/docker。先用 docker system df 查看占用,再按需清理。
docker system df
docker container prune -f
docker image prune -a -f
docker builder prune -f
# Removes everything unused, including volumes - check first!
docker system prune -a --volumes
--volumes 的清理会删除所有未被容器使用的数据卷,其中可能包含数据库数据。执行前请确认不需要这些数据卷。如果删除了大文件但 df 显示空间没有减少,说明仍有进程打开着该文件。用 lsof 找出这些进程并重启对应服务,空间就会被释放。
# Deleted files still held open by a process
lsof +L1 2>/dev/null | head -n 20
# Restart the process that holds them, e.g.
systemctl restart nginx
常见原因有两种:一是存在已删除但仍被进程占用的文件(见步骤 7);二是有文件藏在挂载点下面,被后来挂载的磁盘“盖住”了。前者重启进程即可,后者需卸载挂载点后检查。
带日期或 .gz 后缀的历史轮转日志一般可以删除;当前正在写入的日志建议用 truncate 清空。长期方案是配置 logrotate 定期轮转与压缩。
可以考虑把网站、数据库或备份迁移到数据盘,或升级磁盘容量后按照 LVM/growpart 扩容教程扩展分区。
如按以上步骤操作后仍无法解决,欢迎提交工单联系 IMIDC 7×24 技术支持。提交时请注明服务器 IP、操作系统、已执行的命令和报错截图,工程师可以更快定位问题。