尧图网络科技YAOTU DIGITAL 获取报价
获取报价
首页 / 资讯中心 / 文章详情

RHEL8换源全攻略:从订阅到国内镜像与离线仓库搭建

发布时间:2026/9/29 1:41:54

资讯中心
01
ARTICLE

RHEL8换源全攻略:从订阅到国内镜像与离线仓库搭建

RHEL8换源全攻略:从订阅到国内镜像与离线仓库搭建
装完 RHEL8第一件事永远是配源。如果你手头没有红帽订阅直接yum install的时候大概率会碰一鼻子灰终端上飘一行红字This system is not registered with an entitlement server. You can use subscription-manager to register.这时候你再怎么换安装源只要系统还挂在官方redhat.repo上结果都是一样的。RHEL8 的源配置跟以前 CentOS 8 那种改个baseurl就完事的玩法不太一样它牵涉到订阅机制、仓库结构、镜像站点选型甚至离线环境下的自建仓库。这篇文章想把这条路完整捋一遍在线环境怎么用国内镜像离线环境怎么挂本地源或者自建内网仓库以及遇到各种报错怎么排查。适合刚从 CentOS 7/8 切到 RHEL8 的运维也适合机房没有外网、需要自建 yum 源的人参考。1. RHEL8 仓库机制与配源前的认知准备1.1 RHEL8 默认仓库结构BaseOS 与 AppStream很多人第一次配 RHEL8 源的时候习惯性去找base、extras、updates这三个仓库结果发现 RHEL8 的套路完全不一样。RHEL8 把原本的发行版仓库重新划分成了两个核心仓BaseOS和AppStream。BaseOS装的是底层系统组件比如 kernel、glibc、systemd 这类“地基”性质的包。AppStream则是一个特别的设计它支持模块化module概念同一个软件可以存在多个版本流。最典型的例子是 nginx你可以通过dnf module在 1.14、1.18、1.20 这些版本流之间做选择。用生活化一点的比喻BaseOS相当于毛坯房的地基和承重墙AppStream则是装修套餐你可以按需选不同风格。理解了这一层后面配源的时候就不会对着仓库名字发懵。仓库文件的默认位置在/etc/yum.repos.d/配置文件是/etc/dnf/dnf.conf。RHEL8 的dnf和yum命令其实是一个东西yum是指向dnf的软链接所以你在 RHEL8 上敲yum repolist跟敲dnf repolist实际走的是同一套逻辑。1.2 为什么 RHEL8 要“换源”或者“配源”RHEL8 的官方仓库由subscription-manager管理它读的是/etc/yum.repos.d/redhat.repo。没有红帽订阅或者没有注册红帽账号的话redhat.repo里的仓库根本没法用dnf会把请求转发到红帽订阅服务器然后返回一个 entitlement 错误。国内镜像站其实没有公开同步 RHEL 官方仓库因为 RHEL 的二进制软件包版权要求比 CentOS 严格镜像站只能同步 CentOS、Rocky、AlmaLinux 这些开源发行版。所以网上常说的“RHEL8 配置国内源”在实操层面往往有三种走法第一种买或者申请红帽开发者订阅走官方源这是最稳的第二种把仓库指向跟 RHEL8 兼容的 Rocky Linux 或者 AlmaLinux 镜像本质是借用开源替代发行版的二进制包适合个人学习测试和内部环境第三种只追加 EPEL 这类补充仓库用来装htop、jq、screen等常用软件。我个人给的建议是这样的有条件的生产环境优先考虑官方订阅如果没有订阅又想少踩坑Rocky Linux 的镜像源是替代方案里兼容性最好的一个。下文以这个思路为主讲操作。1.3 动手前的检查清单在写任何 repo 文件之前先花一分钟确认三件事能帮你省掉后面一大半的排查时间。第一确认系统版本和架构。跑一遍cat /etc/os-release uname -mos-release会告诉你当前是 RHEL8 还是 Rocky、Alma 之类重建版uname -m决定你用x86_64还是aarch64的仓库路径。不同架构的软件包路径前缀不一样镜像站上aarch64目录和x86_64目录是分开的。第二看看现在/etc/yum.repos.d/里到底有什么。有的系统装完会自动生成一堆.repo文件残留的仓库引用会让dnf在 makecache 的时候报各种奇怪的错。操作前先备份整个目录这是老规矩mkdir -p /etc/yum.repos.d/backup cp -r /etc/yum.repos.d/*.repo /etc/yum.repos.d/backup/第三测一下到镜像站的网络连通性。curl -I能快速判断目标站点通不通省得配完才发现根本不是源的问题而是内网防火墙把出网流量拦了curl -I https://mirrors.aliyun.com2. 配置国内镜像源在线可用2.1 国内镜像站怎么选横向对比国内能用的镜像站不少阿里云、清华 TUNA、中科大 USTC、华为云都有稳定的同步服务。镜像站本身不求多选一个主力、一个备用就够了。下面是我实际对比下来的感受镜像站仓库路径同步速度优势阿里云mirrors.aliyun.com/rockylinux快大厂带宽稳定国内大部分云服务器访问延迟低遇到大版本同步极少落后清华 TUNAmirrors.tuna.tsinghua.edu.cn/rockylinux快教育网体验极佳同步策略很规范目录结构清晰离线源 rsync 常用它中科大 USTCmirrors.ustc.edu.cn/rockylinux快带宽稳定部分时间段速度媲美阿里华为云mirrors.huaweicloud.com/rockylinux快云上服务器友好路径和阿里类似选择原则很简单你的云服务器在哪个厂商那里优先用哪家的镜像网络链路最短速度最稳。如果是在普通机房阿里云和清华基本不会让你失望。2.2 阿里云源配置步骤以 Rocky 索引路径为例前面说过RHEL8 没有公开的官方红帽镜像所以我这里用 Rocky Linux 8 的镜像路径来为 RHEL8 提供第三方兼容仓库。先用编辑器新建一个 repo 文件我习惯命名为aliyun-rocky.repo[BaseOS] nameBaseOS baseurlhttps://mirrors.aliyun.com/rockylinux/8/BaseOS/$basearch/os/ gpgcheck0 enabled1 [AppStream] nameAppStream baseurlhttps://mirrors.aliyun.com/rockylinux/8/AppStream/$basearch/os/ gpgcheck0 enabled1 [extras] nameextras baseurlhttps://mirrors.aliyun.com/rockylinux/8/extras/$basearch/os/ gpgcheck0 enabled1这里有个细节要解释。$basearch是 dnf 自带的变量执行时自动替换为x86_64或aarch64。gpgcheck0是为了跳过 GPG 签名验证写上的因为当前系统没有 Rocky Linux 官方的 RPM-GPG-KEY不关掉的话dnf install会报公钥找不到的错。如果你比较在意安全校验可以先在系统里导入 Rocky 的官方公钥再把gpgcheck改为 1rpm --import https://mirrors.aliyun.com/rockylinux/8/RPM-GPG-KEY-rockyofficial写完 repo 文件后先把原来的官方订阅仓库临时移开避免 makecache 阶段又去连红帽的订阅服务器。注意不要删移到 backup 目录就行。然后清理缓存并重建dnf clean all dnf makecachemakecache跑完如果没有任何报错说明源已经通了。此时再执行dnf repolist应该能看到三个 enabled 状态的仓库。2.3 清华 / 中科大镜像源替换如果阿里云源在你的网络环境下速度不理想或者是教育网内的机器换成清华 TUNA 也就是改一个 URL 的事。把上面的baseurl全部替换成baseurlhttps://mirrors.tuna.tsinghua.edu.cn/rockylinux/8/BaseOS/$basearch/os/ baseurlhttps://mirrors.tuna.tsinghua.edu.cn/rockylinux/8/AppStream/$basearch/os/ baseurlhttps://mirrors.tuna.tsinghua.edu.cn/rockylinux/8/extras/$basearch/os/中科大源同理baseurlhttps://mirrors.ustc.edu.cn/rockylinux/8/BaseOS/$basearch/os/ baseurlhttps://mirrors.ustc.edu.cn/rockylinux/8/AppStream/$basearch/os/ baseurlhttps://mirrors.ustc.edu.cn/rockylinux/8/extras/$basearch/os/实际操作中我踩过一个小坑有人会同时把阿里云的 BaseOS 和清华的 BaseOS 放在不同的 repo 文件里仓库 ID 还都是[BaseOS]。这样dnf会拿后加载的仓库覆盖前一个结果就是两个源哪边都不生效或者dnf在两个仓库之间反复横跳。无论你选哪个镜像站同一个仓库尽量只保留一个定义。2.4 加装 EPEL 扩展仓库RHEL8 自带的仓库数量非常克制装完系统你会发现连htop、jq、ncdu都没有。这时候就需要 EPELExtra Packages for Enterprise Linux。EPEL 是一个针对 RHEL 系发行版维护的扩展软件包仓库由开源社区维护包数量远多于 BaseOS 和 AppStream。我推荐直接手写 EPEL 的 repo 文件而不是下载epel-release安装包。手写的好处是地址可以直接指向国内镜像省去epel-release默认从国外 Fedora 站点下载的慢速等待[epel] nameEPEL baseurlhttps://mirrors.aliyun.com/epel/8/Everything/$basearch/ enabled1 gpgcheck0如果你坚持要 GPG 校验可以导入 EPEL 的公钥再打开校验rpm --import https://mirrors.aliyun.com/epel/RPM-GPG-KEY-EPEL-8装完 EPEL 后记得再执行一次dnf clean all dnf makecache让 EPEL 的 metadata 进缓存。2.5 验证仓库是否可用配源操作完成后别急着跑了先做一轮基础验证dnf repolist dnf list --available | wc -lrepolist输出里能看到每个仓库的软件包数量。包数量是零或者只有几个说明仓库路径有问题。然后再实际装一个小软件测试比如dnf install -y vim jq htopvim来自 BaseOS/AppStreamjq和htop需要 EPEL。三个包都装成功说明仓库链路和依赖解析都没问题。3. 本地镜像源搭建从 ISO 到内网仓库3.1 本地源使用场景与整体思路本地源也叫离线源最典型的场景是机房内网隔离环境。几十台机器都没有外网每台机器走一遍外网源根本不现实尤其当安装的包数量很大的时候。更常见的做法是找一台有外网权限或者能挂载安装 ISO 的服务器把它变成内网 yum 仓库其他机器全部指向这台内网地址。整体思路其实就三步第一步准备软件包数据可以挂载 RHEL8 安装 ISO也可以用rsync同步镜像站第二步提供传输通道最简单的是用nginx或者python3 -m http.server把仓库目录暴露成 HTTP第三步客户端写好本地仓库 repo 文件执行dnf makecache。3.2 使用 RHEL8 ISO 挂载做本机源如果你手里有 RHEL8 的 DVD ISO这是最省事的做法。ISO 里本身就带好了repodata不需要额外生成 metadata直接把 ISO 挂载到目录就能当仓库用mkdir -p /mnt/iso mount -o loop /path/to/rhel-8.x-x86_64-dvd.iso /mnt/iso挂载完看一下目录结构ls /mnt/iso里面会有BaseOS、AppStream、images、isolinux等目录。接下来写一个本机源的 repo 文件[BaseOS-Local] nameBaseOS-Local baseurlfile:///mnt/iso/BaseOS gpgcheck0 enabled1 [AppStream-Local] nameAppStream-Local baseurlfile:///mnt/iso/AppStream gpgcheck0 enabled1file://开头的 URL 是dnf支持的本地路径格式。写完后执行dnf clean all dnf makecache如果 ISO 的仓库定义正常makecache 会顺利通过。这个方式的局限性也很明显ISO 里的软件包版本是固定的系统装完后无法得到更新。所以这种方法只适合安装阶段和基础环境固定不动的机器如果系统需要持续升级我建议用下一节的方法。3.3 使用 HTTP 服务把本地源共享给内网把 ISO 挂载成本机源只能解决一台机器的问题内网几十台机器要想都用这个源就需要一个 HTTP 服务。最简单的方式先安装 nginxdnf install -y nginx然后改配置/etc/nginx/conf.d/repo.conf核心是开启autoindex让客户端能索引目录下的文件server { listen 80; server_name _; root /mnt/iso; autoindex on; }启动 nginx 并设置开机自启systemctl enable --now nginx如果系统里有 firewalld记得放行 HTTP 端口firewall-cmd --permanent --add-servicehttp firewall-cmd --reload客户端机器上的 repo 文件可以这么写[BaseOS-Local] nameBaseOS-Local baseurlhttp://192.168.1.10/BaseOS gpgcheck0 enabled1 [AppStream-Local] nameAppStream-Local baseurlhttp://192.168.1.10/AppStream gpgcheck0 enabled1192.168.1.10是仓库服务器的内网 IP实际使用时替换成你自己的地址。为了便于维护我通常会用软件配置管理工具把这份 repo 文件推送到所有客户端避免一台台手工敲。3.4 同步镜像站构建完整离线源rsync createrepoISO 自带的软件包数量有限如果内网机器需要安装的软件五花八门更彻底的办法是同步一个完整的仓库到本地硬盘。这里以同步 Rocky Linux 8 的 BaseOS 和 AppStream 为例用rsync从清华镜像站拉取dnf install -y rsync mkdir -p /data/repo/rockylinux/8 rsync -avz --delete rsync://mirrors.tuna.tsinghua.edu.cn/rockylinux/8/ /data/repo/rockylinux/8/这个命令看参数就能明白大概意思-a归档模式保留权限和时间戳-z压缩传输--delete保持本地和远端严格一致。同步量级视网络情况而定BaseOS、AppStream 加起来大约 8 到 10 GB建议磁盘至少预留 20 GB 空间。同步完成后一般来说目录里已经带上了官方的repodata。如果因为某些情况 repodata 缺失或者你需要更新索引用createrepo_c重新生成dnf install -y createrepo_c createrepo_c --update /data/repo/rockylinux/8/BaseOS createrepo_c --update /data/repo/rockylinux/8/AppStream--update参数表示在已有 repodata 基础上增量更新比全量生成快得多。后面如果做了定时同步每次同步完跑一遍就能保持内网仓库的索引最新。这个流程搭建完成后再结合上一节的 nginx 配置把 root 指向/data/repo内网机器就拥有一个可持续更新的低频离线源了。4. 常见问题与排查技巧实录4.1 未订阅注册导致的 entitlement 报错如果你在配源之前就执行过dnf install大概率见过这条经典报错This system is not registered with an entitlement server. You can use subscription-manager to register.出现这个错误的原因不是仓库地址写错而是系统默认在/etc/yum.repos.d/redhat.repo里配置了红帽订阅源。解决方式取决于你的路线。走官方订阅路线执行subscription-manager register --username 你的红帽账号 --password 你的密码 subscription-manager refresh subscription-manager attach --auto走第三方兼容源路线把redhat.repo暂时移出仓库目录然后按照本文第二章节的内容配置替代源mv /etc/yum.repos.d/redhat.repo /etc/yum.repos.d/backup/我自己的经验是这个动作只影响仓库列表不涉及系统内核和系统文件风险很小所以测试环境里可以放心操作。4.2 repomd.xml 下载失败 / 404 错误dnf makecache时最常见的一类报错是http://xxx/repodata/repomd.xml: [Errno 14] HTTP Error 404 - Not Found遇到repomd.xml报错十有八九是仓库 URL 路径不对。排查方向有几个第一检查镜像站实际目录结构。你可以直接用curl或者浏览器打开baseurl的上一级目录确认路径里面到底有没有BaseOS/$basearch/os/这个层级。第二检查$basearch和$releasever变量的实际值。如果你在配置里写了$releaseverRHEL8 可能解析成8或8.9不同版本解析结果不一样镜像站有没有这个版本目录也未知。最省事的办法是在baseurl里硬编码大版本号比如/rockylinux/8/BaseOS/x86_64/os/虽然少了一点灵活性但排错成本最低。4.3 GPG 密钥校验与 gpgcheck 处理第三方源最容易踩的坑就是gpgcheck1但系统没有对应公钥。报错信息大概是The GPG keys listed for the BaseOS repository are already installed but they are not correct for this package.这里要理清一个观念gpgcheck1本身没有错错在当前仓库引用的公钥跟软件包签名不匹配。RHEL8 官方源用的公钥是红帽的而 Rocky 源的包是用 Rocky 官方公钥签名的混用自然过不了校验。解决办法有两个一是按第 2.2 节里的方法先导入对应发行版的官方公钥再把gpgcheck保持为 1二是在测试环境图省事直接把所有自定义源的gpgcheck设为 0。我个人建议生产环境尽量导入公钥不要把签名校验一刀切关掉否则一旦镜像源被劫持你装进去的可能是一堆来路不明的二进制包。4.4 dnf 模块化与应用流导致的安装失败RHEL8 的AppStream仓库引入了模块化概念这导致有些软件的直接安装命令会微微不同。比如你执行dnf install nginx没问题但如果你想安装特定版本的 PHP 或者 Node.js可能要先启用对应的模块流dnf module list php dnf module enable php:7.4 dnf install php如果你没启用模块又恰好仓库里没有匹配的版本流dnf会报类似Unable to match profile或者No available modular packages的错误。这个错跟源配置本身关系不大但初次接触 RHEL8 的人很容易误判为源失效。排查的时候先看报错里有没有module关键字有的话先处理模块流比反复换源有效得多。4.5 缓存、并发锁与源优先级问题日常使用中我发现一个规律大部分dnf起不来的问题第一步永远是dnf clean all。缓存目录/var/cache/dnf里如果残留了上一份仓库的 metadata换源之后对不上就会产生各种诡异报错。清掉缓存重新 makecache能解决七成问题。第二个常见问题是多个同名仓库冲突。如果你一开始配了阿里云源后来又换了清华源但[AppStream]这个仓库 ID 两次都在用dnf 加载时会发生覆盖或随机选择装包就时好时坏。排查以后把不用的 repo 文件移出目录只保留一套有效定义再看是否复现。如果你确实需要从多个源安装软件建议用dnf config-manager --set-disabled把暂时不用的源先禁用掉dnf install -y dnf-plugins-core dnf config-manager --set-disabled epel如果你真的需要精细控制源优先级可以额外装dnf-plugin-priorities插件。不过我的经验是优先级配置越复杂后面排查越麻烦能少用就少用。5. 写在后面三条过来人建议讲完了配置步骤和排错思路最后分享几个我自己实际踩坑之后的习惯。第一个习惯改仓库配置之前永远先备份。cp -r /etc/yum.repos.d真的就是一条命令的事但能让你在配错一个 URL 之后不用手工去回忆原来的仓库文件长什么样。第二个习惯一个系统里尽量只信任一个主力源辅助源最多再加一个 EPEL。仓库文件越少越干净交叉依赖和源冲突的概率直线下降。第三个习惯如果内网机器数量超过十台别让它们各自去访问外网源。搭一台内网仓库服务器用rsync定时同步一次或者直接挂载 ISO 做 HTTP 分享后续维护成本会低很多。RHEL8 的源配置本质上不是技术难度高的问题而是需要你理解发行版的仓库设计逻辑再做合适的路径选择。把这套思路理顺了无论是切换到 Rocky、Alma 还是以后升级到 RHEL9底层都是同一套玩法只是路径名和版本号变了而已。
02
RELATED NEWS

相关资讯

更多网站建设与数字化升级内容

03
WHY YAOTU

想打造同款高转化官网?

懂行业、懂生意,从建站到增长一站式陪跑

◈

场景化定制

不做模板站,围绕你的业务场景量身设计,小众不撞款。

◐

营销型架构

以转化目标组织内容与路径,让官网真正带来询盘。

▲

全周期服务

设计、开发、运营、运维一体,上线只是开始。

免费获取你的建站方案

留下需求,专属顾问 24 小时内为你输出方案建议。