ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

RedHat 9.3配置国内yum源:阿里源与本地镜像源完整实战

RedHat 9.3配置国内yum源:阿里源与本地镜像源完整实战 装完redhat 9.3之后第一件要做的事往往不是部署业务而是先把yum源整明白。默认情况下RHEL的软件源只认订阅账号没注册或者订阅过期连dnf makecache都过不去更别提dnf install了。这篇文章就把redhat 9.3配置国内yum阿里源和挂载本地镜像源的完整过程拆开讲清楚包括每一步的命令、repo文件的写法、GPG校验的处理以及我实际踩过的几个坑。适合刚装好RHEL 9.3准备做开发测试、内网离线部署或者单纯想让系统包管理正常跑起来的朋友参考。1. redhat 9.3为什么需要折腾yum源1.1 RHEL订阅机制默认源为什么不可用Red Hat Enterprise Linux 9.3默认的包管理工具是dnf日常习惯里叫yum也没问题因为/usr/bin/yum就是一个指向dnf的软链接。RHEL的系统仓库定义文件主要是/etc/yum.repos.d/redhat.repo但这个文件并没有直接写明BaseOS、AppStream等仓库地址而是由subscription-manager这个订阅管理组件根据当前系统的订阅状态动态生成。也就是说只要这台机器没有注册Red Hat订阅或者订阅已经过期dnf就根本拿不到可用的仓库列表。你执行dnf makecache的时候看到的报错大概率是类似这种Errors during downloading metadata for repo baseos: - Status code: 401 for http://... (ip)或者更直接的Not registered: No matching repo to modify这跟Ubuntu的apt仓库还不太一样Ubuntu至少默认源能访问只是慢。RHEL是直接不让你用没有订阅连仓库列表都看不到。所以换源这件事对国内用户来说几乎是装完系统后的第一道关卡。还有一层现实问题即使你有Red Hat订阅官方软件源服务器在海外的访问速度也不稳定尤其是高峰期拉取元数据经常超时下载软件包更是让人等到怀疑人生。所以无论从成本还是效率角度配置国内可用的yum源都有实际必要。1.2 阿里源与本地镜像源的使用场景对比很多人一上来就问“到底配阿里源好还是配本地源好”其实这两个东西不是二选一的关系而是互补的关系。我做了个对比对比项阿里云国内镜像源本地镜像源ISO挂载网络要求需要公网访问服务器必须能连外网完全离线可用不依赖任何外部网络软件版本仓库实时同步版本较新漏洞修复及时版本固定跟随ISO发行日期之后不会更新下载速度国内节点速度快但仍有网络波动走本地磁盘/光驱速度最快最稳定适用场景有外网权限的服务器、云主机、开发测试环境内网隔离环境、生产安全区域、无外网机房维护成本低一个repo文件搞定需要挂载ISO重启后如无自挂载会失效软件完整性包含BaseOS、AppStream、CRB、extras等多个仓库DVD里主要包含BaseOS和AppStream包数量有限我个人比较推荐的做法是外网环境优先配置阿里源作为主力同时把ISO挂载成备用本地源纯粹的内网离线环境就直接用本地源。这样平时装软件走阿里源速度快遇到网络波动或者外网被禁的时候还能切回本地源应急。2. 动手前的准备与仓库选型2.1 确认系统环境与备份原有配置换源之前先确认系统版本和你手上的环境情况避免后面白折腾。我习惯是先跑这么几条命令cat /etc/redhat-release dnf --version uname -m df -h/etc/redhat-release会显示当前系统版本比如Red Hat Enterprise Linux release 9.3uname -m用于确认架构一般是x86_64如果是ARM服务器就是aarch64后面写repo文件时baseurl里的架构参数要对应上df -h看一下根分区磁盘空间如果空间不足后面dnf makecache缓存元数据也可能出问题。接下来是备份原有repo文件。这一步看起来无关紧要实际非常关键。Red Hat的订阅机制会在/etc/yum.repos.d/下生成redhat.repo如果你后面想恢复官方订阅或者排查问题这个文件还得留着。建议统一放到备份目录mkdir -p /etc/yum.repos.d/backup mv /etc/yum.repos.d/*.repo /etc/yum.repos.d/backup/注意这里是把所有repo文件都移走不是删除。因为只要redhat.repo留在原目录即使订阅失效dnf在makecache时也可能去访问它拖慢速度甚至报错。移走之后系统就是你干干净净的一张白纸想怎么配怎么配。2.2 仓库设计BaseOS、AppStream、CRB到底是什么写repo文件之前必须得搞清楚RHEL 9的仓库结构不然只配一个BaseOS会发现大量软件装不上还找不到原因。RHEL 9的软件仓库主要分三类BaseOS仓库基础操作系统组件包括kernel、glibc、openssh等核心包。这是系统的地基所有其他软件都依赖它。AppStream仓库应用软件包和运行时环境包括nginx、python、postgresql、nodejs等。注意AppStream里面还引入了模块流module streams机制同一个软件可以存在多个版本通过dnf module切换。CRB仓库CodeReady Builder主要是开发用的库和编译依赖类似CentOS 7时代的PowerTools。很多第三方软件安装时需要用到CRB里的包只配BaseOS和AppStream不够用。另外Rocky Linux/AlmaLinux源还往往提供一个extras仓库里面放一些额外工具包比如epel-release这类有需要也可以顺带配上。一个标准的repo文件结构长这样[仓库id] name仓库描述信息 baseurl仓库下载路径 enabled1 gpgcheck1 gpgkeyfile:///etc/pki/rpm-gpg/RPM-GPG-KEY-xxx其中enabled1表示启用该仓库gpgcheck1表示校验软件包签名baseurl路径里可以用$releasever和$basearch变量分别代表系统版本号和CPU架构。这块设计清楚了后面的配置才不是瞎写。3. 阿里云yum源配置实操3.1 用Rocky/AlmaLinux源替代RHEL付费源的原理这里要讲一个很关键的事实阿里云镜像站没有RHEL官方的yum源。因为Red Hat的仓库只对订阅用户开放版权原因镜像站不能搬运RHEL的包。那国内用户怎么换源社区通行的办法是使用Rocky Linux或AlmaLinux的仓库来替代。为什么可以这样操作因为Rocky Linux和AlmaLinux都是从RHEL源码重新构建的API和软件包都保持二进制兼容RHEL 9.3能装的包Rocky/Alma 9.3基本都能装反之亦然。这是开源生态里一个心照不宣的实践。在个人开发测试环境或者内网环境用这套方案没有任何问题。但我要提醒一句如果你的业务生产环境购买了Red Hat订阅或者对官方技术支持有硬性要求那就应该注册订阅走官方源而不是用替代源。替代源的定位是“兼容可用”不是“官方背书”。实际操作时到底是选Rocky的源还是AlmaLinux的源我两个都用过差别其实不大。Rocky的阿里云镜像目录结构完整更新也比较及时所以我下面以Rocky为例。如果你想用AlmaLinux把链接里的rockylinux换成almalinux其余原理一模一样。3.2 手动创建阿里云repo文件并处理GPG校验备份完原有repo配置之后直接在/etc/yum.repos.d/下新建一个源文件比如叫aliyun.repovi /etc/yum.repos.d/aliyun.repo写入如下内容[baseos] nameRocky Linux 9.3 - BaseOS (Aliyun) baseurlhttps://mirrors.aliyun.com/rockylinux/9.3/BaseOS/$basearch/os/ enabled1 gpgcheck0 [appstream] nameRocky Linux 9.3 - AppStream (Aliyun) baseurlhttps://mirrors.aliyun.com/rockylinux/9.3/AppStream/$basearch/os/ enabled1 gpgcheck0 [crb] nameRocky Linux 9.3 - CRB (Aliyun) baseurlhttps://mirrors.aliyun.com/rockylinux/9.3/CRB/$basearch/os/ enabled1 gpgcheck0 [extras] nameRocky Linux 9.3 - Extras (Aliyun) baseurlhttps://mirrors.aliyun.com/rockylinux/9.3/extras/$basearch/os/ enabled1 gpgcheck0这里有几个细节要说明一下。第一路径里的9.3我建议直接写死不要用$releasever变量。原因在于RHEL 9.3的$releasever实际解析出来的值是9.3照理也能匹配阿里云的Rocky目录但如果你系统里有某些profile文件被改过变量解析就可能出问题直接写死最简单也最稳。第二gpgcheck0是我刻意设置的。很多教程会写gpgcheck1然后指定gpgkeyfile:///etc/pki/rpm-gpg/RPM-GPG-KEY-Rocky-9但问题在于RHEL系统上没有Rocky的GPG公钥文件你还需要先从镜像站下载这个key放到指定路径否则安装任何包都会报Public key for xxx is not installed错误。对于信任的环境和测试服务器直接gpgcheck0是减负操作。如果你的环境安全要求很高那就把key下载下来再开校验后面我会讲具体命令。3.3 执行缓存更新并安装验证写完repo文件后先清理缓存再重建dnf clean all dnf makecache如果路径写对了这一步应该会看到类似Rocky Linux 9.3 - BaseOS (Aliyun) 8.9 MB/s | 2.1 MB 00:00 Rocky Linux 9.3 - AppStream (Aliyun) 6.8 MB/s | 8.0 MB 00:00看到这个基本就成了。然后验证仓库列表dnf repolist再实打实装一个软件包测试dnf install -y nginx装完看一眼nginx版本能正常输出版本号就说明阿里源已经跑通了。这里顺便说一个我踩过的坑从Rocky源更新系统包时不要把dnf update -y当作常规操作。因为RHEL系统和Rocky源虽然二进制兼容但一些core包如果大版本升级可能会把系统的redhat-release相关包混入Rocky的rocky-release依赖关系虽然一般不会直接出大问题但我建议在非必要情况下只装软件不整体update把系统基础包保持原状更稳妥。4. 挂载本地镜像源4.1 ISO镜像挂载与开机自动挂载配置本地镜像源的思路很简单把RHEL 9.3的DVD ISO文件挂载到系统某个目录然后把该目录作为yum仓库路径。这在没有外网的内网环境非常实用。先准备好ISO文件假设放在/root/rhel-9.3-x86_64-dvd.isomkdir -p /mnt/rhel9 mount -o loop /root/rhel-9.3-x86_64-dvd.iso /mnt/rhel9挂载成功后确认一下df -h /mnt/rhel9 ls /mnt/rhel9正常能看到一堆目录比如BaseOS、AppStream、media.repo等。ISO文件同样存在于/mnt/rhel9/BaseOS和/mnt/rhel9/AppStream目录里这两个目录下就是仓库所需的repodata。问题来了服务器重启后ISO不会自动挂载每次重启都得手动mount一遍太费劲。所以要把挂载信息写进/etc/fstab实现开机自动挂载vi /etc/fstab在文件末尾加一行/root/rhel-9.3-x86_64-dvd.iso /mnt/rhel9 iso9660 defaults,loop 0 0保存退出后用mount -a测试一下配置有没有问题没问题再重启验证。这里有个注意事项如果ISO文件所在目录在开机时还没准备好比如放在了LVM或网络存储上挂载就可能失败。稳妥的做法是确认ISO文件放在本地磁盘目录比如/root或/opt不要放在网络盘上。另外如果ISO文件本身经常要换版本我建议把/system/iso这类目录建好专门放ISO镜像方便管理。4.2 利用media.repo快速配置本地仓库文件RHEL 9.3的DVD根目录里自带一个media.repo文件这是Anaconda安装器留下的仓库定义可以直接利用。先看一下它的内容cat /mnt/rhel9/media.repo输出大概是[BaseOS] nameBaseOS mediaid... baseurlfile:///run/media/root/RHEL-9-3-0-BaseOS-x86_64/BaseOS ...注意这里的baseurl指向的是安装器运行时自动挂载的路径实际系统环境下并不存在。所以不能直接用要把路径改成我们自己的挂载点。创建/etc/yum.repos.d/local.repo[local-baseos] nameRHEL 9.3 Local BaseOS baseurlfile:///mnt/rhel9/BaseOS enabled1 gpgcheck0 [local-appstream] nameRHEL 9.3 Local AppStream baseurlfile:///mnt/rhel9/AppStream enabled1 gpgcheck0然后同样执行dnf clean all dnf makecache本地源因为走本地磁盘速度极快dnf makecache基本一两秒就完事。验证一下仓库列表dnf repolist这时能看到local-baseos和local-appstream两个仓库装个包试试dnf install -y vim能装上就说明本地源配置成功。这里补充一个细节local源我同样建议gpgcheck0。原因很简单ISO是你自己的可信媒介不是从不可信渠道下载的而且RHEL ISO里的仓库签名key在/etc/pki/rpm-gpg/RPM-GPG-KEY-redhat-release如果开gpgcheck1还要在repo文件里指定这个key路径多一事不如少一事。4.3 本地源与在线源共存时的优先级处理很多时候本地源和阿里源会同时存在比如我先配了阿里源之后又挂了ISO本地源。这时要注意一个问题当两个源都提供同一个软件包时dnf的默认行为是随机选一个这可能导致表现不稳定比如今天装vim走本地源明天同样的命令走阿里源相关依赖也跟着变。解决这个问题最标准的方式是安装priority插件给仓库设置优先级dnf install -y dnf-plugins-core dnf install -y dnf-plugin-priority然后在repo文件里给每个仓库加上priority参数数字越小优先级越高# local.repo [local-baseos] ... priority1 [local-appstream] ... priority1 # aliyun.repo [baseos] ... priority10 [appstream] ... priority10这样dnf在候选包里会优先选local源的包本地源没有才向阿里源要。这个配置对内网隔离尤其实用平时全部走本地本地没有的包自动去阿里源拉如果在完全离线的内网就把阿里源的enabled改成0或者直接不保留阿里源repo文件。优先级插件有一个隐藏小坑如果本地源和在线源版本不一致priority插件会优先选优先级高的源但它不会阻止你手动指定源来安装特定包。比如我想强制从阿里源装某个最新版软件可以加--enablerepoappstream参数来绕过优先级顺序。5. 常见问题与排查技巧实录我在不同环境下把RHEL 9.3的源配置翻来覆去试过很多遍把最容易踩的坑汇总成一张速查表方便你们直接对照排查。报错信息根本原因解决方法Errors during downloading metadata for repo appstream仓库baseurl路径不可访问常见于路径写错或者镜像站目录结构变化用curl -I检查repomd.xml路径是否200Public key for xxx is not installedgpgcheck1但对应GPG key没有导入系统设置gpgcheck0或下载正确的key并指定gpgkey路径SSL certificate problem: certificate verify failedHTTPS证书校验失败通常是系统时间不对或DNS异常先date -s矫正时间再dnf clean all dnf makecacheCould not open/read file:///mnt/rhel9/BaseOS/repodata/repomd.xml挂载目录权限不对或ISO未正确挂载确认ls /mnt/rhel9/BaseOS能看到repodata目录No match for argument: htop当前仓库里没有这个包常见于只需要EPEL源的包配置EPEL源或从AppStream安装替代工具$releasever解析成了9.3导致路径404reselect变量在不同系统上解析结果不一致baseurl里直接写死9.3不依赖变量Another app is currently holding the yum lock有另一个dnf/yum进程还在运行等进程结束或pkill dnf后重试rpmdb open failedRPM数据库文件损坏rm -f /var/lib/rpm/__db*后执行rpm --rebuilddb下面挑几个我实际处理过的高频问题展开讲讲。问题一makecache报404但看路径明明没问题有次我在一台机器上配好阿里源dnf makecache时BaseOS正常AppStream报404。第一反应是路径拼错但核对了几遍大小写都没问题。最后用curl -I手动访问才发现阿里云镜像站对应仓库目录下确实没有AppStream子目录原因是该镜像站某个节点同步不完整。这种情况换用AlmaLinux源或者换一下目录路径就能解决。这也说明配置任何源之后用curl -I验证仓库路径是必不可少的步骤。curl -I https://mirrors.aliyun.com/rockylinux/9.3/AppStream/x86_64/os/repodata/repomd.xml返回200说明路径正常404就说明仓库路径有问题。问题二GPG校验导致好多包装不上新配好源后执行dnf install第一个包就报公钥未导入这是新手经常遇到的问题。根本原因是repo文件里写了gpgcheck1但系统里没有对应的GPG公钥。解决办法有两个方向一是把gpgcheck改成0跳过校验适合可信源二是把正确的公钥下载到/etc/pki/rpm-gpg/目录并在repo里指定路径curl -o /etc/pki/rpm-gpg/RPM-GPG-KEY-Rocky-9 https://mirrors.aliyun.com/rockylinux/9.3/BaseOS/x86_64/os/RPM-GPG-KEY-Rocky-9然后在repo文件里加一行gpgkeyfile:///etc/pki/rpm-gpg/RPM-GPG-KEY-Rocky-9这里需要注意RPM的签名校验是针对每个rpm包的如果包是Rocky官方签名但系统里只有Red Hat的key同样会报错。所以要么统一用Rocky的key要么干脆关掉校验。问题三本地源挂载了但dnf还是报找不到仓库这种问题十有八九是挂载点不对。比如有人挂载到/mnt根目录但repo文件写的baseurlfile:///mnt/BaseOS结果/mnt下根本没有BaseOS目录。正确做法是专门建一个目录比如/mnt/rhel9把ISO挂上去repo路径对应写成file:///mnt/rhel9/BaseOS。还有个小细节SELinux如果开着file://源的访问也可能会受限制。遇到读不到本地目录的情况可以先getenforce看看SELinux状态临时用setenforce 0验证一下如果确实是SELinux导致的再针对目录打SELinux放行策略。问题四本地源和在线源主次颠倒我遇到过一台服务器本地源priority已设成1但安装软件时dnf还是从阿里源拉包。查了半天发现是因为priority插件没装priority1这个参数在插件缺失的情况下会被dnf直接忽略。所以设置优先级前必须先确认dnf-plugin-priority已安装。还有一种情况是repo文件里priority写在了[仓库id]之前导致配置解析失败配置项必须要写在当前仓库的section内才生效。最后再分享一个我个人的习惯每次改完源之后先跑一遍dnf clean all dnf makecache配完顺手把dnf repolist -v的输出留个截图或者记录这样后面排查问题的时候能快速知道当时仓库配置是什么状态。换源这件事本身不复杂但把细节抠清楚、把校验机制理解透才能真正做到无论在公网还是内网环境都能随手搞定。
返回列表