1. 从一次真实的部署翻车说起如果你在虚拟化平台或者物理机上装完 openEuler release 20.03兴冲冲敲下第一条yum install命令结果终端甩回来一句Error: There are no enabled repositories in /etc/yum.repos.d别慌这不是你装错了而是这个版本默认就没给你配好可用的软件源。openEuler 20.03 是华为捐献给开放原子开源基金会之后较早的一个 LTS 版本它的定位偏向服务器和云计算场景安装镜像里自带的 repo 文件要么是空的要么指向的是内网地址要么干脆只有.repo的模板文件而没有实际内容。所以“装完系统第一件事就是修 yum”几乎成了这个版本用户的必修课。这篇文章面向的是刚接触 openEuler 的运维新手、正在做国产化替代验证的工程师以及需要在离线或半离线环境里批量部署的从业者。我会把“为什么报这个错”“repo 文件到底该怎么写”“本地源和网络源怎么选”“装完之后怎么验证”这一整条链路拆开讲清楚并且给出可以直接抄作业的配置片段。全文基于我在多台测试机和虚拟化环境里反复踩坑的经验整理不涉及任何特定机构或真实项目信息你可以放心对照自己的环境操作。核心关键词就三个openEuler 20.03、yum 源配置、no enabled repositories 报错。搞懂这三个后面所有操作都是顺水推舟。2. 报错背后的真实原因拆解2.1 这个报错到底在说什么There are no enabled repositories in /etc/yum.repos.d这句话翻译成人话就是yum 去/etc/yum.repos.d/这个目录里找软件仓库的配置文件结果发现要么一个.repo文件都没有要么有文件但里面所有仓库的enabled字段都是0要么文件存在但语法有问题导致 yum 直接忽略了它。yum 找不到任何一个“启用状态”的仓库自然就没法知道该从哪里下载软件包于是直接罢工。这里有个容易混淆的点很多人以为“没有 repo 文件”和“repo 文件没启用”是两回事但在 yum 看来结果是一样的——可用仓库数量为零。所以排查的时候不能只ls一下目录就下结论得实际去看文件内容。2.2 openEuler 20.03 为什么默认不带源这跟发行版的定位有关。openEuler 主要面向服务器、边缘计算和云基础设施很多部署场景是内网隔离的官方不可能预设一个“一定能连通”的公网地址。另外 20.03 这个版本在发布时软件仓库的镜像策略和后来的 22.03、24.03 不完全一样早期镜像里/etc/yum.repos.d/下可能只有一个openEuler.repo的占位文件里面的baseurl指向的是需要额外配置才能访问的地址或者enabled0。这就导致新手装完系统后第一反应是“系统坏了”其实只是源没配。我实测过几个不同来源的 20.03 镜像有的里面连.repo文件都没有目录是空的有的有一个文件但内容被注释掉了。所以第一步永远是先看目录里有什么。2.3 本地源和网络源的取舍逻辑解决这个问题有两条路一是配网络源直接指向公开的镜像站点二是配本地源用安装 ISO 或者挂载的光盘做仓库。两者没有绝对优劣取决于你的环境。网络源的好处是软件包全、更新及时适合能连外网的机器缺点是依赖网络质量而且如果镜像站点策略变动地址可能失效。本地源的好处是完全离线可用、速度快、稳定适合内网批量部署缺点是软件包受限于 ISO 里包含的内容可能缺少某些额外组件。我的建议是能连外网就优先配网络源内网环境或者对稳定性要求极高的生产机就配本地源两者甚至可以共存——本地源优先级调高网络源作为补充。下面两节分别讲怎么落地。3. 网络源配置的完整实操3.1 先确认系统版本和架构动手之前先确认两件事避免配了不对版本的源。执行cat /etc/openEuler-release uname -m第一条命令会输出类似openEuler release 20.03 (LTS)的内容确认你确实是 20.03。第二条输出x86_64或aarch64这决定了你要用哪个架构的仓库地址。很多人配完源发现装包报 404就是因为架构对不上——比如在 ARM 机器上用了 x86_64 的地址。3.2 备份并清理原有 repo 文件不管原来有没有文件先备份再清理这是运维的基本素养cd /etc/yum.repos.d/ mkdir -p backup mv *.repo backup/ 2/dev/null ls -la这样做的目的是排除旧文件干扰。有时候旧文件里有个语法错误的仓库yum 解析时可能报奇怪的错清空重来最干净。备份目录留着万一要回滚也方便。3.3 写入新的 repo 配置文件新建一个文件比如叫openEuler.repovi /etc/yum.repos.d/openEuler.repo内容如下以 x86_64 为例[openEuler-20.03-LTS] nameopenEuler 20.03 LTS baseurlhttps://repo.openeuler.org/openEuler-20.03-LTS/OS/x86_64/ enabled1 gpgcheck1 gpgkeyhttps://repo.openeuler.org/openEuler-20.03-LTS/OS/x86_64/RPM-GPG-KEY-openEuler [openEuler-20.03-LTS-everything] nameopenEuler 20.03 LTS Everything baseurlhttps://repo.openeuler.org/openEuler-20.03-LTS/everything/x86_64/ enabled1 gpgcheck1 gpgkeyhttps://repo.openeuler.org/openEuler-20.03-LTS/OS/x86_64/RPM-GPG-KEY-openEuler [openEuler-20.03-LTS-update] nameopenEuler 20.03 LTS Update baseurlhttps://repo.openeuler.org/openEuler-20.03-LTS/update/x86_64/ enabled1 gpgcheck1 gpgkeyhttps://repo.openeuler.org/openEuler-20.03-LTS/OS/x86_64/RPM-GPG-KEY-openEuler几个关键字段解释一下。baseurl是仓库的实际地址末尾的斜杠不能少少了可能拼出错误的路径。enabled1表示启用这是解决报错的核心。gpgcheck1表示校验软件包签名安全起见建议开着如果内网环境搞不定 GPG key可以临时设成 0但生产环境不推荐。gpgkey指向签名公钥的位置配对了才能通过校验。如果是 aarch64 架构把地址里的x86_64全部换成aarch64即可。三个仓库分别对应基础系统包、全量包和更新包全配上覆盖更全。3.4 刷新缓存并验证配完文件别急着装东西先刷新缓存yum clean all yum makecacheyum clean all清掉旧的元数据yum makecache从新仓库下载元数据到本地。如果这一步能跑完不报错基本就成了。然后验证一下yum repolist正常输出会列出你配置的仓库每个仓库后面有包数量。如果repolist显示仓库数量为 0说明配置还是有问题回到上一步检查文件语法——特别注意中文字符、多余空格、缩进错误这些都会导致解析失败。最后实测装一个包yum install -y vim能装上就彻底通了。注意如果yum makecache卡住或者超时多半是网络问题。可以先ping一下仓库域名或者用curl -I看地址是否可达。有些内网环境需要走特定的出口这个得根据实际网络策略处理。4. 本地源配置离线环境的救星4.1 什么时候该用本地源内网机器、安全要求高的生产环境、批量部署几十台机器的时候网络源就不合适了——要么连不上要么几十台同时拉包把带宽打满。这时候用安装 ISO 做本地源是最优解。ISO 里包含了基础系统所需的绝大部分软件包装个 vim、gcc、开发库完全够用。4.2 挂载 ISO 文件假设你的 ISO 放在/root/openEuler-20.03-LTS-x86_64-dvd.iso先建挂载点再挂载mkdir -p /mnt/cdrom mount -o loop /root/openEuler-20.03-LTS-x86_64-dvd.iso /mnt/cdrom-o loop是把普通文件当块设备用的关键参数不加会报错。挂载完ls /mnt/cdrom应该能看到Packages、repodata这些目录。repodata目录的存在说明这个 ISO 本身就是个合法的仓库可以直接拿来用。如果是物理光驱把-o loop /root/xxx.iso换成/dev/sr0之类的设备名即可。4.3 配置本地 repo 文件新建/etc/yum.repos.d/local.repo[local-iso] nameLocal ISO Repository baseurlfile:///mnt/cdrom enabled1 gpgcheck0这里baseurl用的是file://协议指向挂载点。gpgcheck0是因为本地 ISO 的签名校验在离线环境里配置起来麻烦而且 ISO 本身来源可信关掉校验问题不大。如果你对安全有要求可以保留gpgcheck1并指定 ISO 里的 GPG key 路径。4.4 开机自动挂载的处理手动mount的挂载点在重启后会消失导致 yum 又找不到源。解决办法是写进/etc/fstabecho /root/openEuler-20.03-LTS-x86_64-dvd.iso /mnt/cdrom iso9660 loop,defaults 0 0 /etc/fstab这样每次开机自动挂载。写完可以用mount -a测试一下有没有语法错误没报错就说明配置正确。4.5 本地源和网络源共存的优先级如果你两个源都配了yum 默认会从所有启用的仓库里找包。想让本地源优先可以在本地源的配置里加一行priority1需要yum-plugin-priorities插件支持数字越小优先级越高。不过 20.03 默认可能没装这个插件简单点的做法是需要离线装包时只启用本地源把网络源的enabled临时改成 0。5. 常见报错与排查速查5.1 配置后仍然报 no enabled repositories最常见的原因是文件扩展名不对。yum 只认.repo结尾的文件如果你存成了.repo.txt或者.confyum 直接无视。用ls -la /etc/yum.repos.d/确认一下。另一个原因是文件权限虽然少见但如果文件权限是 000yum 读不了也会当没有。正常应该是 644。还有一种情况是文件里所有仓库的enabled都写成了0或者enabled这行被注释掉了。仔细检查每一行。5.2 GPG 校验失败报错类似Public key for xxx.rpm is not installed或者GPG check FAILED。这说明gpgkey地址不对或者 key 没导入成功。手动导入一次rpm --import https://repo.openeuler.org/openEuler-20.03-LTS/OS/x86_64/RPM-GPG-KEY-openEuler导入后再试。如果还是不行临时把gpgcheck改成 0 先跑通再回头解决 key 的问题。5.3 仓库地址 404yum makecache报 404说明baseurl拼错了或者该路径下没有repodata。用浏览器或者curl访问一下这个地址看能不能列出目录。注意 openEuler 的仓库路径结构OS、everything、update是三个不同的子路径别混用。5.4 缓存损坏导致的奇怪错误有时候配置明明对但 yum 就是报一些莫名其妙的元数据错误。这时候yum clean all清缓存再yum makecache基本能解决。如果还不行把/var/cache/yum/整个删掉重建。报错现象最可能原因处理动作no enabled repositories无 .repo 文件或全未启用检查目录和 enabled 字段GPG check FAILEDkey 未导入或地址错手动 rpm --import404 Not Foundbaseurl 路径错误curl 验证地址元数据解析错误缓存损坏yum clean all 后重建装包时依赖缺失仓库不全补充 everything 仓库5.5 一个容易被忽略的坑openEuler 20.03 的某些镜像里/etc/yum.repos.d/下会有一个openEuler.repo文件但里面的baseurl指向的是一个需要特定网络环境才能访问的地址。这种情况下yum repolist可能不报错但实际装包时全部超时。判断方法是看repolist输出的仓库状态如果显示0 packages或者状态异常就要怀疑地址不可达。解决办法就是按本文的方法换成可访问的地址。6. 装完源之后该做的几件事源配通只是第一步后面还有几个动作能让你的 openEuler 用起来更顺手。首先是更新系统到最新补丁级别yum update -y这一步会把基础包升到仓库里的最新版本修复已知问题。生产环境建议先在测试机验证再批量执行。其次是装几个常用工具比如vim、net-tools、wget、tar这些在最小化安装的镜像里往往没有yum install -y vim net-tools wget tar再就是配置dnf的替代关系。openEuler 20.03 里yum和dnf基本是互通的yum命令实际调用的是dnf的兼容层。如果你习惯用dnf直接敲dnf也能用配置的 repo 文件是共享的不用重复配。最后提醒一点如果你是在做批量部署可以把配好的/etc/yum.repos.d/目录打包通过配置管理工具分发到其他机器省得一台台手动改。本地源的话把 ISO 和挂载配置一起分发配合fstab自动挂载基本能做到开箱即用。我个人在实际操作中的体会是openEuler 20.03 的 yum 问题九成以上都出在 repo 文件上要么没有要么没启用要么地址错。把本文的排查顺序走一遍——先看目录、再看文件内容、再验证地址可达性、最后刷新缓存——基本没有解决不了的。真正麻烦的是内网环境里地址不可达又没法改网络策略的情况那种就只能老老实实做本地源。另外配源的时候养成备份旧文件的习惯回滚的时候能省不少事。