从 CentOS 7 迁移到 CentOS 9 并不是官方支持的直接升级路径,且存在重大架构与生态变化。需要特别注意以下关键事项(按优先级和影响程度梳理):
⚠️ 一、核心前提:不存在“就地升级”(In-place Upgrade)
- CentOS 7 → CentOS 9 不支持
dnf system-upgrade或yum update升级
Red Hat / CentOS 官方明确不支持跨大版本(如 7→8→9)的原地升级,尤其跳过 CentOS 8(已 EOL)。
✅ 正确做法:全新安装 + 数据/配置迁移(推荐),或先迁至 CentOS Stream 8/9(若需滚动更新模型)。
💡 注:CentOS Linux 7 已于 2024-06-30 终止维护(EOL),CentOS Linux 8 早在 2021-12-31 EOL;当前唯一受支持的 CentOS 是 CentOS Stream 8/9(滚动发布的上游开发流),而非传统稳定版。
🔧 二、关键技术变更与兼容性风险
| 类别 | CentOS 7 (RHEL 7) | CentOS 9 (RHEL 9 / CentOS Stream 9) | 迁移注意事项 |
|---|---|---|---|
| 内核 | 3.10.x | 5.14+(默认启用 eBPF、cgroup v2 默认启用) | 检查自定义内核模块、eBPF 程序兼容性;cgroup v2 可能影响容器(Docker 需 ≥20.10,Podman 更友好) |
| systemd | 219 | 250+ | systemd-resolved 成为默认 DNS 解析器;/etc/resolv.conf 可能被覆盖;检查服务单元文件语法(如 RestartSec= 等新字段) |
| 默认文件系统 | XFS(但 ext4 仍广泛使用) | XFS(默认,支持 reflink & DAX) | 若用 ext4,确认无依赖旧特性;XFS 需 xfs_info 验证功能支持 |
| 网络栈 | iptables(legacy) | nftables 默认后端(iptables 命令为 nft 的 wrapper) | iptables-save 输出格式变化;防火墙规则需重写或用 iptables-legacy(临时方案,不推荐);firewalld 规则基本兼容 |
| Python | Python 2.7(默认)、Python 3.6(可选) | Python 3.9(唯一默认),Python 2 已彻底移除 | 所有 Python 脚本必须迁移到 Python 3;检查 #!/usr/bin/python → 改为 #!/usr/bin/python3;pip、venv、setuptools 全面更新 |
| GCC / 开发工具 | GCC 4.8.5 | GCC 11+(默认) | 编译旧 C/C++ 代码可能触发新警告/错误(如 -Werror=stringop-truncation);需测试构建与 ABI 兼容性 |
| Crypto & TLS | OpenSSL 1.0.2(弱算法默认启用) | OpenSSL 3.0(FIPS 140-3 模式默认启用,禁用 SSLv3/TLS 1.0/1.1) | 应用若依赖 TLS 1.0/1.1 将失败;需升级客户端/服务端;检查 openssl.cnf 配置迁移 |
| 数据库 | MariaDB 5.5 / PostgreSQL 9.2 | MariaDB 10.3 / PostgreSQL 13+(Stream 9) | 主版本升级需 dump/restore(如 pg_dump → pg_restore);检查 SQL 兼容性(如 ONLY_FULL_GROUP_BY 默认开启) |
🐳 三、容器与虚拟化生态
- Docker CE:RHEL/CentOS 9 不再提供官方 Docker 包(因与 Podman 冲突);推荐改用 Podman(rootless 默认,兼容 Docker CLI) 或手动安装 Docker CE(需添加第三方 repo,不推荐生产环境)。
- Kubernetes:RHEL 9/CentOS Stream 9 是 OpenShift 4.12+ 的基线;kubelet 默认使用 cgroup v2 + systemd cgroup driver(需在
/var/lib/kubelet/config.yaml中确认)。 - QEMU/KVM:libvirt 8.0+,支持 UEFI Secure Boot、TPM 2.0 虚拟设备 —— 若旧 VM 使用 BIOS + legacy boot,需转换固件类型。
🛠 四、迁移实操建议(最小化风险)
-
评估与规划
- 使用
leapp工具(Red Hat Leapp)进行预检(虽非官方支持 7→9,但可识别部分兼容性问题):# 在 CentOS 7 上运行(需启用 leapp repo) yum install leapp-upgrade leapp preupgrade --debug - 生成报告,重点审查
inhibitors(阻断项)和reports(建议项)。
- 使用
-
备份与验证
- 完整备份:
/etc,/var/log,/home, 数据库 dump, 自定义服务配置。 - 在测试环境部署 CentOS 9,逐项验证:
- 应用依赖(如 Java 版本、Node.js、.NET Core runtime)
- 监控X_X(Zabbix Agent 5+, Prometheus node_exporter ≥1.3)
- 日志收集(rsyslog → journald 集成,或 Fluentd/Vector 配置更新)
- 完整备份:
-
配置迁移要点
/etc/fstab: 检查 XFS mount options(如inode64,noatime仍有效,但allocsize等已废弃)/etc/sysctl.conf: 移除废弃参数(如net.ipv4.tcp_fin_timeout在新内核中行为变更)- SELinux: RHEL 9 强化策略(如
container_manage_cgroup布尔值默认 off),需ausearch -m avc -ts recent排查拒绝日志
-
替代方案考虑
- ✅ 首选:迁移到 Rocky Linux 9 或 AlmaLinux 9(100% RHEL 9 二进制兼容,长期稳定支持)。
- ✅ 开发/CI 场景:采用 CentOS Stream 9(滚动更新,接近 RHEL 9 下一版本)。
- ❌ 避免:CentOS Linux 9(从未存在,CentOS 项目已于 2020 年终止该分支)。
📌 总结:迁移决策树
graph LR
A[当前 CentOS 7] --> B{是否需长期稳定?}
B -->|是| C[迁至 Rocky/AlmaLinux 9<br>(全新安装 + 配置迁移)]
B -->|否,需最新特性| D[迁至 CentOS Stream 9<br>(滚动更新,适合开发/测试)]
C --> E[验证应用兼容性<br>• Python 3.9<br>• OpenSSL 3.0<br>• nftables/firewalld<br>• cgroup v2]
D --> E
E --> F[自动化部署<br>Ansible/Terraform 重写 Playbook]
✅ 最后提醒:
- CentOS 7 EOL 后无安全更新,务必在 2024 年底前完成迁移。
- 生产环境强烈建议先在隔离环境完整验证,勿跳过兼容性测试。
- 参考权威文档:
- RHEL 9 Migration Planning Guide
- CentOS Stream vs RHEL vs Community Distros
如需具体场景(如 LAMP 栈、Java 应用、K8s 集群)的迁移 checklist,可告知,我可为您定制详细步骤。
云小栈