从 Ubuntu迁移到欧拉系统(openEuler,通常指华为基于 openEuler 构建的 EulerOS或 openEuler 发行版)部署现有项目,是一个涉及操作系统底层差异、依赖包管理、内核特性及硬件适配的系统性工程。
以下是需要重点关注的调整清单,按优先级和模块分类:
一、核心基础环境差异
1. 包管理器与软件源
- Ubuntu: 使用
apt/dpkg,软件源为.deb格式。 - openEuler: 使用
dnf/yum/rpm,软件源为.rpm格式。 - 调整动作:
- 所有通过命令行安装的基础工具(如
gcc,make,git,python3等需重新通过dnf install安装。 - 检查项目中是否有硬编码的
apt-get脚本,需替换为dnf或yum。 - 注意版本兼容性: openEuler 默认仓库中的软件版本可能与 Ubuntu LTS 不同,需确认关键依赖(如 Python, Node.js, Java)的版本是否满足项目要求。
- 所有通过命令行安装的基础工具(如
2. 初始化系统 (Init System)
- Ubuntu: 传统上使用
systemd,部分旧版本可能混用upstart。 - openEuler: 全面使用
systemd。 - 调整动作:
- systemd 单元文件(
.service)语法基本兼容,但需注意路径差异。 - 检查自定义服务中使用的绝对路径是否在 openEuler 中存在。
- systemd 单元文件(
3. 用户权限与安全模型
- Ubuntu: 默认启用 AppArmor。
- openEuler: 默认启用 SELinux(Security-Enhanced Linux)。
- 调整动作:
- 关键! SELinux 会严格限制进程对文件、端口的访问。如果应用启动失败或无权限访问日志/数据目录,很可能是 SELinux 策略阻止。
- 建议初期设置为
permissive模式排查问题,生产环境配置正确的 SELinux 上下文(context),而非直接禁用 SELinux。 - 检查
/etc/sudoers和用户组配置是否与 Ubuntu 一致。
二、运行时环境与依赖库
1. C/C++ 编译环境
- glibc 版本: openEuler 通常提供较新的 glibc,但某些老旧二进制程序可能因 ABI 不兼容而报错。
- 编译器: GCC 版本较高(如 GCC 8+),需确保代码符合新标准,避免使用已废弃的特性。
- 调整动作:
- 重新编译所有本地 C/C++ 扩展模块。
- 检查动态链接库依赖:使用
ldd ./your_binary查看缺失库。 - 特别注意 libstdc++.so 和 libgcc_s.so 的版本匹配。
2. Python 环境
- Python 版本: openEuler 默认 Python 版本可能为 3.6/3.8/3.9,而 Ubuntu 可能是 3.10+。
- pip 包: 大多数纯 Python 包跨平台兼容,但包含 C 扩展的包(如
numpy,pandas,psycopg2)需重新编译。 - 调整动作:
- 使用
dnf install python3-devel获取头文件。 - 在虚拟环境中重新安装所有 pip 包:
pip install --upgrade pip && pip install -r requirements.txt。 - 若需特定 Python 版本,建议使用 pyenv 或从源码编译。
- 使用
3. Java 环境
- JDK: openEuler 官方仓库提供 OpenJDK 和 Huawei JDK(毕昇 JDK)。
- 调整动作:
- 优先使用 Huawei JDK,其对 ARM 架构(鲲鹏处理器)有深度优化。
- 检查 JVM 参数是否包含针对多核 CPU 的优化选项。
4. Node.js / Go / Rust 等语言
- 这些语言的运行时通常是静态编译或独立二进制,迁移难度低。
- 调整动作:
- 重新下载对应架构(x86_64 或 aarch64)的二进制文件。
- 若项目中有原生模块(如 node-gyp),需确保安装了
build-essential等效包(gcc-c++,make等)。
三、硬件架构适配(关键!)
重要提示: openEuler 广泛运行于 ARM64 (aarch64) 架构(鲲鹏服务器),而 Ubuntu 常见于 x86_64。
1. 指令集架构
- 如果目标机器是 ARM 架构:
- 所有预编译的二进制文件必须重新编译为
aarch64。 - Docker 镜像需使用
linux/arm64基础镜像。 - 数据库(MySQL, PostgreSQL)需安装 ARM 版本。
- 第三方闭源软件(如某些监控 Agent)可能没有 ARM 版本,需寻找替代品或联系厂商。
- 所有预编译的二进制文件必须重新编译为
2. 内核模块与驱动
- openEuler 内核经过华为定制,部分专有硬件驱动(如网卡、GPU、存储控制器)可能需要专用内核模块。
- 调整动作:
- 确认硬件驱动是否在 openEuler 支持列表中。
- 如需加载自定义内核模块,需在内核开发包齐全的情况下重新编译。
四、中间件与数据库
| 组件 | 调整要点 |
|---|---|
| Nginx/Apache | 重新编译或安装 RPM 包;注意配置文件路径差异(Ubuntu: /etc/nginx, openEuler: /etc/nginx 基本一致,但模块路径可能不同)。 |
| MySQL/MariaDB | 使用 dnf install mysql-server;数据目录权限需符合 SELinux 要求。 |
| Redis | 通常无架构依赖,但需重新编译 Redis 模块(如有)。 |
| Kafka/RabbitMQ | 纯 Java/Erlang 应用,主要关注 JVM/Erlang 版本兼容性。 |
| Docker/Podman | openEuler 推荐使用 Podman(无守护进程,更安全);也可安装 Docker CE,但需注意 cgroup v2 的支持情况。 |
五、网络与防火墙
- Ubuntu: 常用
ufw或iptables。 - openEuler: 默认使用 firewalld(基于 firewalld + nftables/iptables)。
- 调整动作:
- 停止并禁用 ufw:
sudo systemctl disable --now ufw。 - 启用并配置 firewalld:
sudo systemctl enable --now firewalld sudo firewall-cmd --permanent --add-port=80/tcp sudo firewall-cmd --reload - 检查 iptables 规则是否被 firewalld 覆盖。
- 停止并禁用 ufw:
六、日志与监控
- 日志位置:
- Ubuntu:
/var/log/syslog - openEuler:
/var/log/messages或使用journalctl。
- Ubuntu:
- 调整动作:
- 更新日志轮转配置(logrotate)。
- 监控系统X_X(如 Prometheus Node Exporter, Zabbix Agent)需重新安装对应平台的版本。
七、迁移实施步骤建议
-
评估阶段:
- 列出所有依赖项(系统包、语言库、第三方二进制)。
- 确定目标硬件架构(x86_64 还是 aarch64)。
- 检查是否有闭源软件不支持 openEuler。
-
搭建测试环境:
- 使用相同版本的 openEuler 最小化安装 ISO。
- 配置基础网络、时区、NTP。
-
逐步迁移:
- 先迁移无状态服务(Web 前端、API 网关)。
- 再迁移有状态服务(数据库、消息队列)。
- 最后迁移复杂业务逻辑服务。
-
压力测试与回归测试:
- 验证功能完整性。
- 进行性能基准测试,对比 Ubuntu 下的表现(ARM 架构下浮点运算性能可能不同)。
-
安全加固:
- 配置 SELinux 策略。
- 更新防火墙规则。
- 禁用不必要的服务和端口。
八、常见问题排查技巧
- 权限拒绝: 检查 SELinux 状态
getenforce,临时设为 permissivesetenforce 0测试。 - 找不到库: 使用
ldconfig -p | grep libxxx查找库文件,或使用strace -e openat ./app追踪缺失库。 - 编译失败: 确保安装了
development tools组:dnf groupinstall "Development Tools"。 - Docker 镜像拉取失败: 若为 ARM 架构,确保 Dockerfile 中使用
FROM ubuntu:latest会自动解析为 arm64,或显式指定--platform linux/arm64。
总结
从 Ubuntu 迁移到 openEuler 的核心挑战在于:
- 包管理差异(apt → dnf/rpm)。
- 安全策略变更(AppArmor → SELinux)。
- 可能的架构转换(x86_64 → aarch64)。
只要提前规划好依赖项,并在测试环境中充分验证,迁移过程可以是平滑的。对于华为云用户,还可利用 Ascend AI 处理器 等专属提速能力,进一步优化 AI 相关项目的性能。
云小栈