不用我说你也知道,Linux 系统装完之后最闹心的就是软件源慢。尤其是刚装完麒麟 KylinV10 系统,兴致勃勃想装个 Nginx 或者 Docker,结果yum install卡在那里半天没反应,最后直接来个下载超时,那一刻真的想把屏幕拍烂。我之前在给客户部署服务器时就踩过这坑,默认官方源的服务器节点在国内访问并不稳定,高峰期下载速度能跌到几十 KB/s,装个编译器都像在拉老牛车。
这篇文章就专门来解决这个问题。我会从麒麟 V10 的“血统”讲起,把一个源从官方切换到第三方仓库的全流程掰开揉碎,一步步带你走完备份、换源、清缓存、验证,顺手把 EPEL 扩展仓库和离线本地源这些进阶玩法也安排上。整个过程不玩虚的,每条命令我都会解释为什么这么写,你跟着做就行。不管你是要给生产环境换源,还是自己在虚拟机里折腾,这套方法都适用,保证让你少踩几个坑,一次搞定。
1. 动手之前:先弄清麒麟 V10 的“血统”,再决定怎么换源
1.1 为什么麒麟 V10 可以换源,而且能和 CentOS/RHEL 的仓库兼容
很多人一开始就蒙圈:麒麟系统不是国产操作系统吗?它换源是不是只能换国产源?其实不是。银河麒麟服务器版 V10 的内核和基础软件包体系跟 RHEL/CentOS 8 高度兼容,它使用的是 RPM 软件包管理格式,底层默认走的是 dnf/yum 这套机制。这意味着,只要是符合 RHEL 8 规格的 yum 仓库,麒麟系统都能直接接入使用。
这背后的原理其实很好理解:yum 源的本质就是一个带元数据索引的 HTTP/FTP 文件服务器,里面放着 rpm 包和 repodata 目录(存的是包的元数据和校验信息)。系统在安装软件时,会去源里拉取 repodata,对比本地缓存,然后下载对应的 rpm 包进行依赖解析和安装。只要包格式一致、目录结构符合规范,仓库地址放在哪、由谁维护,其实并不关键。
所以,给麒麟 V10 换源,本质上就是换一个“包下载地址”。我们既可以用国内大厂维护的第三方镜像仓库,也可以用自己内网的 HTTP 服务器或本地 ISO 挂载路径。唯一要小心的,是仓库的系统版本匹配问题——麒麟 V10 的$releasever变量可能被解析成V10,而 CentOS 源用的是8,如果直接套用 CentOS 的 repo 文件,很可能出现路径 404 的情况。这个坑我会在后面专门讲怎么绕开。
1.2 换源前必备的三项检查和环境确认
在动手换源之前,先花两分钟确认自己手上的系统版本和架构。不同架构对应的 baseurl 路径不同,弄错了后面白折腾。下面是保姆级检查命令,直接抄:
# 查看系统版本信息 cat /etc/os-release # 查看内核架构,x86_64 还是 aarch64 uname -m # 查看当前已经配置了哪些 yum 源 yum repolist cat /etc/yum.repos.d/*.repo 2>/dev/null | head -50我建议你重点看三个东西:VERSION是不是V10或带 SP 小版本、uname -m返回的是x86_64还是aarch64、以及/etc/yum.repos.d/目录下默认有哪些.repo文件。麒麟 V10 服务器版默认的 repo 文件通常叫kylin_x86_64.repo、Kylin-Server-10.repo或者类似的名称,里面配置的是系统自带的官方软件源。
另外,确认一下网络连通性。先 ping 一下公网地址,再试一下能不能访问镜像站:
ping -c 4 mirrors.aliyun.com curl -I --connect-timeout 5 https://mirrors.aliyun.com/这一步能帮你区分“源慢”和“机器根本就没联网”这两种情况,省得后面排查问题的时候把时间浪费在错误方向上。
1.3 备份官方源配置,给自己留条后路
换源前第一件事不是改文件,而是备份。系统自带的官方源虽然慢,但它是经过麒麟官方测试验证的,万一你换的第三方源在某个包上出现兼容性问题,至少还能一键切回官方源,不至于让服务器瘫在那里。备份命令很简单:
mkdir -p /etc/yum.repos.d/bak cp -r /etc/yum.repos.d/*.repo /etc/yum.repos.d/bak/ ls /etc/yum.repos.d/bak/如果你想做得更彻底一点,也可以把整个/etc/yum.repos.d/目录直接压缩备份:
tar czvf yum.repos.d.bak.tar.gz /etc/yum.repos.d/备份完以后,我会建议你先把默认的官方源文件移到一个临时目录里,避免第三方源和官方源混在一起,出现“同一个包多个源都在提供”的冲突提示。后面验证没问题了,你再看是不是需要恢复部分官方源。
2. 第三方仓库怎么选:阿里云、清华、中科大源横向对比
2.1 几个主流镜像站的仓库地址速查
国内大大小小的 Linux 镜像站不少,但对于麒麟 V10 这种兼容 CentOS/RHEL 8 的系统,我实际用过比较稳的就这几家:阿里云、清华 TUNA、中科大 USTC。它们的共同点是带宽大、同步频率高、在国内大部分运营商网络下速度都能跑满。
| 镜像站 | 麒麟仓库地址 | 适用网络环境 | 备注 |
|---|---|---|---|
| 阿里云 | https://mirrors.aliyun.com/kylin/KYLIN-V10/ | 全国通用,带宽充足 | 有专门的麒麟目录,路径清晰 |
| 清华 TUNA | https://mirrors.tuna.tsinghua.edu.cn/kylin/KYLIN-V10/ | 教育网骨干,高校网络优先 | 镜像同步非常及时 |
| 中科大 USTC | https://mirrors.ustc.edu.cn/kylin/KYLIN-V10/ | 教育网和电信网络都很快 | 稳定性不错,历史久 |
除了上面这三个,腾讯云、华为云也有自己的镜像站,如果你正好在那朵云上买了服务器,用同云厂商的镜像源其实是最优解,因为走内网流量不消耗公网带宽,下载速度直接起飞。
2.2 官方源为什么慢,第三方镜像站的优势到底在哪
一句话解释:官方源服务器通常部署在核心机房,对国内的网络优化不够。你的服务器发起的每个请求都要跨运营商跳转,中途还可能经过国际链路,延迟高、丢包率也不小。国内镜像站则不同,它们一般在国内多个 IDC 有节点,走的是 BGP 多线接入,各地访问体验都相对均衡。
更重要的是,镜像站不只是“帮你下载快”,它们有完整的同步机制。比如阿里云每天会定时从上游仓库拉取最新的 rpm 包和 repodata 元数据,你在镜像站上看到的其实是一个“快照副本”。对于日常装软件、更新补丁来说,这个快照的实时性完全够用,比你直连官方源却慢到吐血要舒服得多。
我在实际使用中还会优先选阿里云,因为它除了提供麒麟仓库,还同时维护了 EPEL 仓库,方便后面配置扩展源。如果一次性把base、epel都指向同一个镜像站,还能减少不同源之间的网络差异,排查问题的时候也简单很多。
2.3 不同应用场景的选源建议
- 生产服务器:建议优先选阿里云源,或者如果你服务器本身就在阿里云/腾讯云上,直接选云厂商内网镜像源。这类源稳定性和带宽都有保障,出问题也好找客服。
- 开发测试虚拟机:清华 TUNA、中科大 USTC 都可以,速度和同步频率都在线,日常装包足够用。
- 教育网内网环境:清华 TUNA 或者中科大 USTC 优先,它们在教育网内有节点,部分场景甚至能走 IPv6,速度更快。
- 无法连外网的内网/离线环境:这时候只能做本地源,用 ISO 文件或者内网 HTTP 服务器来搭,我在第 6 章单独展开讲。
3. 手把手实操:把官方源换成阿里云源
3.1 查看当前 repo 文件,确认官方源的写法
换源之前,先看看官方 repo 文件的格式,这样你后面写第三方源的时候有参考。执行下面的命令:
cat /etc/yum.repos.d/kylin_x86_64.repo如果文件名不一样,用ls /etc/yum.repos.d/先看一下目录里有什么。典型的官方仓库内容大概是这样的:
[kylin] name=Kylin Linux $releasever - Official baseurl=http://archive.kylinos.cn/kylin/KYLIN-V10/$basearch/ gpgcheck=1 enabled=1 gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-kylin注意看baseurl和gpgkey这两个字段。前者是仓库的实际下载地址,后者是公钥文件路径。不同版本的麒麟文件路径可能略有区别,你以实际输出为准,但大致结构就是这样的。
3.2 备份并清理原 repo 文件
上一步看完了,接下来就把官方源的文件移出去。我不建议直接删,因为你后续可能还想留一个官方源做备用。稳妥做法是移到一个独立目录:
mkdir -p /etc/yum.repos.d/bak mv /etc/yum.repos.d/*.repo /etc/yum.repos.d/bak/移完以后再确认一下目录里只剩bak子目录,没有别的.repo文件:
ls -la /etc/yum.repos.d/这一步的目的是避免新旧源混用。如果不做清理就直接添加新源,yum repolist里会同时出现官方源和第三方源,万一同一个软件包在两个源里版本不同、优先级不同,安装时就会出现“多个包提供同一依赖”的报警,徒增烦恼。
3.3 写入阿里云源配置
现在创建新的 repo 文件。用vi或者vim都行,文件名我习惯起得一眼就能认出来,就叫aliyun-kylin.repo:
vim /etc/yum.repos.d/aliyun-kylin.repo文件内容如下,直接复制进去:
[kylin] name=Kylin Linux V10 - Aliyun baseurl=https://mirrors.aliyun.com/kylin/KYLIN-V10/$basearch/ enabled=1 gpgcheck=1 gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-kylin这里有几个地方我要解释一下,因为后面报错大多数都出在这些细节上:
第一,$basearch变量会自动替换成x86_64或aarch64,这个不用你手动改。但我建议你写完以后,用下面的命令实际展开看看路径到底对不对:
python3 -c "import yum; print(yum.YumBase().conf.yumvar['basearch'])"不过更直观的办法是直接用浏览器或 curl 打开https://mirrors.aliyun.com/kylin/KYLIN-V10/x86_64/,看这个目录到底存不存在,有没有repodata子目录。
第二,gpgkey指向本机公钥文件。如果系统里没有这个文件,后面执行yum makecache时就会报Public key for xxx.rpm is not installed的错误。检查一下:
ls -l /etc/pki/rpm-gpg/RPM-GPG-KEY-kylin如果文件不存在,可以从镜像站下载后导入。命令是:
curl -o /etc/pki/rpm-gpg/RPM-GPG-KEY-kylin https://mirrors.aliyun.com/kylin/KYLIN-V10/RPM-GPG-KEY-kylin rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-kylin3.4 清理缓存并生成新缓存
配置写完之后,一定要执行缓存清理。这是很多人换源之后依然碰到旧源报错的关键原因——本地已经缓存了官方源的 repodata 元数据,yum 在解析时优先读缓存,结果还在访问旧地址。命令如下:
yum clean all yum makecache执行过程中如果看到类似Metadata cache created或Last metadata expiration check的输出,说明新源已经生效。如果碰到报错,先别慌,绝大多数情况下就是第 3.3 节里的路径或者公钥问题,第五章我会把所有高频报错集中列出。
3.5 验证新源是否生效
缓存生成完毕后,做一轮基础验证。先用下面的命令看仓库列表:
yum repolist正常输出会包含kylin这一条,状态显示启用。然后随便装个常用的软件包试试水,比如htop或者wget:
yum install -y htop如果安装过程流畅、速度明显提升,那恭喜你,换源这一步就大功告成了。另外再用yum list available | wc -l统计一下源里可用包的数量,做到心里有数。
4. 进阶操作:挂上 EPEL 扩展仓库,并设置优先级避免依赖冲突
4.1 麒麟 V10 为什么还需要 EPEL 源
麒麟官方源里的软件包走的是“基础稳定”路线,收录的包以系统组件和常用服务为主。但实际工作中你会发现,很多常用软件在官方源里没有,或者版本旧得让人想骂人。比如装htop、tree、jq、python3-pip这类小而美的工具,官方源可能不全,这时候 EPEL 仓库就派上用场了。
EPEL(Extra Packages for Enterprise Linux)是红帽系发行版的一个社区维护扩展仓库,里面收录了大量 RHEL/CentOS 官方源之外的软件包,对系统兼容性也做了测试。因为麒麟 V10 和 RHEL 8 生态兼容,所以epel-8的包在麒麟上用基本没问题。注意,这里我推荐的是 EPEL 8,因为麒麟 V10 服务器版对应的是 RHEL 8 体系,不是 7,搞错了会导致依赖解析失败。
4.2 手动配置阿里云的 EPEL 仓库
麒麟官方源可能没有epel-release这个包,所以最靠谱的办法是手动写 EPEL 的 repo 文件。镜像站选阿里云,和 base 源保持一致:
vim /etc/yum.repos.d/epel-aliyun.repo写入如下内容:
[epel] name=EPEL for RHEL 8 - Aliyun baseurl=https://mirrors.aliyun.com/epel/8/Everything/$basearch/ enabled=1 gpgcheck=1 gpgkey=https://mirrors.aliyun.com/epel/RPM-GPG-KEY-EPEL-8这里的一个小细节是:我把$releasever直接写成了固定的8。因为麒麟的/etc/os-release里VERSION_ID不是8,如果baseurl里写$releasever,yum 展开后路径会变成epel/V10/...,而这个目录在镜像站上根本不存在,必然 404。想省心的话,所有跨发行版的仓库配置都把版本号写死,这是我从实践中总结出来的血泪教训。
写完后同样执行:
yum clean all yum makecache然后跑一下yum repolist,确认新增的epel仓库已经启用。
4.3 用 priorities 插件让 base 源优先,防止依赖版本覆盖
同时启用官方/第三方 base 源和 EPEL 源后,最怕发生的事就是:同一个软件包在两个源里都有,yum 在解析依赖时选了一个版本,装完以后系统行为和我们预期不一致。解决这个问题的标准做法是给源设置优先级。
在 dnf/yum 体系下,需要安装优先级插件:
yum install -y yum-plugin-priorities如果是 dnf 后端,也可以装 dnf 的对应插件:
yum install -y dnf-plugin-priorities装完之后,在/etc/yum.repos.d/下的每个 repo 文件末尾加一行priority=N。N 数字越小,优先级越高。比如我希望kylin源里的包优先于 EPEL 源,就分别在两个文件里加:
# aliyun-kylin.repo [kylin] name=Kylin Linux V10 - Aliyun baseurl=https://mirrors.aliyun.com/kylin/KYLIN-V10/$basearch/ enabled=1 gpgcheck=1 gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-kylin priority=1# epel-aliyun.repo [epel] name=EPEL for RHEL 8 - Aliyun baseurl=https://mirrors.aliyun.com/epel/8/Everything/$basearch/ enabled=1 gpgcheck=1 gpgkey=https://mirrors.aliyun.com/epel/RPM-GPG-KEY-EPEL-8 priority=99设置完以后,yum 在遇到同一个软件包时,会优先从kylin源里找;只有kylin源里没有,才会去epel源找。这样一来,既能保证系统核心组件按官方源版本更新,又能享受 EPEL 源里丰富的软件包,两全其美。
4.4 用一个小测试验证优先级配置
配置完了,咱们验证一下。用yum info查看某个同时在多个源里存在的包,优先级的差别会直接反映在选择上。比如python3-pip如果在两个源里都有,你可以执行:
yum --showduplicates list python3-pip如果输出里只显示来自kylin源的版本,说明优先级已经生效。如果一个包只在 EPEL 里有,那它会正常走 EPEL,也不会受影响。做完这步,你的 yum 源环境就算基本成型了。
5. 常见问题排查:从 404 到 gpg key 失败的现场实录
5.1 “404 Not Found” 的前因后果
这个报错在换源时出现的频率最高。先复制一段我在一台麒麟 V10 服务器上实际看到过的错误:
Errors during downloading metadata for repository 'epel': - Status code: 404 for https://mirrors.aliyun.com/epel/V10/Everything/x86_64/repodata/repomd.xml看到V10这个字段,你就知道问题出在哪了:baseurl里用了$releasever,而麒麟系统的$releasever解析出来不是8而是V10,导致路径变得不伦不类。解决办法也很简单:把 repo 文件里的$releasever换成对应的数字版本,或者干脆写死完整路径。
另外还有一种 404 情况,是因为你的系统架构是aarch64,但镜像站当前还没同步完整的 arm64 目录,或者目录名不叫aarch64而叫arm64。遇到这种情况,最好先浏览器打开镜像站根目录,把目录树结构看一遍再写 baseurl,比瞎猜快得多。
5.2 repomd.xml 下载失败,该往哪个方向查
repomd.xml是 yum 仓库的索引文件,几乎每个源路径下都有。报错常见形式是:
Cannot download repomd.xml: Cannot download repodata/repomd.xml排查方向按顺序来:
- 先确认一下源路径在浏览器里能不能打开,看目录是否存在;
- 确认 DNS 能不能正常解析镜像站域名:
nslookup mirrors.aliyun.com; - 确认防火墙或安全组有没有封 443 端口;
- 确认 curl 能否正常访问源地址:
curl -I https://mirrors.aliyun.com/。
大部分时候问题出在第 1 和第 2 项。如果 curl 都访问不到,那就是网络层面的问题,换源本身解决不了,得先把网络打通。
5.3 GPG 公钥导入失败
报错提示通常长下面这样:
The downloaded RPM was not signed or has an invalid signature Public key for xxx.rpm is not installed这种情况要么是你gpgcheck=1但本地没导入对应公钥,要么是仓库地址和公钥不匹配。解决步骤:
# 查看系统已导入的 gpg key rpm -qa gpg-pubkey* # 从镜像站手动下载公钥并导入 curl -o /etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-8 https://mirrors.aliyun.com/epel/RPM-GPG-KEY-EPEL-8 rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-8导入完以后重新yum makecache,基本就能消掉这个报错。如果实在不想折腾,又是在内网测试环境,也可以把gpgcheck=1临时改成gpgcheck=0,但生产环境我不建议这么干,毕竟包签名校验是软件供应链安全里很重要的一环。
5.4 makecache 反复失败,缓存脏数据怎么处理
有时候你明明配置没问题,但yum makecache就是报错,而且报错信息指向旧的仓库地址。十有八九是本地dnf缓存里残留了旧元数据。这招我实测有效:
yum clean all rm -rf /var/cache/dnf/* yum makecache/var/cache/dnf这个目录是 dnf 的本地元数据缓存,把它整个删掉再重建,能让 yum 彻底忘掉旧状态。
5.5 问题速查表
| 现象 | 可能原因 | 解决思路 |
|---|---|---|
| 404 路径错误 | $releasever被解析成 V10 / 目录名不匹配 | 将版本号写死为 8,或按镜像站实际目录调整 baseurl |
| repomd.xml 无法下载 | 网络不通 / DNS 解析失败 | curl 测试源地址,检查安全组和 DNS |
| gpg key 未安装 | 本地缺少对应公钥 | 手动下载公钥文件并rpm --import |
| makecache 反复失败 | dnf 缓存脏数据 | yum clean all+ 删除/var/cache/dnf/* |
| 多个源提供同一个包 | 源未设置优先级 | 安装 yum-plugin-priorities 并配置 priority 参数 |
| 下载速度慢 | 选的镜像站不适合当前网络 | 换云厂商内网源,或用 curl 测速对比不同镜像站 |
6. 离线/内网环境的另一个思路:本地 yum 源搭建
6.1 什么时候会用到本地源
很多生产环境出于安全考虑,服务器处于内网隔离区,无法访问外网镜像站。还有一类场景是:你手头有一批同样架构、同样版本的麒麟机器,如果每台都去外网拉包,既慢又浪费带宽。这时候在局域网里搭一个本地 yum 源,把所有机器统一指向内网地址,安装效率能提升一个量级。
本地源有两种常见形式:一种是用麒麟的 ISO 镜像文件直接挂载出来当源,适合弥补补充基础软件包;另一种是从已装好软件的机器上同步 rpm 包,或者把外网源的关键包预下载下来,再通过createrepo生成元数据,做成一个内部仓库。第一种最简单,我用它举例。
6.2 ISO 挂载 + createrepo 制作本地仓库
假设你手上有Kylin-Server-V10-SP1-x86_64.iso这个镜像文件,先在局域网的一台服务器上执行挂载:
mkdir -p /mnt/cdrom mount -o loop Kylin-Server-V10-SP1-x86_64.iso /mnt/cdrom挂载好以后,如果镜像里自带repodata目录,那它本身就是合格的源,直接写 repo 文件就能用。但如果你想积累更多包,把别的机器上装过的 rpm 都收集到一个目录里,再用createrepo扫描生成元数据,这样后续所有机器都能从这个目录安装。命令流程:
# 安装 createrepo 工具(如果系统里还没有) yum install -y createrepo # 创建本地仓库目录,把 rpm 包放进去,然后生成元数据 mkdir -p /data/localrepo cp /path/to/rpms/*.rpm /data/localrepo/ createrepo /data/localrepo/createrepo会在/data/localrepo/下生成一个repodata目录,里面就是 yum 元数据。这一步之后,这个目录就可以直接作为仓库地址使用了。
6.3 把本地源写进 repo 文件
在每台需要使用本地源的机器上,创建/etc/yum.repos.d/local.repo:
[local] name=Local Repository baseurl=file:///data/localrepo/ enabled=1 gpgcheck=0注意baseurl用file://协议前缀,gpgcheck 我建议先设为 0,因为内网自建的包可能没有对应的公钥签名。如果你更讲究,也可以把/mnt/cdrom挂载目录直接作为 baseurl 指向。之后同样执行:
yum clean all yum makecache测试yum repolist,看到local仓库出现,说明本地源搭建完成。
基于我个人的使用体验,给刚接触麒麟系统的朋友一个实在建议:换完源以后,不要急着把所有源一锅端全部使用,先保留一个你最信任的第三方源作为主力,其他源设成备用,再配好优先级。这样系统既能保持稳定,又能在需要额外软件包时灵活补充。我自己在这套流程上翻过几次车,弯路走多了以后深深体会到:yum 源这件事,说到底是“路径、公钥、缓存”三个关键词的活,把这三样搞明白了,什么源都能玩得转。希望这篇文章能帮你在麒麟 V10 上少踩坑,顺顺利利把软件装齐。