恒美微站
首页
关于我们
建站服务
主题模板
案例展示
资讯中心
联系我们
openEuler 20.03 yum源配置全指南:从报错到实战
首页
资讯中心
/
openEuler 20.03 yum源配置全指南:从报错到实战
openEuler 20.03 yum源配置全指南:从报错到实战
发布时间:2026/10/17 12:15:07
1. 从一次真实的系统部署翻车说起openEuler 20.03 这个版本做国产化适配或者信创环境交付的朋友应该都不陌生。它是华为捐献给开放原子开源基金会之后较早的一个 LTS 版本很多早期的服务器、边缘设备、实验环境里至今还跑着它。我最近在帮一个做工业控制的朋友调试一台离线部署的机器系统装完之后第一件事就是配软件源结果yum一敲下去直接甩回来一句Error: There are no enabled repositories in /etc/yum.repos.d, /etc/yum/repos.d, /etc/distro.repos.d.这个报错其实特别典型它不是说 yum 坏了也不是网络不通而是 yum 在它默认会去扫描的那几个目录里一个可用的、处于启用状态的仓库配置文件都没找到。换句话说yum 这个包管理器本身是好的但它手里没有货架清单不知道去哪儿取包。很多人第一次遇到这个错误会慌以为是系统装残了甚至想重装。其实完全没必要。这篇文章我就把 openEuler 20.03 上让 yum 重新工作这件事从头到尾讲透报错的本质是什么、仓库配置文件的组织结构、本地源和网络源怎么选、配置完怎么验证、以及我在实际交付中踩过的几个坑。不管你是刚接触 openEuler 的新手还是做过多个信创项目的老人这篇应该都能给你一些能直接抄的配置和排查思路。需要先说明一点openEuler 20.03 这个版本比较早官方主流的镜像站对它的支持状态和后续版本不太一样所以配置源的时候要特别注意版本号匹配这一点后面会专门讲。2. 这个报错到底在说什么yum 仓库机制拆解2.1 yum 找仓库的完整逻辑链要解决问题先得搞清楚 yum 是怎么找仓库的。当你执行yum install xxx的时候它内部大致走了这么几步读取主配置文件/etc/yum.conf这里面定义了全局行为比如缓存目录cachedir、是否保留缓存keepcache、日志路径等。扫描仓库配置目录。默认情况下yum 会去/etc/yum.repos.d/这个目录找所有以.repo结尾的文件。报错信息里还列了/etc/yum/repos.d和/etc/distro.repos.d这是不同发行版或不同 yum 版本可能使用的备选路径。解析每个.repo文件里的仓库段落每个段落用[仓库ID]开头里面有一堆键值对。判断哪些仓库是启用的。关键就在enabled1这个字段如果没写或者写成enabled0这个仓库就会被跳过。对启用的仓库去读取它的baseurl或mirrorlist拉取repodata/repomd.xml元数据建立本地缓存。报错 no enabled repositories 就卡在第 4 步——要么目录里根本没有.repo文件要么有文件但里面所有仓库都是enabled0要么文件格式写错了导致解析失败被忽略。2.2 为什么全新安装的 openEuler 会没有源这里有个很多人不理解的点为什么我明明装了系统却连个默认源都没有原因在于 openEuler 的安装镜像ISO和它的在线仓库是两套东西。安装的时候系统是从 ISO 里的本地仓库装包的装完之后安装程序不一定会把 ISO 里的仓库配置写到/etc/yum.repos.d/下。尤其是你选择最小化安装的时候系统只装了最基础的包仓库配置文件可能压根没生成或者生成了一个指向 ISO 挂载点的配置但 ISO 早就卸载了于是那个源就失效了。还有一种情况是某些定制化的镜像或者经过裁剪的交付版本出于安全或体积考虑把默认的.repo文件删掉了需要你自己补。所以遇到这个报错第一反应不应该是系统坏了而是我需要给它配一个能用的源。2.3 本地源和网络源的本质区别配源之前先想清楚你要用哪种。这两种方案没有绝对优劣取决于你的环境对比维度本地源ISO/光盘网络源在线镜像站依赖条件需要 ISO 文件或挂载的光盘需要能访问外网或内网镜像速度极快走本地磁盘取决于网络带宽包完整性只有 ISO 里包含的包通常更全含更新适用场景离线环境、内网隔离、批量交付联网环境、需要最新包配置复杂度略高要挂载和写 file:// 路径较低写 http 地址即可我做工业项目时现场经常是物理隔离的内网那就只能用本地源。而做开发测试时联网环境直接配网络源最省事。下面两种我都给完整配置。3. 方案一用 ISO 搭建本地源离线环境首选3.1 挂载 ISO 并确认目录结构假设你手里有openEuler-20.03-LTS-x86_64-dvd.iso这个文件先把它挂到一个目录上。我习惯挂在/mnt/isomkdir -p /mnt/iso mount -o loop /path/to/openEuler-20.03-LTS-x86_64-dvd.iso /mnt/iso挂载完先别急着写配置一定要先看一眼目录里有没有repodata这个文件夹ls /mnt/iso正常的话你会看到Packages、repodata、isolinux之类的目录。repodata是仓库元数据yum 就是靠它来知道有哪些包、依赖关系是什么。如果这个目录不存在说明你挂的不是完整的 DVD 版 ISO可能是 boot 版或者 netinst 版那种是没法直接当本地源的。提示mount -o loop这种方式在重启后会失效如果这台机器要长期用本地源建议把 ISO 文件放到固定路径然后写进/etc/fstab实现开机自动挂载或者干脆把 ISO 内容解压到硬盘上。3.2 编写 repo 文件的关键字段确认repodata存在后在/etc/yum.repos.d/下新建一个文件比如叫local-iso.repo[local-iso] nameopenEuler 20.03 Local ISO Repository baseurlfile:///mnt/iso enabled1 gpgcheck0逐字段解释一下这几个字段一个都不能含糊[local-iso]仓库的唯一 ID方括号里这个名字随便起但同一台机器上不能重复。name人类可读的描述随便写只影响显示。baseurlfile:///mnt/iso这是核心。file://表示本地文件协议后面跟的是挂载点路径。注意是三个斜杠file://加绝对路径/mnt/iso。enabled1这个字段就是报错的直接开关1 表示启用0 表示禁用。很多人复制配置时漏了这一行默认值虽然是 1但显式写出来最保险。gpgcheck0是否校验包的 GPG 签名。本地 ISO 场景下为了省事通常关掉生产环境如果在意完整性可以设为 1 并配好gpgkey。3.3 清缓存并验证本地源是否生效配置写完执行两步yum clean all yum makecacheyum clean all是清掉旧的缓存元数据避免残留的坏缓存干扰。yum makecache是让 yum 重新去读所有启用的仓库把元数据下载本地源就是复制到本地缓存。如果makecache没报错基本就成了。再验证一下yum repolist正常输出会列出你的仓库 ID、名字和包数量。看到local-iso出现在列表里且包数量不是 0就说明本地源通了。这时候随便装个包试试比如yum install -y vim能装上就彻底没问题了。注意如果yum makecache报 Cannot find a valid baseurl八成是baseurl路径写错了或者 ISO 没挂上。先用ls /mnt/iso/repodata确认路径真实存在再检查file://后面是不是多写或少写了斜杠。4. 方案二配置网络源联网环境更省心4.1 版本号必须对得上这是最大的坑网络源最容易翻车的地方就是版本号。openEuler 的镜像站路径里通常带版本标识比如20.03-LTS、20.03-LTS-SP1、20.03-LTS-SP3等等。你系统实际是哪个小版本就得配对应的路径。先查清楚自己的版本cat /etc/openEuler-release输出类似openEuler release 20.03 (LTS-SP3)那你就得用 SP3 对应的仓库路径。如果你拿 SP1 的源去给 SP3 的系统用轻则部分包版本冲突重则依赖解析直接失败。我见过有人图省事所有机器都配同一个源结果在 SP 版本不一致的机器上装包各种报错排查半天才发现是版本错配。4.2 一份可直接用的网络源配置下面这份配置以 20.03-LTS-SP3 为例仓库地址用官方镜像站的通用路径格式实际使用时替换成你能访问的镜像地址[os] nameopenEuler 20.03 LTS SP3 OS baseurlhttp://repo.example.com/openeuler/openEuler-20.03-LTS-SP3/OS/$basearch/ enabled1 gpgcheck0 [everything] nameopenEuler 20.03 LTS SP3 Everything baseurlhttp://repo.example.com/openeuler/openEuler-20.03-LTS-SP3/everything/$basearch/ enabled1 gpgcheck0 [update] nameopenEuler 20.03 LTS SP3 Update baseurlhttp://repo.example.com/openeuler/openEuler-20.03-LTS-SP3/update/$basearch/ enabled1 gpgcheck0这里有几个细节值得说$basearch是 yum 的内置变量会自动替换成当前系统的架构比如x86_64或aarch64。用变量而不是写死架构配置可以跨架构复用这在混合架构环境里特别有用。分了os、everything、update三个仓库。os是基础系统包everything包含更全的软件update是更新包。按需启用如果只想要稳定基础包可以只留os。仓库 ID 用了os、everything这种通用名如果你同时配了多个来源记得 ID 别冲突。4.3 网络不通时的分层排查法网络源配好后如果yum makecache失败别急着改配置按这个顺序排查先测网络连通性ping repo.example.com或者curl -I http://repo.example.com/...看能不能拿到响应头。再测具体路径用curl直接访问baseurl拼出来的完整地址看是不是 404。404 说明路径写错了通常是版本号或目录名不对。检查 DNS如果 ping 域名不通但 ping IP 通那就是 DNS 问题检查/etc/resolv.conf。检查代理有些内网环境需要走代理才能出网yum 的代理配置在/etc/yum.conf里加proxyhttp://代理地址:端口这一行。这个分层思路的核心是先确认能不能到再确认路径对不对最后才怀疑配置语法。很多人一上来就反复改 repo 文件其实问题根本不在那儿。5. 配置完还是报错几个高频坑的排查链路5.1 文件后缀和编码的隐形陷阱.repo文件必须以.repo结尾这个大家都知道。但有两个隐形坑一是文件名里带了空格或特殊字符比如从 Windows 拷过来的文件叫local iso.repoyum 扫描时可能出问题。建议文件名只用字母、数字、连字符。二是文件编码。如果文件是 GBK 编码或者带了 BOM 头yum 解析时可能读不出enabled1这一行结果就是文件存在但仓库没启用报错和没有文件一模一样。用file命令查一下file /etc/yum.repos.d/local-iso.repo如果显示UTF-8 Unicode (with BOM)那就用编辑器去掉 BOM或者干脆重新用vi手敲一遍。5.2 enabled 字段被覆盖的排查有时候你明明写了enabled1但仓库还是不启用。这时候要检查是不是有多个 repo 文件定义了同一个仓库 ID。yum 对同名仓库的处理是后者覆盖前者如果另一个文件里同名仓库写了enabled0就会把你的覆盖掉。排查方法grep -r enabled /etc/yum.repos.d/把所有仓库的启用状态列出来看看有没有 ID 重复或者意外的enabled0。5.3 缓存损坏导致的假性失败还有一种情况配置完全正确但yum makecache就是报错。这往往是旧缓存损坏了。yum 的缓存在/var/cache/yum/下有时候元数据下载到一半中断缓存就坏了。处理办法是彻底清一遍yum clean all rm -rf /var/cache/yum/* yum makecacheyum clean all有时候清不干净手动删掉缓存目录更彻底。这个操作我在现场救过好几次急尤其是网络不稳定导致缓存半残的情况。5.4 一个容易被忽略的 SELinux 因素在 openEuler 上如果 SELinux 处于 enforcing 模式而你用的是本地源SELinux 可能会阻止 yum 读取挂载点下的文件。表现就是makecache报权限相关的错误。快速验证是不是 SELinux 的问题getenforce如果返回Enforcing可以临时设为宽容模式测试setenforce 0如果设成 0 之后源就正常了那说明确实是 SELinux 策略的问题。生产环境不建议直接关 SELinux正确做法是给挂载点打上合适的上下文标签或者调整相关布尔值。临时关闭只用于定位问题。6. 让源长期稳定几个实战经验6.1 本地源开机自动挂载的写法前面提过mount -o loop重启失效。要长期用把 ISO 放到固定路径比如/opt/iso/openEuler.iso然后在/etc/fstab加一行/opt/iso/openEuler.iso /mnt/iso iso9660 loop,ro 0 0loop表示回环设备ro表示只读挂载ISO 本来也不该写。加完之后mount -a测试一下没报错就说明配置对了下次重启会自动挂上。6.2 多台机器批量交付的源配置思路做批量交付时一台台配源太慢。我的做法是把配好的.repo文件作为模板用脚本分发到各台机器然后统一执行yum clean all yum makecache。如果内网有统一的镜像服务器所有机器都指向它维护起来最省事——镜像服务器更新一次所有机器都受益。这里有个经验批量环境里仓库 ID 和文件名一定要统一规范比如都用internal-os.repo、internal-update.repo。否则机器一多谁配了什么源自己都记不清排查问题时非常痛苦。6.3 验证源可用性的最小检查清单每次配完源我都会跑一遍这个清单确认没问题再交付yum repolist—— 看仓库列表和包数量数量为 0 说明元数据没读到。yum makecache—— 能成功建立缓存。yum search vim—— 能搜到包说明元数据可用。yum install -y tree—— 实际装一个小包验证完整流程。yum remove -y tree—— 卸载掉保持环境干净。这五步走完源基本就是可靠的。别小看这个清单我在现场遇到过repolist正常但install失败的案例原因是元数据里的包路径和实际文件对不上只有真正装一次才能暴露。6.4 关于 gpgcheck 的取舍最后聊聊gpgcheck。本地源场景我一般设 0因为 ISO 本身来源可控。网络源场景如果镜像站提供了 GPG 公钥建议设 1 并配好gpgkey这样能防止包在传输过程中被篡改。配置方式是在 repo 文件里加gpgcheck1 gpgkeyfile:///etc/pki/rpm-gpg/RPM-GPG-KEY-openEuler公钥文件需要提前放到对应路径。如果镜像站没提供公钥或者你只是临时测试设 0 也能用但要清楚这是在牺牲一层校验。我个人在正式交付环境里只要条件允许都会开gpgcheck因为一旦出问题有签名校验能帮你快速定位是包本身的问题还是环境的问题。这个习惯是从一次惨痛经历里养成的——曾经有个包在传输中损坏装上去之后程序行为诡异查了两天才发现是包不完整如果当时开了校验第一次安装就会报错拦下来。配源这件事看起来简单但真正把它做扎实需要对 yum 的机制、版本匹配、环境差异都有清晰的认识。上面这些配置和排查思路都是我在实际项目里反复验证过的你可以直接拿去用也可以根据自己的环境调整。遇到报错别慌按先看目录有没有文件、再看 enabled 是不是 1、最后看路径和网络通不通这个顺序走绝大多数问题都能定位到。