努力
加油

CentOS或Ubuntu服务器系统盘分配20GB够用吗?

直接给结论:对于绝大多数生产环境或学习测试环境,20GB 的系统盘(System Disk)都显得非常局促,甚至可以说是“不够用”的。

除非你是在做极致的成本控制实验,或者系统只跑最基础的 Web 服务且所有数据、日志、依赖包全部挂载到独立的数据盘上,否则不建议将系统盘限制在 20GB。

下面从几个实际维度拆解一下为什么 20GB 容易捉襟见肘,以及不同场景下的建议:

1. 基础占用与增长逻辑

  • 初始占用:
    • CentOS/RHEL 系:默认安装后,包含内核、基本工具链、yum/dnf 缓存等,通常在 3-5GB 左右。但如果开启了自动更新、保留了旧内核(grubby 会保留多个 kernel 版本),占用会迅速增加。
    • Ubuntu/Debian 系:相对精简,初始占用可能在 2-4GB。但 Ubuntu 默认的 unattended-upgrades 和 snap 包机制(如果启用)可能会带来不可控的空间消耗。
  • 日志文件(Log):这是系统盘爆满的头号杀手。
    • /var/log 目录下的 syslog, auth.log, kern.log 等。如果没有配置 logrotate(日志轮转)或轮转策略过于宽松,几天下来就能吃掉几 GB。
    • 如果是高并发服务器,Nginx/Apache 的 access/error log 如果没做分离,瞬间就能撑爆系统盘。
  • 软件包缓存:
    • CentOS 的 /var/cache/yum 或 Ubuntu 的 /var/cache/apt/archives。如果你频繁执行 yum update 或 apt upgrade 而不清理缓存,这些目录可以轻松占据 1-2GB。

2. 常见场景分析

场景 A:个人学习 / 轻量级 Web 服务 (WordPress, Nginx)

  • 现状:很多教程推荐最小化安装,看起来 20GB 够用。
  • 风险:当你开始部署 Docker、编译代码、或者安装一些大型依赖(如 Node.js 的 node_modules, Python 的 site-packages)时,空间需求会指数级上升。
  • 建议:至少 30-40GB。预留 50% 的冗余空间用于突发增长和临时文件解压。

场景 B:Java / Go / C++ 后端服务

  • 现状:JVM 需要堆外内存和元空间,有时会在本地磁盘生成 dump 文件;Go 编译产物较大;C++ 的 build 目录更是空间黑洞。
  • 风险:一旦应用崩溃生成 core dump,或者编译过程中间文件未清理,系统盘极易写满,导致服务不可用。
  • 建议:至少 50GB。强烈建议将构建目录 (/tmp, /build) 和日志目录挂载到独立的数据盘或 tmpfs。

场景 C:Docker / Kubernetes 节点

  • 现状:Docker 的默认存储驱动(overlay2)会将镜像层、容器层放在系统盘的 /var/lib/docker。
  • 风险:一个中等大小的 Java 镜像可能就有 1-2GB,加上拉取过程中的中间层,系统盘很快被占满。一旦 /var/lib/docker 满了,整个 Docker 守护进程会停止工作,影响所有容器。
  • 建议:至少 50-80GB。并且必须配置 Docker 的 data-root 指向数据盘,或者使用 docker system prune 定期清理。

场景 D:数据库服务 (MySQL, PostgreSQL)

  • 现状:虽然数据文件通常建议放在数据盘,但错误日志、二进制日志(binlog)、慢查询日志默认都在系统盘的 /var/log/mysql 或类似路径。
  • 风险:binlog 如果不及时清理,会飞速膨胀。
  • 建议:至少 50GB。并确保 binlog 有合理的过期策略(expire_logs_days)。

3. 为什么国内云厂商默认给 20-40GB?

国内主流云厂商(阿里云、腾讯云、华为云等)在创建 ECS/CVM 实例时,往往默认提供 20GB-40GB 的系统盘。这主要是出于:

  1. 成本考量:降低用户入门门槛。
  2. 引导最佳实践:他们希望你将数据、日志、应用部署在数据盘(EBS/云硬盘)上,因为数据盘可以方便地快照、扩容、迁移,而系统盘通常被视为“易失性”或“可重建”的。

4. 实操建议

  1. 初始分配:

    • 如果只是跑一个简单的静态网站或 Hello World 服务,20GB 勉强能用,但你要做好心理准备,随时监控磁盘使用率。
    • 强烈推荐:选择 40GB 或 50GB 作为起步。价格差异很小(每月可能只差几块钱),但能避免后期扩容的麻烦。
  2. 监控告警:

    • 无论分配多少,务必配置磁盘使用率告警。当使用率达到 80% 时发出警告,90% 时紧急处理。
    • 使用 df -h 和 du -sh /* 定期检查大文件。
  3. 数据分离原则:

    • 核心原则:系统盘只放操作系统和必要的运行脚本。
    • 日志:通过 syslog/rsyslog 或 ELK 栈将日志发送到外部存储或另一台日志服务器。
    • 应用数据:数据库文件、Web 上传文件、代码仓库、Docker 镜像等,全部挂载到独立的数据盘。
    • 临时文件:设置 /tmp 为 tmpfs(内存文件系统),重启即清空,避免占用磁盘。
  4. 扩容方案:

    • 如果已经用了 20GB 的系统盘并发现不够,不要慌。大多数云平台支持在线扩容系统盘(需要重启实例),然后在 OS 内使用 growpart 和 resize2fs (ext4) 或 xfs_growfs (xfs) 命令扩展分区。但这终究是补救措施,不如一开始就规划好。

总结:
20GB 系统盘在 2024 年的云计算环境下属于“极限操作”。为了运维稳定性和减少故障排查时间,建议至少分配 40GB,并将重要数据和日志分离到数据盘。这不是浪费钱,而是买了一份“运维保险”。