加油
努力

从Ubuntu迁移到欧拉系统部署现有项目需要做哪些调整?

从 Ubuntu迁移到欧拉系统(openEuler,通常指华为基于 openEuler 构建的 EulerOS或 openEuler 发行版)部署现有项目,是一个涉及操作系统底层差异、依赖包管理、内核特性及硬件适配的系统性工程。

以下是需要重点关注的调整清单,按优先级和模块分类:


一、核心基础环境差异

1. 包管理器与软件源

  • Ubuntu: 使用 apt/dpkg,软件源为 .deb 格式。
  • openEuler: 使用 dnf/yum/rpm,软件源为 .rpm 格式。
  • 调整动作:
    • 所有通过命令行安装的基础工具(如 gcc, make, git, python3 等需重新通过 dnf install 安装。
    • 检查项目中是否有硬编码的 apt-get 脚本,需替换为 dnfyum
    • 注意版本兼容性: openEuler 默认仓库中的软件版本可能与 Ubuntu LTS 不同,需确认关键依赖(如 Python, Node.js, Java)的版本是否满足项目要求。

2. 初始化系统 (Init System)

  • Ubuntu: 传统上使用 systemd,部分旧版本可能混用 upstart
  • openEuler: 全面使用 systemd
  • 调整动作:
    • systemd 单元文件(.service)语法基本兼容,但需注意路径差异。
    • 检查自定义服务中使用的绝对路径是否在 openEuler 中存在。

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++.solibgcc_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: 常用 ufwiptables
  • 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 覆盖。

六、日志与监控

  • 日志位置:
    • Ubuntu: /var/log/syslog
    • openEuler: /var/log/messages 或使用 journalctl
  • 调整动作:
    • 更新日志轮转配置(logrotate)。
    • 监控系统X_X(如 Prometheus Node Exporter, Zabbix Agent)需重新安装对应平台的版本。

七、迁移实施步骤建议

  1. 评估阶段:

    • 列出所有依赖项(系统包、语言库、第三方二进制)。
    • 确定目标硬件架构(x86_64 还是 aarch64)。
    • 检查是否有闭源软件不支持 openEuler。
  2. 搭建测试环境:

    • 使用相同版本的 openEuler 最小化安装 ISO。
    • 配置基础网络、时区、NTP。
  3. 逐步迁移:

    • 先迁移无状态服务(Web 前端、API 网关)。
    • 再迁移有状态服务(数据库、消息队列)。
    • 最后迁移复杂业务逻辑服务。
  4. 压力测试与回归测试:

    • 验证功能完整性。
    • 进行性能基准测试,对比 Ubuntu 下的表现(ARM 架构下浮点运算性能可能不同)。
  5. 安全加固:

    • 配置 SELinux 策略。
    • 更新防火墙规则。
    • 禁用不必要的服务和端口。

八、常见问题排查技巧

  • 权限拒绝: 检查 SELinux 状态 getenforce,临时设为 permissive setenforce 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 的核心挑战在于:

  1. 包管理差异(apt → dnf/rpm)。
  2. 安全策略变更(AppArmor → SELinux)。
  3. 可能的架构转换(x86_64 → aarch64)。

只要提前规划好依赖项,并在测试环境中充分验证,迁移过程可以是平滑的。对于华为云用户,还可利用 Ascend AI 处理器 等专属提速能力,进一步优化 AI 相关项目的性能。

云服务器