乐于分享
好东西不私藏

yum 安装包为什么总和镜像源有关?先搞懂 Linux 软件仓库这套逻辑(上)

yum 安装包为什么总和镜像源有关?先搞懂 Linux 软件仓库这套逻辑(上)
点击上方
蓝字
关注我,设置星标不迷路哈

很多刚接触 Linux 的朋友,第一次敲下这条命令:

yum install nginx

心里多少都会冒出几个问题:

为什么装软件要用 yum

为什么它有时候下载很慢?

为什么明明命令没错,却提示找不到包?

为什么教程总让你“换 yum 源”?

如果只把 yum 当成一条安装命令,这些问题就会越用越糊涂。因为 yum 背后真正重要的,不是 install 这个动作,而是 Linux 管理软件的一整套思路:

软件从哪里来,依赖怎么解决,版本怎么控制,系统如何知道一个包是否可信。

这篇上篇,我们先把 yum、软件仓库、镜像源和依赖解析这几件事讲清楚。

一、没有包管理器之前,装软件有多麻烦

在说 yum 之前,先想象一个更原始的场景。

你想在 Linux 上安装 nginx。

如果不用包管理器,通常要自己去官网找源码包,下载、解压,然后执行:

./configuremakesudo make install

看起来只有几步,但新手很快就会遇到第一堵墙。

比如配置 nginx 时,系统可能提示:

./configure: error: the HTTP rewrite module requires the PCRE library.

意思是缺少 PCRE。

你去安装 PCRE,回来继续编译,又可能看到:

HTTP gzip module requires zlib library

又缺 zlib。

继续装 zlib,后面还可能缺 OpenSSL,或者版本不匹配。

这就是手动编译安装最折磨人的地方:软件不是孤零零运行的,它背后往往依赖一堆库和工具。

你要自己找依赖、装依赖、处理版本冲突,还要记住软件到底装到了哪里。

包管理器,就是为了解决这类重复、复杂、容易出错的问题而出现的。

二、yum 到底是什么

yum 是 RHEL 系 Linux 里经典的软件包管理工具,常见于 CentOS 7、RHEL 7 等系统。

它主要负责:

  • 查找软件包
  • 解析依赖关系
  • 下载 RPM 包
  • 调用底层 RPM 机制完成安装、升级、卸载
  • 记录软件包信息
  • 根据配置检查软件包签名

这里要区分两个概念。

rpm 更像底层安装工具,负责把一个具体的 .rpm 包安装到系统里。

yum 则更像上层管理工具,它知道去哪里找包,也知道一个包缺哪些依赖。

所以你可以粗略理解为:

rpm 负责“装这个包”,yum 负责“帮你找到这个包,并把它需要的东西一起安排好”。

在较新的 RHEL 系发行版里,比如 RHEL 8/9、Rocky Linux 8/9、AlmaLinux 8/9、Fedora,默认包管理器已经是 dnf

很多系统里你仍然可以敲 yum,但它可能只是兼容入口,背后实际由 dnf 工作。

这不是错误,而是工具演进。

核心思路没有变:都是围绕软件仓库、元数据、依赖解析和 RPM 数据库进行管理。

三、yum 源不是 yum,它是软件仓库地址

很多人说“yum 源”,容易误以为 yum 本身就是源。

其实不是。

yum 是工具。

软件仓库,也就是 repo,才是真正存放软件包和元数据的地方。

镜像源,则是这些仓库在不同服务器上的复制站点。

你可以这样理解:

yum 是帮你取货的人,repo 是仓库,镜像源是离你更近的分仓。

当你执行:

sudo yum install nginx

yum 不会凭空变出一个 nginx。

它会先读取本机的 repo 配置,找到可用仓库地址,再下载仓库元数据,确认有没有 nginx 这个包,以及它依赖哪些其他包。

repo 配置通常放在:

/etc/yum.repos.d/

你可以这样查看:

ls -l /etc/yum.repos.d/

常见文件名可能类似:

CentOS-Base.reporocky.repoepel.repo

一个简化后的 repo 配置大概长这样:

