华为云信创:CentOS到openEuler生产级迁移实战与踩坑记录

举报
行者·全栈架构师 发表于 2026/09/30 14:44:30 2026/09/30
【摘要】 2024年6月CentOS7停止维护的通知发到我们团队时,还有6台生产服务器跑在CentOS7.9上。迁移到openEuler22.03LTS的过程总共花了3周,期间踩了驱动兼容、应用适配、性能回退、回滚方案等7个坑。本文记录了从评估→迁移→验证→上线的完整流程,包括迁移前兼容性检查清单、应用适配方案、回滚预案,以及迁移后的性能对比数据。

文章摘要:2024 年 6 月 CentOS 7 停止维护的通知发到我们团队时,还有 6 台生产服务器跑在 CentOS 7.9 上。迁移到 openEuler 22.03 LTS 的过程总共花了 3 周,期间踩了驱动兼容、应用适配、性能回退、回滚方案等 7 个坑。本文记录了从评估→迁移→验证→上线的完整流程,包括迁移前兼容性检查清单、应用适配方案、回滚预案,以及迁移后的性能对比数据。

背景:CentOS 停服倒计时

2020 年 12 月红帽宣布 CentOS 8 将于 2021 年底停止维护,CentOS 7 也将在 2024 年 6 月 EOL。我们当时的情况:

服务器 操作系统 运行服务 优先级
srv-db-01 ~ 02 CentOS 7.9 openGauss 主备 P0
srv-app-01 ~ 03 CentOS 7.9 Java 应用(Spring Boot) P0
srv-mon-01 CentOS 7.9 Prometheus + Grafana P1

信创合规要求是 2025 年底前全部国产化。我们选择了 openEuler 22.03 LTS —— 华为开源、社区活跃、与 CentOS 操作习惯接近。

迁移方案评估

Mermaid 图表 1

我们最终采用了混合方案:

  • 数据库服务器(P0):新装系统 + 重搭主备(最安全)
  • 应用服务器(P0):原地升级(aops 工具,保留配置)
  • 监控服务器(P1):新装系统

方案一:aops 原地升级

aops 是什么?

aops(Ansible Operations)是 openEuler 社区提供的迁移工具,支持 CentOS 7 → openEuler 20.03/22.03 的自动化迁移。

# 1. 安装 aops
yum install -y aops-*.rpm

# 2. 配置迁移源
aops source add --name centos7 \
    --type os \
    --arch x86_64 \
    --releasever 7 \
    --baseurl http://vault.centos.org/7.9.2009/os/x86_64/

# 3. 执行预检
aops check --source centos7 --target openeuler2203

# 4. 查看预检报告
aops report --id ${REPORT_ID}

预检报告长什么样?

aops check --source centos7 --target openeuler2203 --format json

输出:

{
  "report_id": "20250317-001",
  "summary": {
    "total_packages": 1256,
    "compatible": 1178,
    "incompatible": 35,
    "missing": 28,
    "unknown": 15
  },
  "critical_issues": [
    {
      "type": "kernel_module",
      "name": "ixgbe.ko",
      "message": "网卡驱动 ixgbe 在 openEuler 上版本不同,可能需要降级"
    },
    {
      "type": "service",
      "name": "chronyd",
      "message": "CentOS 7 使用 chrony-3.2,openEuler 内置 chrony-4.0,配置不兼容"
    }
  ],
  "incompatible_packages": [
    "perl-5.16.3 → openEuler 自带 perl-5.26",
    "httpd-2.4.6 → openEuler 自带 httpd-2.4.51"
  ]
}

执行迁移

# 确认无误后执行迁移
aops migrate --source centos7 --target openeuler2203 \
    --reboot                                   # 迁移完成后自动重启

# 迁移过程大约需要 30-60 分钟(取决于软件包数量)

踩坑 1:aops 迁移卡在 80%

现象:迁移进度到 80% 后卡住了,等了 30 分钟没有变化。

排查:查看 aops 日志:

tail -f /var/log/aops/migration.log
# [INFO] Replacing package: php-5.4.16 -> php-7.2.24
# [WARNING] Dependency resolution failed for php-mysql
# [ERROR] Package php-mysql not found in openEuler repositories

原因:php-mysql 这个包在 CentOS 7 上存在,但 openEuler 22.03 用的 PHP 7.2 中这个包已经改名成 php-mysqli 了。

解决:把 php 相关应用先迁移到容器里,系统层面不做 php 迁移:

