从 CentOS 迁移到 Huawei Cloud EulerOS(欧拉操作系统),这不仅仅是换个发行版那么简单,更像是一次“换引擎”的工程。虽然两者在底层都源自 RHEL/CentOS 的技术路线,但在实际生产环境中,直接拷贝过去大概率会出幺蛾子。
作为过来人,我整理了一份基于实战经验的避坑指南,主要围绕兼容性、包管理、内核特性、云原生适配以及运维习惯这几个维度展开。
1. 核心认知:EulerOS 到底是个啥?
首先得纠正一个误区:很多人以为 EulerOS 就是换了个名字的 CentOS。
- CentOS Stream 是滚动更新的红帽上游分支,不稳定因素多。
- EulerOS 是华为基于 openEuler(开源社区版)构建的商业发行版,更强调稳定性、安全性和云原生能力。
关键点:EulerOS 默认安装的是 openEuler 的内核和基础库,而不是传统的 glibc 或 kernel 的老版本。这意味着你的应用如果硬编码了某些旧路径或依赖了特定版本的动态库,可能会直接报错。
2. 软件包与依赖管理(最头疼的部分)
这是迁移过程中失败率最高的环节。
-
Yum/DNF 源的变化:
- CentOS 用的是 baseos, extras, appstream 等标准 repo。
- EulerOS 的源结构不同,且华为云的镜像站有特定的配置。你需要重新配置
/etc/yum.repos.d/下的文件,指向华为云的官方源或内部私有源。 - 注意:EulerOS 推荐使用
dnf而非yum,虽然兼容,但行为略有差异。建议统一脚本中的命令。
-
第三方 RPM 包的兼容性:
- 如果你之前安装了 Nginx、MySQL 等非系统自带的 RPM 包,必须确认这些包是否提供了
openEuler或EulerOS的版本。 - 常见坑:很多老旧的第三方仓库只支持
el7(Enterprise Linux 7) 或el8。EulerOS 2.x 系列通常兼容el8的二进制接口,但并非 100% 通用。务必先在测试环境验证关键依赖包的rpm -q --whatrequires <package>关系。
- 如果你之前安装了 Nginx、MySQL 等非系统自带的 RPM 包,必须确认这些包是否提供了
-
Python 环境:
- 系统自带的 Python 版本可能变化。如果你的业务强依赖 Python 2.7 或特定版本的 Python 3,建议在容器化运行,或者使用 EulerOS 提供的
python39等模块流(Module Stream)。不要指望系统自带的环境能无缝衔接。
- 系统自带的 Python 版本可能变化。如果你的业务强依赖 Python 2.7 或特定版本的 Python 3,建议在容器化运行,或者使用 EulerOS 提供的
3. 内核与硬件驱动
-
内核版本:
- EulerOS 默认启用较新的 LTS 内核。如果你的应用依赖于特定的内核参数(如
sysctl设置)或内核模块(如某些旧的网卡驱动、GPU 直通驱动),需要检查新内核是否加载成功。 - 操作:迁移后第一时间执行
uname -r对比,并检查/var/log/messages是否有驱动加载失败的警告。
- EulerOS 默认启用较新的 LTS 内核。如果你的应用依赖于特定的内核参数(如
-
KVM 虚拟化优化:
- 华为云底层是 KVM,EulerOS 针对华为云的 KVM 做了深度优化(如 virtio-drivers 的预编译和优化)。如果你在本地虚拟机或其他云平台做过开发,记得替换掉本地的 virtio 驱动,否则 I/O 性能会差一大截。
4. 安全机制与 SELinux/AppArmor
-
SELinux 策略变更:
- EulerOS 对 SELinux 的策略更加严格和细化。CentOS 上可能因为 SELinux 处于 Permissive 模式而忽略的问题,在 EulerOS 上可能导致服务启动失败。
- 建议:初期可以暂时设置为
Permissive进行调试,但生产环境务必正确配置布尔值(Boolean)和上下文(Context)。使用audit2allow生成自定义策略时,要注意标签名称的变化。
-
国密算法支持:
- 如果业务涉及国内合规要求,EulerOS 原生支持 SM2/SM3/SM4 国密算法。如果你的应用代码里硬编码了 OpenSSL 的路径或调用了非国密的加密库,可能需要调整代码或使用华为提供的国密插件。
5. 云原生与容器化适配
这是 EulerOS 相比传统 CentOS 最大的优势,也是迁移的动力之一。
-
Containerd vs Docker:
- EulerOS 默认推荐并深度集成
containerd。虽然也支持 Docker,但建议直接使用 containerd 或 Kubernetes 原生方案。 - CRIU 支持:EulerOS 对 CRIU(容器检查点恢复)有更好的支持,适合需要高可用和快速迁移的场景。
- EulerOS 默认推荐并深度集成
-
eBPF 支持:
- EulerOS 内核默认开启 eBPF 相关功能,这对于网络监控、安全审计非常有用。如果你的运维工具链依赖 eBPF(如 Cilium, Tetragon),确保内核模块已加载。
6. 迁移实操步骤建议
不要试图在生产环境直接 cp -a 整个文件系统。推荐流程:
-
评估阶段:
- 列出所有安装的 RPM 包:
rpm -qa --qf '%{NAME}n' | sort > centos_packages.txt - 分析自定义配置文件:重点排查
/etc/下非默认生成的文件。 - 检查 crontab、systemd 服务、开机自启项。
- 列出所有安装的 RPM 包:
-
搭建测试环境:
- 在华为云 ECS 上创建同规格实例,安装 EulerOS。
- 配置 yum/dnf 源。
- 尝试安装关键依赖包,记录失败项。
-
数据与应用迁移:
- 数据库:使用逻辑备份(mysqldump, pg_dump)而非物理文件拷贝。不同内核版本可能导致存储引擎细微差异。
- Web 应用:优先使用 Docker 镜像迁移。如果不行,再考虑源码部署,注意编译环境(gcc, make 版本)可能与 CentOS 不同。
-
灰度上线:
- 先切少量流量,监控 CPU、内存、I/O 和网络延迟。
- 特别关注日志中的权限拒绝(Permission denied)错误,这通常是 SELinux 或文件权限问题。
7. 一些“玄学”但真实的问题
- 时间同步:EulerOS 默认使用
chronyd,而 CentOS 7 常用ntpd。确保时钟同步正常,否则分布式锁、日志时间戳会对不上。 - 字体缺失:如果应用生成 PDF 或图片报告,EulerOS 默认中文字体可能较少,需手动安装
wqy-*或noto-cjk字体包,否则会出现乱码方块。 - SSH 密钥认证:EulerOS 对 SSH 协议版本可能有更严格的限制(禁用弱加密套件),确保客户端支持现代 SSH 协议。
总结
从 CentOS 迁移到 EulerOS,最大的挑战不是技术本身,而是惯性思维。
- 别把 EulerOS 当 CentOS 用:接受它的新特性(如模块化、更强的安全默认值)。
- 拥抱容器化:这是平滑过渡的最佳路径。将应用封装在容器中,宿主 OS 的差异被屏蔽掉。
- 充分测试:任何看似简单的
yum install都要在隔离环境中验证。
最后,华为云提供了官方的迁移工具和文档,建议结合官方指引,但不要完全照搬,结合自身业务架构做定制化调整。毕竟,每个系统的“脏数据”和“历史包袱”都是独一无二的。
云技术博客