努力
加油

CentOS停更后,华为云用户迁移到openEuler或Ubuntu需要关注哪些系统兼容性和运维变更?

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.conf vs /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 密钥对,旧的私钥不能直接用(除非你保留了公钥并重新生成)。

五、 我的建议

  1. 优先评估业务复杂度:

    • 如果是 Java/.NET/Go + MySQL/Redis 架构,openEuler 迁移成本最低,因为包管理和依赖链最接近。
    • 如果是 Python/Node.js/Docker/K8s 主导的微服务架构,Ubuntu 更友好,社区资源和教程更多,出问题容易搜到答案。
  2. 利用华为云迁移工具:

    • 华为云提供 SMS(服务器迁移服务),支持跨操作系统迁移(CentOS → openEuler/Ubuntu)。它会在目标端自动处理大部分驱动和初始化问题,但最终的应用层兼容性仍需人工验证。强烈建议使用 SMS 进行全量数据迁移,而非手动重装。
  3. 不要追求一步到位:

    • 先在测试环境用 SMS 迁移一台非核心业务服务器,完整走一遍流程,记录所有报错和修复步骤,形成内部的《迁移操作手册》,再推广到生产环境。

最后提醒一句:CentOS 停更是趋势,但迁移不是简单的“换个系统”,而是“换一套生存环境”。 做好充分的回归测试,比任何技术选型都重要。