说实话,刚接触 AlmaLinux 的时候,我也曾对着满屏的报错信息怀疑人生。毕竟从 CentOS 7 转到 Rocky/Alma 这一套“接力棒”之后,虽然底子还是那个 RHEL 系,但细节上的坑还真不少。今天咱们不整那些虚头巴脑的官方文档翻译,我就把自己踩过的雷、修复过的 Bug,还有那些真正有用的操作命令,掰开了揉碎了讲给你听。无论你是想确认自己现在跑在哪个版本上,还是准备进行一场大版本的跨越升级,这篇文章都能让你心里有个底。
一、 先搞清楚自己现在在哪儿:查看版本的几种姿势
很多人上来就急着敲 yum update,结果发现版本对不上,或者依赖包冲突。所以,第一步永远是“ reconnaissance(侦察)”,也就是确认当前的系统状态。在 AlmaLinux 里,方法其实挺多的,但不同命令适用的场景也不一样。
最稳妥、最直观的方法是用 rpm 查询发行版信息。你在终端里输入这条命令:
cat /etc/os-release
你会看到类似这样的输出:
NAME="AlmaLinux"
VERSION="9.4 (Turquoise Kodkod)"
ID="almalinux"
ID_LIKE="rhel fedora"
VERSION_ID="9.4"
PLATFORM_ID="platform:el9"
PRETTY_NAME="AlmaLinux 9.4"
这里最关键的是 VERSION_ID 和 PRETTY_NAME。前者告诉你大版本是 9,后者告诉你具体的小版本是 9.4。这比看内核版本有用多了,因为内核版本 (uname -r) 和系统发行版本不是一回事,别搞混了。
如果你更关心底层的包管理器状态,或者需要检查特定的包是否安装了,yum 或 dnf 也能帮忙:
dnf list installed | grep -i almalinux-release
这条命令会列出系统里安装的 almalinux-release 包的版本。比如输出是 almalinux-release-9.4-1.el9.x86_64,那就说明你的系统基础元数据是 9.4 版本的。这一步很重要,因为有时候你装了第三方源或者手动更新过 release 包,但实际系统核心还没跟上,这时候以这个为准。
另外,有些老派用户喜欢用 cat /etc/redhat-release。在 AlmaLinux 上,这通常会显示:
AlmaLinux release 9.4 (Turquoise Kodkod)
虽然简单,但它依赖于 /etc/redhat-release 这个符号链接是否存在。在纯新的安装里没问题,但如果你做过一些奇怪的优化或者清理,这个文件可能被删掉或修改,导致输出不准。所以,最推荐的方式还是组合拳:/etc/os-release 看发行版信息,dnf list installed | grep almalinux-release 看包版本,双重确认,心里才踏实。
二、 升级前的“体检”:为什么不能直接盲升?
听到“升级”两个字,第一反应可能是“不就是跑个命令吗?” 但在这里我要泼盆冷水。大版本升级(比如从 9.0 升到 9.4,或者跨大版本如从 8 升到 9)绝对不是点一下“下一步”那么简单。它涉及到底层库的变化、配置文件的重置、甚至服务的重启策略。
在动手之前,你必须做好这几件事,少一样都可能让你服务器变砖,到时候哭都来不及。
1. 数据备份是底线,没有之一
我知道你嫌麻烦,但请相信我。如果是生产环境,务必对关键数据进行完整备份。如果是测试机,至少要把 /etc 目录(存放配置文件)、数据库文件(如 /var/lib/mysql 或 /var/lib/postgresql)以及你的应用数据目录做个快照。如果是在虚拟机上跑,直接拍一个 VM Snapshot 是最省心的方法。万一升级失败,几分钟就能回滚;要是没备份,那就是几天的工作量打水漂。
2. 清理现有系统的“陈年旧账”
在开始大版本升级之前,先对当前系统进行一轮彻底的 dnf update。
sudo dnf update -y
sudo dnf distro-sync
dnf update 会把所有包更新到当前大版本下的最新版本,而 dnf distro-sync 则确保你系统里的包和当前发布的仓库中的包完全一致,不会有多余的残留包或版本不一致的情况。这步做完后,重启一下服务器,让新内核生效。为什么要重启?因为如果还在用旧内核,升级工具可能会因为内核模块不兼容而出问题。
3. 检查自定义源和第三方仓库
这是最容易踩坑的地方。AlmaLinux 官方仓库非常纯净,但你很可能装了 EPEL、Remi(PHP 源)、NVIDIA 驱动源,或者其他公司的内部源。这些源不一定支持你正在运行或者即将升级到的版本。
比如,你正在用 AlmaLinux 8,但某个 RPM Fusion 源只提供了 EL9 的包,当你尝试升级到 EL9 时,这个源就会导致依赖冲突。解决办法是:
- 列出所有启用的 repo:
dnf repolist - 检查每个 repo 的
baseurl或mirrorlist是否包含当前版本号(如el8或el9)。 - 对于不兼容的第三方源,先禁用它们:
sudo dnf config-manager --set-disabled <repo-id> - 升级完成并验证系统稳定后,再重新启用并适配它们。
4. 记录当前运行的服务
升级过程中,部分服务可能会停止或重启。你需要知道哪些服务是关键的。可以用 systemctl list-units --type=service --state=running 列出来,或者简单点,记录下你正在运行的业务,比如 Web 服务器、数据库、API 网关等。这样在升级后,你可以快速核对业务是否恢复正常。
三、 实战升级:AlmaLinux 8 到 9 的完整路径
很多用户是从 CentOS 8 停更后迁移过来的,或者是直接从 CentOS Stream 转来的。这里我重点讲从 AlmaLinux 8 升级到 AlmaLinux 9 的过程,因为这是目前最常见的“大跨越”。小版本升级(如 9.1 到 9.4)其实比较简单,直接用 dnf update 就行,下面主要讲大版本。
大版本升级需要用到一个专门的工具:leapp。这是 Red Hat 开发的一套升级框架,AlmaLinux 也支持。
步骤 1:安装升级工具
确保你的系统里安装了 leapp 和相关的升级数据。
sudo dnf install leapp leapp-repository leapp-upgrade-el8toel9
如果提示找不到包,可能是 EPEL 源没开,先安装 EPEL:
sudo dnf install epel-release
sudo dnf upgrade leapp leapp-repository leapp-upgrade-el8toel9
步骤 2:预检(Preupgrade Audit)—— 最重要的一步!
千万不要跳过这一步!leapp 会检查你的系统是否有不兼容的包、配置或依赖关系。
sudo leapp preupgrade
这个过程可能需要几分钟。它会生成一份详细的报告,保存在 /var/log/leapp/leapp-report.txt。你需要仔细查看这份报告。
常见的报错原因包括:
- 不兼容的第三方包:比如某些专有软件的旧版本。
- Python 版本依赖:EL9 默认使用 Python 3.9,如果应用强依赖 Python 2.7 或旧版 Python 3,可能会出问题。
- 内核模块:某些闭源内核模块(如 NVIDIA 驱动)可能不支持新内核。
对于报告中的警告,leapp 通常会给出建议。如果有阻塞性错误(Error),你必须解决后才能继续。有时候,报告里会生成一个答案文件,告诉你哪些包需要移除或替换,你可以用以下命令应用这些答案:
sudo leapp answer --answer-file /var/log/leapp/answersdir/ 2>/dev/null
或者手动编辑 /var/log/leapp/answersdir/ 下的答案文件。
步骤 3:生成升级事务
预检通过后,生成升级所需的事务数据。
sudo leapp upgrade
这一步会在 /var/log/leapp/ 下生成升级所需的安装包列表和脚本。如果这一步失败,通常是因为前面的预检没清理干净。
步骤 4:执行升级
这是最紧张的时刻。执行升级命令:
sudo leapp reboot
执行完这个命令后,系统会自动重启,并开始升级过程。注意:这次重启不是普通的重启,而是进入升级模式。 屏幕可能会出现一些滚动日志,千万不要强制关机!这个过程可能需要 20 分钟到 1 小时不等,取决于你的硬件和包的数量。
如果升级过程中出现错误,系统可能会自动回滚到升级前的状态(如果快照支持的话),或者停留在一个紧急模式下,让你查看 /var/log/leapp/ 下的日志来排查问题。
步骤 5:升级后的收尾
系统重新进入 AlmaLinux 9 的登录界面后,第一件事就是再次运行 dnf update,确保所有新系统的包都是最新的。
sudo dnf update -y
然后,重新启用你在步骤 2 中禁用的第三方仓库,并检查是否有兼容 EL9 的新版本。例如,如果你之前禁用了 Remi 源,现在要去 Remi 官网下载 EL9 的 RPM 包重新安装。
最后,检查所有关键服务的状态:
sudo systemctl status nginx
sudo systemctl status postgresql
# 其他你关心的服务...
确认业务正常后,清理一下旧的 Kernel 包,节省空间:
sudo dnf install dnf-utils
sudo dnf remove $(dnf repoquery --installroot / --latest-only -q | grep kernel)
四、 常见坑点与解决方案
聊完流程,咱们说说那些让人头疼的具体问题。这些问题我在社区里见得太多了,提前告诉你,你能少掉几根头发。
坑点 1:Nginx/Apache 配置丢失或错误
在 CentOS 7⁄8 时代,Nginx 配置可能在 /etc/nginx/,但升级后,某些模块的配置路径或默认行为变了。特别是如果你们用了一些非官方源的 Nginx 版本(如 Nginx Mainline),升级后可能需要重新编译或重新安装模块。
建议:升级前,备份整个 /etc/nginx 和 /etc/httpd 目录。升级后,用 nginx -t 或 apachectl configtest 测试配置语法。如果有语法错误,根据报错逐个文件排查。很多时候,只需要把旧配置里的 listen 80 default_server; 改成新的格式,或者调整一下 include 路径。
坑点 2:PHP 版本断裂
这是重灾区。AlmaLinux 9 默认 PHP 版本是 8.1 或 8.2,而 AlmaLinux 8 默认是 PHP 7.2 或 7.4。如果你的应用是写在 PHP 7 时代的,直接升上去 99% 会挂。
建议:
- 如果可能,在升级前就把应用升级到支持 PHP 8 的版本。
- 如果应用暂时动不了,考虑使用 PHP 7.4 的第三方源(如 Remi 的 php74 集合),但要做好安全补丁可能跟不上的心理准备。
- 升级前,先在你的开发环境模拟一次同样的升级过程,测试所有接口。
坑点 3:数据库数据损坏
虽然数据库本身(MySQL/MariaDB/PostgreSQL)的升级通常很稳健,但如果你的系统里有一些自定义的触发器、存储过程,或者使用了特定版本的字符集,升级后可能会出问题。
建议:升级前,对数据库进行全量备份(mysqldump 或 pg_dump)。升级后,运行 mysql_upgrade(对于 MySQL)或检查 PostgreSQL 的版本兼容性。如果发现数据异常,立即停止服务,从备份恢复,并检查日志。
坑点 4:防火墙规则重置
升级过程中,firewalld 或 iptables 的规则有时会被重置或需要重新加载。
建议:升级前,导出防火墙规则:
firewall-cmd --state
firewall-cmd --list-all > /tmp/firewall-backup.txt
升级后,检查规则是否还在:
firewall-cmd --list-all
如果丢失,手动从备份恢复,或者重新配置。
五、 给小朋友也能听懂的比喻
为了让你更深刻地理解这个过程,咱们打个比方。
把 AlmaLinux 系统想象成一栋住了很久的房子。
- 查看版本:就像是你站在门口,看看门牌号是多少,确认自己到底住在哪条街、哪栋楼。
- 备份数据:就像是把家里值钱的珠宝、重要的证件照片都拷贝到云端或保险柜里。万一房子装修塌了,至少东西还在。
- 清理系统:就像是大扫除,把家里堆积的垃圾、过期的食物、坏掉的家具都清理掉。不然装修的时候,垃圾到处堵着,工人没法干活,还容易出事故。
- 禁用第三方源:就像是把家里那些来路不明的、会破坏房子结构的“偏方”药剂先收起来。装修时只用官方提供的材料,保证房子结实。
- Leapp 预检:就像请了个专业建筑师,拿着图纸来检查你的房子,看看哪些墙不能拆,哪些管道要改,提前告诉你会有什么风险。
- 执行升级:就是真正开始装修了。把旧墙砸了,换新的地板、新的电线、新的水管。这个过程会有噪音、灰尘,甚至短暂断水断电,但完成后,房子变成了新房。
- 升级后检查:装修完,你得检查灯亮不亮、水龙头漏不漏水、窗户关不关得上。只有这些都正常,你才能放心搬进去住。
六、 总结与建议
AlmaLinux 的升级并不是一件可怕的事,只要你按部就班,做好充分的准备,就能平稳过渡。核心要点就三条:备份、预检、测试。
- 永远先备份。这是铁律。
- 善用
leapp preupgrade。它会帮你发现大部分潜在问题。 - 在非生产环境先试一次。如果有条件,克隆一个同样的测试机,在上面演练一遍升级过程,你会发现很多细节问题,这样在生产环境操作时就会从容很多。
最后,记住官方文档永远是你最坚实的后盾。如果在升级过程中遇到奇怪的错误,把日志里的错误信息复制到搜索引擎,大概率能找得到其他人的解决方案。AlmaLinux 社区很活跃,大家遇到的问题你可能也遇到过。
希望这篇指南能帮到你。如果在实际操作中遇到任何具体问题,欢迎随时交流,咱们一起解决。毕竟,系统是为我们服务的,而不是让我们被它折腾的。
