想把CentOS 7直接升级到Rocky Linux 9?这事儿听起来有点“疯狂”,毕竟中间隔了一个大版本。但现实是,生产环境里总有些服务器因为各种原因,需要一步到位完成这种跨越。好消息是,这条路确实存在;坏消息是,它只有一条狭窄且必须严格遵循的通道。

这条通道的核心,就是dnf distro-sync --allowerasing这个命令。可以说,它是完成这次“直接跨大版本迁移”的唯一钥匙。它的作用在于强制替换所有不兼容的软件包,并解决复杂的依赖冲突。不过,这把钥匙必须配合三把精确的“锁芯”——也就是前置的清理、密钥导入和仓库配置。这三步顺序一旦出错,整个迁移过程就会卡在依赖冲突或签名验证失败上,前功尽弃。
为什么不能用 yum swap 或升级脚本?
这得从底层说起。CentOS 7的“心脏”是yum、Python 2.7和rpm 4.11,而Rocky Linux 9则换成了dnf、Python 3.9和rpm 4.18。这已经不是简单的版本更新,而是整个工具链的断层。所以,那些基于yum swap或者某些自动化升级脚本的方案,在这里完全行不通。
市面上常提的“ELevate + Leapp”方案,其实也绕不开这个断层。它的真实路径是要求你先升级到Rocky 8这个中间态,然后再升到9。对于追求一步到位的生产环境而言,唯一可行的路,就是“仓库替换 + 全量同步”。这本质上不是一次传统意义上的“升级”,而是一次彻底的“系统替换”。
关键三步:清源、换钥、同步
这三步环环相扣,顺序绝对不能乱。任何一步的缺失或错序,都会导致dnf distro-sync因为元数据混乱而报错。
- 第一步:清源。 这是为了和过去彻底告别。执行
yum clean all && rm -rf /etc/yum.repos.d/CentOS-*,清空所有CentOS 7的仓库残留,为新系统扫清障碍。 - 第二步:换钥。 新系统需要新的身份凭证。通过
rpm --import https://dl.rockylinux.org/pub/rocky/RPM-GPG-KEY-rockyofficial导入Rocky官方的GPG密钥,确保后续安装包的完整性和真实性。 - 第三步:配仓。 告诉系统去哪里获取新的“血液”。在
/etc/yum.repos.d/rocky.repo中配置Rocky 9的仓库。这里有个关键细节:baseurl必须明确指向$releasever为9的路径。为了提高速度,国内用户可以使用阿里云镜像,例如https://mirrors.aliyun.com/rockylinux/9/BaseOS/x86_64/os/。
执行同步时最常遇到的错误
准备工作做完,执行dnf distro-sync --allowerasing时,最常见的拦路虎就是各种冲突报错,比如经典的“Transaction check error: package xxx conflicts with file from package yyy”。
这类问题,十有八九是旧系统的“顽固分子”没清理干净——要么是残留的centos-release系列包,要么是那些不再需要的旧内核。在按下同步键之前,务必再执行一次深度清理:
- 强制卸载CentOS身份包:
rpm -e --nodeps centos-release centos-gpg-keys centos-repos - 清理非当前运行的内核:
rpm -qa | grep kernel | grep -v "$(uname -r)" | xargs -r rpm -e --nodeps - 最后确认一下:运行
rpm -q rocky-release应该能查到包,而dnf repolist列出的仓库应该只有Rocky 9的。
迁移后必须验证的三项
命令执行成功,系统重启了,这就算大功告成了吗?远不止。同步成功只意味着系统能启动,但能否稳定运行业务,还得看下面这三项验证有没有漏掉。任何一项出问题,服务都可能在下一次重启后“趴窝”。
- 服务自启项: 运行
systemctl list-unit-files --state=enabled,仔细检查关键服务如sshd(远程连接)、firewalld(防火墙)、NetworkManager(网络)等是否被正确设置为开机启用。迁移过程中,这些配置有可能丢失。 - 核心驱动模块: 通过
lsmod | grep -E "(xfs|ext4|nvme|virtio)"确认必要的文件系统和硬件驱动模块已经加载。这里有个细节:Rocky 9默认更倾向于XFS,而很多CentOS 7服务器根分区用的是ext4。如果你的根分区是ext4,这本身没问题,但要确保相关模块正常。 - 启动错误日志: 执行
journalctl -b -p 3,仔细筛查本次启动过程中所有级别为error(3级)的日志。重点关注systemd、kernel和dbus这几个核心单元的报错信息,它们往往是深层问题的信号。
话说回来,整个迁移过程中,最大的隐性成本往往不在这些系统命令的执行上,而在于应用层的适配。系统底层的glibc从2.17跃升到2.34,这个变化是巨大的。所有那些静态链接的,或者硬编码了LD_LIBRARY_PATH的二进制程序——比如一些老版本的Jenkins插件、定制的监控袋里(agent)——都可能因此“水土不服”。所以,千万别只满足于系统能跑起来,真正的成功标准是:让系统上跑的业务,也能顺畅地“动起来”。这才是迁移的最终目的。
