努力
加油

如果之前用CentOS 8,迁移到Alibaba Cloud Linux 2.1903 LTS需要做哪些适配?

从 CentOS 8 迁移到 Alibaba Cloud Linux 2.1903 LTS,这不仅仅是换个名字那么简单,本质上是一次跨大版本、跨底层发行版体系的“换血”手术。

先泼盆冷水:CentOS 8 是基于 RHEL 8 体系的(RPM + Systemd + DNF),而 Alibaba Cloud Linux 2.1903 LTS 是基于 RHEL 7/CentOS 7 体系的(RPM + Systemd + Yum)。这意味着你的包管理器变了,系统服务初始化逻辑变了,很多依赖库的版本也变了。

如果直接尝试 yum update 或者简单的文件拷贝,必死无疑。以下是作为过来人总结的真实迁移路径和避坑指南。

核心结论:不要试图原地升级

千万不要在现有的 CentOS 8 系统上尝试通过 yum 或 dnf 直接升级到 Alibaba Cloud Linux 2。这是两个不同的代码分支,依赖关系完全冲突。

正确的做法只有两条路:

  1. 全新安装+数据迁移(推荐,最稳妥)
  2. P2V 工具迁移(适合不想重装系统的场景,但仍有风险)

方案一:全新安装 + 数据/配置迁移(推荐)

这是最干净、隐患最少的方式。Alibaba Cloud Linux 是阿里云官方推荐的操作系统,深度优化了内核和网络栈,性能通常优于原生 CentOS。

1. 准备工作

  • 备份!备份!备份!:无论哪种方案,确保你有完整的快照或异地备份。
  • 评估应用依赖:检查你的应用是否强依赖特定版本的 Python、PHP、Java 或数据库。ACL 2.1903 的内核和基础库版本较老(接近 CentOS 7),新软件可能需要编译安装或使用容器化部署。
  • 准备镜像:在阿里云控制台创建自定义镜像时,选择 Alibaba Cloud Linux 2.1903 LTS。

2. 系统层适配差异

特性 CentOS 8 Alibaba Cloud Linux 2.1903 LTS 适配注意
包管理器 dnf / rpm yum / rpm 脚本中的 dnf 需改为 yum
默认 Shell Bash (新版) Bash (兼容性好) 基本无感
网络管理 NetworkManager NetworkManager ACL 2 默认启用 NM,配置方式类似
安全模块 SELinux (Enforcing) SELinux (Permissive/Disabled by default in some images) 重点检查:ACL 2 镜像可能默认关闭或宽松处理 SELinux,如果你的应用强依赖 SELinux 策略,需重新配置
内核版本 4.18+ 4.19+ (定制内核) ACL 2 内核经过深度优化,驱动兼容性更好,但 API 层面需注意旧版内核特性

3. 具体迁移步骤

  1. 启动新实例:使用 Alibaba Cloud Linux 2.1903 LTS 镜像启动一台新的 ECS 实例。
  2. 安装基础环境:
    • 安装 Web 服务器(Nginx/Apache)、数据库(MySQL/PostgreSQL/MongoDB)、运行时环境(Node.js/Python/Java)。
    • 注意:由于 ACL 2 基于较老的 RHEL 7 生态,某些最新版的软件包可能在官方源中找不到。你可能需要:
      • 使用第三方源(如 EPEL, Remi for PHP)。
      • 使用 Docker/Podman 容器化部署(强烈推荐,隔离依赖问题)。
      • 从源码编译安装。
  3. 迁移数据:
    • 使用 rsync 或 scp 将 /var/www, /home, /etc/nginx, /etc/mysql 等关键目录从旧服务器同步到新服务器。
    • 如果是数据库,建议使用 mysqldump 或物理备份恢复,而不是直接复制数据文件(因为版本可能不同)。
  4. 配置调整:
    • 修改 Nginx/Apache 配置文件中的路径(如果之前用了绝对路径且硬编码)。
    • 检查 Crontab 定时任务,重新添加。
    • 检查防火墙规则(Firewalld vs Iptables)。ACL 2 默认使用 firewalld,与 CentOS 8 一致,但规则可能需要重新导入。
  5. 测试与割接:
    • 绑定临时域名或修改本地 Hosts 指向新 IP 进行功能测试。
    • 确认无误后,更换 DNS 解析。

