服务器磁盘空间占满排查清理手册:从入门到实操
为什么服务器磁盘会突然占满?
很多新手站长或自己搭服务器的朋友,经常遇到这样的场景:网站突然打不开、SSH 登录报错、上传文件提示“磁盘空间不足”。
服务器磁盘空间占满后,不仅网站服务会异常,甚至系统都可能崩溃。
别急,这篇文章就是专门写给零基础用户的实操教程,跟着一步步做,你也能学会怎样定位和清理问题。
从连接服务器开始
在动手清理之前,先确认你能登录服务器。
推荐使用 SSH 客户端(如 Xshell、PuTTY 或 Mac 终端),通过服务器 IP 和 root 密码或密钥登录。
如果你用的是宝塔面板、1Panel 等管理工具,也可以直接用面板的“终端”功能执行命令。
登录后,先运行一个最简单的命令看看整体情况:
df -h
这条命令会列出所有分区的总大小、已用、可用和使用百分比。
重点看 / 根分区或 /home、/data 这类存放网站数据的挂载点。
使用率达到 90% 以上就要立刻处理了。
小技巧:如果df -h显示正常,但系统仍然报空间不足,可能是 inode 耗尽。再跑一条df -i查看 inode 使用情况,如果使用率接近 100% 说明小文件太多,清理方向就变成了删大量零碎文件。
找到占用磁盘空间的元凶
光知道哪个分区满了还不够,需要定位到具体目录甚至文件。
用 du 命令来层层排查。
- 查看根目录下各个目录的大小
cd /
du -sh * | sort -rh | head -10
du -sh * 统计每个文件和目录的大小,sort -rh 按人类可读格式排序(大的在前),head -10 只看前 10 个。
一般排在前面的会是 /var、/usr、/home、/tmp 等。
- 深入分析最大目录
假设发现 /var 很大,就继续:
cd /var
du -sh * | sort -rh | head -10
重复这个过程,直到找到具体的“罪魁祸首”。
常见的大户包括:
- 日志文件:
/var/log/下的 messages、syslog、nginx 访问日志等。 - Docker 日志:
/var/lib/docker/containers/下的 json.log 文件。 - 系统缓存:
/tmp、/var/cache。 - 核心转储(core dump):
/var/crash或/core。 - 网站文件:如果网站放在
/home或/www,可能是备份、图片或旧项目占用。
- 查找大于指定大小的文件
如果你不想逐层扒,也可以直接暴力搜索超过 100MB 的文件:
find / -type f -size +100M -exec ls -lh {} \; 2>/dev/null | sort -rh | head -20
这条命令会列出根下所有超过 100MB 的常规文件,大小从大到小排。
注意 2>/dev/null 忽略权限错误。
清理时别踩这些坑
很多人拿到命令就急着删文件,结果把系统搞崩了。
下面几个避坑点一定要记住:
- 不要直接删除正在被占用的日志文件:删除后只是文件名没了,但进程还在写旧 inode,空间不会释放(用
df看还是一样满)。此时需要先清空文件而不是删除:> /var/log/nginx/access.log或者truncate -s 0 /var/log/nginx/access.log。 - 查看已删除但仍被占用的文件:有时你明明删了文件,空间却没变,是因为有进程还在使用它。执行:
lsof | grep '(deleted)'
找到对应的进程 ID,然后重启该进程(例如 systemctl restart nginx)或 kill 掉它。
- 清理系统日志要谨慎:可以用
logrotate管理日志轮转,不要手动清空/var/log下的所有文件。例如保留最近 7 天的日志:
find /var/log -type f -name "*.log" -mtime +7 -delete
或者用 journalctl --vacuum-size=200M 限制 systemd 日志总大小。
- Docker 容器日志特别大:进入容器日志目录
/var/lib/docker/containers,找到容器ID/容器ID-json.log,直接清空:truncate -s 0 /var/lib/docker/containers/*/*-json.log。或者在 Docker 启动参数里设置日志限制。
确认空间已释放
清理完成后,再次运行 df -h 看目标分区的使用率是否下降。
如果数字没变,检查上面提到的已删除未释放文件,或者 inode 是否已满。
如果 inode 满,需要找到包含大量小文件的目录删除(比如邮件队列 /var/spool/postfix/maildrop)。
建议再跑一遍 du -sh /* | sort -rh 对比之前的占用,确认最大的那几个目录已经变小。
最后重启相关服务(比如 nginx、php-fpm)确保旧文件句柄释放。
常见高频问题解答
Q:为什么我删了文件,硬盘空间还是满的?
A:多半是某个进程还在用这个已删除的文件。用 lsof | grep deleted 找出进程并重启即可。
Q:我的宝塔面板显示空间满,怎么在面板里清理?
A:宝塔的“文件”里可以直接查看目录大小,也可以在“工具箱-日志清理”里一键清理系统日志。不过更推荐用 SSH 执行上述命令,更彻底。
Q:有没有自动清理的办法?
A:可以设置 cron 定时任务,比如每天凌晨清理 7 天前的日志,或者使用 logwatch 报告。但新手建议先手动操作一遍,再考虑自动化。
总结
服务器磁盘空间占满排查清理并不难,核心就是:先用 df -h 确认分区,再用 du -sh * 逐层或 find 直接找出大文件,然后针对日志、缓存、Docker 等常见大户进行清理。
遇到空间不释放就检查已删除未释放文件。
牢记这几个命令和避坑点,你就能独立解决大部分磁盘满的问题。
如果你按照本文一步步操作后问题依旧,不妨重新检查一下 inode 使用情况,或者看看是否挂载了外部存储没有释放快照。
希望这篇教程能帮你轻松应对磁盘告警。