从 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 源中,需确认官方仓库或自行编译。
- Ubuntu:
-
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 包或头文件可用。
- Ubuntu 通常预装 Python 3.x,且
-
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/runvs/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/,但具体策略可能因包而异。
- Ubuntu:
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: 常见
-
防火墙:
- Ubuntu: 常用
ufw或iptables。 - ACL3: 默认使用
firewalld(基于 firewalld + iptables/nftables)。 - 适配动作:停止使用
ufw。学习并使用firewall-cmd命令开放端口。例如:firewall-cmd --permanent --add-port=80/tcp && firewall-cmd --reload。
- Ubuntu: 常用
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。
- Ubuntu:
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。这是最大的“坑”之一。
- 适配动作:
- 首选方案:正确配置 SELinux 策略标签(chcon, semanage)。例如,Web 服务器文件需要正确的 httpd_sys_content_t 标签。
- 次选方案:如果应用复杂且难以调试 SELinux 拒绝日志(/var/log/audit/audit.log),可暂时设置为 Permissive 模式进行测试,但生产环境不建议永久 Disabled,除非你有明确的合规豁免。
- 关键:在迁移初期,务必检查应用日志中是否有 “Permission denied” 错误,这很可能是 SELinux 拦截所致。
-
密码策略:
- ACL3 遵循 PAM 更严格的安全策略,可能要求密码复杂度更高。
- 适配动作:检查
/etc/pam.d/system-auth和/etc/security/passwdqc.conf,确保不会因密码策略导致自动化登录失败。
7. 迁移实操建议
- 并行运行测试:不要直接在生产环境切换。先搭建一个 ACL3 测试机,部署应用,对比功能、性能、日志。
- 使用 Cloud-Init:阿里云 ECS 推荐使用 cloud-init 进行初始化。确保你的 AMI 镜像包含最新的 cloud-init 版本,以便在新系统中能正确获取元数据、主机名和网络配置。
- 备份与快照:迁移前对源 Ubuntu 实例打快照。ACL3 实例创建后,也立即打快照。
- 依赖扫描:使用工具如
auditbeat或简单的strace监控应用启动时的系统调用,识别缺失的动态链接库(.so文件)。ACL3 的 glibc 版本较新,旧的二进制文件可能无法直接运行(需重新编译或使用兼容层)。 - 性能基准测试:ACL3 内核针对阿里云虚拟化做了大量优化(如 virtio-net, virtio-blk 增强)。迁移后应重新进行压测,可能会发现网络吞吐和 IOPS 有所提升,但也可能因 SELinux 或调度策略变化导致波动。
总结
从 Ubuntu 到 ACL3 3.2104 的迁移,核心挑战在于 包管理生态的差异 和 SELinux 的安全模型。只要处理好这三点:
- 重写依赖安装脚本(yum/dnf);
- 适应 firewalld 和 systemd 的服务管理;
- 正确处理 SELinux 策略;
迁移过程将是可控的。对于大多数 Web 应用、微服务架构,由于容器化(Docker/K8s)的普及,这种迁移的影响会被进一步隔离在容器外部,因此实际工作量可能比你想象的要小。但对于深度绑定系统库的传统单体应用,则需要细致的适配工作。
云技术博客