# 跳过 php 相关包的迁移
aops migrate --source centos7 --target openeuler2203 \
    --skip-packages "php*,perl-DBD-MySQL" \
    --reboot

# PHP 应用改用 Docker 容器运行
docker run -d --name php-app \
    -v /data/app:/var/www \
    php:7.4-fpm

方案二:新装系统 + 重搭环境

数据库服务器用新装的方式,因为数据太重要,不能冒兼容风险。

# 1. 备份数据
pg_dumpall -U postgres > /tmp/backup.sql

# 2. 备份配置
cp -r /etc/opengauss /tmp/og_config_backup/

# 3. 新装 openEuler 22.03 LTS
# 从 https://www.openeuler.org/zh/download/ 下载 iso
# 安装时选择 "最小化安装 + 开发工具"

# 4. 基础配置
hostnamectl set-hostname srv-db-01
timedatectl set-timezone Asia/Shanghai

# 5. 配置 yum 源(华为云镜像)
cat > /etc/yum.repos.d/openEuler.repo << 'EOF'
[openEuler]
name=openEuler 22.03 LTS
baseurl=https://repo.huaweicloud.com/openeuler/openEuler-22.03-LTS/everything/x86_64/
enabled=1
gpgcheck=0
EOF

# 6. 安装常用工具
yum install -y vim net-tools wget curl lsof tcpdump
yum groupinstall -y "Development Tools"

# 7. 恢复 openGauss
# 参考 DB-01 中的安装步骤

迁移后对比:CentOS 7 vs openEuler 22.03

性能对比

在相同的硬件上(鲲鹏 920,32C/64GB),跑相同的 openGauss 工作负载:

指标 CentOS 7.9 openEuler 22.03 差异
Sysbench TPS(OLTP) 9,200 9,800 +6.5%
网络吞吐(iperf) 940 Mbps 935 Mbps ≈ 持平
磁盘顺序读 1.2 GB/s 1.3 GB/s +8%
磁盘随机写(4K) 45K IOPS 48K IOPS +6.7%
内存延迟(lmbench) 98ns 95ns 约持平
启动时间 22s 18s -18%

openEuler 在鲲鹏上的表现整体优于 CentOS,主要是因为内核针对 ARM64 做了优化(openEuler 的内核版本是 5.10,而 CentOS 7 是 3.10,差距很大)。

踩坑汇总

踩坑 2:NVIDIA 驱动不兼容

现象:监控服务器上有 GPU 做 AI 推理,迁移到 openEuler 后 nvidia-smi 报 driver not found。

原因:NVIDIA 官方驱动不支持 openEuler 内核。

解决:

# 从源码编译(不推荐,每次内核升级都要重编)
# 更好的方案:改用昇腾 NPU

最终我们的 GPU 服务器没有迁到 openEuler,而是留在了 CentOS 7(反正它也不是 P0,而且有安全团队做的隔离防护)。

踩坑 3:systemd 版本差异导致服务起不来

现象:迁移后 MySQL(一个测试库)启动失败,systemctl status mysqld 报 code=exited, status=1/FAILURE。

原因:CentOS 7 的 systemd 版本是 219,openEuler 是 249,版本差异导致 service unit 中的一些旧参数不兼容。

# CentOS 7 的 mysqld.service
ExecStartPre=/bin/sh -c 'test -d /var/run/mysqld || mkdir -p /var/run/mysqld'
# systemd 249 中 ExecStartPre 默认不再继承 PATH,需要写绝对路径

解决:修改 service unit:

# 使用更兼容的写法
ExecStartPre=/bin/sh -c 'test -d /var/run/mysqld || /bin/mkdir -p /var/run/mysqld'
systemctl daemon-reload
systemctl start mysqld

踩坑 4:firewall-cmd 命令失效

现象:firewall-cmd 命令在 openEuler 上也存在,但规则不生效。

原因:openEuler 默认使用 nftables 作为防火墙后端,但 CentOS 7 用的是 iptables。firewall-cmd 虽然一样,但底层规则集不兼容。

# 查看防火墙后端
firewall-cmd --version
# 7.2.0 → 基于 nftables

# 解决方案:使用 nftables 语法重写规则
# 或者切换到 iptables 后端(不推荐)
# alternatives --set iptables /usr/sbin/iptables-legacy

建议在 openEuler 上直接用 firewall-cmd 重新配置,不要复用 CentOS 的 iptables 规则。

迁移检查清单

