将 CentOS 8(已 EOL)平滑迁移到 AlmaLinux 或 Rocky Linux 是一项关键运维任务。由于 CentOS 8 在 2021-12-31 正式终止支持,继续使用存在严重安全与兼容性风险。以下是一套经过生产验证、低风险、可回滚的平滑迁移方案,适用于云服务器(如阿里云、腾讯云、AWS、Azure 等),以 AlmaLinux 8(推荐,社区活跃、Red Hat 兼容性强)为例,Rocky Linux 8 步骤几乎完全相同。
⚠️ 重要前提
- ✅ 仅适用于 CentOS 8.x(非 CentOS Stream);
- ✅ 迁移目标为同版本大系:CentOS 8 → AlmaLinux 8 / Rocky Linux 8(不跨主版本,如不可直迁至 AlmaLinux 9);
- ✅ 所有操作均在原系统内执行(in-place upgrade),无需重装或重建实例;
- ✅ 建议在非生产环境充分测试,并确保完整快照/备份(云平台快照 +
/etc,/home, 应用数据等逻辑备份)。
✅ 一、迁移前准备(必做)
1. 检查当前系统状态
# 确认是 CentOS 8(且非 Stream)
cat /etc/redhat-release
# 输出应为:CentOS Linux release 8.x.x
# 检查内核与架构(x86_64/aarch64)
uname -r && uname -m
# 更新当前系统至最新(修复潜在依赖问题)
sudo dnf update -y --refresh
# 清理旧包缓存
sudo dnf clean all
2. 备份关键配置(自动化脚本推荐)
# 创建备份目录
sudo mkdir -p /root/migration-backup
# 备份核心配置
sudo cp -a /etc/{yum.repos.d,selinux,systemd,firewalld,ssh} /root/migration-backup/
sudo cp -a /etc/{hosts,hostname,fstab,grub2} /root/migration-backup/
# 备份已安装包列表(用于验证)
rpm -qa --qf '%{NAME}-%{VERSION}-%{RELEASE}.%{ARCH}n' | sort > /root/migration-backup/rpm-list-before.txt
3. 停止非必要服务(降低迁移冲突风险)
# 示例(按需调整):
sudo systemctl stop docker nginx httpd mysql redis
# ⚠️ 注意:数据库服务停止前请确保已备份!
4. 安装必要工具
sudo dnf install -y dnf-plugins-core yum-utils python3-pip
✅ 二、执行迁移(AlmaLinux 8 为例)
✅ 推荐使用官方迁移工具
almalinux-deploy(由 AlmaLinux 团队维护,比手动替换 repo 更可靠)
方式一:使用官方 almalinux-deploy(首选 ✅)
# 下载并运行迁移脚本(自动检测、校验、替换)
curl -O https://raw.githubusercontent.com/AlmaLinux/almalinux-deploy/master/almalinux-deploy.sh
chmod +x almalinux-deploy.sh
# 🔍 首先预检(dry-run,不修改系统)
sudo ./almalinux-deploy.sh --dry-run
# ✅ 若预检通过(无 ERROR),执行实际迁移
sudo ./almalinux-deploy.sh
# 脚本会自动完成:
# - 替换所有 centos-* repo 为 almalinux-*;
# - 替换 gpgkeys;
# - 清理元数据并重置 DNF 缓存;
# - 升级所有基础包(kernel, glibc, systemd 等);
# - 生成新 initramfs & 更新 GRUB。
方式二:手动迁移(备选,适合定制化需求)
# 1. 备份原 repo
sudo mv /etc/yum.repos.d/CentOS-* /root/migration-backup/
# 2. 下载 AlmaLinux repo(国内用户建议用镜像提速)
sudo curl -o /etc/yum.repos.d/almalinux.repo https://mirrors.aliyun.com/almalinux/8/BaseOS/x86_64/os/repodata/repomd.xml?repo=BaseOS&arch=x86_64 | true
# 更规范做法(推荐):
sudo tee /etc/yum.repos.d/almalinux.repo << 'EOF'
[baseos]
name=AlmaLinux $releasever - BaseOS
baseurl=https://mirrors.aliyun.com/almalinux/$releasever/BaseOS/$basearch/os/
gpgcheck=1
enabled=1
gpgkey=https://mirrors.aliyun.com/almalinux/RPM-GPG-KEY-AlmaLinux
[appstream]
name=AlmaLinux $releasever - AppStream
baseurl=https://mirrors.aliyun.com/almalinux/$releasever/AppStream/$basearch/os/
gpgcheck=1
enabled=1
gpgkey=https://mirrors.aliyun.com/almalinux/RPM-GPG-KEY-AlmaLinux
[extras]
name=AlmaLinux $releasever - Extras
baseurl=https://mirrors.aliyun.com/almalinux/$releasever/extras/$basearch/os/
gpgcheck=1
enabled=1
gpgkey=https://mirrors.aliyun.com/almalinux/RPM-GPG-KEY-AlmaLinux
EOF
# 3. 清理并切换
sudo dnf clean all
sudo dnf distro-sync -y --releasever=8
# 4. 替换发行版标识文件(关键!)
sudo sed -i 's/CentOS/Linux/g' /etc/os-release
sudo sed -i 's/centos/almalinux/g' /etc/os-release
sudo sed -i 's/8.[0-9]*/8/g' /etc/os-release
# 手动确认 /etc/os-release 内容已更新为 AlmaLinux
cat /etc/os-release | grep -E "NAME|VERSION|ID"
✅ 三、迁移后验证与加固
1. 基础验证
# ✅ 检查 OS 信息
cat /etc/os-release # 应显示 ID=almalinux, NAME="AlmaLinux"
# ✅ 检查内核与基础包是否更新
uname -r # 应为 AlmaLinux 提供的 kernel(如 4.18.0-477.*)
rpm -q kernel glibc systemd
# ✅ 检查仓库源是否生效
dnf repolist # 应只显示 almalinux-* repo,无 centos-*(若有,禁用:sudo dnf config-manager --disable centos-*)
2. 关键服务验证(按需)
# 启动并检查核心服务
sudo systemctl start firewalld sshd chronyd
sudo systemctl enable firewalld sshd chronyd
sudo firewall-cmd --state # 应输出 running
# 验证网络、DNS、SELinux(若启用)
getenforce # 应为 Enforcing/Permissive(与迁移前一致)
3. 应用兼容性检查(重点!)
- ✅ Web 服务(Nginx/Apache):
nginx -t/httpd -t,重启服务 - ✅ 数据库(MySQL/PostgreSQL):启动服务,连接测试,检查字符集/权限
- ✅ Python/Node.js 环境:
python3 --version,node --version,验证 pip/npm 包 - ✅ 自定义脚本/定时任务:检查
/etc/cron.*,/var/spool/cron/ - ✅ SELinux 策略:若应用报 AVC denied,用
ausearch -m avc -ts recent | audit2why分析
4. 安全加固(迁移后立即执行)
# 更新全部包(含安全补丁)
sudo dnf update -y
# 安装 EPEL(如需)
sudo dnf install -y epel-release
# 可选:启用 AlmaLinux 安全公告订阅(https://wiki.almalinux.org/security/)
✅ 四、回滚方案(万一失败)
⚠️ 迁移前已创建云平台快照,则直接回滚最安全!
若需手动回滚(仅限未重启前):
# 1. 恢复原 repo
sudo rm -f /etc/yum.repos.d/almalinux.repo
sudo mv /root/migration-backup/CentOS-* /etc/yum.repos.d/
# 2. 清理并重装 CentOS 核心包(谨慎!)
sudo dnf clean all
sudo dnf distro-sync -y --releasever=8 --setopt=install_weak_deps=False
# 3. 恢复 os-release
sudo cp /root/migration-backup/os-release /etc/os-release # 如之前备份过
# 或手动编辑 /etc/os-release 恢复为 CentOS 内容
💡 提示:若已重启且系统异常,优先使用云平台快照恢复,切勿强行修复。
✅ 五、Rocky Linux 8 迁移差异说明
- 工具:使用
rocky-upgrade(https://github.com/rocky-linux/rocky-tools)curl -O https://raw.githubusercontent.com/rocky-linux/rocky-tools/main/rocky-upgrade chmod +x rocky-upgrade sudo ./rocky-upgrade --dry-run # 先预检 sudo ./rocky-upgrade - repo 地址替换为
https://mirrors.aliyun.com/rocky/8/... - 其余步骤(验证、回滚)完全一致。
🌟 最佳实践建议
| 项目 | 建议 |
|---|---|
| 时机 | 选择业务低峰期,预留 2 小时窗口(含测试) |
| 监控 | 迁移前后对比 df -h, free -h, ss -tuln |
| 日志 | 全程记录命令输出:script /root/migration.log |
| 云平台适配 | 阿里云/腾讯云需确认 cloud-init 兼容性(AlmaLinux 8 默认支持);AWS 需检查 ec2-net-utils 是否需更新 |
| 长期规划 | CentOS 8 → AlmaLinux 8 是过渡;建议 6–12 个月内升级至 AlmaLinux 9(RHEL 9 兼容) |
✅ 总结:
使用
almalinux-deploy.sh --dry-run预检 → 全量更新 → 严格验证 → 快速回滚能力 = 平滑迁移。
真正的“平滑”不在于速度,而在于可预测性、可观测性与可逆性。
如需我为你生成一键迁移脚本(含预检+备份+回滚函数) 或 针对特定应用(如宝塔面板、Docker、MySQL 8.0)的兼容性检查清单,欢迎随时提出,我可以立即为你定制。
CLOUD云枢