[baseos]name=Rocky Linux $releasever - BaseOSbaseurl=https://mirrors.example.com/rocky/$releasever/BaseOS/$basearch/os/enabled=1gpgcheck=1gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-rockyofficial

几个字段要看懂:

  • [baseos] 是仓库 ID。
  • name 是显示名称。
  • baseurl 是仓库地址。
  • enabled=1 表示启用这个仓库。
  • gpgcheck=1 表示安装软件包时检查签名。
  • $releasever 会替换成系统版本。
  • $basearch 会替换成系统架构,比如 x86_64

所以,换源并不是改 yum 命令,而是在改系统“去哪里找软件包”。

四、为什么换镜像源能解决很多问题

新手遇到 yum 报错时,教程经常让你换源。

这不是玄学。

换源通常是在解决这几类问题。

第一,默认源访问慢。

如果系统默认访问海外服务器,下载速度可能很慢,甚至连接超时。

换成国内云厂商、高校或公司内部镜像站,速度通常会好很多。

第二,系统版本已经停止维护。

比如 CentOS Linux 8 已在 2021 年 12 月 31 日停止维护,CentOS Linux 7 已在 2024 年 6 月 30 日停止维护。

这类系统的原始仓库可能已经迁移到归档地址。继续使用旧地址,就容易出现元数据下载失败、找不到仓库等问题。

第三,仓库没有启用。

有些软件不在基础仓库里,而在额外仓库里,比如 EPEL。

如果没有启用对应仓库,yum install 就可能提示找不到包。

第四,包名或版本不匹配。

同一个软件在不同发行版、不同版本、不同仓库里,包名和版本可能不同。

所以“找不到包”不一定是 yum 坏了,也不一定换个源就必好。

正确排查顺序应该是:

cat /etc/os-releaseyum repolistyum search nginx

先确认系统版本,再看启用了哪些仓库,最后搜索包名是否存在。

五、yum 安装软件时,背后做了什么

一次正常的 yum 安装,大致会经历这几步。

第一步,读取 repo 配置。

yum 会读取 /etc/yum.repos.d/ 里的 .repo 文件,确认哪些仓库启用,仓库地址在哪里。

第二步,下载或读取仓库元数据。

仓库里不只有 RPM 包,还有一套元数据,记录了包名、版本、架构、依赖关系、文件列表等信息。

第三步,解析依赖关系。

比如你安装 nginx,yum 会根据元数据判断它还需要哪些库或模块。

第四步,下载安装包。

yum 会从仓库下载对应的 RPM 包。

第五步,检查签名并调用 rpm 安装。

如果仓库配置启用了 gpgcheck=1,系统会检查软件包签名,确认软件包来源是否可信。

第六步,更新本地 RPM 数据库。

安装完成后,系统会记录这个包的名称、版本、文件路径等信息。

以后你查询、升级、卸载软件,都要依赖这些记录。

可以用下面的命令查看本机已安装的软件包:

rpm -qa | grep nginx

也可以查看某个包安装了哪些文件:

rpm -ql nginx

这就是 yum 的价值:它把找包、解析依赖、下载、安装、记录这些动作串成了标准流程。

六、上篇小结

yum 不只是安装命令,它背后是一套软件管理机制。

你真正需要理解的是这条链路:

repo 配置 -> 镜像源 -> 仓库元数据 -> 依赖解析 -> RPM 包 -> 本地 RPM 数据库

看懂这条链路之后,再遇到 yum 安装慢、找不到包、依赖冲突、换源失败,就不会只会复制教程里的命令。

下篇我们继续讲实操部分:

  • 怎么安全换 yum 源
  • 怎么启用 EPEL
  • 离线安装应该怎么做
  • yum update 和 yum upgrade 到底有什么区别
  • 生产环境为什么不能随便 yum update -y

END

Linux 为什么有这么多发行版?Ubuntu、CentOS、Debian、麒麟到底是什么关系?

第一次登录 Linux,先别慌:看懂这 6 件事就入门了(上)

第一次登录 Linux,路径、切目录和 PATH 一次讲清楚(下)

为什么 Linux 的目录这么奇怪?终于有人讲明白了

为什么 Linux 要用“挂载”?而不是直接显示 C 盘、D 盘?