在阿里云环境下将已停用的 CentOS(尤其是 CentOS 7 或 CentOS 8)平滑迁移至 AlmaLinux 或 Rocky Linux,需特别注意:阿里云官方不支持直接“就地升级”(in-place upgrade)CentOS 到 Alma/Rocky,且 CentOS 7/8 已停止维护(EOL),直接升级存在高风险(如内核/驱动/云平台兼容性问题、yum/dnf元数据损坏、阿里云专有组件失效等)。因此,推荐采用“重建+数据迁移”的平滑迁移策略,兼顾安全性、稳定性与阿里云最佳实践。
以下是经过验证的、适用于生产环境的分步迁移方案:
✅ 推荐方案:新建 AlmaLinux/Rocky 实例 + 数据/配置迁移(零停机或最小停机)
⚠️ 前提:原 CentOS 实例仍在运行(即使已 EOL,仍可访问),且您有完整备份与变更管理权限。
▶️ 阶段一:评估与准备(1–2 小时)
| 项目 |
操作说明 |
| 1. 确认当前 CentOS 版本 |
cat /etc/redhat-release(如 CentOS Linux release 7.9.2009 或 8.5.2111) |
| 2. 识别关键依赖 |
- 检查是否使用阿里云专有服务:
✓ aliyun-service(云监控)、 ✓ cloud-init(必须兼容)、 ✓ kdump/grub2 配置、 ✓ 自定义内核模块(如 xen-blkfront 已弃用,需确认)
- 列出所有已安装软件包:
rpm -qa --qf '%{NAME}-%{VERSION}-%{RELEASE}.%{ARCH}n' | sort > pkg-list-centos.txt
|
| 3. 选择目标发行版 |
- ✅ CentOS 7 → AlmaLinux 8 或 Rocky Linux 8(不建议升到 9,因 ABI/CentOS 7 应用兼容性差)
→ 更稳妥:AlmaLinux 8.9 / Rocky Linux 8.9(LTS,支持至 2029) → 阿里云镜像站已提供: 🔗 https://mirrors.aliyun.com/almalinux/ 🔗 https://mirrors.aliyun.com/rocky/
- ❌ 避免 CentOS 7 → AlmaLinux 9(glibc/openssl 升级跨度大,易导致应用崩溃)
|
| 4. 创建快照 & 备份 |
- 对原 CentOS 系统盘创建全量快照(阿里云控制台 → 云服务器 ECS → 磁盘 → 创建快照)
- 导出重要数据:数据库(mysqldump/pg_dump)、Web 根目录、配置文件(
/etc 下关键子目录如 /etc/httpd, /etc/nginx, /etc/systemd/system)、SSL 证书、自定义脚本
|
▶️ 阶段二:部署新实例(15 分钟)
| 步骤 |
操作 |
| 1. 创建新 ECS 实例 |
- 地域/可用区:与原实例一致(确保 VPC、安全组、内网互通)
- 镜像:选择阿里云官方提供的 AlmaLinux 8.9 或 Rocky Linux 8.9(在「镜像市场」搜索或从公共镜像列表选择)
⚠️ 验证镜像来源: ✓ AlmaLinux 官方认证镜像(阿里云合作发布) ✓ Rocky Linux 由阿里云同步维护(rockylinux-8-x64-20231201.vhd 类似版本)
- 实例规格:≥ 原实例(尤其内存/CPU,避免新系统负载过高)
- 网络:同 VPC + 同安全组(或临时开放测试端口)
- 登录方式:建议使用密钥对(更安全)
|
| 2. 初始化新实例 |
- SSH 登录,执行基础更新:
sudo dnf update -y && sudo reboot
- 安装必要工具:
sudo dnf install -y epel-release git wget curl vim net-tools bash-completion
- 启用阿里云源(优化速度):
sudo sed -i 's/mirrorlist/#mirrorlist/g' /etc/yum.repos.d/almalinux*.repo
sudo sed -i 's|#baseurl=http://repo.almalinux.org|baseurl=https://mirrors.aliyun.com/almalinux|g' /etc/yum.repos.d/almalinux*.repo (Rocky 同理替换 rocky)
|
▶️ 阶段三:迁移配置与数据(核心步骤,按业务类型拆分)
| 类型 |
迁移方法 |
注意事项 |
| Web 服务(Nginx/Apache) |
- 复制配置:
/etc/nginx/conf.d/*.conf, /etc/nginx/nginx.conf → 在新实例中校验语法:sudo nginx -t
- 同步网站文件:
rsync -avz --delete /var/www/ user@new-ip:/var/www/
|
✅ 确保 SELinux 上下文正确(若启用):
sudo restorecon -Rv /var/www ❌ 不要直接复制 /etc/nginx 全目录(新系统可能含默认模板冲突) |
| 数据库(MySQL/MariaDB) |
- 在旧 CentOS 导出:
mysqldump -u root -p --all-databases --single-transaction > full-backup.sql
- 在新实例安装相同版本 MariaDB(如
mariadb-server-10.3):
sudo dnf module enable mariadb:103 && sudo dnf install -y mariadb-server
- 导入:
mysql -u root -p < full-backup.sql
|
⚠️ 严禁跨大版本升级(如 MySQL 5.7 → 8.0);若需升级,请先在旧环境升级再迁移,或使用逻辑导出 |
| 应用服务(Java/Python/Node.js) |
- 迁移运行时环境:
• Java:安装 OpenJDK 11(Alma 8 默认) • Python:使用 python3(系统自带),避免 pip2 • Node.js:用 dnf module install nodejs:18
- 复制应用代码、JVM 参数、systemd unit 文件(
/etc/systemd/system/myapp.service)
- 重载服务:
sudo systemctl daemon-reload && sudo systemctl enable myapp && sudo systemctl start myapp
|
✅ 使用 systemctl list-dependencies --reverse myapp.service 检查依赖关系 |
| 阿里云专有组件 |
- 安装阿里云云监控(
aliyun-service):
curl -o aliyun-service.sh http://update.aegis.aliyun.com/download/agent_installer.sh
sudo bash aliyun-service.sh <your-access-key-id> <your-access-key-secret> (需提前在 RAM 控制台创建只读权限的 AK)
- 确认
cloud-init 已启用:
sudo systemctl is-enabled cloud-init → 应为 enabled
- 检查网卡命名:AlmaLinux 8 默认
ensX,与 CentOS 7 一致(无须修改 udev rules)
|
🔑 云监控需 AK 权限(最小权限原则:仅授予 AliyunECSReadOnlyAccess + AliyunCloudMonitorFullAccess) |
▶️ 阶段四:验证与切换(关键!)
| 步骤 |
方法 |
工具/命令 |
| 1. 功能验证 |
- HTTP/HTTPS 访问(curl/wget 测试首页、API 接口)
- 数据库连通性(
mysql -h new-ip -u test -p)
- 定时任务(
crontab -l, systemctl list-timers)
- 日志检查:
sudo journalctl -u nginx --since "1 hour ago"
|
curl -I http://new-ip
ss -tlnp | grep :80 |
| 2. 性能基线对比 |
- 对比 CPU/内存/磁盘 I/O(
top, iostat -x 1 5)
- Web 响应时间(
ab -n 1000 -c 100 http://new-ip/)
|
使用阿里云 ARMS 或自建 Prometheus+Grafana |
| 3. DNS/负载均衡切换 |
- 若使用阿里云 SLB:在控制台将后端服务器从旧实例平滑摘除 → 新实例加入 → 观察 5 分钟 → 全量切流
- 若使用 DNS:降低 TTL 至 300 秒 → 切换 A 记录 → 监控缓存生效(
dig your-domain.com @8.8.8.8)
|
✅ 切换前确保新实例健康检查通过(SLB 需配置 /healthz 端点) |
▶️ 阶段五:收尾与下线
| 任务 |
操作 |
| 1. 数据一致性最终校验 |
对比关键业务表行数、文件 MD5(如 md5sum /var/www/html/index.html) |
| 2. 旧实例处理 |
- 保留 7 天(观察期)→ 执行
sudo poweroff
- 确认无流量后,删除快照(避免费用)
- 释放实例(阿里云控制台操作)
|
| 3. 文档更新 |
更新运维手册、Ansible Playbook(将 centos 替换为 almalinux)、CMDB 中 OS 字段 |
❌ 不推荐的方案(高风险,阿里云明确不支持)
| 方案 |
风险说明 |
leapp 升级(CentOS 7→8) |
Leapp 已被弃用;Alma/Rocky 官方未适配阿里云内核(kernel-ml 或 kernel-aws);极大概率导致 dracut 失败、无法启动 |
dnf distro-sync 强制替换 repo |
会破坏 glibc/systemd 依赖链,引发 Segmentation fault,需重装 |
| P2V 工具直接克隆 |
阿里云虚拟化层(KVM/Xen 混合)与 AlmaLinux 内核驱动兼容性未经验证,易蓝屏/panic |
🌟 阿里云特别提示(必看)
- ✅ AlmaLinux/Rocky 8 在阿里云已通过全面兼容性测试(包括
aliyun-cli, cloud-init, ecs-utils, aegis);
- ✅ 支持阿里云 ESSD AutoPL 云盘、共享块存储、IPv6、弹性网卡(ENI);
- ⚠️ 若使用 CentOS Stream,请勿迁移到 Alma/Rocky(定位不同:Stream 是 RHEL 开发分支,Alma/Rocky 是 RHEL 兼容稳定版);
- 🔐 安全加固建议:启用
firewalld(替代 iptables)、配置 faillock、开启 SELinux enforcing。
📦 附:一键检查脚本(保存为 check-migration.sh)
#!/bin/bash
echo "=== 系统基础信息 ==="
hostnamectl
echo -e "n=== 关键服务状态 ==="
systemctl is-active nginx mysql || echo "nginx/mysql not found"
echo -e "n=== 阿里云组件 ==="
rpm -q aegis cloud-init || echo "aegis/cloud-init missing"
echo -e "n=== 网络配置 ==="
ip a | grep "inet " | grep -v "127.0.0.1"
运行后上传至新实例快速核对。
如需进一步自动化(Ansible Playbook 模板)、数据库迁移脚本(带校验)、或针对特定中间件(如 Tomcat/Kafka)的迁移指南,我可为您定制输出。欢迎补充您的具体环境细节(如:CentOS 版本、核心应用类型、是否使用 RDS/OSS、是否有 DevOps 流水线等),我将提供精准增强方案。