多彩编程 多彩编程MZPH · CODE BLOG
ARTICLE DETAIL

文章详情

深耕前端与后端开发技术的一线实战笔记与踩坑复盘。

RHEL系统更新升级全攻略:从订阅管理到跨版本升级实战

RHEL系统更新升级全攻略:从订阅管理到跨版本升级实战 1. 从一次深夜告警说起为什么RHEL的更新升级不是简单的“yum update”那天凌晨两点我被一阵急促的告警电话吵醒。监控显示一台运行着核心数据库的RHEL 7.9服务器其某个关键安全组件的CVE漏洞评分突然飙升至“严重”级别。睡眼惺忪的我第一反应就是登录服务器执行那个刻在肌肉记忆里的命令sudo yum update。然而等待我的不是顺利的更新进度条而是一行刺眼的红色错误“This system is not registered with an entitlement server. You can use subscription-manager to register.” 那一刻我彻底清醒了。这不是普通的CentOS这是Red Hat Enterprise Linux (RHEL)它的更新升级链路从底层逻辑到实操细节都自成一派充满了企业级系统的“规矩”和“门道”。很多从CentOS转向RHEL或者初次接触红帽生态的运维工程师很容易把“更新升级”想象成一件简单的事情。毕竟命令看起来都差不多。但正是这种轻敌的想法可能导致生产环境更新失败、订阅失效、甚至因依赖关系混乱引发服务中断。RHEL的更新体系紧密围绕着其订阅Subscription模型构建。你没有有效的订阅就连最基本的漏洞修复包都无法获取。这与社区发行版“开源即自由”的哲学截然不同它强调的是可持续的支持、经过严格测试的软件流以及法律合规性。因此掌握RHEL的更新升级远不止记住一两条命令。它是一套组合拳涉及订阅管理、仓库配置、版本升级策略、回滚预案等多个维度。本文将从一个老运维的视角拆解在RHEL上执行软件更新和系统升级的完整逻辑链。无论你是要为一个RHEL 7.3的老系统寻找特定版本的Ansible包还是为RHEL 8配置高效的阿里云镜像源或是处理从RHEL 7到RHEL 8的原地升级这里的内容都将为你提供可直接复现的路径和必须绕开的深坑。2. 基石理解RHEL的订阅管理与仓库体系在Debian/Ubuntu世界里你修改/etc/apt/sources.list在CentOS里你配置/etc/yum.repos.d/*.repo。但在RHEL中第一步永远是处理好你的“门票”——订阅。没有订阅后续的所有操作都是空中楼阁。2.1 Subscription-Manager你的系统“护照”subscription-manager是RHEL订阅管理的核心工具。它的作用是将你的系统与红帽客户门户Red Hat Customer Portal账户下的一个有效订阅池Subscription Pool关联起来。关联成功后系统才能获得访问特定软件仓库如RHEL Server、可选仓库、扩展更新支持仓库等的权限。初始注册与附加订阅对于一台全新的、从未注册过的RHEL系统你需要完成以下步骤检查当前状态首先运行sudo subscription-manager status。如果显示“Overall Status: Current”说明系统已注册且订阅有效。如果显示“Not Registered”则需要从头开始。注册系统使用你的红帽客户门户账号进行注册。命令格式如下sudo subscription-manager register --username你的门户用户名 --password你的密码 --auto-attach--auto-attach参数会让工具自动为系统附加一个合适的订阅从你的账户可用池中选取。如果你有多个订阅类型如用于物理机、虚拟机、开发者订阅等可能需要先注册再手动附加。手动附加特定订阅可选如果自动附加的不符合预期你可以先查看可用订阅列表sudo subscription-manager list --available --all找到你想要的订阅池IDPool ID然后使用以下命令附加sudo subscription-manager attach --pool订阅池ID注意红帽提供免费的“Red Hat Developer Subscription for Individuals”适用于个人开发者和小型非生产环境。你可以用它来合法地注册最多16台RHEL系统用于开发、测试和学习。这是上手练习的绝佳途径。2.2 仓库Repository的启用与禁用成功附加订阅后系统并不会自动启用所有仓库。默认可能只启用了基础OS仓库。你需要根据需求启用额外的仓库例如“Supplementary”、“Optional”、“CodeReady Builder”RHEL 8等这些仓库包含了大量开发库和额外工具。列出所有可用仓库sudo subscription-manager repos --list启用特定仓库sudo subscription-manager repos --enable仓库ID。例如启用可选仓库sudo subscription-manager repos --enablerhel-7-server-optional-rpmsRHEL 7。禁用仓库sudo subscription-manager repos --disable仓库ID一个关键技巧在配置任何第三方YUM源如EPEL、Remi之前务必先确保你的RHEL基础仓库是正常工作的。很多依赖性问题源于基础包缺失而基础包只能来自红帽官方仓库。2.3 当无法使用官方仓库时配置本地或替代YUM源在某些隔离环境如内网开发、测试环境中系统可能无法直接访问红帽的CDN。这时你有两种主要选择方案一配置本地镜像源这是最稳定、可控的方案。你需要在一台可以访问外网的机器上使用reposync工具定期同步所需的仓库到本地服务器如Nginx、Apache或createrepo创建的本地仓库然后在内网RHEL客户端上修改repo文件将baseurl指向这个本地服务器地址。例如一个本地仓库的repo文件可能长这样 (/etc/yum.repos.d/local-rhel.repo)[local-rhel-baseos] nameLocal RHEL 8 - BaseOS baseurlhttp://your-local-server/rhel8/BaseOS enabled1 gpgcheck1 gpgkeyfile:///etc/pki/rpm-gpg/RPM-GPG-KEY-redhat-release [local-rhel-appstream] nameLocal RHEL 8 - AppStream baseurlhttp://your-local-server/rhel8/AppStream enabled1 gpgcheck1 gpgkeyfile:///etc/pki/rpm-gpg/RPM-GPG-KEY-redhat-release实验目的不仅仅是改个地址而是要理解仓库的目录结构如BaseOS和AppStream的分离以及createrepo命令如何为下载的RPM包创建元数据。方案二替换为社区重建的镜像源如CentOS镜像警告此方案存在法律风险和兼容性风险不适用于生产环境。红帽的RPM包受订阅协议保护。社区发行版如Rocky Linux或AlmaLinux提供了与RHEL二进制兼容的包其镜像源如阿里云、清华镜像站速度很快。例如将RHEL 8的仓库替换为Rocky Linux的镜像确实可以绕过订阅检查进行yum update。以Rocky Linux 8为例替换步骤通常包括备份原有的repo文件sudo mv /etc/yum.repos.d/redhat.repo /etc/yum.repos.d/redhat.repo.backup下载Rocky Linux的repo文件。修改repo文件中的baseurl为阿里云或清华镜像地址。但是你必须清楚这带来的后果你不再从红帽获得官方更新和支持包版本可能出现细微差异并且严格来说这违反了RHEL的最终用户许可协议EULA。这只应作为临时的、非生产环境的权宜之计。3. 日常操作软件包的更新、安装与问题排查处理好订阅和仓库日常的软件包管理就回归到我们熟悉的YUM或RHEL 8以上的DNF工具上。但即使在这里也有许多细节值得深究。3.1 YUM/DNF的核心操作与最佳实践检查更新sudo yum check-update(RHEL 7) 或sudo dnf check-update(RHEL 8)。这个命令只列出可用的更新不会执行任何更改是更新前风险评估的第一步。更新所有包sudo yum update或sudo dnf upgrade。这是最常用的命令。dnf upgrade是dnf update的别名行为一致。更新指定包sudo yum update package_name例如sudo yum update kernel。这常用于只更新关键组件减少影响范围。安装新软件sudo yum install package_name。如果遇到“No package available”错误首先检查是否启用了正确的仓库。例如安装ansible在RHEL 7上可能需要先启用EPEL仓库在RHEL 8上ansible可能位于AppStream仓库中。一个必须养成的习惯更新前先做一次系统快照或备份。对于物理机或无法快照的虚拟机至少确保有完整的回退预案。我曾遇到过因为一个看似无关的库更新导致一个老旧的自研应用崩溃的情况。3.2 典型问题排查实录问题场景在RHEL 7.3上你需要安装一个特定版本的Ansible包比如2.9.x但默认仓库只有2.4.x。排查与解决确认需求为什么必须是2.9.x是因为新剧本playbook的特性依赖还是为了与Ansible Tower版本匹配明确需求是第一步。搜索可用包使用yum list available ansible*查看所有可用的Ansible相关包。发现只有低版本。寻找额外仓库Ansible官方可能不直接为老版本RHEL提供高版本包。这时需要转向第三方仓库如EPELExtra Packages for Enterprise Linux。但EPEL通常也只提供较新的、与EPEL维护周期匹配的版本。启用特定仓库对于RHEL有时红帽的“Ansible Engine”仓库提供了官方维护的、经过认证的Ansible版本。你需要通过订阅管理器启用它sudo subscription-manager repos --enablerhel-7-server-ansible-2.9-rpms假设该仓库ID存在且在你的订阅内。如果订阅内没有考虑从较新版本的EPEL中手动下载对应版本的RPM包及其依赖然后在本地安装。但这会带来依赖地狱dependency hell的风险需要极其谨慎。最终方案经过评估发现升级整个系统到RHEL 7.9其EPEL仓库提供了Ansible 2.9是更稳定、可持续的方案。于是问题从“安装特定包”转化为“安全地更新系统次版本”。另一个常见错误#include errors detected. Please update your includePath.这看起来是开发环境如VSCode的C/C头文件路径问题但根源可能在于系统开发包未更新或未安装。你需要运行sudo yum install gcc gcc-c kernel-devel等来安装或更新开发工具链确保/usr/include等路径下的头文件是最新的。4. 重大升级从RHEL 7到RHEL 8的原地升级Leapp跨主版本的升级如7 - 8是高风险操作。红帽提供了leapp工具来执行原地升级in-place upgrade它会在升级前进行预检并尝试自动化解决一些兼容性问题。4.1 升级前准备比执行升级更重要完整备份重申一遍完整的系统备份包括数据、配置、应用是生命线。考虑使用rsync,tar或虚拟机快照。审查官方文档仔细阅读红帽官方发布的《从RHEL 7升级到RHEL 8》指南。每个次版本如7.9到8.10的指南可能有细微差别。使用预检Preupgrade在RHEL 7上安装leapp-upgrade包然后运行sudo leapp preupgrade。这个命令会生成一个详细的报告 (/var/log/leapp/leapp-report.txt)列出所有可能阻碍升级的问题例如已废弃且不再被支持的软件包如mysql-server需要迁移到mariadb-server或mysql-community-server。不兼容的配置文件格式或位置。不受支持的硬件或驱动。根据报告解决问题这是最耗时的一步。你可能需要卸载某些包修改配置文件或更新应用。Leapp报告会给出建议但有些复杂情况需要手动研究解决。4.2 执行升级与事后验证当所有预检问题都被解决或评估为可接受后才能执行升级sudo leapp upgrade执行后系统会下载必要的RHEL 8包并创建一个新的启动项。接下来需要重启系统。在重启过程中系统会进入一个特殊的升级环境自动执行包替换、配置迁移等操作。这个过程可能持续几十分钟到数小时取决于系统规模和网络速度。升级后必须做的几件事检查操作系统版本cat /etc/redhat-release确认已变为RHEL 8.x。检查服务状态systemctl list-units --statefailed查看是否有服务启动失败。检查网络确认网络接口、主机名、DNS解析正常。RHEL 8使用nmcli管理网络与RHEL 7的network-scripts有所不同。测试关键应用这是核心。逐一对你的核心业务应用进行功能测试。不要假设它们都能正常工作。检查防火墙与SELinuxfirewalld和SELinux的规则可能在升级中发生变化需要重新审核。4.3 升级失败的回滚Leapp在升级前会创建一个名为*.backup的snapshot如果文件系统支持如XFS。如果升级后系统无法启动或关键功能失效你可以在GRUB启动菜单中选择回滚到之前的RHEL 7环境。但请注意这个回滚点仅在升级后第一次成功启动RHEL 8之前有效。一旦你在RHEL 8下做了任何修改哪怕只是创建了一个文件回滚就可能不完整或失败。因此备份依然是最终的保障。5. 特殊场景与进阶技巧5.1 处理“Windows Update”式问题如何暂停或控制更新在RHEL上虽然没有直接的“暂停更新35天”的图形化按钮但你可以通过多种方式控制更新节奏这对于维护生产环境的稳定性至关重要。禁用仓库最彻底的方法。使用subscription-manager repos --disable临时禁用所有更新仓库。需要更新时再启用。缺点是粒度较粗。使用YUM版本锁yum versionlock这是一个强大的插件。安装yum-plugin-versionlock后你可以将特定的包锁定在当前版本即使有更新可用yum update也会跳过它。sudo yum install yum-plugin-versionlock sudo yum versionlock add kernel* # 锁定所有kernel相关包 sudo yum versionlock list # 查看锁定列表 sudo yum update # 此时kernel包不会被更新配置YUM自动更新yum-cron对于需要自动安全更新的场景可以安装和配置yum-cron。你可以配置它仅下载更新但不安装 (download_updates yes,apply_updates no)然后由管理员在维护窗口手动审核并安装。在RHEL 8上对应的工具是dnf-automatic。5.2 依赖与冲突的解决艺术yum或dnf在解决依赖方面已经非常智能但偶尔还是会遇到棘手冲突。关键在于理解工具给出的信息。使用--skip-broken在yum update或install时如果某个包的依赖无法满足可以尝试加上--skip-broken参数跳过有问题的包先更新其他所有包。但这只是权宜之计被跳过的包的安全漏洞依然存在。使用repoquery进行深度分析安装yum-utils包后repoquery命令是你的瑞士军刀。repoquery --requires package查看一个包需要什么。repoquery --whatrequires capability查看哪个包需要某个特定的能力如一个.so库文件。当冲突发生时用这些命令厘清依赖关系网判断是应该强制降级某个包还是寻找替代方案。5.3 内核更新与安全启动Secure BootRHEL更新内核后新内核需要被引导加载器通常是GRUB识别。在启用了UEFI安全启动Secure Boot的系统上新内核模块必须经过签名才能加载。红帽官方内核已经正确签名。但如果你安装了第三方内核模块如某些显卡驱动、虚拟化工具在更新内核后这些模块需要针对新内核重新编译和签名否则系统可能无法启动这些模块甚至无法进入图形界面。操作建议在内核更新后重启前如果系统安装了DKMSDynamic Kernel Module Support管理的第三方驱动最好手动触发一次重建sudo dkms autoinstall。对于安全启动环境确保你有第三方模块的签名密钥并已将其加入MOKMachine Owner Key管理器。RHEL的更新升级表面上是命令的执行内核里是订阅、仓库、依赖、版本策略和风险控制的综合体现。它要求运维人员不仅知道如何敲命令更要理解命令背后的商业逻辑和技术约束。从确保订阅有效这个“准入门槛”到日常更新的谨慎验证再到跨版本升级的如履薄冰每一步都需要规划、测试和备份。把每一次更新都当作一次可能改变系统状态的手术做好术前检查预检、备份、术中监控日志观察、术后护理功能验证才能在企业级Linux的世界里既保持系统的安全与活力又保障其上业务的连续与稳定。
返回列表