嘿,朋友。我知道你正盯着屏幕皱眉。你的生产环境里跑着 AlmaLinux 8.5(或者更老的版本),而新版本的 AlmaLinux 9.x 已经发布了一段时间。系统管理员的直觉在尖叫:“别动!动了就崩!”但另一方面,安全补丁、新内核特性、以及不再被支持的软件包又让你夜不能寐。
这种焦虑我太懂了。我们不是机器,我们是运维者。今天,我不给你甩一堆冷冰冰的命令,我要带你像剥洋葱一样,把 AlmaLinux 的升级过程层层拆解。我们要做的不是“暴力重启”,而是一场精密的外科手术。目标是:数据无损、服务不中断、兼容性无忧。
准备好了吗?让我们开始这场“无痛”迁移之旅。
第一步:认清现实——为什么不能直接 yum update?
很多新手(甚至老手)的第一反应是执行 sudo dnf upgrade --refresh。停!打住!
AlmaLinux 是基于 RHEL(Red Hat Enterprise Linux)构建的,它遵循严格的语义版本控制。从 AlmaLinux 8 升级到 9,不仅仅是小版本号的变化,这是跨大版本升级。这意味着:
- 基础库变更:glibc, openssl, python 等核心库可能发生了不兼容的大版本跳跃。
- 包管理器变化:虽然都是 dnf/yum,但依赖解析逻辑在底层有优化和差异。
- 废弃组件:某些在 8 中还在用的工具,在 9 中可能已被移除或替换。
如果你直接尝试 dnf distro-sync 到 9,系统大概率会陷入依赖地狱,甚至直接变砖。所以,我们需要一个“中间人”——官方推荐的迁移工具链。
第二步:战前侦察——全面审计当前环境
在动手之前,你必须知道你的服务器上到底跑了什么。盲目升级是运维大忌。
1. 清理冗余包
首先,移除那些不再需要的依赖包。这能减少迁移过程中的冲突概率。
# 检查并清理未使用的依赖
sudo dnf autoremove
# 查看当前已安装的所有包及其版本,生成基准报告
sudo dnf list installed > /tmp/installed_packages_before_upgrade.txt
2. 识别第三方仓库
这是最容易踩坑的地方。如果你安装了 EPEL、Nginx 官方源、Docker 官方源等,这些源在 AlmaLinux 9 中的包名或依赖关系可能完全不同。
# 列出所有启用的仓库
sudo dnf repolist
# 重点检查非官方源
ls -l /etc/yum.repos.d/
专家建议:如果可能,暂时禁用非必要的第三方仓库,只保留 BaseOS 和 AppStream。迁移完成后再重新配置。
3. 检查自定义脚本和 cron 任务
有没有手动编写的启动脚本?有没有特殊的 crontab 任务?把这些信息记录下来。因为升级过程中,某些服务会被停止或重启,如果你的脚本依赖于旧版的文件路径或环境变量,它们可能会失败。
4. 备份!备份!备份!
不要听任何人说“备份不重要”。在升级大版本前,你必须拥有:
- 系统快照:如果是虚拟机(VMware, KVM, VirtualBox),做一个完整的 Snapshot。
- 文件级备份:使用
rsync或tar备份/etc,/var/www,/home,/opt等关键目录。
# 示例:备份关键配置和数据
sudo tar -czvf /backup/config_backup_$(date +%F).tar.gz /etc /var/www /home
第三步:搭建“沙盒”——在测试环境中验证
这是区分业余选手和专业人士的分水岭。永远不要在生产环境直接进行首次跨大版本升级。
你需要一台与生产环境配置尽可能一致的测试服务器(至少是相同的 AlmaLinux 8 版本)。在这台机器上,完整走一遍升级流程。
模拟升级流程代码示例
假设你在测试机上操作:
# 1. 确保测试机也是最新的 AlmaLinux 8
sudo dnf update -y
# 2. 安装迁移工具
sudo dnf install -y dnf-plugin-system-upgrade
# 3. 下载 AlmaLinux 9 的安装树
# 注意:这里我们只是下载,还没有安装
sudo dnf system-upgrade download --releasever=9
# 4. 观察输出
# 如果看到 "Complete!",说明依赖解析通过。
# 如果看到 "Error: Problem: ...",请仔细分析冲突包。
关键点:如果在测试环境中遇到依赖冲突,去 AlmaLinux 社区论坛或 GitHub Issues 搜索解决方案。常见的问题包括:
python3版本冲突。- 某些商业软件(如 Oracle JDK, 特定数据库客户端)没有提供 AlmaLinux 9 的 RPM 包。
第四步:生产环境升级实战——分阶段推进
确认测试环境无误后,我们可以对生产环境动手了。为了降低风险,我们采用分阶段升级策略。
阶段一:升级到最新的 AlmaLinux 8 小版本
不要直接从 8.0 跳到 9。先确保你的系统是 AlmaLinux 8 的最新维护版本(如 8.9 或 8.10)。这能修复许多已知的 Bug,并为迁移工具提供更好的基础。
sudo dnf upgrade --refresh -y
sudo reboot
重启后,检查内核版本和服务状态:
uname -r
systemctl list-units --type=service --state=failed
阶段二:安装迁移插件并下载新版本
现在,我们引入“系统升级”插件。这个插件允许你异步下载新版本的包,而不立即重启。
# 安装插件(如果尚未安装)
sudo dnf install -y dnf-plugin-system-upgrade
# 下载 AlmaLinux 9 的所有包
sudo dnf system-upgrade download --releasever=9
等待时间:这一步取决于你的带宽和包数量,可能需要几分钟到几十分钟。请耐心等待,不要中断网络。
阶段三:处理潜在的依赖冲突
在下载过程中,你可能会看到警告或错误。例如:
Problem: package nginx-1.24.0-1.el8.x86_64 from appstream requires httpd-mmn = 20170718, but none of the providers can be installed
这时候,你需要决定:
- 卸载该包(如果不重要)。
- 寻找替代品(例如用 Nginx 的 AlmaLinux 9 官方源替换)。
- 忽略(风险自负,通常不建议)。
对于大多数标准服务,AlmaLinux 9 的 AppStream 仓库会提供兼容的新版本。如果某个专有软件没有升级,你可能需要联系供应商或寻找替代方案。
阶段四:执行升级并重启
当下载完成后,执行升级命令:
sudo dnf system-upgrade reboot
系统会重启进入一个特殊的“升级模式”(类似 GRUB 菜单后的引导过程)。此时,屏幕上会滚动大量的安装日志。千万不要强制关机! 这个过程可能需要 10-30 分钟,具体取决于硬件性能。
第五步:升级后的“体检”与兼容性修复
系统重启后,你应该进入了 AlmaLinux 9。但故事还没结束。跨大版本升级后,往往有一些“后遗症”需要处理。
1. 清理旧内核和临时文件
# 清理不再需要的旧内核包
sudo dnf autoremove
# 清理 yum/dnf 缓存
sudo dnf clean all
2. 检查服务状态
这是最关键的一步。很多服务可能因为配置文件格式变化或依赖库缺失而无法启动。
# 检查所有服务状态
systemctl status
重点关注那些显示 failed 的服务。常见的问题包括:
- Apache/Nginx:配置文件语法可能在 9 中更严格,检查
/var/log/httpd/error_log或/var/log/nginx/error.log。 - PHP:PHP 模块可能被重组。确保你安装的 PHP 版本与 Web 服务器匹配。
- 数据库:MySQL/MariaDB 或 PostgreSQL 可能需要运行升级脚本。
3. 代码层面的兼容性检查
如果你是开发者,这是你必须介入的地方。
Python 应用
AlmaLinux 9 默认使用 Python 3.9+。如果你的应用依赖 Python 3.6 的旧语法或库,必须重构。
# 旧代码 (Python 2/早期3)
print "Hello"
# 新代码 (Python 3.9+)
print("Hello")
检查 requirements.txt 或 Pipfile 中的包版本,确保它们在 PyPI 上有支持 Python 3.9+ 的版本。
Node.js 应用
Node.js 本身不随系统捆绑,但系统库(如 libssl)的变化可能影响原生模块(Native Modules)的编译。
# 重新编译原生模块
npm rebuild
Java 应用
检查你的 JRE/JDK 版本。AlmaLinux 9 可能默认提供 OpenJDK 11 或 17。如果你的应用需要 Java 8,你需要从第三方源(如 EPEL 或 AdoptOpenJDK)单独安装,并调整 JAVA_HOME 环境变量。
4. 防火墙与 SELinux
SELinux 的策略在跨大版本升级时可能会重置或变得过于严格。
# 检查 SELinux 状态
sestatus
# 如果设为 Enforcing,检查是否有 AVC 拒绝日志
grep AVC /var/log/audit/audit.log | tail -n 20
# 如果有问题,可以使用 audit2allow 生成策略文件,或者暂时设为 Permissive 进行调试
sudo setenforce 0
注意:在生产环境中,长期将 SELinux 设为 Permissive 是不安全的。务必修复策略问题,而不是关闭它。
第六步:长期维护与监控
升级完成不是终点,而是新周期的起点。
1. 启用自动安全更新
为了减少未来的手动干预,配置 dnf-automatic 来自动安装安全补丁。
sudo dnf install -y dnf-automatic
# 编辑配置文件,允许仅安装安全更新
sudo sed -i 's/download_updates = no/download_updates = yes/' /etc/dnf/automatic.conf
sudo sed -i 's/apply_updates = no/apply_updates = yes/' /etc/dnf/automatic.conf
# 启用服务
sudo systemctl enable --now dnf-automatic.timer
2. 监控资源使用
新内核和新库可能会带来不同的性能特征。使用 htop, iotop, netstat 等工具监控一周,确保没有内存泄漏或 I/O 瓶颈。
3. 文档更新
更新你的运维文档、Ansible Playbook、Terraform 脚本等基础设施即代码(IaC)文件,以反映 AlmaLinux 9 的变化。例如,服务名称、配置文件路径、端口号等可能已更改。
常见问题解答(FAQ)
Q: 我可以在升级过程中断电吗?
A: 绝对不行。如果在 dnf system-upgrade reboot 阶段断电,可能导致文件系统损坏或包状态不一致,恢复极其困难。请使用 UPS(不间断电源)并确保网络稳定。
Q: 我的专有软件不支持 AlmaLinux 9 怎么办? A: 这是一个严峻的挑战。你有几个选择:
- 联系软件供应商寻求升级版本。
- 寻找功能相似的开源替代品。
- 在容器(Docker/Podman)中运行旧版软件,宿主系统升级为 AlmaLinux 9。这是最灵活的方案。
Q: 升级失败,如何回滚?
A: 如果你做了系统快照,直接回滚快照是最快的方法。如果没有快照,且系统还能启动,尝试使用 dnf history undo 撤销最近的安装事务,但这在大版本升级中成功率极低。因此,备份和快照是唯一的救命稻草。
结语
升级操作系统就像给飞行中的飞机换引擎。它有风险,但它能让你飞得更快、更远、更安全。AlmaLinux 9 带来了更新的软件栈、更好的性能和更长的支持周期。
记住,成功的升级不在于命令有多复杂,而在于准备有多充分。按照本文的步骤,一步一步来,保持耐心,细心检查每一个环节。当你看到 AlmaLinux 9 的登录界面时,你会发现,所有的谨慎都是值得的。
现在,去检查你的备份吧。祝你好运!
