努力
加油

从Ubuntu迁移到Alibaba Cloud Linux 3.2104需要做哪些兼容性适配?

从 Ubuntu 迁移到 Alibaba Cloud Linux 3 (ACL3) 2104 版本,本质上是从 Debian/Ubuntu 系 向 RHEL/CentOS 系 的跨发行版迁移。这不仅仅是换个操作系统,而是底层包管理、文件系统结构、服务管理以及内核模块的一系列重构。

Alibaba Cloud Linux 3 基于 CentOS Stream 8 开发(注意:虽然叫 3,但内核和基础组件更接近 RHEL 8 体系),而 Ubuntu 通常是 LTS 版本(如 20.04/22.04)。这两者之间的差异比 Ubuntu 内部不同版本间的差异要大得多。

以下是需要重点关注的兼容性适配清单,按优先级排序:

1. 包管理与软件安装方式(最直接的冲突点)

这是迁移过程中最先遇到的障碍。你不能再使用 apt 或 pip 直接安装系统级依赖,也不能假设某些库在 /usr/lib 下的路径一致。

  • 包管理器切换:

    • Ubuntu: apt-get, dpkg
    • ACL3: yum 或 dnf, rpm
    • 适配动作:重写所有自动化部署脚本(Ansible, Shell, Terraform 等)。将 apt install xxx 替换为 yum install xxx。
    • 注意:很多在 Ubuntu 上容易安装的第三方工具,在 ACL3 上可能需要开启额外的源(如 EPEL)。例如 git、curl 等基础工具通常自带,但像 redis-server、nginx 可能不在默认 Base 源中,需确认官方仓库或自行编译。
  • Python 环境:

    • Ubuntu 通常预装 Python 3.x,且 python3-pip 是独立包。
    • ACL3 默认也提供 Python 3.6+,但包名可能不同。更重要的是,许多 Python 库依赖的系统 C 库(如 glibc, openssl)版本不同。
    • 适配动作:如果项目重度依赖 Python,建议继续使用虚拟环境(venv/poetry)隔离依赖,不要依赖系统全局 Python。检查 requirements.txt 中的二进制依赖(如 lxml, cryptography),确保它们在 ACL3 上有对应的 wheel 包或头文件可用。
  • Node.js / Java / Go:

    • 这些语言运行时通常不随系统默认安装。你需要通过官方源、NVM 或手动下载二进制包进行安装。
    • 适配动作:统一使用容器化或版本管理器(如 nvm, sdkman)来管理运行时,避免与系统库冲突。

2. 系统服务管理(Systemd vs Upstart/SysVinit)

Ubuntu 16.04 及以后全面转向 systemd,ACL3 也是 systemd。这一点表面看一致,但细节有差异。

  • Service 文件路径与语法:

    • 自定义服务的 .service 文件路径在两者中都是 /etc/systemd/system/,语法基本兼容。
    • 适配动作:检查你的自定义 service 文件中是否有特定于 Debian/Ubuntu 的路径引用(如 /var/run vs /run,ACL3 中 /var/run 是符号链接到 /run,但最好直接使用 /run)。
    • 开机启动项:如果使用 update-rc.d 或 chkconfig,需改为 systemctl enable/disable。
  • 日志查看:

    • Ubuntu: tail -f /var/log/syslog
    • ACL3: journalctl -u <service_name> 或 /var/log/messages
    • 适配动作:修改监控脚本和日志轮转配置(logrotate)。ACL3 的 logrotate 配置目录可能在 /etc/logrotate.d/,但具体策略可能因包而异。

3. 网络配置与防火墙

  • 网络接口命名:

    • Ubuntu: 常见 eth0, ens5 等,由 Netplan 或 NetworkManager 管理。
    • ACL3: 传统使用 ifcfg-* 脚本(位于 /etc/sysconfig/network-scripts/),但新版也支持 NetworkManager。阿里云 ECS 默认可能使用 cloud-init 动态配置 IP。
    • 适配动作:如果你习惯手动编辑 /etc/network/interfaces,这在 ACL3 上无效。需改用 nmcli 或编写 ifcfg 脚本。强烈建议使用云厂商提供的初始化脚本或 cloud-init 来管理网络,而非硬编码。
  • 防火墙:

    • Ubuntu: 常用 ufw 或 iptables。
    • ACL3: 默认使用 firewalld(基于 firewalld + iptables/nftables)。
    • 适配动作:停止使用 ufw。学习并使用 firewall-cmd 命令开放端口。例如:firewall-cmd --permanent --add-port=80/tcp && firewall-cmd --reload。

