云服务器用着用着,突然某一天登录上去,发现系统开始报错:网站无法写入日志、数据库异常、甚至连 SSH 登录都变得卡顿。再一查磁盘,根目录 / 已经 100% 满了。这种情况在实际运维中非常常见,而且往往来得很突然。很多人第一反应是“赶紧删点东西”,但如果没有搞清楚空间是怎么被占满的,很容易删错关键文件,甚至导致服务彻底崩溃。
处理这类问题,核心思路其实很简单:先确认空间被谁占用,再决定是清理还是扩容,而不是盲目操作。最基础的一步,是先确认磁盘使用情况:
df -h
这个命令可以快速看到每个分区的使用率。如果你发现 / 分区已经接近或达到 100%,那就说明问题确实出在根目录。接下来要做的不是删除,而是定位“大头”在哪。
一个非常实用的命令是:
du -h --max-depth=1 /
它会按目录层级统计空间占用情况,帮助你快速找到哪个目录在“吃空间”。一般来说,最常见的几个“元凶”是 /var、/home、/usr 和 /root。其中 /var 几乎是重灾区,因为日志、缓存、数据库数据基本都在这里。
如果 /var 占用很大,可以进一步细查:
du -h --max-depth=1 /var
很多时候你会发现 /var/log 或 /var/lib 特别大。日志文件是最容易被忽略的,比如 Nginx、Apache、MySQL、系统日志,如果没有做轮转(logrotate),可能会无限增长,一个日志文件几十 GB 并不夸张。
可以用下面的命令找出大文件:
find / -type f -size +100M -exec ls -lh {} \;
这个命令会列出大于 100MB 的文件,通常能很快锁定问题文件。如果你看到某个 .log 文件特别大,比如 access.log 或 error.log,可以先确认它是否仍在被使用:
lsof | grep deleted
有一种情况比较隐蔽:文件已经被删除,但进程还在占用它,这时候磁盘空间不会释放。只有重启服务或进程,空间才会真正回收。
对于日志文件的清理,不建议直接 rm,更安全的方式是先清空内容:
> /var/log/nginx/access.log
这样不会影响正在运行的服务。如果确定日志可以删除,再结合 logrotate 做自动管理,避免再次发生。
除了日志,另一个常见问题是缓存文件。比如系统包缓存:
apt-get clean
或者在 CentOS 系统中:
yum clean all
Docker 也是一个经常被忽略的“空间黑洞”。如果你在服务器上运行容器,镜像、容器日志和中间层会不断堆积。可以用以下命令清理无用资源:
docker system df
docker system prune -a
执行前一定要确认没有重要容器依赖这些镜像,否则可能影响业务。
还有一种情况是备份文件堆积。很多人习惯把数据库备份、网站压缩包直接放在 /root 或 /home,时间一长就会占用大量空间。可以用:
ls -lh /root
检查是否有旧备份文件,并按需删除或迁移到对象存储。
如果排查下来发现空间确实是被正常数据占满,比如数据库增长、用户上传文件增加,那就不是“清理”的问题,而是需要扩容。
云服务器扩容通常分两步:先在控制台扩展云盘容量,然后在系统内扩展分区和文件系统。扩容云盘后,系统并不会自动识别新空间,需要手动操作。
可以先查看磁盘:
lsblk
如果你使用的是常见的 ext4 文件系统,可以执行:
resize2fs /dev/vda1
如果是 xfs 文件系统,则使用:
xfs_growfs /
在某些情况下,如果使用了 LVM(逻辑卷管理),扩容步骤会稍微复杂一些,需要先扩展物理卷,再扩展逻辑卷,最后扩展文件系统。但好处是更灵活,适合长期使用。
还有一个值得注意的点是 inode 耗尽。有时候磁盘看起来还有空间,但系统依然提示“磁盘已满”,这可能是 inode 用完了。可以用:
df -i
查看 inode 使用情况。如果 inode 满了,通常是因为大量小文件(比如缓存、session 文件),需要删除这些文件才能恢复。
在整个处理过程中,有几个误区需要避免。第一,不要随意删除 /bin、/usr、/lib 等系统目录中的文件,这可能导致系统无法启动。第二,不要在不确认用途的情况下删除数据库文件或程序数据目录,否则数据可能无法恢复。第三,清理前最好做备份,尤其是在生产环境中。
从运维角度来看,解决“磁盘满”只是第一步,更重要的是防止再次发生。建议做好以下几点:开启日志轮转、定期清理缓存、监控磁盘使用率、设置告警阈值。一旦磁盘使用率超过 80%,就应该引起重视,而不是等到 100% 才处理。
另外,可以把日志、上传文件、数据库等数据目录单独挂载到数据盘,而不是全部堆在根目录。这样即使某个目录爆满,也不会影响整个系统。
很多人经历过一次“磁盘爆满”后,都会意识到容量规划的重要性。云服务器的资源是可以弹性扩展的,但前提是你要提前发现问题,而不是等服务崩溃后再救火。
最后总结一下,根目录满了并不可怕,关键在于方法:先用 df 和 du 找出问题,再用 find 定位大文件,合理清理日志、缓存和无用数据;如果是正常增长,就果断扩容。只要思路清晰,这类问题其实是可以快速解决的。
常见问答:
问:磁盘满了最先删什么最安全?
答:优先清理日志文件(如 /var/log)、缓存(apt/yum/docker)、旧备份文件,这些一般不会影响系统运行。
问:直接 rm 大文件为什么空间没释放?
答:可能文件仍被进程占用,需要重启相关服务或进程才能释放。
问:扩容后为什么 df 还是没变化?
答:因为文件系统没有扩展,需要手动执行 resize2fs 或 xfs_growfs。
问:inode 满了怎么办?
答:删除大量小文件,比如缓存或 session 文件,释放 inode。
问:如何避免再次出现磁盘满?
答:开启日志轮转、设置监控告警、合理分区、定期清理,是最有效的方法。