华为云信创:CentOS到openEuler生产级迁移实战与踩坑记录
文章摘要: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 操作习惯接近。
迁移方案评估

我们最终采用了混合方案:
- 数据库服务器(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 上。数据库服务器不建议原地升级,新装系统最安全。
迁移全流程总览

各阶段关键动作
| 阶段 | 核心任务 | 产出物 |
|---|---|---|
| 环境评估 | 盘点服务器清单、服务依赖、数据量、网络拓扑 | 迁移范围清单、RTO/RTO 目标 |
| 兼容性检查 | aops 预检、驱动兼容性、应用依赖、systemd 单元 | 兼容性报告 + 问题清单 |
| 问题修复 | 替换不兼容包、修改 service unit、调整防火墙规则 | 修复清单 + 验证结果 |
| 迁移执行 | 原地升级 / 新装系统 / 容器化迁移 | 迁移完成确认 |
| 验证测试 | 功能测试 + 性能基准对比 + 监控告警确认 | 验证报告 |
| 切换上线 | DNS/负载均衡切换、旧系统下线、保留回滚窗口 | 上线确认单 |
| 持续监控 | 运行状态跟踪、性能趋势、异常告警 | 稳定运行报告 |
总结
CentOS → openEuler 迁移在 2025 年是很多信创团队的必修课。我的建议是:
- 先用 aops 做预检,不要手动评估,工具能扫出 90% 的问题
- P0 服务用新装系统,虽然费时,但最安全
- PHP/Python 2.7 的旧应用用容器化跑,不要让系统层面的版本冲突拖累迁移
- 迁移后的性能不会比 CentOS 差,openEuler 在鲲鹏上的表现甚至更好
下篇文章讲 openEuler 内核调优 —— iSula 容器引擎和 A-Tune 智能调优工具的实战用法。
💬 互动:你们团队开始做 CentOS 迁移了吗?用的是哪种迁移方式?评论区聊聊。
- 点赞
- 收藏
- 关注作者
评论(0)