先定位占用大头,再针对性清理日志、容器镜像和缓存文件,最后评估是否该扩容。别急着删数据,多数情况下你只需要处理几个固定目录就能腾出一大半空间,下面这套方法来自我个人踩坑总结,按步骤来基本能解决90%以上的磁盘告警。
云服务器磁盘满了怎么办:先诊断再动手
很多人一看到磁盘告警就慌,直接去删业务文件,结果越删越乱,正确的姿势是先搞清楚空间去哪了,登录服务器后,第一件事执行:
df -h
这一步能看到每个挂载点的使用率,如果你用的是简米云或酷番云的默认系统盘配置,大概率是/dev/vda1或/dev/vda2这个分区快满了,确认系统盘还是数据盘告警之后,再进入具体目录排查。
用du和find定位占空间的大文件
行业共识认为,定位大文件最稳的方式是du和find组合,进入根目录,执行:
du -sh / 2>/dev/null | sort -rh | head -20
这条命令直接按占用空间从大到小列出根目录下所有一级目录的体量,你会很快发现,占用最多的通常不是业务代码,而是/var、/usr或/home,继续往下钻取,比如/var占了很多,就再跑:
du -sh /var/ 2>/dev/null | sort -rh | head -20
找到具体目录后再用find筛出体积超过500MB的单个文件:
find /var -type f -size +500M -exec ls -lh {} \; 2>/dev/null
我之前遇到过一个客户,云服务器磁盘满了怎么办,他们第一反应是删MySQL备份文件,结果跑了半天发现空间根本没降下来,最后我用上面两条命令一查,问题出在/var/log/journal目录,光日志就占了30多GB,可见诊断这一步绝对不能省。
怎么清理云服务器系统盘:四个主要空间占用点逐一清除
系统盘空间被吃光,大概率就这几类东西:系统日志、Docker残留、包管理器缓存、临时文件,下面逐一来说。
清理journal系统日志:最容易被忽略的隐藏大户
systemd-journald是很多服务器磁盘爆掉的元凶,默认配置下它会无限积累日志,有些甚至能占到整个系统盘的一半以上,检查方式:
journalctl --disk-usage
看到输出是几十GB的话,直接执行:
journalctl --vacuum-size=500M
这条命令把日志总量压到500MB以内,旧日志自动被清掉,如果想让它以后不再膨胀,可以编辑/etc/systemd/journald.conf文件,把SystemMaxUse设为500M,然后重启服务:
systemctl restart systemd-journald
据我接触过的运维案例,单是这一步就能释放系统盘60%以上的空间,常规日志目录/var/log/下如果有巨型的.log文件,直接用> /var/log/xxx.log,别用rm删文件,因为进程还在写句柄,删了不释放空间。
Docker空间清理策略:镜像和悬空卷的回收
如果你的服务器装了Docker,那么磁盘占用大头往往不在业务文件上,而在镜像和构建缓存里,执行:
docker system df
可以看到镜像、容器、本地卷、构建缓存各自的体积,清理无主资源比较安全的做法:
docker system prune -a
这条命令会删除所有未被容器使用的镜像和停止的容器,但要注意,它还带一个--volumes参数,默认不加,以免误删挂载数据,如果想深度清理BuildKit缓存,再执行:
docker builder prune -f
我自己有个习惯,对业务稳定性要求高的服务器,清理镜像前先跑docker ps -a,确认没有需要保留的暂停容器,毕竟部分部署脚本会记录容器ID,全删了可能引发配置漂移。
包管理器缓存清理:apt和yum的残留文件
Ubuntu系统(apt)和CentOS系统(yum)各自都有缓存堆积问题,网上很多教程建议只跑apt-get clean,但说实话,这条命令清理力度很有限,我推荐按系统分支来看。
Ubuntu系,升级过系统版本的话,先清理旧的软件包:
apt-get autoremove -y --purge apt-get autoclean
这两个命令会把已卸载但残留的依赖包装删除,也能清掉过期的deb包,CentOS系则用:
yum clean all
顺便提一句,如果是用着宝塔面板或其他可视化面板的服务器,一般图形界面的”终端”选项里都支持直接执行以上操作,不用额外装软件。
/tmp目录和旧内核文件
长期运行的服务器在/tmp目录下会残留大量临时文件,这些文件通常是程序崩溃或异常退出时留下的,手动删的话:
rm -rf /tmp/ 2>/dev/null
这个命令可以放心执行,因为正常写入的临时文件在服务重启后都会被系统清理,而你删除的这部分就是纯垃圾。
系统每更新一次内核就会保留旧版本,占用很大空间,查看当前使用版本:
uname -r
并列出已安装的内核列表,删除与当前无关的旧内核,用apt-get purge或yum remove指定包名即可,这种方式释放空间比清任何日志都立竿见影,旧内核每个动辄几百MB起步。
数据库文件迁移:比较极端的释放方案
如果以上步骤全做完,系统盘还是紧张的,通常是数据库文件太大,而数据库目录恰好在系统盘上,这种情况的办法是把数据库文件挪到数据盘,最常见的场景是MySQL数据目录迁移。
先查看当前数据目录:
mysql -e "show variables like 'datadir';"
然后停掉MySQL服务,把整个数据目录rsync到数据盘挂载点,再修改/etc/my.cnf的datadir配置并启动服务,这个过程对新手来说有一定门槛,但效果是系统盘能一口气空出几十GB,而且不需要购买任何额外的存储。
云服务器清理空间后仍提示满的原因及对策
有一种悲催的情况是,你明明删了十几个GB的文件,df -h一看还是100%,别慌,这是文件占用句柄的问题,某个进程还在访问你删除的文件,文件在系统层还没真正释放,找到并重启对应服务,空间才会回来。
如果重启后依然拥堵,直接上硬方案:把数据盘挂载到系统盘下某个目录,或者直接升级云服务器配置,云服务器怎么清理空间在技术上能解决的问题是有限的,碰到磁盘IO瓶颈或容量天花板,单靠删文件是撑不过去的。
inode耗尽属于另一种形式的”满”
有时候df -h显示有空间,但业务报”磁盘已满”,这大概率是inode(索引节点)耗尽,查看方式:
df -i
如果Inodes用尽,即使你有10GB剩余空间也写不进任何新文件,造成问题的根源通常是大量缓存小文件,清理手段是在存放小文件最多的目录执行find删除过期的临时缓存文件,程序的运行时缓存(例如Node.js的node_modules/.cache或PHP的session文件)都属于易清理对象。
定期执行固定的体检清单
比较稳妥的习惯是每个月固定做一次针对云服务器的空间检查:
df -h确认当前磁盘水位du -sh /找新的大目录journalctl --disk-usage检查日志膨胀程度docker system df复查容器镜像体积find /tmp -type f -mtime +7 -delete清掉7天前的临时文件
这套流程走下来,一次大约10分钟就能完成,系统盘空间长期稳定在50%以下,才算比较健康的状态,另外还有一点要提醒,系统盘的IO性能一般优于数据盘,数据库或高并发业务文件不要因为空间原因随便迁走,尽量靠清理来维持系统盘剩余空间,业务数据则放数据盘。
云服务器磁盘清理常见问题
问:清理Docker镜像会误删正在使用的容器数据吗?
答:docker system prune -a只删除未被任何容器使用的悬空镜像和停止的容器,运行中容器及其挂载数据不会受影响,如果删除后部分脚本因容器ID丢失而报错,重新启动容器即可恢复,数据仍保存在卷中。
问:删除大文件后磁盘空间没变化是为什么?
答:因为该文件仍被某个进程占用,执行lsof | grep deleted查看已删除但仍被占用的文件,找到对应PID后重启进程或关闭该句柄,磁盘空间才会真正释放,这是Linux文件系统的基本机制,与云服务商的磁盘类型无关。
问:云服务器扩容大概多少钱?
答:按主流云厂商的价格体系浮动,以简米云为例,临时扩容数据盘通常按日计费,约在每小时几分钱级别的区间浮动,包月比按量便宜不少,具体可以查看控制台实时报价,但如果清理后经常需要扩容,说明业务已是稳定增长期,可以优先评估负载均衡加新节点的方案,表面成本更低且扩展性更好。
最后再总结一句:云服务器空间管理的精髓,不在于买多大磁盘,而在于日志轮转、镜像收敛和依赖缓存常清这三个习惯,做到位了,一台20GB系统盘的服务器,跑两三年业务都不带告警的。
首发原创文章,作者:王坚,如若转载,请注明出处:https://idctop.com/article/796908.html


![[享干货]云服务器满了怎么办?如何清理网站服务器空间?硬盘占用100%可以删除二进制日志或者备份](https://i1.hdslb.com/bfs/archive/47e4adeec6aad21fc95c2170bb7db6153b16f885.jpg)