跳转到内容

迁移到 AlmaLinux

本文将指导你使用 AlmaLinux 官方迁移工具 almalinux-deploy,从 CentOS 7/8、CentOS Stream、RHEL 或其他 EL 兼容发行版迁移到 AlmaLinux。

在开始迁移之前,请确认以下事项:

  • 操作系统版本:CentOS 7、CentOS 8、CentOS Stream 8/9、RHEL 7/8/9、Oracle Linux、Rocky Linux 等 EL 兼容系统
  • 磁盘空间/var 分区至少有 5 GB 可用空间(用于下载和缓存软件包)
  • 网络连接:服务器能够访问外网以下载 AlmaLinux 软件包
  • root 权限:迁移过程需要 root 或 sudo 权限
  • 完整备份:务必在迁移前完成系统快照或完整备份

重要提示: 迁移操作会替换系统核心软件包,存在一定风险。请务必在测试环境验证后再在生产环境执行。

确认当前操作系统版本
$ cat /etc/os-release
备份已安装软件包列表
$ rpm -qa --queryformat '%{NAME}-%{VERSION}-%{RELEASE}.%{ARCH}\n' | sort > ~/packages-before-migration.txt
备份运行中的服务
$ systemctl list-units --type=service --state=running > ~/services-before-migration.txt
备份 yum/dnf 仓库配置
$ cp -a /etc/yum.repos.d/ ~/yum.repos.d.bak/
备份网络配置
$ nmcli connection show > ~/network-before-migration.txt
$ ip addr show > ~/ip-addr-before-migration.txt

almalinux-deploy 是 AlmaLinux 官方提供的迁移脚本,托管在 GitHub 上。

安装必要工具
$ sudo dnf install -y curl
下载迁移脚本
$ curl -O https://raw.githubusercontent.com/AlmaLinux/almalinux-deploy/master/almalinux-deploy.sh
验证脚本已下载
$ ls -la almalinux-deploy.sh

提示: 如果你的服务器无法直接访问 GitHub,可以在其他机器下载后通过 scp 传输到目标服务器。

基本迁移(CentOS 8 / CentOS Stream)

Section titled “基本迁移(CentOS 8 / CentOS Stream)”
运行迁移脚本
$ sudo bash almalinux-deploy.sh

脚本会自动完成以下操作:

  1. 检测当前操作系统版本
  2. 下载 AlmaLinux 的 GPG 密钥和软件仓库配置
  3. 移除 CentOS 特有的软件包(如 centos-releasecentos-logos 等)
  4. 安装 AlmaLinux 对应的软件包
  5. 使用 dnf distro-sync 同步所有软件包到 AlmaLinux 版本

CentOS 7 迁移需要先升级到 EL8,因为 almalinux-deploy 主要支持 EL8+ 的直接迁移。AlmaLinux 提供了 ELevate 项目来完成跨大版本升级。

安装 ELevate 仓库(CentOS 7)
$ sudo yum install -y http://repo.almalinux.org/elevate/elevate-release-latest-el7.noarch.rpm
安装 Leapp 升级工具
$ sudo yum install -y leapp-upgrade leapp-data-almalinux
运行升级前检查
$ sudo leapp preupgrade

注意: leapp preupgrade 会生成一份报告,列出所有需要手动处理的问题。请仔细阅读 /var/log/leapp/leapp-report.txt 并逐一解决。

查看预升级报告
$ sudo cat /var/log/leapp/leapp-report.txt
确认无问题后执行升级
$ sudo leapp upgrade

升级完成后系统会自动重启,进入 AlmaLinux 8。

如果你需要迁移到特定的 AlmaLinux 版本:

迁移到 AlmaLinux 9(从 EL9 系统)
$ sudo bash almalinux-deploy.sh -t 9

迁移过程中,第三方仓库可能会导致软件包冲突。以下是常见的处理方法。

EPEL 仓库通常可以自动适配,但建议迁移前临时禁用:

迁移前禁用 EPEL
$ sudo dnf config-manager --set-disabled epel epel-modular 2>/dev/null
迁移完成后重新启用 EPEL
$ sudo dnf install -y epel-release
$ sudo dnf config-manager --set-enabled epel
迁移前列出所有已启用的第三方仓库
$ dnf repolist --enabled | grep -v -E '^(baseos|appstream|extras|powertools|crb)'
临时禁用所有第三方仓库
$ sudo dnf config-manager --set-disabled remi* ius* rpmfusion*

迁移完成后,需要重新安装适配 AlmaLinux 的第三方仓库版本:

示例:重新安装 Remi 仓库(AlmaLinux 8)
$ sudo dnf install -y https://rpms.remirepo.net/enterprise/remi-release-8.rpm
示例:重新安装 Remi 仓库(AlmaLinux 9)
$ sudo dnf install -y https://rpms.remirepo.net/enterprise/remi-release-9.rpm

如果迁移过程中出现包冲突:

查看哪些包不属于 AlmaLinux 仓库
$ rpm -qa --qf '%{NAME} %{VENDOR}\n' | grep -v "AlmaLinux" | sort
强制同步所有包到 AlmaLinux 版本
$ sudo dnf distro-sync -y
验证系统版本
$ cat /etc/os-release

输出应显示 AlmaLinux 相关信息:

NAME="AlmaLinux"
VERSION="8.9 (Midnight Oncilla)"
ID="almalinux"
验证发行版标识包
$ rpm -qa | grep almalinux-release
检查是否还有残留的 CentOS 包
$ rpm -qa | grep -i centos

如果有残留包,可以手动移除或替换:

移除残留的 CentOS 包(如有)
$ sudo dnf remove centos-logos centos-indexhtml 2>/dev/null
$ sudo dnf distro-sync -y
确保 GRUB 配置正确
$ sudo grub2-mkconfig -o /boot/grub2/grub.cfg

对于 EFI 系统:

EFI 系统重建 GRUB
$ sudo grub2-mkconfig -o /boot/efi/EFI/almalinux/grub.cfg
重启系统
$ sudo reboot
重启后验证内核
$ uname -r
验证所有服务正常运行
$ systemctl list-units --type=service --state=failed

确认你的源系统版本在支持列表中。CentOS 6 及更早版本不被支持。

确认系统版本
$ cat /etc/redhat-release

可能是网络问题导致无法下载密钥。

手动导入 AlmaLinux GPG 密钥
$ sudo rpm --import https://repo.almalinux.org/almalinux/RPM-GPG-KEY-AlmaLinux-8

通常是第三方仓库包冲突导致的。

排除特定包后重试同步
$ sudo dnf distro-sync -y --exclude=<冲突包名>
如果问题严重,清除缓存后重试
$ sudo dnf clean all
$ sudo dnf distro-sync -y

如果重启后进入 GRUB rescue 或无法引导:

  1. 使用安装介质或救援模式启动
  2. 挂载根分区
  3. chroot 到系统中
  4. 重新安装内核和 GRUB
救援模式下修复引导
$ sudo mount /dev/sda2 /mnt
$ sudo mount /dev/sda1 /mnt/boot
$ sudo chroot /mnt
$ dnf reinstall kernel-core grub2-efi-x64 shim-x64
$ grub2-mkconfig -o /boot/efi/EFI/almalinux/grub.cfg
$ exit
$ sudo reboot

AlmaLinux 支持 Secure Boot,但迁移后可能需要重新注册:

检查 Secure Boot 状态
$ mokutil --sb-state