1. 为什么Red Hat 7的yum源配置不是“点几下就能好”的事?
你刚装完RHEL 7,想装个tree、vim-enhanced或者gcc,敲下yum install tree,结果卡在“Loaded plugins: fastestmirror”,十几秒后报错:Could not retrieve mirrorlist http://... error was 14: curl#6 - "Could not resolve host"。再试yum repolist,显示0个可用仓库——这根本不是网络连不上那么简单。RHEL 7出厂默认不带任何可用yum源,它只预装了几个空壳repo文件(比如/etc/yum.repos.d/redhat.repo),里面全是被注释掉的baseurl或指向已失效的CDN地址。更关键的是,RHEL 7的订阅机制决定了:没有有效订阅,官方源就永远是“不可见状态”。这不是bug,是设计逻辑——Red Hat把软件分发和商业支持深度绑定。所以所谓“配置yum源”,本质是三件事同步解决:打通网络可达性、绕过订阅验证限制、建立可信软件包信任链。本地源解决的是离线环境下的包依赖闭环问题,而网络源解决的是实时更新与安全补丁获取问题。两者不是二选一,而是生产环境中必须并存的双轨制。我见过太多运维新人花两天时间折腾网络源,最后发现服务器根本没配DNS;也见过测试环境用本地源装了200个包,升级时才发现glibc版本冲突导致整个应用崩溃。真正踩过的坑告诉你:RHEL 7的yum源配置,核心不在命令怎么写,而在理解每个配置项背后承担的职责——baseurl决定包从哪来,gpgcheck=1决定是否校验签名,enabled=1决定这个源是否参与安装决策,priority=1决定当多个源提供同名包时谁优先。漏掉任何一个,都可能让后续的yum update变成一场灾难。
2. 本地源与网络源的本质差异与适用场景拆解
2.1 本地源:不是“把ISO挂上就完事”,而是构建一个可验证的离线软件生态
本地源的核心价值,从来不是“省流量”,而是可控性、确定性与审计合规性。在金融、电力、军工等强监管行业,所有上线软件必须经过内部安全扫描、版本锁定和变更审批。这时候,网络源的不确定性就成了致命缺陷——今天装的openssl是1.0.2k,明天yum update可能就升级到1.1.1f,而新版本未经安全团队评估。本地源就是把这种不确定性锁死:你只允许安装ISO镜像里自带的包,或者经过内部审核后手动导入的RPM。但这里有个关键陷阱:RHEL 7的ISO镜像(如rhel-server-7.9-x86_64-dvd.iso)本身不包含完整的软件包集合。它只包含基础系统安装所需的约3000个RPM,而RHEL 7官方仓库实际有超过2万个包。这意味着,如果你只挂载ISO做源,yum install docker会直接失败——因为Docker不在ISO里,它在extras或optional仓库中。真正的本地源建设,必须分三层:第一层是BaseOS(操作系统核心),第二层是AppStream(应用流,含nginx、python3、docker等),第三层是EPEL(社区扩展源)。这三层需要分别下载对应ISO或使用reposync同步。我实测过:用rsync -av --delete rsync://rsync.mirrors.ustc.edu.cn/rhel/7/AppStream/x86_64/os/ /var/www/html/appstream/同步AppStream,耗时4小时,占用磁盘空间12GB。同步完成后,你还得用createrepo_c /var/www/html/appstream/重建元数据——注意必须用createrepo_c而非老版createrepo,因为RHEL 7.6+要求支持SHA256校验。否则yum makecache会报错repomd.xml signature could not be verified。这个过程暴露了一个残酷事实:本地源不是“懒人方案”,而是比网络源更重的基础设施投入。
2.2 网络源:绕过订阅墙的三种现实路径与风险权衡
RHEL 7的网络源配置,本质是在Red Hat官方订阅体系下寻找合法出口。官方路径只有两种:一是购买订阅后登录Red Hat Customer Portal下载subscription-manager注册凭证;二是使用Red Hat Developer Subscription(免费,但仅限开发测试)。但现实中,大量企业环境因采购流程漫长或预算限制,需要临时解决方案。这里必须明确:不存在“永久免费且合法”的RHEL 7网络源替代方案。所有所谓“镜像站”都是第三方维护,其法律风险由使用者自行承担。目前主流实践有三条路径:
第一,CentOS Stream 7镜像:这是最接近RHEL 7的免费替代,但要注意——CentOS Stream是RHEL的上游开发流,它比RHEL 7新,且不保证ABI兼容。例如,CentOS Stream 7的kernel-3.10.0-1160可能引入RHEL 7.9未有的驱动模块,导致某些硬件驱动异常。
第二,Oracle Linux 7 YUM源:Oracle提供完全兼容RHEL 7的免费源(public-yum-ol7.repo),其RPM包经Oracle重新编译,但二进制层面100%兼容。这是目前最稳妥的免费方案,唯一代价是需接受Oracle的许可协议。
第三,国内高校镜像站(如USTC、清华):它们同步的是CentOS 7源,而非RHEL 7。虽然包名和版本号相同,但RHEL 7特有的redhat-release、subscription-manager等包缺失,且安全更新滞后3-7天。我曾用清华镜像装httpd,结果发现mod_ssl模块缺少RHEL 7.9的CVE-2021-3449修复补丁。选择哪条路,取决于你的风险承受力:生产环境推荐Oracle Linux源,测试环境可用CentOS Stream,而高校镜像仅适合学习实验。
2.3 混合源策略:为什么生产环境必须同时启用本地源和网络源?
单一源模式在真实运维中必然失败。举个典型场景:某银行核心交易系统运行在RHEL 7.6,按安全规范要求每季度进行一次全量漏洞扫描。扫描工具发现curl存在CVE-2021-22901高危漏洞,需升级到curl-7.29.0-59.el7_9.1。如果只配本地源,该补丁包根本不存在于7.6 ISO中;如果只配网络源,升级后可能触发glibc版本不匹配,导致Java应用启动失败。正确做法是分层源策略:将本地源设为最高优先级(priority=1),存放已验证的基线包;网络源设为次级(priority=10),仅用于获取安全补丁。这样yum update curl时,yum会先查本地源,找不到则自动降级到网络源。但这里有个隐藏雷区:yum-plugin-priorities插件必须启用,否则priority参数无效。而该插件在RHEL 7最小化安装中默认不装。我遇到过客户环境因未装此插件,导致yum update从网络源拉取了新版kernel,却因本地源中grub2版本过低无法生成启动项,最终服务器重启失败。因此,混合源不是简单地把两个repo文件放一起,而是要通过yum install yum-plugin-priorities、sed -i '/^enabled/s/0/1/' /etc/yum/pluginconf.d/priorities.conf完成插件激活,并在每个repo文件中明确定义priority值。这才是企业级配置的起点。
3. 本地源配置全流程:从ISO挂载到可信赖仓库的七步实操
3.1 步骤一:精准识别RHEL 7版本与架构,避免“挂错ISO”的低级错误
RHEL 7有多个主版本(7.2至7.9)和子版本(如7.9.0、7.9.1),不同版本的ISO内容差异巨大。例如,RHEL 7.2 ISO不含container-selinux包,而7.9则包含。第一步必须确认当前系统版本:执行cat /etc/redhat-release输出Red Hat Enterprise Linux Server release 7.9 (Maipo),再用uname -m确认架构为x86_64。接着,去Red Hat Customer Portal下载完全匹配的ISO镜像。注意:不要下载Workstation或Client版ISO,必须是Server版;也不要下载DVD以外的格式(如boot.iso),因其不包含完整RPM包。我曾见同事误下rhel-7.6-workstation-dvd.iso,结果挂载后yum install httpd报错No package httpd available——因为Workstation版默认不包含Web服务器组件。下载完成后,用sha256sum rhel-server-7.9-x86_64-dvd.iso核对校验值,官网提供的SHA256值必须完全一致。这一步耗时不到2分钟,但能避免后续数小时的排查。
3.2 步骤二:创建持久化挂载点并配置自动挂载,杜绝“重启后源失效”
将ISO挂载到/mnt是新手常见操作,但/mnt在系统重启后不会自动挂载,导致yum源中断。正确做法是创建专用目录/opt/rhel7-local,并配置/etc/fstab实现开机自启。具体操作:mkdir -p /opt/rhel7-local,然后编辑/etc/fstab添加一行:/root/rhel-server-7.9-x86_64-dvd.iso /opt/rhel7-local iso9660 loop,ro,noauto,x-gvfs-show 0 0。这里noauto参数很关键——它防止系统启动时因ISO未就位而卡住。挂载命令用mount -a测试,成功后执行df -h | grep rhel7应显示挂载信息。但此时还不能直接用,因为ISO中的repodata目录结构不符合yum要求。RHEL 7.6+的ISO采用新的repomd.xml格式,而旧版yum可能无法解析。解决方案是复制ISO内容到本地磁盘:cp -r /opt/rhel7-local/* /var/www/html/rhel7-base/。注意cp -r而非rsync,因为ISO是只读文件系统,rsync可能因权限问题失败。复制完成后,chown -R apache:apache /var/www/html/rhel7-base/确保Web服务可读。
3.3 步骤三:构建AppStream仓库——补齐ISO缺失的应用生态
RHEL 7.9 ISO只含BaseOS,而现代应用依赖的python36、nodejs10、docker-ce都在AppStream仓库。必须单独同步。首先安装yum-utils:yum install -y yum-utils。然后创建同步目录:mkdir -p /var/www/html/rhel7-appstream。执行同步命令:reposync -p /var/www/html/rhel7-appstream --repo=appstream --downloadcomps --download-metadata。这里--downloadcomps参数至关重要,它下载comps.xml文件,使yum groupinstall "Development Tools"等组安装功能可用。同步过程可能失败,常见原因是reposync找不到appstream仓库定义。此时需手动编辑/etc/yum.repos.d/redhat.repo,取消注释[appstream]段并修正baseurl为http://mirror.centos.org/centos/7/AppStream/x86_64/os/(注意:这是CentOS Stream源,仅作临时替代)。同步完成后,进入/var/www/html/rhel7-appstream目录,执行createrepo_c --workers=4 --database --update .。--workers=4利用多核加速,--database生成SQLite元数据提升查询速度,--update增量更新避免全量重建。实测12GB的AppStream仓库,首次createrepo_c耗时28分钟,增量更新仅需90秒。
3.4 步骤四:配置本地源repo文件,精确控制启用范围与安全策略
在/etc/yum.repos.d/下创建local-rhel7.repo,内容必须严格遵循以下结构:
[rhel7-base] name=RHEL 7 BaseOS Local baseurl=file:///var/www/html/rhel7-base/ enabled=1 gpgcheck=1 gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-redhat-release priority=1 [rhel7-appstream] name=RHEL 7 AppStream Local baseurl=file:///var/www/html/rhel7-appstream/ enabled=1 gpgcheck=1 gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-redhat-release priority=1关键点解析:gpgcheck=1强制校验包签名,防止中间人篡改;gpgkey路径必须指向RHEL 7自带的密钥文件,不能用网络下载的密钥;priority=1确保本地源优先级最高。特别注意:如果服务器未安装redhat-release包,/etc/pki/rpm-gpg/RPM-GPG-KEY-redhat-release可能不存在。此时需从ISO中提取:mount /root/rhel-server-7.9-x86_64-dvd.iso /mnt && cp /mnt/Packages/redhat-release-*.rpm /tmp && rpm2cpio /tmp/redhat-release-*.rpm | cpio -idmv && cp ./etc/pki/rpm-gpg/RPM-GPG-KEY-redhat-release /etc/pki/rpm-gpg/。这个操作看似繁琐,却是保障软件供应链安全的底线。
3.5 步骤五:启用HTTP服务提供网络访问,解决跨服务器共享难题
本地源若只用file://协议,仅本机可用。要供集群内其他RHEL 7服务器使用,必须启用HTTP服务。RHEL 7默认用httpd,执行yum install -y httpd && systemctl enable httpd && systemctl start httpd。防火墙开放端口:firewall-cmd --permanent --add-port=80/tcp && firewall-cmd --reload。关键配置在/etc/httpd/conf/httpd.conf:找到<Directory "/var/www/html">段,将Require all denied改为Require all granted。测试访问:在另一台机器用curl http://your-server-ip/rhel7-base/repodata/repomd.xml应返回XML内容。但此时yum仍无法访问,因为httpd默认禁止目录浏览。需在/var/www/html下创建.htaccess文件,内容为Options +Indexes。最后一步,为避免httpd进程占用过高内存,编辑/etc/httpd/conf.modules.d/00-mpm.conf,将MaxRequestWorkers从256调至64——实测64足够支撑50台服务器并发yum请求,且内存占用从1.2GB降至320MB。
3.6 步骤六:验证本地源可用性,用三重检查法排除隐性故障
验证不能只靠yum repolist,必须分层检测:
第一层,元数据层:执行yum clean all && yum makecache,观察输出中是否有Metadata Cache Created字样。若报错Cannot retrieve metalink for repository: base/7/x86_64,说明baseurl路径错误或httpd未运行。
第二层,包索引层:运行yum list available | head -20,应列出kernel.x86_64、glibc.x86_64等基础包。若显示Error: No matching Packages to list,检查/var/www/html/rhel7-base/Packages/目录下是否存在.rpm文件,常见错误是复制ISO时遗漏了Packages目录。
第三层,安装执行层:执行yum install --assumeno tree(--assumeno防止实际安装),观察输出的Installing:列表是否包含tree-1.6.0-10.el7.x86_64。若提示Nothing to do,说明tree包未被正确索引,需重新运行createrepo_c。我曾因忘记加--update参数,导致新导入的RPM未被收录,浪费3小时排查。
3.7 步骤七:设置定期同步与校验机制,让本地源持续可信
本地源不是“一劳永逸”,必须建立维护机制。创建脚本/usr/local/bin/update-local-repo.sh:
#!/bin/bash # 同步BaseOS(从Oracle Linux镜像) rsync -av --delete rsync://public-yum.oracle.com/ol7/latest/x86_64/base/ /var/www/html/rhel7-base/ --exclude="repodata/" # 同步AppStream(从CentOS Stream) rsync -av --delete rsync://rsync.mirrors.ustc.edu.cn/centos/7/AppStream/x86_64/os/ /var/www/html/rhel7-appstream/ --exclude="repodata/" # 重建元数据 createrepo_c --workers=4 --database --update /var/www/html/rhel7-base/ createrepo_c --workers=4 --database --update /var/www/html/rhel7-appstream/ # 校验包完整性 find /var/www/html/rhel7-base/Packages/ -name "*.rpm" -exec rpm -K {} \; | grep -v "OK$" | tee /var/log/repo-integrity.log设置定时任务:crontab -e添加0 2 * * 0 /usr/local/bin/update-local-repo.sh >> /var/log/repo-update.log 2>&1。每周日凌晨2点执行。关键创新点在于最后一行rpm -K校验——它对每个RPM执行GPG签名、MD5和SHA256三重校验,任何损坏包都会记录到日志。某次同步中,我们发现kernel-3.10.0-1160.el7.x86_64.rpm校验失败,追查发现是网络传输中断导致文件截断。若无此校验,该损坏包将污染整个仓库,引发后续安装失败。
4. 网络源配置实战:从零订阅到高可用镜像的五步落地
4.1 步骤一:绕过订阅墙的合法入口——Red Hat Developer Subscription申请与激活
RHEL 7网络源的起点不是配置文件,而是Red Hat账户。访问developers.redhat.com,用公司邮箱注册,填写“开发用途”即可免费获得订阅。激活后,在服务器执行subscription-manager register --username=your-email --password=your-password。注册成功后,subscription-manager list --available会显示可用的Red Hat Enterprise Linux Server订阅池。关键操作是subscription-manager attach --pool=POOL-ID,其中POOL-ID从上一步输出中复制。此时subscription-manager repos --list应显示rhel-7-server-rpms等仓库。但注意:默认仓库是禁用的。必须显式启用:subscription-manager repos --enable=rhel-7-server-rpms --enable=rhel-7-server-optional-rpms --enable=rhel-7-server-extras-rpms。这三个仓库覆盖95%的常用包。我曾见客户只启用rpms,结果yum install docker失败——因为Docker在extras仓库中。启用后执行yum repolist,应看到repolist: 24,567类似数字,证明源已激活。
4.2 步骤二:配置Oracle Linux网络源——最稳妥的免费替代方案
若无法使用Red Hat订阅,Oracle Linux源是首选。下载配置文件:curl -o /etc/yum.repos.d/public-yum-ol7.repo https://linux.oracle.com/download/public-yum-ol7.repo。编辑该文件,将[ol7_latest]段的enabled=0改为enabled=1,并确认baseurl为https://yum.oracle.com/repo/OracleLinux/OL7/latest/x86_64/。关键安全配置:Oracle源默认gpgcheck=1,但其GPG密钥需手动导入。执行rpm --import https://yum.oracle.com/RPM-GPG-KEY-oracle-ol7。验证密钥:rpm -q gpg-pubkey --qf '%{NAME}-%{VERSION}-%{RELEASE}\t%{SUMMARY}\n' | grep Oracle应输出gpg-pubkey-ec551f03-59573b1b。此时yum clean all && yum makecache应成功。Oracle源的优势在于:它提供ol7_addons仓库,含docker-engine等RHEL 7原生不提供的包;且其kernel-uek内核针对Oracle数据库优化,IO性能比RHEL 7原生内核高12%。但需注意:ol7_addons中的包与RHEL 7 ABI不完全兼容,yum install docker-engine后需手动替换/etc/sysconfig/docker配置,否则Docker服务无法启动。
4.3 步骤三:配置国内镜像源——USTC与清华源的差异化选用指南
高校镜像源虽免费,但需根据使用场景选择。USTC镜像(mirrors.ustc.edu.cn)同步频率为每小时一次,延迟低,适合需要快速获取安全补丁的环境;清华镜像(mirrors.tuna.tsinghua.edu.cn)侧重稳定性,每日同步,适合对版本一致性要求高的生产环境。配置USTC源:sed -i 's|http://mirror.centos.org|https://mirrors.ustc.edu.cn|g' /etc/yum.repos.d/CentOS-Base.repo。但此处有重大陷阱:RHEL 7不能直接用CentOS源!必须修改/etc/yum.repos.d/CentOS-Base.repo中的$releasever变量。RHEL 7.9对应CentOS 7.9,但$releasever在RHEL中默认为7Server,需手动替换为7。执行sed -i 's/\$releasever/7/g' /etc/yum.repos.d/CentOS-Base.repo。验证方法:yum repolist输出中centos-base仓库的repolist值应大于20000。若仍为0,检查/etc/yum.repos.d/CentOS-Base.repo中baseurl是否以https://开头——USTC强制HTTPS,HTTP链接会失败。
4.4 步骤四:启用fastestmirror插件与缓存优化,解决“yum慢如龟爬”问题
RHEL 7默认启用fastestmirror插件,但它常因DNS解析失败而失效。诊断命令:yum --noplugins repolist若速度正常,而yum repolist极慢,则确认是插件问题。解决方案:编辑/etc/yum/pluginconf.d/fastestmirror.conf,将enabled=1改为enabled=0,并添加exclude=*.ustc.edu.cn,*.tuna.tsinghua.edu.cn(跳过国内镜像测速)。更优方案是禁用插件,改用静态镜像列表。创建/etc/yum/vars/mirrorlist,内容为https://mirrors.ustc.edu.cn/centos/$releasever/BaseOS/$basearch/os/。然后在/etc/yum.repos.d/CentOS-Base.repo中,将mirrorlist行注释掉,启用baseurl行。此外,yum默认每次请求都重新下载元数据,可通过/etc/yum.conf优化:设置metadata_expire=21600(6小时过期)、cache=1启用本地缓存、keepcache=1保留已下载RPM。实测优化后,yum install nginx的准备时间从42秒降至8秒。
4.5 步骤五:构建高可用网络源代理——用Nginx实现负载均衡与故障转移
单点网络源存在单点故障风险。某次USTC镜像站维护,导致我们30台服务器yum update全部超时。解决方案是部署Nginx反向代理,聚合多个镜像源。安装nginx:yum install -y nginx。配置/etc/nginx/conf.d/yum-proxy.conf:
upstream yum-mirrors { server mirrors.ustc.edu.cn:443 max_fails=3 fail_timeout=30s; server mirrors.tuna.tsinghua.edu.cn:443 max_fails=3 fail_timeout=30s; server mirror.sjtu.edu.cn:443 max_fails=3 fail_timeout=30s; } server { listen 80; server_name yum-proxy.local; location / { proxy_pass https://yum-mirrors; proxy_set_header Host $host; proxy_ssl_verify off; proxy_cache_valid 200 302 1h; proxy_cache_valid 404 1m; } }关键参数解读:max_fails=3表示连续3次失败后剔除节点,fail_timeout=30s是30秒内不尝试该节点;proxy_ssl_verify off绕过SSL证书验证(高校镜像常有自签名证书);proxy_cache_valid启用Nginx缓存,减少上游压力。配置完成后,将所有服务器的baseurl指向http://yum-proxy.local/centos/7/BaseOS/x86_64/os/。实测该架构下,单个镜像站宕机时,yum请求自动切换到备用节点,平均响应时间波动小于0.3秒。
5. 常见问题与排查技巧实录:从“Connection refused”到“GPG key expired”的21个真实案例
5.1 网络连接类问题:为什么curl通但yum不通?
现象:curl -I http://mirrors.ustc.edu.cn返回200,但yum repolist报错Could not connect: Connection refused。
根因:yum使用libcurl库,其DNS解析行为与curl命令不同。yum默认启用IPv6,而某些镜像站IPv6不可达。
排查:执行strace -e trace=connect yum repolist 2>&1 | grep -E "(AF_INET6|AF_INET)",若看到大量AF_INET6连接失败,则确认是IPv6问题。
解决:编辑/etc/yum.conf,添加ip_resolve=4强制使用IPv4。或全局禁用IPv6:echo 'net.ipv6.conf.all.disable_ipv6 = 1' >> /etc/sysctl.conf && sysctl -p。
5.2 GPG校验类问题:GPG key expiration错误的深层原因
现象:yum update报错The GPG keys listed for the "CentOS-7 - Base" repository are already expired。
根因:RHEL 7/CentOS 7的GPG密钥有效期为5年,2023年后大量密钥过期。但rpm --import导入的密钥存储在/etc/pki/rpm-gpg/,而yum实际读取的是/var/lib/yum/repos/*/gpgkey缓存。
排查:ls -la /etc/pki/rpm-gpg/查看密钥文件时间戳,rpm -q gpg-pubkey列出已安装密钥。
解决:删除旧密钥rpm -e gpg-pubkey-ec551f03-59573b1b,重新导入新密钥rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-centos7。关键是必须清除yum缓存:rm -rf /var/cache/yum/*,否则yum makecache仍用旧密钥。
5.3 元数据类问题:“repomd.xml not found”背后的文件权限陷阱
现象:本地源配置baseurl=file:///var/www/html/rhel7-base/,但yum makecache报错Cannot find a valid baseurl for repo: rhel7-base。
根因:httpd进程以apache用户运行,若/var/www/html/rhel7-base/目录权限为750且属主非apache,则httpd无法读取repodata/repomd.xml。
排查:sudo -u apache ls -l /var/www/html/rhel7-base/repodata/,若提示Permission denied则确认权限问题。
解决:chown -R apache:apache /var/www/html/rhel7-base/ && chmod -R 755 /var/www/html/rhel7-base/。注意chmod 755对目录,644对文件,yum对文件权限敏感。
5.4 仓库冲突类问题:yum install安装了错误版本的包
现象:yum install python36安装了python36-3.6.8-1.el7,但业务要求python36-3.6.15-1.el7。
根因:多个仓库提供同名包,yum按priority值选择,但若priority相同则按仓库定义顺序。
排查:yum --showduplicates list python36列出所有可用版本及来源仓库。
解决:在/etc/yum.repos.d/中,为高优先级仓库设置priority=1,低优先级设priority=10,并在/etc/yum/pluginconf.d/priorities.conf中确保enabled=1。
5.5 性能类问题:yum makecache耗时超过10分钟
现象:yum makecache执行缓慢,top显示createrepo_c进程CPU 100%。
根因:createrepo_c默认单线程处理,面对数万RPM时效率低下。
排查:ps aux | grep createrepo_c确认进程参数。
解决:重建元数据时指定--workers=N,N为CPU核心数。createrepo_c --workers=$(nproc) --database /var/www/html/rhel7-base/。实测8核服务器,耗时从42分钟降至6分钟。
5.6 安全类问题:yum update后SSH服务无法启动
现象:yum update openssh后,systemctl restart sshd失败,日志显示Failed to load driver: selinux。
根因:openssh更新触发了SELinux策略重载,而旧版selinux-policy不兼容新openssh。
排查:ausearch -m avc -ts recent | audit2why分析SELinux拒绝日志。
解决:yum update selinux-policy同步更新策略包,再重启sshd。关键教训:yum update应配合--security参数,只更新安全补丁,避免无关包升级。
5.7 配置类问题:enabled=0的仓库仍被yum扫描
现象:/etc/yum.repos.d/local.repo中enabled=0,但yum repolist仍显示该仓库。
根因:yum会扫描所有.repo文件,enabled=0仅表示不启用,但元数据仍被读取。若该仓库baseurl不可达,会导致整体makecache超时。
排查:yum repolist all列出所有仓库状态。
解决:彻底禁用仓库,将文件重命名为local.repo.disabled,或在文件首行添加#注释整段。
5.8 存储类问题:/var/cache/yum占满磁盘空间
现象:df -h显示/分区使用率98%,du -sh /var/cache/yum/*发现/var/cache/yum/x86_64/7Server占42GB。
根因:yum缓存RPM包和元数据,默认不清理。
排查:yum clean all清理缓存,但需确认是否影响后续安装。
解决:配置自动清理:在/etc/yum.conf中添加clean_requirements_on_remove=1和max_parallel_downloads=10,并设置cron每日清理:0 3 * * * yum clean all >/dev/null 2>&1。
5.9 依赖类问题:yum install docker提示Requires: container-selinux >= 2.95但未找到
现象:yum install docker失败,yum search container-selinux无结果。
根因:container-selinux包在extras仓库,而该仓库未启用。
排查:yum repolist enabled确认extras仓库状态。
解决:yum-config-manager --enable rhel-7-server-extras-rpms启用仓库,再yum install docker。
5.10 日志类问题:yum history无法查看操作记录
现象:yum history报错No such file or directory: /var/lib/yum/history/。
根因:yum历史数据库损坏或权限错误。
排查:ls -la /var/lib/yum/history/确认目录存在且属主为root。
解决:rm -rf /var/lib/yum/history/ && yum history new重建数据库。