CentOS 7在2024年6月30日正式停止维护,意味着不再有安全补丁和漏洞修复。继续运行CentOS 7的生产环境,无异于在公网上裸奔。Rocky Linux作为与RHEL 100%二进制兼容的衍生版,是目前迁移路径中最平滑的选择。但平滑不代表零风险,运维团队在制定迁移方案时,必须对潜在的故障点有清晰的认知,并准备好切实可行的回滚路径。
迁移前的隐形风险:别让依赖关系成为定时炸弹很多人认为Rocky Linux就是换了个源的CentOS,直接执行迁移脚本就能搞定。这种认知在生产环境中极其危险。首先要排查的是第三方软件源。CentOS 7末期,很多运维人员为了获取高版本软件包,手动添加了EPEL、Remi、ELRepo甚至是一些小众的社区源。这些源在Rocky Linux 8或9上的兼容性没有经过长期验证。迁移前必须用rpm -qa --last命令导出所有已安装包的列表,逐一核对供应商。特别是那些从源码编译安装的软件,在Rocky Linux上可能因为glibc版本差异导致动态链接库缺失。
硬件驱动是另一个容易被忽略的雷区。如果服务器上运行着特定的RAID卡驱动、光纤卡驱动或闭源GPU驱动,迁移后内核版本升级可能导致驱动无法加载。建议在测试环境中先用Rocky Linux的安装ISO做一次救援模式启动,用lspci -k检查关键硬件是否被新内核识别。如果发现驱动缺失,不要贸然迁移,需要提前准备好厂商提供的EL8或EL9版本的驱动包。
应用兼容性方面,重点检查Python环境。CentOS 7默认的Python 2.7在Rocky Linux 8中依然可用但已不被推荐,而Rocky Linux 9直接移除了Python 2。如果你的运维脚本、监控插件或业务后端还依赖Python 2,迁移后这些工具会直接罢工。同样需要关注的是OpenSSL版本跳跃,从1.0.2升级到1.1.1或3.0,会导致一些老旧的加密算法被禁用,进而影响与第三方API的HTTPS通信。
迁移过程中的高危操作与规避策略执行迁移工具是风险最高的环节。目前主流的方案是使用Rocky Linux官方提供的migrate2rocky脚本。这个脚本的原理是替换所有CentOS标识的包为Rocky Linux的包,并处理依赖冲突。在执行前,必须确保系统处于最新状态,运行yum update -y把所有CentOS官方包更新到最终版本。如果系统长期没有更新,一次性执行迁移脚本极大概率会遇到依赖地狱,导致系统进入半迁移状态,既不是CentOS也不是Rocky Linux。
网络中断是迁移过程中最致命的问题。迁移脚本需要从远程仓库下载几百兆的RPM包,如果网络抖动导致下载中断,部分关键系统库可能被替换了一半。一旦glibc、openssl-libs这类核心库处于不一致状态,SSH连接会立刻断开,后续只能通过带外管理或机房现场操作。规避方法是使用screen或tmux会话执行迁移,并在本地提前搭建一个Rocky Linux的本地镜像仓库。用reposync工具把Rocky Linux的BaseOS和AppStream仓库同步到内网的一台HTTP服务器上,迁移时指向内网源,速度和稳定性都有保障。
第三方内核模块是另一个重灾区。如果当前系统安装了kmod类的驱动,比如某些阵列卡的管理工具,迁移脚本在替换内核时可能会因为模块签名验证失败而拒绝加载。在重启进入新内核前,务必检查/etc/modprobe.d/目录下是否有自定义的模块黑名单或参数配置,这些配置在新内核中可能语法不兼容。建议在重启前用dracut -f命令重新生成initramfs,确保所有必要的驱动模块都打包进去了。
文件系统与存储层的潜在冲突CentOS 7大量使用XFS文件系统,而Rocky Linux 8/9的XFS版本更新,默认启用了reflink和sparse inode等特性。虽然新内核挂载旧XFS分区是向下兼容的,但反过来不行。一旦在Rocky Linux下对XFS文件系统执行了xfs_growfs扩容或者用了reflink做文件克隆,这个文件系统就再也无法被CentOS 7的内核挂载。如果你的回滚方案依赖从备份恢复分区表,这个细节会让你在回滚时发现数据分区无法读取。
LVM卷组的元数据也会在迁移过程中被升级。如果系统使用了LVM快照或精简配置,迁移后的lvm2工具版本更高,会对元数据格式做自动升级。这意味着即使你把系统盘刷回CentOS 7的备份,数据盘上的LVM信息可能已经无法被旧版lvm2识别。在执行迁移前,必须用vgcfgbackup命令备份所有卷组的元数据到外部存储,这个备份文件是回滚时重建LVM配置的唯一希望。
对于使用多路径存储的SAN环境,device-mapper-multipath的配置文件语法在EL7和EL8之间有变化。原有的multipath.conf中一些参数名被废弃,比如getuid_callout被替换为uid_attribute。如果直接沿用旧配置,迁移后重启可能导致存储路径聚合失败,服务器无法发现LUN。必须在测试环境中先验证multipath -t输出的默认配置,再逐步合并自定义策略。
回滚方案的设计原则与具体步骤回滚方案必须在迁移前就完成验证,而不是出了问题才临时想办法。最可靠的回滚手段是基于块设备的全量备份。在迁移窗口开始前,用dd或者更高效的partclone工具对系统盘做逐块备份,备份文件存放在独立的备份服务器或外接存储上。不要依赖LVM快照作为回滚手段,因为快照本身依赖原始卷,一旦原始卷的元数据被破坏,快照也一起报废。
如果物理环境不允许全量块备份,可以采用文件级别的备份加引导修复的方案。用rsync -avz --delete把整个根文件系统同步到备份目录,同时用tar打包/etc、/boot、/var/lib/rpm这三个关键目录。回滚时先用LiveCD启动,格式化原系统分区,把rsync备份还原回去,然后chroot进入系统,用备份的RPM数据库重建引导配置。具体命令如下:
# 备份阶段,在迁移前执行 rsync -avz --exclude='/proc/*' --exclude='/sys/*' --exclude='/dev/*' --exclude='/tmp/*' \ --exclude='/run/*' --exclude='/mnt/*' --exclude='/media/*' \ / /backup/centos7-system/ tar czf /backup/centos7-critical.tar.gz /etc /boot /var/lib/rpm # 回滚阶段,用Rocky Linux LiveCD启动后执行 mkfs.xfs -f /dev/sda1 mount /dev/sda1 /mnt rsync -avz /backup/centos7-system/ /mnt/ tar xzf /backup/centos7-critical.tar.gz -C /mnt/ mount --bind /dev /mnt/dev mount --bind /proc /mnt/proc mount --bind /sys /mnt/sys chroot /mnt grub2-install /dev/sda chroot /mnt grub2-mkconfig -o /boot/grub2/grub.cfg
对于使用UEFI启动的服务器,回滚时还需要额外挂载EFI分区并恢复引导条目。在chroot之前执行mount /dev/sda2 /mnt/boot/efi,然后用efibootmgr命令检查NVRAM中的启动条目是否指向正确的EFI文件。很多回滚失败案例不是因为数据没恢复,而是因为UEFI启动条目还指向旧的Rocky Linux内核,导致开机直接进入grub rescue模式。
数据库和中间件的回滚需要单独处理。MySQL或PostgreSQL的数据文件如果在Rocky Linux下被新版本的数据库引擎打开过,数据文件头部会被写入新的格式标记,导致无法被旧版本数据库读取。迁移后如果发现应用异常需要回滚,数据库不能直接用文件级还原,必须用在迁移窗口开始时做的SQL逻辑备份来恢复。这个细节决定了RTO是十分钟还是三小时。
迁移后的验证清单与监控重点迁移完成不代表风险解除。系统重启后的第一个小时是问题高发期。首先要验证SELinux状态。CentOS 7上很多运维习惯是直接setenforce 0甚至永久关闭SELinux,迁移脚本会尊重这个设置。但Rocky Linux的安全策略文件版本更新,如果之前有自定义的SELinux模块,需要重新编译和加载。用ausearch -m avc命令检查审计日志,确认没有因为标签错误导致的权限拒绝。
系统服务启动状态需要逐一核对。用systemctl list-units --state=failed列出所有启动失败的服务。常见的问题包括:某些服务依赖的/usr/bin/python软链接指向了不存在的Python 2解释器,或者systemd unit文件中ExecStart指定的路径在Rocky Linux中发生了变化。例如,CentOS 7的ntpd在Rocky Linux 8中被chronyd替代,如果迁移脚本没有正确处理这个替换,时间同步会中断。
性能指标的基线对比能发现隐藏问题。迁移前后各做一次unixbench或sysbench的快速跑分,对比CPU、内存和磁盘IO的基准数据。如果发现磁盘延迟明显增加,检查/sys/block/sda/queue/scheduler,确认IO调度器是否从CentOS 7默认的deadline变成了Rocky Linux默认的mq-deadline或kyber。不同的调度器对数据库的随机读写性能影响很大,必要时在内核启动参数中显式指定。
应用层面的验证要覆盖完整的业务链路。不要只看进程有没有启动,要模拟真实请求走通整个调用链。特别注意SSL/TLS握手环节,因为Rocky Linux的OpenSSL默认禁用了TLS 1.0和1.1,如果后端还有老旧的Java应用或老旧中间件,HTTPS通信会失败。临时解决办法是在/etc/crypto-policies/config中调整加密策略,但长期还是要推动应用升级。
无法回滚时的应急补救措施如果迁移已经执行,回滚窗口又已关闭,但系统出现了严重问题,这时需要就地修复。最常见的灾难场景是系统能启动但网络不通。Rocky Linux 8/9使用NetworkManager作为默认网络管理,而CentOS 7上很多服务器还在用network-scripts。迁移后/etc/sysconfig/network-scripts/下的ifcfg配置文件虽然还在,但NetworkManager可能没有正确接管。用nmcli connection show查看连接状态,如果为空,需要手动用nmcli connection import导入旧配置。
另一个紧急情况是第三方安全软件导致内核崩溃。比如某些EDR或HIDS产品,它们的内核模块只支持CentOS 7的3.10内核,强行在Rocky Linux的4.18或5.14内核上加载会导致kernel panic。如果重启后系统反复崩溃,在GRUB启动菜单按e编辑启动参数,在linux那一行末尾添加module_blacklist=问题模块名,先让系统正常启动,再联系厂商获取兼容版本。
如果RPM数据库在迁移过程中损坏,yum或dnf命令会报错无法执行。这是比较棘手的情况,因为RPM数据库记录了所有包的安装状态。可以用rpm --rebuilddb尝试重建,如果重建失败,需要从/var/lib/rpm/目录下的备份文件中恢复。迁移脚本通常会在/var/lib/rpm/下创建一个迁移前的备份目录,找到Packages文件覆盖回去,再重新执行迁移。
构建可重复的迁移测试体系一次成功的迁移不能靠运气,需要可重复的测试流程。用Vagrant或Docker模拟生产环境的软件栈,编写自动化测试脚本。测试用例要覆盖:迁移前后RPM包数量对比、关键配置文件md5校验、服务端口监听状态、模拟业务请求的HTTP状态码。每次调整迁移参数后,能在30分钟内得到一次完整的测试结果,这样才能在正式迁移前发现所有潜在问题。
把迁移过程写成Ansible Playbook或Shell脚本,实现标准化执行。脚本中要加入足够多的检查点,每完成一个步骤就输出当前状态,并记录到日志文件。这样即使迁移在凌晨由不同的人执行,也能保证操作的一致性,出了问题也容易定位到具体步骤。生产环境的迁移不应该依赖任何交互式操作,全程自动化是降低人为失误的唯一途径。