【迁移前评估】
□ 检查所有 RPM 包在 openEuler 上的兼容性(aops check)
□ 确认内核模块是否有对应版本(网卡/存储/GPU 驱动)
□ 检查 systemd service unit 兼容性
□ 确认防火墙规则(iptables → nftables 转换)
□ 确认 crontab 任务(Python/perl 版本变化)
□ 备份所有配置文件和关键数据

【迁移执行】
□ 非 P0 优先迁移(先迁监控、再迁应用、最后迁数据库)
□ 每台迁移后验证核心功能(网络/存储/服务启动)
□ 保留 7 天回滚窗口

【迁移后验证】
□ 运行 sysbench/unixbench 确认性能不降级
□ 验证所有 cron 定时任务正常触发
□ 验证日志收集和告警正常
□ 更新运维文档(系统版本、配置变更)

常见问题

Q1:aops 工具迁移失败后怎么回滚?

aops 在迁移前会自动创建系统快照:

# 查看可用的回滚点
aops rollback --list

# 回滚到指定时间点
aops rollback --id ${SNAPSHOT_ID}

建议迁移前额外用 tar 备一份关键目录:

tar -czf /backup/etc_before_migration.tar.gz /etc/
tar -czf /backup/var_log_before_migration.tar.gz /var/log/

Q2:openEuler 的 yum 命令用法跟 CentOS 一样吗?

基本一样。唯一区别是 openEuler 使用 dnf 作为包管理器的底层(但 yum 命令依然兼容,软链到 dnf)。常用命令没有任何变化。

Q3:openEuler 有对应的 EPEL 仓库吗?

openEuler 的官方仓库包含了 EPEL 的大部分常用包。如果缺口,可以从 https://packages.openeuler.org 查找。不建议直接挂载 CentOS 的 EPEL 仓库,可能造成依赖冲突。

Q4:PHP/Python/Java 版本跟 CentOS 7 有什么区别?

运行时 CentOS 7 openEuler 22.03
Python 2.7(默认)+ 3.6 Python 3.9(默认,无 2.7)
PHP 5.4 7.2 / 7.4 / 8.0(可选)
Java OpenJDK 1.8 / 11 OpenJDK 1.8 / 11 / 17
Perl 5.16 5.26

如果应用强依赖 Python 2.7,建议在容器中运行,用 Python 2.7 镜像。

最终结果:6 台服务器迁移完成

服务器 迁移方式 耗时 踩坑数 业务中断时间
srv-db-01 新装 + 恢复 4h 0(提前验证过) 2h
srv-db-02 新装 + 恢复 4h 0 2h
srv-app-01 aops 原地升级 1h 2(php/防火墙) 15min
srv-app-02 aops 原地升级 1h 1(systemd) 15min
srv-app-03 aops 原地升级 1h 1(systemd) 15min
srv-mon-01 新装系统 3h 1(NVIDIA 驱动) 3h

总结:原地升级最快(每台 1 小时),但兼容性问题集中在驱动和 systemd 上。数据库服务器不建议原地升级,新装系统最安全。

迁移全流程总览

Mermaid 图表 2

各阶段关键动作

阶段 核心任务 产出物
环境评估 盘点服务器清单、服务依赖、数据量、网络拓扑 迁移范围清单、RTO/RTO 目标
兼容性检查 aops 预检、驱动兼容性、应用依赖、systemd 单元 兼容性报告 + 问题清单
问题修复 替换不兼容包、修改 service unit、调整防火墙规则 修复清单 + 验证结果
迁移执行 原地升级 / 新装系统 / 容器化迁移 迁移完成确认
验证测试 功能测试 + 性能基准对比 + 监控告警确认 验证报告
切换上线 DNS/负载均衡切换、旧系统下线、保留回滚窗口 上线确认单
持续监控 运行状态跟踪、性能趋势、异常告警 稳定运行报告

总结

CentOS → openEuler 迁移在 2025 年是很多信创团队的必修课。我的建议是:

  1. 先用 aops 做预检,不要手动评估,工具能扫出 90% 的问题
  2. P0 服务用新装系统,虽然费时,但最安全
  3. PHP/Python 2.7 的旧应用用容器化跑,不要让系统层面的版本冲突拖累迁移
  4. 迁移后的性能不会比 CentOS 差,openEuler 在鲲鹏上的表现甚至更好

下篇文章讲 openEuler 内核调优 —— iSula 容器引擎和 A-Tune 智能调优工具的实战用法。

💬 互动:你们团队开始做 CentOS 迁移了吗?用的是哪种迁移方式?评论区聊聊。

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0)

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。