说实话,看着服务器列表里那一行行 8.5、8.6 的 AlmaLinux 版本号,心里总有点发毛。这就像你看着家里的老房子,知道它该翻新了,但最怕的是拆墙的时候发现承重柱断了——数据丢了,服务挂了,背锅的还是你。
AlmaLinux 作为 RHEL(Red Hat Enterprise Linux)的直系“孪生兄弟”,它的稳定性毋庸置疑,但升级这件事,从来不是点一下“更新”那么简单。特别是从 8.x 大版本跨代升级(比如从 8.5 到 8.10,或者准备迎接未来的 9.x),里面藏着的依赖地狱能让人头秃。
今天我不跟你扯那些官方的冷冰冰文档,咱们就把它当成一次“搬家装修”。我会把每一步掰开了揉碎了讲,包括那些文档里不会告诉你的“坑”,以及如何用代码和命令真正解决问题。
第一步:别急着动手,先做个“全身体检”
很多人升级失败,不是因为升级包有问题,而是因为底子上没理清。在敲下第一个 dnf 命令之前,你必须清楚三件事:
- 你的内核版本是什么?
- 哪些包被强制锁定(Hold)了?
- 第三方仓库是不是在搞事?
1. 检查当前状态
打开你的终端(SSH 连上去),先来个全景扫描:
# 查看当前 AlmaLinux 版本和内核
cat /etc/os-release
uname -r
# 查看有哪些包被锁定(这是很多依赖冲突的罪魁祸首)
dnf system-log
dnf repoquery --installed | grep -E "(kernel|glibc|openssl)" | sort
# 检查是否有包处于“保留”状态
dnf distro-sync --check
这里有个真实案例:
有一次我帮一个客户排查,他的 Web 服务死活启动不了,提示 libssl.so.1.1 找不到。查了半天发现,他在半年前为了跑一个旧版 Java 应用,手动把 openssl 锁定在了 1.1.1k,并加入了 skip_if_unavailable=1 的排除规则。结果 AlmaLinux 8.10 默认的仓库里已经清理掉了旧版 OpenSSL 1.1 的部分依赖,导致锁定的包和新内核的驱动打架。
2. 清理“幽灵”仓库
AlmaLinux 官方仓库很干净,但你自己装的 EPEL、Remi、Docker 官方源可能会引入冲突。
# 列出所有启用的仓库
dnf repolist
# 备份当前的 repo 配置(万一搞砸了能还原)
sudo cp -r /etc/yum.repos.d /etc/yum.repos.d.bak.$(date +%Y%m%d)
建议: 如果可能,临时禁用非必要的第三方仓库。比如你在升级期间不需要 Docker 的新版本,就把 docker-ce.repo 禁掉:
sudo dnf config-manager --set-disabled docker-ce-stable
第二步:小步快跑,先升到当前大版本的最新点
千万不要直接跨大版本!
如果你现在跑的是 AlmaLinux 8.5,而目标是 AlmaLinux 9.4,官网的升级路径是:
8.5 -> 8.10 (当前8系终点) -> 9.x
很多人试图用 dnf distro-sync 直接跳到 9,结果就是满屏的 Transaction Check Error,然后你就傻了。
操作:升级到 8.x 最新点
# 1. 更新所有包到当前大版本的最新状态
sudo dnf upgrade --refresh
# 2. 清理旧的内核和缓存,减少负担
sudo dnf autoremove
sudo dnf clean all
# 3. 重启进入最新内核(重要!确保你在最新内核上运行)
sudo reboot
# 4. 重启后再次确认
uname -r
这一步看似简单,但它是消除累积依赖债的关键。很多所谓的“依赖冲突”,其实是因为你之前的某个小版本升级没清理干净遗留的 *.rpmnew 或冲突的 .rpmorig 文件。
第三步:安装预升级工具 leapp
这是 AlmaLinux(以及 RHEL/CentOS)官方推荐的跨大版本升级工具。它不是 yum,它是一个专门分析依赖、生成升级图谱的“翻译官”。
1. 安装 leapp 和相关数据
# 确保你在 8.10 上
sudo dnf install -y leapp leapp-repository leapp-data-almalinux
# 如果没有 leapp-repository,可能需要先启用 Epel
sudo dnf install -y epel-release
sudo dnf install -y leapp leapp-repository leapp-data-almalinux
2. 预检(Pre-Upgrade Audit)—— 这是最关键的一步
永远不要跳过这步! 它会告诉你为什么不能升级,以及需要做什么准备。
# 开始预检
sudo leapp preupgrade
# 预检结束后,查看报告
sudo leapp answer --list-installed
sudo leapp answer --list-committed
常见问题解读:
NetworkManager冲突:如果你用静态 IP 配置而不是 NetworkManager,leapp 会报错。- 解法:通常需要将网络配置迁移到 NetworkManager,或者按照 leapp 生成的答案文件修改配置。
- 第三方内核模块:比如 NVIDIA 驱动、VirtualBox 模块。
- 解法:leapp 会提示你禁用或卸载这些模块。你需要在
/etc/modprobe.d/下创建黑名单文件。
- 解法:leapp 会提示你禁用或卸载这些模块。你需要在
- Python 3.9 迁移:AlmaLinux 8 默认 Python 是 3.6⁄3.8,9 是 3.9。脚本里的
#!/usr/bin/python要改。
3. 生成答案文件并应用
预检不会自动修复所有问题,它会生成一个 answerfile。你需要手动检查这个文件。
# 查看生成的答案文件
cat /root/leapp/answerfile
# 或者交互式地回答 leapp 提出的问题
sudo leapp answer --section <问题ID>.remove_<包名>_warning=true
举个例子:
如果 leapp 问你“是否要移除旧的 libpng12?”而你又确定不用它:
sudo leapp answer --section remove_libpng12_packages_assessment.confirm=true
第四步:执行升级(重启几次是常态)
当预检显示 Upgrade is possible 时,就可以启动了。
sudo leapp upgrade
这个过程会自动下载新的根文件系统包。完成后,你会看到提示:“Reboot into the new environment.”
sudo reboot
注意: 重启后,你可能会发现登录界面变了,或者网络暂时不通。这是正常的,因为新的内核和驱动正在加载。
重启后,不要急着做其他事,先验证你是否已经进入了 9.x 的环境:
cat /etc/os-release
# 应该看到 AlmaLinux release 9.4
如果一切正常,继续运行:
sudo leapp reboot
再次重启后,你就正式进入 AlmaLinux 9 的世界了!
第五步:升级后的“扫尾”工作(容易被忽略)
很多人以为升级完就没事了,其实这时候系统处于“半新半旧”的状态,很多旧依赖还在。
1. 清理旧内核和包
# 查看当前保留的内核
rpm -qa | grep kernel
# 删除旧的内核包(保留最新的1-2个即可)
sudo dnf remove kernel-$(uname -r | sed 's/\.[0-9]*$//' | rev | cut -d'-' -f2- | rev)
# 或者直接用 dnf 的自动清理
sudo dnf autoremove
2. 重建依赖关系
# 重新生成 dnf 缓存
sudo dnf makecache
# 检查是否有残留的冲突包
sudo dnf distro-sync
3. 重新启用第三方仓库
如果你之前在第二步禁用了 Docker、Nginx 官方源等,现在可以重新启用了,并检查它们是否与新的系统库兼容。
sudo dnf config-manager --set-enabled docker-ce-stable
sudo dnf upgrade --refresh
常见“踩坑”深度解析与解决方案
坑一:libxcrypt 版本冲突
现象: 升级过程中报错 Problem: package libxcrypt-4.4.18-4.el8.x86_64 from base requires ...
原因: CentOS/AlmaLinux 8 早期版本有一个已知的 libxcrypt 缺陷,导致部分软件包依赖解析错误。
解决方案:
在升级前,确保你已经安装了修复后的 libxcrypt 包:
sudo dnf update libxcrypt
sudo dnf upgrade --refresh
如果还是报错,尝试强制重新安装:
sudo dnf reinstall libxcrypt
坑二:Python 脚本失效
现象: 系统升级完,原来的 Python 脚本报 ModuleNotFoundError: No module named 'xyz' 或者路径错误。
原因: Python 的路径在 8 和 9 之间发生了变化。/usr/bin/python3 在 8 中可能是 3.6,在 9 中是 3.9。
解决方案:
不要硬编码 /usr/bin/python3。使用 which python3 找到实际路径,或者在脚本头部使用 shebang 的动态解析:
#!/usr/bin/env python3
并在升级后运行:
sudo dnf reinstall python3-devel python3-setuptools
坑三:SELinux 标签丢失
现象: 网站能访问,但日志里全是 Permission denied。
原因: 跨版本升级后,新文件系统的 SELinux 上下文可能与旧文件不匹配。
解决方案: 在升级完成后,重新标记文件系统(注意:这会花费较长时间,尤其是在磁盘IO慢的服务器上):
# 触发重标记,下次重启时生效
sudo touch /.autorelabel
# 重启服务器
sudo reboot
重启时屏幕可能会停在那里很久,不要慌,它在忙着修复 SELinux 标签。
给小朋友也能听懂的比喻
想象一下,你要把家里的家具(包)从8平米的小房间(AlmaLinux 8)搬到10平米的新房子(AlmaLinux 9)。
- 体检(第一步):你先看看房间里有哪些东西,哪些是坏的,哪些是多余的垃圾。
- 小步快跑(第二步):你不能直接瞬移,得先在现在的房间里把家具整理好,把能修的修好,不能用的扔了。
- 找搬家队长(第三步):
leapp就是那个专业的搬家队长。他拿着清单,告诉你:“这个沙发(旧内核模块)太大,新房子放不进去,得拆了或者换个小的。” - 打包(第四步):队长开始把东西搬过去。这时候你要配合,别乱动。
- 整理新家(第五步):搬进去了,但灯泡可能还没装好(Python 路径变了),门锁可能还是旧的(SELinux 标签)。你需要最后打扫一下,把新房子彻底安顿好。
最后的忠告
快照!快照!快照! 在进行任何跨大版本升级之前,务必对虚拟机做快照,或者对重要数据做完整备份。这是你的“后悔药”。
不要在生产高峰期升级 哪怕你准备得再充分,也可能遇到意外。选一个业务低峰期,预留出 2-4 小时的窗口。
阅读日志 如果升级失败,不要只盯着最后的报错。查看
/var/log/leapp/leapp-report.txt和/var/log/yum.log,那里有详细的“犯罪现场”记录。保持耐心 AlmaLinux 8 到 9 的升级虽然比 CentOS 8 到 Stream 要顺畅得多,但它依然是一个复杂的系统级操作。不要边升级边刷视频,专心致志,一步步来。
希望这份指南能帮你顺利翻过 AlmaLinux 升级这座山。如果有具体的报错信息,欢迎随时拿出来,咱们一起分析。祝你的服务器在新的版本里跑得飞起!
