CentOS 7 停更(EOL)确实是很多运维和开发团队最近两年最头疼的问题之一。作为在华为云摸爬滚打多年的老手,我直接说结论:从 CentOS 迁移到 openEuler 或 Ubuntu,核心痛点不在“装系统”,而在“依赖包兼容性”和“自动化运维脚本的适配”。
下面我把这两个方向拆解开来,讲点干货,避免那些虚头巴脑的理论。
一、 为什么是 openEuler 和 Ubuntu?
在华为云生态里,openEuler 是“亲儿子”,Ubuntu 是“国际主流”。
- openEuler:内核基于 Linux,但 RPM 包体系与 CentOS(RHEL系)同源。如果你之前的业务重度依赖
yum/rpm,且代码主要是 C/C++ 编译型或 Java 后端,openEuler 是平滑过渡的首选。 - Ubuntu:Debian 系,使用
apt/dpkg。如果你用的是 Python、Node.js、Go 等解释型语言,或者大量使用 Docker/K8s 容器化部署,Ubuntu 的软件源和社区支持会更顺手。
二、 迁移到 openEuler:关注“血缘兼容”陷阱
openEuler 虽然号称兼容 RHEL/CentOS,但不是二进制完全兼容。你需要注意以下细节:
1. 软件包名称与版本差异
- 包名变更:部分库的名称可能微调。例如,某些旧版的
mysql-community-server在 openEuler 中可能需要通过官方源重新配置,或者改用 MariaDB 源。 - 依赖链断裂:CentOS 7 上很多老旧的
.so库文件路径可能不同。检查你的自定义编译程序,特别是那些硬编码了/usr/lib64/下具体库版本的程序。 - 解决方案:
- 使用
yum install <package>时,务必确认 openEuler 官方仓库是否有对应版本。如果没有,考虑使用第三方源(如阿里云镜像站同步的 openEuler 源)。 - 关键动作:迁移前导出 CentOS 上的
rpm -qa --qf '%{NAME}-%{VERSION}-%{RELEASE}.%{ARCH}n' > centos_pkgs.txt,然后在 openEuler 新实例上用yum list installed对比,找出缺失或版本不匹配的包。
- 使用
2. 内核模块与驱动
- openEuler 的内核版本通常比 CentOS 7 更新(5.10+ vs 3.10)。如果你的业务涉及自研内核模块、特殊硬件驱动(如某些老旧的网卡、GPU 提速卡),必须测试这些模块是否能在新内核下加载。
- 注意:DKMS(动态内核模块支持)在 openEuler 上的配置方式略有不同,需查阅华为云文档调整构建脚本。
3. SELinux 策略
- openEuler 默认启用 SELinux,且策略集比 CentOS 7 更严格。很多在 CentOS 上能跑通的 Web 服务(如 Nginx + PHP-FPM),因为端口绑定或文件权限问题被 SELinux 拦截。
- 建议:初期迁移可暂时设为
permissive模式排查问题,但不要长期关闭。使用audit2allow生成策略补丁是标准做法。
4. 华为云专属优化
- 利用华为云的 IMS(镜像服务) 制作自己的 openEuler 基础镜像,预装好常用环境。
- 使用 CCE(云容器引擎) 时,确保使用的节点镜像是基于 openEuler 构建的,否则 K8s 底层组件可能存在细微差异。
三、 迁移到 Ubuntu:关注“生态切换”成本
Ubuntu 的优势在于社区活跃、Docker 原生支持好,但代价是你要适应 Debian 系的逻辑。
1. 包管理器彻底转换
- 命令不同:
yum→apt,rpm→dpkg。 - 依赖解析逻辑不同:apt 的依赖解决机制比 yum 更激进,有时会自动升级依赖导致版本冲突。
- 关键动作:
- 不要手动下载
.deb包安装,除非必要。优先使用apt update && apt install。 - 对于无法通过 apt 安装的软件(如某些 Oracle JDK 特定版本),建议使用 AppImage、Snap 或在容器中运行,而不是强行塞进系统。
- 不要手动下载
2. Systemd 与服务管理
- 虽然 systemd 是通用的,但 Ubuntu 的服务单元文件(
.service)路径和环境变量加载顺序可能与 CentOS 有细微差别。 - 重点检查:环境变量配置文件。CentOS 常用
/etc/profile.d/或/etc/sysconfig/,而 Ubuntu 更倾向于/etc/environment或 systemd 的EnvironmentFile=指令。迁移后务必重启服务并验证环境变量是否生效。
3. Python 与 Node.js 环境
- Ubuntu 自带的 Python 版本较新(如 20.04 带 Python 3.8,22.04 带 3.10),而 CentOS 7 自带的是 Python 2.7 或 3.6。
- 风险:如果你的代码强依赖 Python 2.7,迁移到 Ubuntu 后会非常痛苦。
- 建议:直接使用
pyenv或conda管理 Python 版本,或者用 Docker 隔离 Python 环境。不要在宿主机上全局安装复杂依赖。
4. AppArmor vs SELinux
- Ubuntu 默认使用 AppArmor,而 CentOS 用 SELinux。两者的安全模型不同,AppArmor 更简单直观,但也更缺乏灵活性。如果之前有复杂的 SELinux 策略,迁移到 Ubuntu 后需要重写为 AppArmor profile,或者直接禁用(不推荐生产环境)。
四、 通用运维变更 checklist(无论选哪个)
这部分才是真正决定你能否平稳过渡的关键:
1. 备份与快照先行
- 在华为云上,先对原 CentOS 云服务器创建整机镜像或磁盘快照。这是最后的退路。
- 迁移过程中,采用 “双活并行” 策略:新系统上线,流量灰度切换,观察 1-2 周无异常后再下线旧实例。
2. 监控与日志格式
- 日志轮转:CentOS 7 用
logrotate,Ubuntu 也是,但配置文件位置可能不同(/etc/logrotate.confvs/etc/logrotate.d/)。检查自定义日志的轮转规则是否失效。 - Prometheus/Grafana 指标:如果你的监控系统依赖采集器(node_exporter),确保新版本系统下的采集器能正常读取
/proc和/sys信息。openEuler 和 Ubuntu 的/proc结构基本一致,但某些硬件传感器路径可能有变。
3. 自动化脚本重构
- Shell 脚本:检查所有 crontab 中的脚本。特别注意使用了
#!/bin/bash还是#!/bin/sh。在 Ubuntu 中,sh指向dash,其行为与 bash 有差异(如数组处理、正则表达式)。建议统一改为#!/bin/bash。 - Ansible/SaltStack:如果你有配置管理工具,需要更新 playbook 中的模块。例如,将
yum模块替换为apt模块,或针对 openEuler 编写特定的 role。
4. 网络与安全组
- 虽然 IP 不变,但新系统的防火墙规则(iptables/firewalld/ufw)需要重新配置。
- Ubuntu 推荐使用 ufw,简单明了;openEuler 推荐使用 firewalld,与 CentOS 习惯一致。根据你的团队熟悉程度选择。
5. 华为云特定资源
- 弹性公网 IP(EIP):绑定到新实例时,确认 NAT 规则是否保留。
- 云硬盘(EVS):如果是整盘迁移,注意文件系统类型(ext4/xfs)在两个系统中都支持,但挂载参数(如 noatime)需在
/etc/fstab中重新确认。 - 密钥对:新实例需重新绑定 SSH 密钥对,旧的私钥不能直接用(除非你保留了公钥并重新生成)。
五、 我的建议
-
优先评估业务复杂度:
- 如果是 Java/.NET/Go + MySQL/Redis 架构,openEuler 迁移成本最低,因为包管理和依赖链最接近。
- 如果是 Python/Node.js/Docker/K8s 主导的微服务架构,Ubuntu 更友好,社区资源和教程更多,出问题容易搜到答案。
-
利用华为云迁移工具:
- 华为云提供 SMS(服务器迁移服务),支持跨操作系统迁移(CentOS → openEuler/Ubuntu)。它会在目标端自动处理大部分驱动和初始化问题,但最终的应用层兼容性仍需人工验证。强烈建议使用 SMS 进行全量数据迁移,而非手动重装。
-
不要追求一步到位:
- 先在测试环境用 SMS 迁移一台非核心业务服务器,完整走一遍流程,记录所有报错和修复步骤,形成内部的《迁移操作手册》,再推广到生产环境。
最后提醒一句:CentOS 停更是趋势,但迁移不是简单的“换个系统”,而是“换一套生存环境”。 做好充分的回归测试,比任何技术选型都重要。
云技术博客