方案二:使用 P2V 迁移工具(阿里云在线迁移)

如果你不能停机太久,或者应用极其复杂不愿重装,可以使用阿里云提供的在线迁移工具。

  1. 在 CentOS 8 服务器上安装迁移 Agent:
    • 下载阿里云的 aegis 或专门的迁移工具包。
    • 执行安装脚本,它会扫描系统状态并生成迁移任务。
  2. 在阿里云控制台发起迁移:
    • 选择“从其他云厂商/物理机迁移”。
    • 指定目标镜像为 Alibaba Cloud Linux 2.1903 LTS。
  3. 执行迁移:
    • 工具会将整个磁盘内容打包,通过网络传输到阿里云 OSS,然后转换为镜像。
    • 关键点:这个过程是全盘克隆,包括引导记录、内核参数等。
  4. 后续适配:
    • 迁移完成后,启动新实例。
    • 必须修改 GRUB 引导参数:因为从 CentOS 8 内核切换到 ACL 2 内核,initramfs 和 kernel 路径都变了。通常需要进入救援模式或使用 LiveCD 修复引导。
    • 网络配置重置:MAC 地址变化会导致网卡识别失败,需删除 /etc/sysconfig/network-scripts/ifcfg-eth0 中的 UUID 和 HWADDR,重启网络服务让 DHCP 重新获取或手动配置静态 IP。
    • SELinux 标签重建:由于文件系统上下文可能错乱,建议执行 restorecon -Rv / 或暂时禁用 SELinux。

⚠️ 警告:P2V 迁移跨大版本内核风险极高,容易遇到启动失败、驱动不匹配等问题。除非万不得已,否则不建议生产环境直接使用此方法。


常见坑点与解决方案

1. 依赖库版本过低

Alibaba Cloud Linux 2 的基础库(glibc, openssl, zlib 等)版本较低。

  • 现象:编译新版软件报错,提示 GLIBC_2.17 not found。
  • 解决:
    • 优先使用 Docker 容器,容器内可以包含任意版本的 glibc。
    • 如果必须裸机运行,考虑使用 pyenv、nvm 等工具管理语言环境,避免依赖系统级库。
    • 对于 Java 应用,只要安装了 JDK 即可,不受影响。

2. 防火墙规则丢失

  • 现象:新服务器无法访问 80/443 端口。
  • 解决:ACL 2 默认启用 firewalld。
    systemctl enable firewalld
    systemctl start firewalld
    firewall-cmd --permanent --add-service=http
    firewall-cmd --permanent --add-service=https
    firewall-cmd --reload

3. SELinux 导致权限问题

  • 现象:Nginx 无法读取网站文件,日志报 Permission denied。
  • 解决:
    • 临时方案:setenforce 0(仅用于测试,生产环境慎用)。
    • 永久方案:修改 /etc/selinux/config 设为 disabled 或 permissive,然后重启。
    • 正确方案:学习并使用 chcon 或 restorecon 设置正确的 SELinux 上下文标签。

4. 时间同步

  • CentOS 8 默认用 chronyd,ACL 2 也支持 chronyd 和 ntpd。
  • 确保新服务器上 chronyd 服务正常运行,否则可能导致证书验证失败、日志时间混乱等问题。

为什么推荐 Alibaba Cloud Linux 2?

虽然迁移麻烦,但值得做,原因如下:

  1. 长期支持:2.1903 LTS 提供长达数年的安全更新,比 CentOS 8 已停止维护的状态更安全。
  2. 性能优化:针对阿里云硬件做了深度调优,网络吞吐、磁盘 IO 表现更好。
  3. 兼容性:完美兼容 CentOS/RHEL 生态,大多数命令和配置方式一致。
  4. 成本:免费使用,无需额外购买 OS 授权。

最后建议

  1. 最小化迁移原则:不要试图把旧服务器的所有角落都搬过去。只迁移必要的数据、代码和配置。
  2. 容器化是未来:如果可能,将应用拆分为微服务,使用 Docker 部署。这样你只需要迁移 Docker 镜像和数据卷,操作系统本身的差异被屏蔽掉。
  3. 灰度发布:先在一台小配置机器上测试迁移流程,成功后再操作生产环境。

迁移不是终点,而是架构优化的起点。祝顺利!