AlmaLinux版本更新指南从 CentOS迁移升级流程常见坑点及官方兼容性说明
为啥突然要聊这个
说实话,自从CentOS 7在2024年6月彻底停止维护之后,国内有不少朋友半夜突然惊醒——”我的服务器还能用多久?” 这种焦虑我太理解了。很多人都是在某次自动更新失败或者发现安全补丁断了的时候,才真正意识到问题的严重性。
AlmaLinux就是这时候站出来的。作为CloudLinux公司支持的RHEL(Red Hat Enterprise Linux)完全兼容发行版,它基本上就是CentOS的”精神续作”,而且免费、开源、社区活跃。
但迁移这件事,听着简单,做起来坑真不少。我见过太多人直接从CentOS 7跳到AlmaLinux 9,结果应用全挂了,服务器差点回不了血。
今天咱们就好好捋一捋,从准备到实战,从坑点到兼容性,一步步来。
迁移前,你得先想清楚几件事
确认你的CentOS版本
这一步看着简单,但很多人就直接跳过了。不同类型的CentOS,迁移路径完全不一样:
# 查看当前CentOS版本
cat /etc/os-release
你会看到类似这样的输出:
NAME="CentOS Linux"
VERSION="7 (Core)"
ID="centos"
ID_LIKE="rhel fedora"
VERSION_ID="7"
PRETTY_NAME="CentOS Linux 7 (Core)"
或者如果是CentOS 8 Stream:
NAME="CentOS Stream"
VERSION="8"
ID="centos"
ID_LIKE="rhel fedora"
VERSION_ID="8"
PLATFORM_ID="platform:el8"
PRETTY_NAME="CentOS Stream 8"
关键点来了:
- CentOS 7 是最常见的,也是迁移风险最大的,因为AlmaLinux 8和9都支持,但中间有个跳跃问题
- CentOS 8 Stream 已经停止维护了,必须迁移,但AlmaLinux没有8 Stream这个分支,只能迁到AlmaLinux 8或9
- CentOS 9 Stream 还在支持期,如果你想保持”Stream”的滚动更新模式,可以直接升到AlmaLinux 9
备份!备份!备份!
这句话说了八百遍了,但我还是要说。迁移过程中任何一步出错,你的系统都可能变砖。
# 备份关键配置目录
tar -czf /root/backup-$(date +%Y%m%d).tar.gz \
/etc \
/var/lib \
/var/log
# 如果有数据库,记得先dump出来
mysqldump -u root --all-databases > /root/mysql-backup-$(date +%Y%m%d).sql
pg_dumpall > /root/pg-backup-$(date +%Y%m%d).sql
别嫌麻烦,这些tar包可能就是你最后的救命稻草。
检查你的软件依赖
这是很多人踩坑的地方。你服务器上跑的应用,可能依赖某些CentOS特有的包或者版本。
# 查看已安装的RPM包列表
rpm -qa | sort > /root/packages-list.txt
# 查看正在运行的服务
systemctl list-units --type=service --state=running > /root/services.txt
# 查看自定义的yum源
ls -la /etc/yum.repos.d/
cat /etc/yum.repos.d/*.repo
把这三份输出保存好,迁移完新系统之后,用来对比和排查问题会非常有用。
官方推荐的迁移方式:Leapp工具
AlmaLinux官方推荐的迁移工具叫 Leapp。这玩意儿本质上是Red Hat搞的一个升级工具,被社区移植过来支持AlmaLinux了。
先装Leapp
# 升级到最新状态(这一步很重要,别偷懒)
yum update -y
# 安装Leapp和相关数据包
yum install -y leapp leapp-repository leapp-repository-extra
# 如果是CentOS 7迁移到AlmaLinux 8,还需要额外装
yum install -y leapp-preupgrade leapp-upgrade leapp-answer
# 如果是CentOS 8 Stream迁移到AlmaLinux 8
yum install -y leapp leapp-repository leapp-repository-extra
这里有个坑: Leapp的版本要和你的CentOS版本匹配。CentOS 7用的Leapp和CentOS 8 Stream用的Leapp,安装包的名字和路径不太一样。上面我给的是最常用情况。
开始升级前检查
这一步是重头戏,Leapp会帮你检查所有的”不兼容项”:
# 执行预升级检查
leapp preupgrade
# 检查完成后,会生成报告
# 报告位置在:
cat /var/log/leapp/leapp-report.txt
这个报告洋洋洒洒几百行,看起来吓人,但其实主要看这几个部分:
[INFORMATION]
- Packages marked for removal: ...
- Packages marked for downgrade: ...
- Packages requiring manual update: ...
[WARNING]
- Third-party repositories: ...
- Kernel modules: ...
- Configuration changes: ...
[ERROR]
- Blocking issues that prevent upgrade: ...
ERROR级别的最关键,这些是必须解决的问题才能继续。WARNING和INFORMATION的虽然不阻塞,但也建议你一个个看过去,心里有数。
常见的预检查问题及解决方案
问题1:第三方仓库冲突
很多公司会装一些非官方的yum源,比如某些数据库源、Nginx源之类的。Leapp发现这些源会直接报错:
ERROR: Third-party repository 'xxx.repo' is detected
解决方法很简单,迁移前先把第三方源禁用或者备份走:
# 备份所有repo文件
mkdir -p /root/yum-repos-backup
cp /etc/yum.repos.d/*.repo /root/yum-repos-backup/
# 禁用第三方源(临时)
sed -i 's/enabled=1/enabled=0/g' /etc/yum.repos.d/non-official.repo
迁移完成之后再重新启用。
问题2:内核模块不兼容
比如你装了VMware Tools、VirtualBox Guest Additions、或者某些特定的驱动,这些在内核升级后可能挂掉:
ERROR: Kernel module 'xxx' is not compatible with target kernel
解决方法是在迁移前先把这些模块卸载:
# 以VMware为例
vmware-config.pl --uninstall
# 或者用rpm直接卸
yum remove -y open-vm-tools
问题3:Python版本冲突
CentOS 7默认Python是2.7,而AlmaLinux 8默认是Python 3.6+。很多运维脚本依赖Python 2,迁移后会直接找不到:
WARNING: Python 2 is deprecated and will be removed
解决方法:
# 在迁移前先标记需要保留的Python 2依赖
leapp answer --section remove_python2_packages.target=skip
问题4:SELinux策略变化
CentOS 7到AlmaLinux 8,SELinux的策略和规则有变化,部分应用可能启动不了:
WARNING: SELinux policy changes detected
这个一般不用太担心,迁移后如果应用报错,用restorecon -Rv /重新应用一下上下文就行。
正式执行升级
预检查通过之后(或者你决定忽略某些WARNING继续升级),就可以正式开始迁移了:
# 开始升级(这步会下载大量数据包,可能需要几十分钟到几小时)
leapp upgrade
# 升级完成后,重启系统
reboot
重启之后,你会看到GRUB启动菜单里多了一个选项,选择”AlmaLinux 8 (Upgrade from CentOS 7)“之类的选项进入新系统。
如果第一次重启后系统进不去了,别慌,选”CentOS Linux 7”那个选项试试。Leapp的升级方式是双引导,你还有后悔药。
升级后的验证
进入AlmaLinux系统后,先确认一切正常:
# 确认系统版本
cat /etc/os-release
# 检查内核版本
uname -r
# 查看是否有遗留的CentOS包
rpm -qa | grep centos
# 检查服务状态
systemctl list-units --type=service --state=failed
# 查看系统日志,排查问题
journalctl -xe --since "1 hour ago"
正常情况下,/etc/os-release应该显示:
NAME="AlmaLinux"
VERSION="8.x (Palikir)"
ID="almalinux"
ID_LIKE="rhel centos fedora"
VERSION_ID="8.x"
PRETTY_NAME="AlmaLinux 8.x"
从CentOS 8 Stream迁移到AlmaLinux
这个路径相对简单一些,因为两者都是基于EL8的:
# 先升级到最新状态
dnf update -y
# 安装Leapp
dnf install -y leapp leapp-repository leapp-repository-extra
# 执行预检查
leapp preupgrade
# 修复发现的问题后执行升级
leapp upgrade
# 重启
reboot
CentOS 8 Stream和AlmaLinux 8之间的兼容性比7到8要好很多,因为底层都是EL8。但同样要注意第三方仓库和自定义配置的问题。
版本更新指南
迁移完成之后,AlmaLinux的更新方式和CentOS基本一致:
日常更新
# AlmaLinux 8
dnf update -y
# AlmaLinux 9
dnf update -y
查看更新历史
# 查看最近的更新
dnf history
# 查看某个事务的详细信息
dnf history info <事务ID>
# 回滚更新(如果有问题)
dnf history undo <事务ID>
配置自动更新
如果你希望服务器自动打补丁:
# 安装自动更新服务
dnf install -y dnf-automatic
# 启用并启动服务
systemctl enable --now dnf-automatic.install
systemctl enable --now dnf-automatic.timer
# 查看配置
cat /etc/dnf/automatic.conf
大版本升级
从AlmaLinux 8升级到9,和从CentOS 7升级到8的流程类似,也是用Leapp:
# 确保当前系统是最新的
dnf update -y
# 安装Leapp
dnf install -y leapp leapp-repository leapp-repository-extra
# 预检查
leapp preupgrade
# 升级
leapp upgrade
# 重启
reboot
兼容性那些事儿
和RHEL的兼容性
AlmaLinux的官方定位就是”1:1 RHEL兼容”。这意味着:
- 所有RHEL的rpm包都能在AlmaLinux上安装
- YUM/DNF的命令和仓库配置完全一致
- SELinux策略、系统调用行为保持一致
- 第三方RHEL软件(比如某些商业软件)通常也能直接跑
但”兼容”不等于”一模一样”。AlmaLinux是社区驱动的项目,有一些自己的仓库和工具。而且某些极端情况下,Red Hat的闭源驱动或者专有工具可能不会在AlmaLinux上测试。
和CentOS的兼容性
这个要小心了。AlmaLinux 不是 CentOS的替代品,它是RHEL的替代品。CentOS是RHEL的源码重建版,而AlmaLinux也是基于RHEL源码重建的。
从CentOS迁移到AlmaLinux,本质上是从一个RHEL rebuild迁移到另一个RHEL rebuild。技术上是可行的,但你要意识到:
- 配置文件可能会有微小差异(比如sysconfig文件的位置)
- 某些CentOS特有的包可能没有对应物
- 一些针对CentOS写的自动化脚本可能需要微调
硬件兼容性
AlmaLinux支持主流的x86_64和ARM64架构。常见的云服务器厂商(阿里云、腾讯云、AWS、Azure等)都提供AlmaLinux的镜像。
如果你用的是某些比较老的硬件,建议先查一下AlmaLinux的硬件兼容列表,或者先在虚拟机里测试一下。
实际迁移案例分享
来说一个真实的例子。我有个朋友,公司用的是一套基于CentOS 7的老系统,跑着Nginx、MySQL 5.7、PHP 7.2,还有一堆自己写的Python 2脚本。
他一开始想直接rpm -Uvh强行升级,结果一重启,系统直接进不去了。
后来我帮他走的是正规流程:
第一步:备份
# 全量备份系统
tar -czf /backup/full-system-$(date +%Y%m%d).tar.gz --exclude=/proc --exclude=/sys --exclude=/dev /
第二步:预检查
leapp preupgrade
发现的问题:
- 有一个第三方nginx源
- PHP 7.2是从remi源装的
- 几个Python 2脚本依赖的包
第三步:处理问题
# 禁用第三方源
sed -i 's/enabled=1/enabled=0/g' /etc/yum.repos.d/nginx.repo
sed -i 's/enabled=1/enabled=0/g' /etc/yum.repos.d/remi.repo
# 标记Python 2包跳过删除
leapp answer --section remove_python2_packages.target=skip
第四步:升级
leapp upgrade
reboot
第五步:迁移后处理
# 启用第三方源
sed -i 's/enabled=0/enabled=1/g' /etc/yum.repos.d/nginx.repo
sed -i 's/enabled=0/enabled=1/g' /etc/yum.repos.d/remi.repo
# 安装新版本的PHP
dnf module install php:7.4
# 重新应用SELinux上下文
restorecon -Rv /
# 重启服务
systemctl restart nginx
systemctl restart php-fpm
整个过程花了大约3个小时,其中大部分时间花在等待下载和重启上。系统迁移后运行正常,唯一的遗憾是那几个Python 2脚本得重写,因为AlmaLinux 8默认没有Python 2。
一些容易被忽视的坑
1. GRUB引导问题
有些服务器在迁移后GRUB配置会乱掉,导致重启后找不到系统。解决办法:
# 重新安装grub
grub2-install /dev/sda
grub2-mkconfig -o /boot/grub2/grub.cfg
# 如果是UEFI启动
grub2-install --target=x86_64-efi --efi-directory=/boot/efi --bootloader-id=almalinux
2. 网络配置变化
CentOS 7用ifcfg-eth0这种命名,而AlmaLinux 8默认用enp3s0这种命名。如果你的系统有网络问题,检查一下:
# 查看网络接口
ip addr
# 查看网络配置
cat /etc/sysconfig/network-scripts/ifcfg-*
如果命名规则变了,你可能需要修改网络配置或者修改GRUB参数保持一致。
3. 时间同步问题
迁移后某些服务器的时间可能不准。检查一下:
# 查看时间同步状态
timedatectl
# 启用NTP同步
timedatectl set-ntp true
4. 防火墙规则丢失
CentOS 7用iptables,AlmaLinux 8用firewalld。迁移后你的iptables规则可能不再生效:
# 查看当前防火墙状态
firewall-cmd --state
firewall-cmd --list-all
# 如果需要恢复iptables规则
yum install -y iptables-services
systemctl enable --now iptables
5. 数据库迁移问题
MySQL 5.7在AlmaLinux 8上可能无法直接运行,需要升级到8.0。这个过程比迁移系统本身还复杂:
# MySQL 8.0升级流程
# 1. 备份数据库
mysqldump --all-databases --single-transaction > full-backup.sql
# 2. 停止MySQL
systemctl stop mysqld
# 3. 卸载旧版
yum remove -y mysql mysql-server
# 4. 安装新版
yum install -y mysql-server
# 5. 启动并升级
systemctl start mysqld
# 6. 执行数据库升级
mysql_upgrade -u root -p
官方资源
如果你遇到具体问题,官方文档是最好的参考:
- AlmaLinux官方文档:https://docs.almalinux.org/
- Leapp工具文档:https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/8/html/upgrading_from_centos_linux_to_red_hat_enterprise_linux_8/index
- AlmaLinux社区:https://gist.github.com/jgogden
最后说两句
迁移这种事情,说难也难,说不难也不难。关键是:别慌、别急、备份好、一步步来。
很多看似恐怖的问题,其实都是小问题堆积起来的。把预检查做细,把备份做全,迁移过程基本不会出大问题。
如果你的服务器上有特别重要的业务,建议先在测试环境完整演练一遍,确认没问题了再上生产。
还有,AlmaLinux的社区挺活跃的,遇到问题可以去他们的论坛或者Discord问问,通常很快就能得到回复。
希望这篇指南能帮到你。如果迁移过程中遇到什么奇怪的问题,欢迎评论区留言,咱们一起想办法。