4. 内核与硬件驱动

Alibaba Cloud Linux 3 使用了定制化的内核(基于 kernel 4.19 或 5.10,取决于具体小版本和实例类型),针对阿里云虚拟化进行了优化。

  • 内核模块:

    • 如果你的应用依赖特定的内核模块(如某些 SSD 驱动、GPU 直通驱动),需确认这些模块在 ACL3 内核中是否可用。
    • 适配动作:一般用户态应用无影响。如果是内核级开发,需重新编译模块并测试。
  • GRUB 配置:

    • Ubuntu: /etc/default/grub
    • ACL3: /etc/default/grub,但参数格式和默认值可能不同。
    • 适配动作:如果需要调整内核启动参数(如关闭透明大页 THP 以提升数据库性能),需在 ACL3 中正确修改 grub 配置并执行 grub2-mkconfig -o /boot/grub2/grub.cfg。

5. 文件系统与存储

  • XFS vs EXT4:

    • Ubuntu 云服务器镜像常用 EXT4。
    • ACL3 默认推荐 XFS 文件系统(尤其在数据盘挂载时)。
    • 适配动作:如果涉及磁盘格式化,注意 ACL3 上创建 XFS 分区后,inode 数量、块大小等参数可能与预期不同。XFS 不支持在线缩小,扩容需谨慎规划。
  • Swap 处理:

    • ACL3 对 swap 的使用策略可能与 Ubuntu 不同(vm.swappiness 默认值)。
    • 适配动作:检查 /etc/sysctl.conf 中的 vm.swappiness 设置,根据应用特性调整(如 MySQL 建议设为 1)。

6. 安全与合规

  • SELinux:

    • Ubuntu: 默认禁用 AppArmor(虽存在但非强制)。
    • ACL3: 默认启用 SELinux。这是最大的“坑”之一。
    • 适配动作:
      1. 首选方案:正确配置 SELinux 策略标签(chcon, semanage)。例如,Web 服务器文件需要正确的 httpd_sys_content_t 标签。
      2. 次选方案:如果应用复杂且难以调试 SELinux 拒绝日志(/var/log/audit/audit.log),可暂时设置为 Permissive 模式进行测试,但生产环境不建议永久 Disabled,除非你有明确的合规豁免。
      3. 关键:在迁移初期,务必检查应用日志中是否有 “Permission denied” 错误,这很可能是 SELinux 拦截所致。
  • 密码策略:

    • ACL3 遵循 PAM 更严格的安全策略,可能要求密码复杂度更高。
    • 适配动作:检查 /etc/pam.d/system-auth 和 /etc/security/passwdqc.conf,确保不会因密码策略导致自动化登录失败。

7. 迁移实操建议

  1. 并行运行测试:不要直接在生产环境切换。先搭建一个 ACL3 测试机,部署应用,对比功能、性能、日志。
  2. 使用 Cloud-Init:阿里云 ECS 推荐使用 cloud-init 进行初始化。确保你的 AMI 镜像包含最新的 cloud-init 版本,以便在新系统中能正确获取元数据、主机名和网络配置。
  3. 备份与快照:迁移前对源 Ubuntu 实例打快照。ACL3 实例创建后,也立即打快照。
  4. 依赖扫描:使用工具如 auditbeat 或简单的 strace 监控应用启动时的系统调用,识别缺失的动态链接库(.so 文件)。ACL3 的 glibc 版本较新,旧的二进制文件可能无法直接运行(需重新编译或使用兼容层)。
  5. 性能基准测试:ACL3 内核针对阿里云虚拟化做了大量优化(如 virtio-net, virtio-blk 增强)。迁移后应重新进行压测,可能会发现网络吞吐和 IOPS 有所提升,但也可能因 SELinux 或调度策略变化导致波动。

总结

从 Ubuntu 到 ACL3 3.2104 的迁移,核心挑战在于 包管理生态的差异 和 SELinux 的安全模型。只要处理好这三点:

  1. 重写依赖安装脚本(yum/dnf);
  2. 适应 firewalld 和 systemd 的服务管理;
  3. 正确处理 SELinux 策略;

迁移过程将是可控的。对于大多数 Web 应用、微服务架构,由于容器化(Docker/K8s)的普及,这种迁移的影响会被进一步隔离在容器外部,因此实际工作量可能比你想象的要小。但对于深度绑定系统库的传统单体应用,则需要细致的适配工作。